diff --git a/apps/nextjs/next.config.mjs b/apps/nextjs/next.config.mjs index fcf1321a4..970d393c4 100644 --- a/apps/nextjs/next.config.mjs +++ b/apps/nextjs/next.config.mjs @@ -1,6 +1,6 @@ // Importing env files here to validate on build -import "./src/env.mjs"; import "@homarr/auth/env.mjs"; +import "./src/env.mjs"; /** @type {import("next").NextConfig} */ const config = { @@ -9,6 +9,15 @@ const config = { /** We already do linting and typechecking as separate tasks in CI */ eslint: { ignoreDuringBuilds: true }, typescript: { ignoreBuildErrors: true }, + webpack: (config) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access + config.module.rules.push({ + test: /\.node$/, + loader: "node-loader", + }); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return config; + }, experimental: { optimizePackageImports: ["@mantine/core", "@mantine/hooks", "@tabler/icons-react"], }, diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index c64d52e2a..2c34496d5 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -48,11 +48,13 @@ "@xterm/addon-fit": "0.10.0", "@xterm/xterm": "^5.5.0", "chroma-js": "^2.4.2", + "clsx": "^2.1.1", "dayjs": "^1.11.11", "dotenv": "^16.4.5", "flag-icons": "^7.2.3", "glob": "^10.4.1", "jotai": "^2.8.2", + "mantine-react-table": "2.0.0-beta.3", "next": "^14.2.3", "postcss-preset-mantine": "^1.15.0", "react": "18.3.1", @@ -72,6 +74,7 @@ "@types/react-dom": "^18.3.0", "concurrently": "^8.2.2", "eslint": "^8.57.0", + "node-loader": "^2.0.0", "prettier": "^3.2.5", "tsx": "4.11.0", "typescript": "^5.4.5" diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/DockerTable.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/DockerTable.tsx new file mode 100644 index 000000000..fe56590c7 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/DockerTable.tsx @@ -0,0 +1,154 @@ +"use client"; + +import type { ButtonProps, MantineColor } from "@mantine/core"; +import { Avatar, Badge, Box, Button, Group, Text } from "@mantine/core"; +import { IconPlayerPlay, IconPlayerStop, IconRotateClockwise, IconTrash } from "@tabler/icons-react"; +import type { MRT_ColumnDef } from "mantine-react-table"; +import { MantineReactTable, useMantineReactTable } from "mantine-react-table"; + +import type { RouterOutputs } from "@homarr/api"; +import { useTimeAgo } from "@homarr/common"; +import type { DockerContainerState } from "@homarr/definitions"; +import type { TranslationFunction } from "@homarr/translation"; +import { useI18n, useScopedI18n } from "@homarr/translation/client"; +import { OverflowBadge } from "@homarr/ui"; + +const createColumns = ( + t: TranslationFunction, +): MRT_ColumnDef[] => [ + { + accessorKey: "name", + header: t("docker.field.name.label"), + Cell({ renderedCellValue, row }) { + return ( + + + {row.original.name.at(0)?.toUpperCase()} + + {renderedCellValue} + + ); + }, + }, + { + accessorKey: "state", + header: t("docker.field.state.label"), + size: 120, + Cell({ cell }) { + return ; + }, + }, + { + accessorKey: "image", + header: t("docker.field.containerImage.label"), + maxSize: 200, + Cell({ renderedCellValue }) { + return ( + + {renderedCellValue} + + ); + }, + }, + { + accessorKey: "ports", + header: t("docker.field.ports.label"), + Cell({ cell }) { + return ( + port.PrivatePort.toString())} /> + ); + }, + }, +]; + +export function DockerTable({ containers, timestamp }: RouterOutputs["docker"]["getContainers"]) { + const t = useI18n(); + const tDocker = useScopedI18n("docker"); + const relativeTime = useTimeAgo(timestamp); + const table = useMantineReactTable({ + data: containers, + enableDensityToggle: false, + enableColumnActions: false, + enableColumnFilters: false, + enablePagination: false, + enableRowSelection: true, + positionToolbarAlertBanner: "top", + enableTableFooter: false, + enableBottomToolbar: false, + positionGlobalFilter: "right", + mantineSearchTextInputProps: { + placeholder: tDocker("table.search", { count: containers.length }), + style: { minWidth: 300 }, + autoFocus: true, + }, + + initialState: { density: "xs", showGlobalFilter: true }, + renderToolbarAlertBannerContent: ({ groupedAlert, table }) => { + return ( + + {groupedAlert} + + {tDocker("table.selected", { + selectCount: table.getSelectedRowModel().rows.length, + totalCount: table.getRowCount(), + })} + + + + ); + }, + + columns: createColumns(t), + }); + return ( + <> + {tDocker("table.updated", { when: relativeTime })} + + + ); +} + +const ContainerActionBar = () => { + const t = useScopedI18n("docker.action"); + const sharedButtonProps = { + variant: "light", + radius: "md", + } satisfies Partial; + + return ( + + + + + + + ); +}; + +const containerStates = { + created: "cyan", + running: "green", + paused: "yellow", + restarting: "orange", + exited: "red", + removing: "pink", + dead: "dark", +} satisfies Record; + +const ContainerStateBadge = ({ state }: { state: DockerContainerState }) => { + const t = useScopedI18n("docker.field.state.option"); + + return ( + + {t(state)} + + ); +}; diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/page.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/page.tsx new file mode 100644 index 000000000..9a18f5ba5 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/page.tsx @@ -0,0 +1,18 @@ +import { Stack, Title } from "@mantine/core"; + +import { api } from "@homarr/api/server"; +import { getScopedI18n } from "@homarr/translation/server"; + +import { DockerTable } from "./DockerTable"; + +export default async function DockerPage() { + const { containers, timestamp } = await api.docker.getContainers(); + const tDocker = await getScopedI18n("docker"); + + return ( + + {tDocker("title")} + + + ); +} diff --git a/apps/nextjs/src/env.mjs b/apps/nextjs/src/env.mjs index 2e4452340..d5b00da89 100644 --- a/apps/nextjs/src/env.mjs +++ b/apps/nextjs/src/env.mjs @@ -27,6 +27,9 @@ export const env = createEnv({ DB_USER: isUsingDbCredentials ? z.string() : z.string().optional(), DB_PASSWORD: isUsingDbCredentials ? z.string() : z.string().optional(), DB_NAME: isUsingDbUrl ? z.string().optional() : z.string(), + // Comma separated list of docker hostnames that can be used to connect to query the docker endpoints (localhost:2375,host.docker.internal:2375, ...) + DOCKER_HOSTNAMES: z.string().optional(), + DOCKER_PORTS: z.number().optional(), }, /** * Specify your client-side environment variables schema here. @@ -49,6 +52,8 @@ export const env = createEnv({ DB_PORT: process.env.DB_PORT, DB_DRIVER: process.env.DB_DRIVER, NODE_ENV: process.env.NODE_ENV, + DOCKER_HOSTNAMES: process.env.DOCKER_HOSTNAMES, + DOCKER_PORTS: process.env.DOCKER_PORTS, // NEXT_PUBLIC_CLIENTVAR: process.env.NEXT_PUBLIC_CLIENTVAR, }, skipValidation: diff --git a/apps/websocket/package.json b/apps/websocket/package.json index e9d856950..8500fc111 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -8,7 +8,7 @@ "type": "module", "scripts": { "dev": "pnpm with-env tsx ./src/main.ts", - "build": "esbuild src/main.ts --bundle --platform=node --outfile=wssServer.cjs --external:bcrypt --loader:.html=text", + "build": "esbuild src/main.ts --bundle --platform=node --outfile=wssServer.cjs --external:bcrypt --loader:.html=text --loader:.node=text", "clean": "rm -rf .turbo node_modules", "lint": "eslint .", "format": "prettier --check . --ignore-path ../../.gitignore", diff --git a/packages/api/package.json b/packages/api/package.json index 3fad704f3..c18e51cac 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -31,12 +31,14 @@ "@homarr/server-settings": "workspace:^0.1.0", "@trpc/client": "next", "@trpc/server": "next", + "dockerode": "^4.0.2", "superjson": "2.2.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", + "@types/dockerode": "^3.3.29", "eslint": "^8.57.0", "prettier": "^3.2.5", "typescript": "^5.4.5" diff --git a/packages/api/src/root.ts b/packages/api/src/root.ts index 1395b871e..239be6f09 100644 --- a/packages/api/src/root.ts +++ b/packages/api/src/root.ts @@ -1,5 +1,6 @@ import { appRouter as innerAppRouter } from "./router/app"; import { boardRouter } from "./router/board"; +import { dockerRouter } from "./router/docker/docker-router"; import { groupRouter } from "./router/group"; import { homeRouter } from "./router/home"; import { iconsRouter } from "./router/icons"; @@ -24,6 +25,7 @@ export const appRouter = createTRPCRouter({ log: logRouter, icon: iconsRouter, home: homeRouter, + docker: dockerRouter, serverSettings: serverSettingsRouter, }); diff --git a/packages/api/src/router/docker/docker-router.ts b/packages/api/src/router/docker/docker-router.ts new file mode 100644 index 000000000..0d936bec1 --- /dev/null +++ b/packages/api/src/router/docker/docker-router.ts @@ -0,0 +1,84 @@ +import type Docker from "dockerode"; + +import { db, like, or } from "@homarr/db"; +import { icons } from "@homarr/db/schema/sqlite"; +import type { DockerContainerState } from "@homarr/definitions"; +import { createCacheChannel } from "@homarr/redis"; + +import { createTRPCRouter, publicProcedure } from "../../trpc"; +import { DockerSingleton } from "./docker-singleton"; + +const dockerCache = createCacheChannel<{ + containers: (Docker.ContainerInfo & { instance: string; iconUrl: string | null })[]; +}>("docker-containers", 5 * 60 * 1000); + +export const dockerRouter = createTRPCRouter({ + getContainers: publicProcedure.query(async () => { + const { timestamp, data } = await dockerCache.consumeAsync(async () => { + const dockerInstances = DockerSingleton.getInstance(); + const containers = await Promise.all( + // Return all the containers of all the instances into only one item + dockerInstances.map(({ instance, host: key }) => + instance.listContainers({ all: true }).then((containers) => + containers.map((container) => ({ + ...container, + instance: key, + })), + ), + ), + ).then((containers) => containers.flat()); + + const extractImage = (container: Docker.ContainerInfo) => + container.Image.split("/").at(-1)?.split(":").at(0) ?? ""; + const likeQueries = containers.map((container) => like(icons.name, `%${extractImage(container)}%`)); + const dbIcons = + likeQueries.length >= 1 + ? await db.query.icons.findMany({ + where: or(...likeQueries), + }) + : []; + + return { + containers: containers.map((container) => ({ + ...container, + iconUrl: + dbIcons.find((icon) => { + const extractedImage = extractImage(container); + if (!extractedImage) return false; + return icon.name.toLowerCase().includes(extractedImage.toLowerCase()); + })?.url ?? null, + })), + }; + }); + + return { + containers: sanitizeContainers(data.containers), + timestamp, + }; + }), +}); + +interface DockerContainer { + name: string; + id: string; + state: DockerContainerState; + image: string; + ports: Docker.Port[]; + iconUrl: string | null; +} + +function sanitizeContainers( + containers: (Docker.ContainerInfo & { instance: string; iconUrl: string | null })[], +): DockerContainer[] { + return containers.map((container) => { + return { + name: container.Names[0]?.split("/")[1] || "Unknown", + id: container.Id, + instance: container.instance, + state: container.State as DockerContainerState, + image: container.Image, + ports: container.Ports, + iconUrl: container.iconUrl, + }; + }); +} diff --git a/packages/api/src/router/docker/docker-singleton.ts b/packages/api/src/router/docker/docker-singleton.ts new file mode 100644 index 000000000..072c40925 --- /dev/null +++ b/packages/api/src/router/docker/docker-singleton.ts @@ -0,0 +1,50 @@ +import Docker from "dockerode"; + +interface DockerInstance { + host: string; + instance: Docker; +} + +export class DockerSingleton { + private static instances: DockerInstance[]; + + private createInstances() { + const instances: DockerInstance[] = []; + const hostVariable = process.env.DOCKER_HOST; + const portVariable = process.env.DOCKER_PORT; + if (hostVariable === undefined || portVariable === undefined) { + instances.push({ host: "socket", instance: new Docker() }); + return instances; + } + const hosts = hostVariable.split(","); + const ports = portVariable.split(","); + + if (hosts.length !== ports.length) { + throw new Error("The number of hosts and ports must match"); + } + + hosts.forEach((host, i) => { + instances.push({ + host: `${host}:${ports[i]}`, + instance: new Docker({ + host, + port: parseInt(ports[i] || "", 10), + }), + }); + return instances; + }); + return instances; + } + + public static findInstance(key: string): DockerInstance | undefined { + return this.instances.find((instance) => instance.host === key); + } + + public static getInstance(): DockerInstance[] { + if (!DockerSingleton.instances) { + DockerSingleton.instances = new DockerSingleton().createInstances(); + } + + return this.instances; + } +} diff --git a/packages/common/src/hooks.ts b/packages/common/src/hooks.ts new file mode 100644 index 000000000..5464d67d9 --- /dev/null +++ b/packages/common/src/hooks.ts @@ -0,0 +1,25 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useParams } from "next/navigation"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; + +dayjs.extend(relativeTime); + +const calculateTimeAgo = (timestamp: Date, locale: string) => { + return dayjs().locale(locale).to(timestamp); +}; + +export const useTimeAgo = (timestamp: Date) => { + const { locale } = useParams<{ locale: string }>(); + const [timeAgo, setTimeAgo] = useState(calculateTimeAgo(timestamp, locale)); + + useEffect(() => { + const intervalId = setInterval(() => setTimeAgo(calculateTimeAgo(timestamp, locale)), 1000); // update every second + + return () => clearInterval(intervalId); // clear interval on hook unmount + }, [timestamp, locale]); + + return timeAgo; +}; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 5ee205da0..e3127eab3 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -3,4 +3,5 @@ export * from "./string"; export * from "./cookie"; export * from "./array"; export * from "./stopwatch"; +export * from "./hooks"; export * from "./number"; diff --git a/packages/definitions/src/docker.ts b/packages/definitions/src/docker.ts new file mode 100644 index 000000000..4a39a21ab --- /dev/null +++ b/packages/definitions/src/docker.ts @@ -0,0 +1,11 @@ +export const dockerContainerStates = [ + "created", + "running", + "paused", + "restarting", + "exited", + "removing", + "dead", +] as const; + +export type DockerContainerState = (typeof dockerContainerStates)[number]; diff --git a/packages/definitions/src/index.ts b/packages/definitions/src/index.ts index d72b9e8d1..42ce3cc29 100644 --- a/packages/definitions/src/index.ts +++ b/packages/definitions/src/index.ts @@ -3,3 +3,4 @@ export * from "./integration"; export * from "./section"; export * from "./widget"; export * from "./permissions"; +export * from "./docker"; diff --git a/packages/redis/src/lib/channel.ts b/packages/redis/src/lib/channel.ts index 270b3c6ce..89c89ed40 100644 --- a/packages/redis/src/lib/channel.ts +++ b/packages/redis/src/lib/channel.ts @@ -56,9 +56,10 @@ const cacheClient = createRedisConnection(); /** * Creates a new cache channel. * @param name name of the channel + * @param cacheDurationMs duration in milliseconds to cache * @returns cache channel object */ -export const createCacheChannel = (name: string, cacheDurationSeconds: number = 5 * 60 * 1000) => { +export const createCacheChannel = (name: string, cacheDurationMs: number = 5 * 60 * 1000) => { const cacheChannelName = `cache:${name}`; return { @@ -73,7 +74,7 @@ export const createCacheChannel = (name: string, cacheDurationSeconds: nu const parsedData = superjson.parse<{ data: TData; timestamp: Date }>(data); const now = new Date(); const diff = now.getTime() - parsedData.timestamp.getTime(); - if (diff > cacheDurationSeconds) return null; + if (diff > cacheDurationMs) return null; return parsedData; }, @@ -102,7 +103,7 @@ export const createCacheChannel = (name: string, cacheDurationSeconds: nu const now = new Date(); const diff = now.getTime() - parsedData.timestamp.getTime(); - if (diff > cacheDurationSeconds) { + if (diff > cacheDurationMs) { return await getNewDataAsync(); } diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index fa5d56756..58cf676d2 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -1369,4 +1369,41 @@ export default { }, }, }, + docker: { + title: "Containers", + table: { + updated: "Updated {when}", + search: "Seach {count} containers", + selected: "{selectCount} of {totalCount} containers selected", + }, + field: { + name: { + label: "Name", + }, + state: { + label: "State", + option: { + created: "Created", + running: "Running", + paused: "Paused", + restarting: "Restarting", + exited: "Exited", + removing: "Removing", + dead: "Dead", + }, + }, + containerImage: { + label: "Image", + }, + ports: { + label: "Ports", + }, + }, + action: { + start: "Start", + stop: "Stop", + restart: "Restart", + remove: "Remove", + }, + }, } as const; diff --git a/packages/ui/src/components/index.tsx b/packages/ui/src/components/index.tsx index 425545c50..073965df3 100644 --- a/packages/ui/src/components/index.tsx +++ b/packages/ui/src/components/index.tsx @@ -1,8 +1,9 @@ export * from "./count-badge"; +export { OverflowBadge } from "./overflow-badge"; +export { SearchInput } from "./search-input"; export * from "./select-with-description"; export * from "./select-with-description-and-badge"; -export { UserAvatar } from "./user-avatar"; -export { UserAvatarGroup } from "./user-avatar-group"; export { TablePagination } from "./table-pagination"; -export { SearchInput } from "./search-input"; export { TextMultiSelect } from "./text-multi-select"; +export { UserAvatar } from "./user-avatar"; +export { UserAvatarGroup } from "./user-avatar-group"; diff --git a/packages/ui/src/components/overflow-badge.tsx b/packages/ui/src/components/overflow-badge.tsx new file mode 100644 index 000000000..976f8e2fd --- /dev/null +++ b/packages/ui/src/components/overflow-badge.tsx @@ -0,0 +1,55 @@ +import type { BadgeProps } from "@mantine/core"; +import { ActionIcon, Badge, Group, Popover, Stack } from "@mantine/core"; + +export function OverflowBadge({ + data, + overflowCount = 3, + ...props +}: { + data: string[]; + overflowCount?: number; +} & BadgeProps) { + const badgeProps = { + variant: "default", + size: "lg", + radius: "sm", + ...props, + }; + return ( + + + {data.slice(0, overflowCount).map((item) => ( + + {item} + + ))} + {data.length > overflowCount && ( + + + +{data.length - overflowCount} + + + )} + + + + {data.slice(overflowCount).map((item) => ( + + {item} + + ))} + + + + ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0524f9642..51ada9fd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,10 +29,10 @@ importers: version: 1.13.3(@types/node@20.12.13)(typescript@5.4.5) '@vitejs/plugin-react': specifier: ^4.3.0 - version: 4.3.0(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)) + version: 4.3.0(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0)) '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)) + version: 1.6.0(vitest@1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0)) '@vitest/ui': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0) @@ -53,10 +53,10 @@ importers: version: 5.4.5 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0)) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1) + version: 1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) apps/nextjs: dependencies: @@ -83,7 +83,7 @@ importers: version: link:../../packages/form '@homarr/gridstack': specifier: ^1.0.0 - version: 1.0.2 + version: 1.0.0 '@homarr/integrations': specifier: workspace:^0.1.0 version: link:../../packages/integrations @@ -162,6 +162,9 @@ importers: chroma-js: specifier: ^2.4.2 version: 2.4.2 + clsx: + specifier: ^2.1.1 + version: 2.1.1 dayjs: specifier: ^1.11.11 version: 1.11.11 @@ -177,6 +180,9 @@ importers: jotai: specifier: ^2.8.2 version: 2.8.2(@types/react@18.3.3)(react@18.3.1) + mantine-react-table: + specifier: 2.0.0-beta.3 + version: 2.0.0-beta.3(@mantine/core@7.10.0(@mantine/hooks@7.10.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.10.0(@mantine/core@7.10.0(@mantine/hooks@7.10.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.10.0(react@18.3.1))(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.10.0(react@18.3.1))(@tabler/icons-react@3.5.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.3 version: 14.2.3(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.2) @@ -229,6 +235,9 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 + node-loader: + specifier: ^2.0.0 + version: 2.0.0(webpack@5.91.0) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -436,6 +445,9 @@ importers: '@trpc/server': specifier: next version: 11.0.0-rc.382 + dockerode: + specifier: ^4.0.2 + version: 4.0.2 superjson: specifier: 2.2.1 version: 2.2.1 @@ -449,6 +461,9 @@ importers: '@homarr/tsconfig': specifier: workspace:^0.1.0 version: link:../../tooling/typescript + '@types/dockerode': + specifier: ^3.3.29 + version: 3.3.29 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -1116,10 +1131,6 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@auth/core@0.31.0': resolution: {integrity: sha512-UKk3psvA1cRbk4/c9CkpWB8mdWrkKvzw0DmEYRsWolUQytQ2cRqx+hYuV6ZCsngw/xbj9hpmkZmAZEyq2g4fMg==} peerDependencies: @@ -1343,6 +1354,9 @@ packages: resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} 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==} @@ -1810,8 +1824,8 @@ packages: '@floating-ui/utils@0.2.1': resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - '@homarr/gridstack@1.0.2': - resolution: {integrity: sha512-YL9oF9SwAhioto4QNaowHdMNEhjy2G6v22aN3BlGtumiAWPayo3Ni9P37ZQ7Zv/1s8qKmC2t3GZAp+IsCPjgUA==} + '@homarr/gridstack@1.0.0': + resolution: {integrity: sha512-KM9024BipLD9BmtM6jHI8OKLZ1Iy4vZdTfU53ww4qEda/330XQYhIC2SBcQgkNnDB2MTkn/laNSO5gTy+lJg9Q==} '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} @@ -1868,6 +1882,9 @@ packages: 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.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -2460,8 +2477,8 @@ packages: '@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/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} '@types/bcrypt@5.0.2': resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} @@ -2487,6 +2504,15 @@ packages: '@types/css-modules@1.0.5': resolution: {integrity: sha512-oeKafs/df9lwOvtfiXVliZsocFVOexK9PZtLQWuPeuVCFR7jwiqlg60lu80JTe5NFNtH3tnV6Fs/ySR8BUPHAw==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.29': + resolution: {integrity: sha512-5PRRq/yt5OT/Jf77ltIdz4EiR9+VLnPF+HpU4xGFwUqmV24Co2HKBNW3w+slqZ1CYchbcDeqJASHDYWzZCcMiQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint@8.56.10': resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} @@ -2529,6 +2555,12 @@ packages: '@types/node-cron@3.0.11': resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==} + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + + '@types/node@20.12.12': + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@types/node@20.12.13': resolution: {integrity: sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==} @@ -2562,6 +2594,9 @@ packages: '@types/serve-static@1.15.5': resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/ssh2@1.15.0': + resolution: {integrity: sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==} + '@types/throttle-debounce@2.1.0': resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} @@ -2692,6 +2727,51 @@ packages: '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@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==} + '@xmldom/xmldom@0.8.10': resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} @@ -2709,9 +2789,20 @@ packages: '@xterm/xterm@5.5.0': resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2741,6 +2832,11 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2782,7 +2878,6 @@ packages: 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. arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -2839,6 +2934,9 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -2883,6 +2981,9 @@ packages: resolution: {integrity: sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==} engines: {node: '>=10.0.0'} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + bcrypt@5.1.1: resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} engines: {node: '>= 10.0.0'} @@ -2890,6 +2991,9 @@ packages: better-sqlite3@10.0.0: resolution: {integrity: sha512-rOz0JY8bt9oMgrFssP7GnvA5R3yln73y/NizzWqy3WlFth8Ux8+g4r/N9fjX97nn4X1YX6MTER2doNpTu5pqiA==} + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2921,6 +3025,10 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} @@ -2993,6 +3101,10 @@ packages: chroma-js@2.4.2: resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -3066,6 +3178,9 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -3102,6 +3217,10 @@ packages: core-js-pure@3.36.0: resolution: {integrity: sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==} + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -3264,6 +3383,14 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + docker-modem@5.0.3: + resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==} + engines: {node: '>= 8.0'} + + dockerode@4.0.2: + resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==} + engines: {node: '>= 8.0'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -3397,12 +3524,20 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3438,6 +3573,9 @@ packages: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} + es-module-lexer@1.5.3: + resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -3575,6 +3713,10 @@ packages: peerDependencies: eslint: '>6.6.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} @@ -3605,6 +3747,10 @@ packages: 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'} @@ -3619,6 +3765,10 @@ packages: event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3739,7 +3889,6 @@ packages: gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} - deprecated: This package is no longer supported. generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -3793,6 +3942,9 @@ packages: 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'} @@ -4207,6 +4359,10 @@ packages: resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} engines: {node: '>=14'} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jose@5.2.2: resolution: {integrity: sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==} @@ -4256,6 +4412,9 @@ packages: resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} hasBin: true + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -4315,6 +4474,14 @@ packages: linkifyjs@4.1.3: resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -4548,6 +4715,9 @@ packages: resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} engines: {node: '>=12.0.0'} + nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4629,6 +4799,12 @@ packages: encoding: optional: true + node-loader@2.0.0: + resolution: {integrity: sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^5.0.0 + node-plop@0.26.3: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} @@ -4655,7 +4831,6 @@ packages: npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. nwsapi@2.2.10: resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} @@ -4830,9 +5005,6 @@ packages: 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'} @@ -5014,6 +5186,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -5236,6 +5411,10 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5245,17 +5424,15 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - sentence-case@2.1.1: resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -5353,6 +5530,9 @@ packages: spawn-command@0.0.2: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -5360,6 +5540,10 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + ssh2@1.15.0: + resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} + engines: {node: '>=10.16.0'} + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -5491,6 +5675,13 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + 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==} @@ -5502,6 +5693,27 @@ packages: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} + 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@5.31.0: + resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -5665,6 +5877,9 @@ packages: resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==} hasBin: true + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -5931,6 +6146,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -5941,6 +6160,20 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -6074,11 +6307,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.25 - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - '@auth/core@0.31.0': dependencies: '@panva/hkdf': 1.1.1 @@ -6105,7 +6333,7 @@ snapshots: '@babel/code-frame@7.24.6': dependencies: '@babel/highlight': 7.24.6 - picocolors: 1.0.1 + picocolors: 1.0.0 '@babel/compat-data@7.23.5': {} @@ -6133,7 +6361,7 @@ snapshots: '@babel/core@7.24.6': dependencies: - '@ampproject/remapping': 2.3.0 + '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.24.6 '@babel/generator': 7.24.6 '@babel/helper-compilation-targets': 7.24.6 @@ -6205,7 +6433,7 @@ snapshots: '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.0 '@babel/helper-module-imports@7.24.6': dependencies: @@ -6233,7 +6461,7 @@ snapshots: '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.0 '@babel/helper-simple-access@7.24.6': dependencies: @@ -6283,7 +6511,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.0.0 '@babel/parser@7.24.0': dependencies: @@ -6314,9 +6542,9 @@ snapshots: '@babel/template@7.23.9': dependencies: - '@babel/code-frame': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 '@babel/template@7.24.0': dependencies: @@ -6378,6 +6606,8 @@ snapshots: '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 + '@balena/dockerignore@1.0.2': {} + '@bcoe/v8-coverage@0.2.3': {} '@colors/colors@1.6.0': {} @@ -6654,7 +6884,7 @@ snapshots: '@floating-ui/utils@0.2.1': {} - '@homarr/gridstack@1.0.2': {} + '@homarr/gridstack@1.0.0': {} '@humanwhocodes/config-array@0.11.14': dependencies: @@ -6715,6 +6945,11 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/trace-mapping@0.3.25': @@ -7278,29 +7513,29 @@ snapshots: js-yaml: 4.1.0 ora: 4.1.1 rimraf: 3.0.2 - semver: 7.6.2 + semver: 7.6.0 update-check: 1.5.4 '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.5 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.20.5': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.0 '@types/bcrypt@5.0.2': dependencies: @@ -7332,6 +7567,22 @@ snapshots: '@types/css-modules@1.0.5': {} + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 20.12.12 + '@types/ssh2': 1.15.0 + + '@types/dockerode@3.3.29': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 20.12.12 + '@types/ssh2': 1.15.0 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 @@ -7379,6 +7630,14 @@ snapshots: '@types/node-cron@3.0.11': {} + '@types/node@18.19.33': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.12.12': + dependencies: + undici-types: 5.26.5 + '@types/node@20.12.13': dependencies: undici-types: 5.26.5 @@ -7415,6 +7674,10 @@ snapshots: '@types/mime': 3.0.4 '@types/node': 20.12.13 + '@types/ssh2@1.15.0': + dependencies: + '@types/node': 18.19.33 + '@types/throttle-debounce@2.1.0': {} '@types/through@0.0.33': @@ -7489,7 +7752,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.2 + semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 @@ -7545,18 +7808,18 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@4.3.0(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1))': + '@vitejs/plugin-react@4.3.0(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0))': dependencies: '@babel/core': 7.24.6 '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1) + vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1))': + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0))': dependencies: '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 @@ -7571,7 +7834,7 @@ snapshots: std-env: 3.7.0 strip-literal: 2.0.0 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1) + vitest: 1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) transitivePeerDependencies: - supports-color @@ -7606,7 +7869,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.0 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1) + vitest: 1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) '@vitest/utils@1.6.0': dependencies: @@ -7615,6 +7878,82 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 + '@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': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@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': {} + + '@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': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + 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 + + '@webassemblyjs/wasm-gen@1.12.1': + 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 + + '@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': + 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 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + '@xmldom/xmldom@0.8.10': {} '@xterm/addon-canvas@0.7.0(@xterm/xterm@5.5.0)': @@ -7627,8 +7966,16 @@ snapshots: '@xterm/xterm@5.5.0': {} + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + abbrev@1.1.1: {} + acorn-import-assertions@1.9.0(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 @@ -7661,6 +8008,10 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7797,6 +8148,10 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.2 + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + assertion-error@1.1.0: {} ast-types-flow@0.0.8: {} @@ -7831,6 +8186,10 @@ snapshots: basic-ftp@5.0.4: {} + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + bcrypt@5.1.1: dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -7844,6 +8203,8 @@ snapshots: bindings: 1.5.0 prebuild-install: 7.1.1 + big.js@5.2.2: {} + binary-extensions@2.2.0: {} bindings@1.5.0: @@ -7883,9 +8244,12 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buildcheck@0.0.6: + optional: true + builtins@5.0.1: dependencies: - semver: 7.6.2 + semver: 7.6.0 busboy@1.6.0: dependencies: @@ -7985,6 +8349,8 @@ snapshots: chroma-js@2.4.2: {} + chrome-trace-event@1.0.3: {} + clean-stack@2.2.0: {} cli-color@2.0.3: @@ -8052,6 +8418,8 @@ snapshots: commander@10.0.1: {} + commander@2.20.3: {} + commander@9.5.0: {} concat-map@0.0.1: {} @@ -8090,6 +8458,12 @@ snapshots: core-js-pure@3.36.0: {} + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.6 + nan: 2.19.0 + optional: true + create-require@1.1.1: {} crelt@1.0.6: {} @@ -8235,6 +8609,23 @@ snapshots: dependencies: path-type: 4.0.0 + docker-modem@5.0.3: + dependencies: + debug: 4.3.4 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.15.0 + transitivePeerDependencies: + - supports-color + + dockerode@4.0.2: + dependencies: + '@balena/dockerignore': 1.0.2 + docker-modem: 5.0.3 + tar-fs: 2.0.1 + transitivePeerDependencies: + - supports-color + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -8301,12 +8692,19 @@ snapshots: emoji-regex@9.2.2: {} + emojis-list@3.0.0: {} + enabled@2.0.0: {} end-of-stream@1.4.4: dependencies: once: 1.4.0 + enhanced-resolve@5.16.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + entities@4.5.0: {} env-paths@3.0.0: {} @@ -8447,6 +8845,8 @@ snapshots: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 + es-module-lexer@1.5.3: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -8700,6 +9100,11 @@ snapshots: dotenv: 16.0.3 eslint: 8.57.0 + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -8766,6 +9171,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@3.0.3: @@ -8779,6 +9186,8 @@ snapshots: d: 1.0.1 es5-ext: 0.10.62 + events@3.3.0: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -8982,6 +9391,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.3.10: dependencies: foreground-child: 3.1.1 @@ -9437,6 +9848,12 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jest-worker@27.5.1: + dependencies: + '@types/node': 20.12.13 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jose@5.2.2: {} jotai@2.8.2(@types/react@18.3.3)(react@18.3.1): @@ -9492,6 +9909,8 @@ snapshots: difflib: 0.2.4 dreamopt: 0.8.0 + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -9548,6 +9967,14 @@ snapshots: linkifyjs@4.1.3: {} + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + local-pkg@0.5.0: dependencies: mlly: 1.5.0 @@ -9643,7 +10070,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.0 make-error@1.3.6: {} @@ -9787,6 +10214,9 @@ snapshots: dependencies: lru-cache: 7.18.3 + nan@2.19.0: + optional: true + nanoid@3.3.7: {} napi-build-utils@1.0.2: {} @@ -9843,7 +10273,7 @@ snapshots: node-abi@3.54.0: dependencies: - semver: 7.6.2 + semver: 7.6.0 node-addon-api@5.1.0: {} @@ -9855,6 +10285,11 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-loader@2.0.0(webpack@5.91.0): + dependencies: + loader-utils: 2.0.4 + webpack: 5.91.0 + node-plop@0.26.3: dependencies: '@babel/runtime-corejs3': 7.23.9 @@ -10103,8 +10538,6 @@ snapshots: picocolors@1.0.0: {} - picocolors@1.0.1: {} - picomatch@2.3.1: {} pkcs7@1.0.4: @@ -10341,6 +10774,10 @@ snapshots: queue-microtask@1.2.3: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -10590,14 +11027,18 @@ snapshots: dependencies: loose-envify: 1.4.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) + semver@6.3.1: {} semver@7.6.0: dependencies: lru-cache: 6.0.0 - semver@7.6.2: {} - sentence-case@2.1.1: dependencies: no-case: 2.3.2 @@ -10605,6 +11046,10 @@ snapshots: seq-queue@0.0.5: {} + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + server-only@0.0.1: {} set-blocking@2.0.0: {} @@ -10711,10 +11156,20 @@ snapshots: spawn-command@0.0.2: {} + split-ca@1.0.1: {} + sprintf-js@1.1.3: {} sqlstring@2.3.3: {} + ssh2@1.15.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.19.0 + stack-trace@0.0.10: {} stackback@0.0.2: {} @@ -10853,6 +11308,15 @@ snapshots: tabbable@6.2.0: {} + tapable@2.2.1: {} + + tar-fs@2.0.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + tar-fs@2.1.1: dependencies: chownr: 1.1.4 @@ -10877,6 +11341,22 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + terser-webpack-plugin@5.3.10(webpack@5.91.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.0 + webpack: 5.91.0 + + terser@5.31.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -11024,6 +11504,8 @@ snapshots: turbo-windows-64: 1.13.3 turbo-windows-arm64: 1.13.3 + tweetnacl@0.14.5: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -11127,7 +11609,7 @@ snapshots: dependencies: browserslist: 4.23.0 escalade: 3.1.2 - picocolors: 1.0.1 + picocolors: 1.0.0 update-check@1.5.4: dependencies: @@ -11227,13 +11709,13 @@ snapshots: dependencies: global: 4.4.0 - vite-node@1.6.0(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1): + vite-node@1.6.0(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1) + vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - less @@ -11244,18 +11726,18 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0)): dependencies: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) optionalDependencies: - vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1) + vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) transitivePeerDependencies: - supports-color - typescript - vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1): + vite@5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 @@ -11265,8 +11747,9 @@ snapshots: fsevents: 2.3.3 sass: 1.77.2 sugarss: 4.0.1(postcss@8.4.38) + terser: 5.31.0 - vitest@1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1): + vitest@1.6.0(@types/node@20.12.13)(@vitest/ui@1.6.0)(jsdom@24.1.0)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -11285,8 +11768,8 @@ snapshots: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.3 - vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1) - vite-node: 1.6.0(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1) + vite: 5.2.6(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) + vite-node: 1.6.0(@types/node@20.12.13)(sass@1.77.2)(sugarss@4.0.1)(terser@5.31.0) why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.12.13 @@ -11307,6 +11790,11 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -11315,6 +11803,39 @@ snapshots: webidl-conversions@7.0.0: {} + webpack-sources@3.2.3: {} + + webpack@5.91.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.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.16.1 + es-module-lexer: 1.5.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.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.91.0) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3