From ac8267b431f599137d756bb2b5d372fc7721476a Mon Sep 17 00:00:00 2001 From: sai80082 Date: Mon, 29 Dec 2025 21:31:41 +0530 Subject: [PATCH 01/29] feat: Importing shared assets - Implemented `upload.ts` for handling the upload of shared assets, including validation and error handling. - Created `video.ts` for proxying video playback requests from shared assets. - Developed `import-shared.tsx` page for importing shared albums, including UI for asset selection and album creation options. - Updated album asset schema to use more descriptive field names (`albumId` and `assetId`). --- bun.lockb | Bin 490115 -> 501396 bytes package.json | 1 + src/config/constants/sidebarNavs.tsx | 7 +- .../api/albums/potential-albums-assets.ts | 4 +- src/pages/api/import-shared.ts | 222 +++++ src/pages/api/import-shared/helpers.ts | 63 ++ src/pages/api/import-shared/thumbnail.ts | 87 ++ src/pages/api/import-shared/upload-all.ts | 518 +++++++++++ src/pages/api/import-shared/upload.ts | 174 ++++ src/pages/api/import-shared/video.ts | 95 ++ src/pages/assets/import-shared.tsx | 814 ++++++++++++++++++ src/schema/albumAssetsAssets.schema.ts | 4 +- 12 files changed, 1984 insertions(+), 5 deletions(-) create mode 100644 src/pages/api/import-shared.ts create mode 100644 src/pages/api/import-shared/helpers.ts create mode 100644 src/pages/api/import-shared/thumbnail.ts create mode 100644 src/pages/api/import-shared/upload-all.ts create mode 100644 src/pages/api/import-shared/upload.ts create mode 100644 src/pages/api/import-shared/video.ts create mode 100644 src/pages/assets/import-shared.tsx diff --git a/bun.lockb b/bun.lockb index f6133adbc69ad5e7cc7fcab1dd5887b36eb046c2..cdde689296782592bbcde7988c8ac0f1642642f3 100755 GIT binary patch delta 97609 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%0AaYO&S;jA0`Eji;i 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 delta 95002 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 Qy7zsl>P|Kz<^|38KP`}{qyPW_ diff --git a/package.json b/package.json index 4574803..f84a5d9 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "date-fns": "^3.6.0", "drizzle-orm": "^0.33.0", "jsonwebtoken": "^9.0.2", + "jszip": "^3.10.1", "leaflet": "^1.9.4", "leaflet-defaulticon-compatibility": "0.1.2", "leaflet.heat": "^0.2.0", diff --git a/src/config/constants/sidebarNavs.tsx b/src/config/constants/sidebarNavs.tsx index 6b95734..27c1834 100644 --- a/src/config/constants/sidebarNavs.tsx +++ b/src/config/constants/sidebarNavs.tsx @@ -1,4 +1,4 @@ -import { Copy, GalleryHorizontal, GalleryVerticalEnd, Image as ImageIcon, MapPin, MapPinX, Rewind, Search, User, Video } from "lucide-react"; +import { Copy, GalleryHorizontal, GalleryVerticalEnd, Image as ImageIcon, MapPin, MapPinX, Rewind, Search, Share2, User, Video } from "lucide-react"; export const sidebarNavs = [ // { @@ -36,6 +36,11 @@ export const sidebarNavs = [ link: "/albums", icon: , }, + { + title: "Import shared", + link: "/assets/import-shared", + icon: , + }, { title: "Geo Heatmap", diff --git a/src/pages/api/albums/potential-albums-assets.ts b/src/pages/api/albums/potential-albums-assets.ts index 75c98c2..01558a2 100644 --- a/src/pages/api/albums/potential-albums-assets.ts +++ b/src/pages/api/albums/potential-albums-assets.ts @@ -27,12 +27,12 @@ const SELECT_ORPHAN_PHOTOS = (date: string, ownerId: string) => asset a LEFT JOIN album_asset aaa - ON a.id = aaa."assetsId" + ON a.id = aaa."assetId" LEFT JOIN asset_exif e ON a.id = e."assetId" WHERE - aaa."albumsId" IS NULL + aaa."albumId" IS NULL AND a."ownerId" = '${ownerId}' AND e."dateTimeOriginal"::date = '${date}' AND a."visibility" = 'timeline' diff --git a/src/pages/api/import-shared.ts b/src/pages/api/import-shared.ts new file mode 100644 index 0000000..d333125 --- /dev/null +++ b/src/pages/api/import-shared.ts @@ -0,0 +1,222 @@ +import type { NextApiRequest, NextApiResponse } from "next"; + +interface IAlbumContributorCount { + userId: string; + assetCount: number; +} + +interface ImmichOwner { + name?: string | null; + email?: string | null; +} + +interface ImmichExifInfo { + city?: string | null; + state?: string | null; + country?: string | null; + description?: string | null; + fileSizeInByte?: number | null; +} + +interface ImmichAsset { + id: string; + originalFileName: string; + type: string; + fileCreatedAt?: string | null; + localDateTime?: string | null; + thumbhash?: string | null; + exifInfo?: ImmichExifInfo | null; +} + +interface ImmichAlbumResponse { + albumName: string; + assetCount?: number; + owner?: ImmichOwner | null; + description?: string | null; + startDate?: string | null; + endDate?: string | null; + shared?: boolean; + hasSharedLink?: boolean; + lastModifiedAssetTimestamp?: string | null; + order?: string | null; + contributorCounts?: IAlbumContributorCount[]; + assets: ImmichAsset[]; +} + +interface ImmichSharedLinkResponse { + id: string; + key: string; + type: string; + createdAt: string; + expiresAt?: string | null; + allowUpload?: boolean; + allowDownload?: boolean; + showMetadata?: boolean; + album?: { id: string } | null; +} + +interface IImportSharedAsset { + id: string; + originalFileName: string; + type: string; + fileCreatedAt?: string | null; + localDateTime?: string | null; + description?: string | null; + location?: string | null; + thumbhash?: string | null; + fileSizeInByte?: number | null; +} + +interface IImportSharedAlbum { + albumName: string; + assetCount: number; + owner?: ImmichOwner | null; + description?: string | null; + startDate?: string | null; + endDate?: string | null; + shared?: boolean; + hasSharedLink?: boolean; + lastModifiedAssetTimestamp?: string | null; + order?: string | null; + contributorCounts?: IAlbumContributorCount[]; + assets: IImportSharedAsset[]; +} + +interface IImportSharedResponse { + link: string; + origin: string; + key: string; + sharedLink: { + id: string; + type: string; + createdAt: string; + expiresAt?: string | null; + allowUpload?: boolean; + allowDownload?: boolean; + showMetadata?: boolean; + }; + album: IImportSharedAlbum | null; +} + +const respondWithError = (res: NextApiResponse, status: number, message: string) => { + return res.status(status).json({ error: message }); +}; + +const parseSharedLink = (link: string) => { + const trimmed = link.trim(); + if (!trimmed) { + return null; + } + try { + const url = new URL(trimmed); + const segments = url.pathname.split("/").filter(Boolean); + const key = segments.pop(); + if (!key) { + return null; + } + return { key, origin: url.origin, original: trimmed }; + } catch (_err) { + return null; + } +}; + +const buildLocationString = (exif?: ImmichExifInfo | null) => { + if (!exif) { + return null; + } + const parts = [exif.city, exif.state, exif.country] + .filter((value): value is string => !!value && value.trim().length > 0); + return parts.length > 0 ? parts.join(", ") : null; +}; + +const fetchJson = async (url: string) => { + const response = await fetch(url, { + headers: { accept: "application/json" }, + }); + if (!response.ok) { + throw new Error(`Request failed for ${url} (status ${response.status})`); + } + return (await response.json()) as T; +}; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return respondWithError(res, 405, "Method Not Allowed"); + } + + const payload = typeof req.body === "string" ? JSON.parse(req.body) : req.body; + const link = payload?.link; + + if (!link || typeof link !== "string") { + return respondWithError(res, 400, "A shared album link is required"); + } + + const parsed = parseSharedLink(link); + if (!parsed) { + return respondWithError(res, 400, "Invalid Immich share link"); + } + + try { + const sharedLink = await fetchJson( + `${parsed.origin}/api/shared-links/me?key=${parsed.key}` + ); + + const albumId = sharedLink.album?.id; + let albumResult: IImportSharedAlbum | null = null; + + if (albumId) { + const album = await fetchJson( + `${parsed.origin}/api/albums/${albumId}?key=${parsed.key}&withoutAssets=false` + ); + + const assets = (album.assets || []).map((asset) => ({ + id: asset.id, + originalFileName: asset.originalFileName, + type: asset.type, + fileCreatedAt: asset.fileCreatedAt ?? null, + localDateTime: asset.localDateTime ?? null, + description: asset.exifInfo?.description ?? null, + location: buildLocationString(asset.exifInfo), + thumbhash: asset.thumbhash ?? null, + fileSizeInByte: asset.exifInfo?.fileSizeInByte ?? null, + } satisfies IImportSharedAsset)); + + albumResult = { + albumName: album.albumName, + assetCount: album.assetCount ?? assets.length, + owner: album.owner ?? null, + description: album.description ?? null, + startDate: album.startDate ?? null, + endDate: album.endDate ?? null, + shared: album.shared ?? false, + hasSharedLink: album.hasSharedLink ?? false, + lastModifiedAssetTimestamp: album.lastModifiedAssetTimestamp ?? null, + order: album.order ?? null, + contributorCounts: album.contributorCounts ?? [], + assets, + } satisfies IImportSharedAlbum; + } + + const responseBody: IImportSharedResponse = { + link: parsed.original, + origin: parsed.origin, + key: parsed.key, + sharedLink: { + id: sharedLink.id, + type: sharedLink.type, + createdAt: sharedLink.createdAt, + expiresAt: sharedLink.expiresAt ?? null, + allowUpload: sharedLink.allowUpload ?? false, + allowDownload: sharedLink.allowDownload ?? false, + showMetadata: sharedLink.showMetadata ?? false, + }, + album: albumResult, + }; + + return res.status(200).json(responseBody); + } catch (error: any) { + console.error("Import shared error", error); + return respondWithError(res, 500, error?.message ?? "Failed to import shared album"); + } +} diff --git a/src/pages/api/import-shared/helpers.ts b/src/pages/api/import-shared/helpers.ts new file mode 100644 index 0000000..09aee47 --- /dev/null +++ b/src/pages/api/import-shared/helpers.ts @@ -0,0 +1,63 @@ +import { ENV } from "@/config/environment"; + +export const POWER_TOOLS_TAG_NAME = "immich-power-tools"; + +export type HeadersRecord = Record; + +interface ImmichTagResponse { + id: string; + name: string; +} + +export const ensurePowerToolsTag = async (headers: HeadersRecord) => { + const listResponse = await fetch(`${ENV.IMMICH_URL}/api/tags`, { + headers, + }); + + if (!listResponse.ok) { + throw new Error("Failed to fetch tags from Immich instance"); + } + + const tags = (await listResponse.json()) as ImmichTagResponse[]; + const existing = tags.find((tag) => tag.name === POWER_TOOLS_TAG_NAME); + if (existing) { + return existing; + } + + const createResponse = await fetch(`${ENV.IMMICH_URL}/api/tags`, { + method: "POST", + headers, + body: JSON.stringify({ name: POWER_TOOLS_TAG_NAME }), + }); + + if (!createResponse.ok) { + throw new Error("Failed to create immich-power-tools tag"); + } + + return (await createResponse.json()) as ImmichTagResponse; +}; + +export const tagAssetWithPowerTools = async ( + tagId: string, + assetId: string, + headers: HeadersRecord +) => { + const taggingHeaders: HeadersRecord = { + ...headers, + "Content-Type": "application/json", + Accept: "application/json", + }; + + const tagResponse = await fetch(`${ENV.IMMICH_URL}/api/tags/assets`, { + method: "PUT", + headers: taggingHeaders, + body: JSON.stringify({ tagIds: [tagId], assetIds: [assetId] }), + }); + + if (!tagResponse.ok) { + const errorBody = await tagResponse.text().catch(() => ""); + throw new Error( + `Failed to tag uploaded asset (status ${tagResponse.status}): ${errorBody || "Unknown error"}` + ); + } +}; \ No newline at end of file diff --git a/src/pages/api/import-shared/thumbnail.ts b/src/pages/api/import-shared/thumbnail.ts new file mode 100644 index 0000000..eaed1f8 --- /dev/null +++ b/src/pages/api/import-shared/thumbnail.ts @@ -0,0 +1,87 @@ +import type { NextApiRequest, NextApiResponse } from "next"; + +const respondWithError = (res: NextApiResponse, status: number, message: string) => { + return res.status(status).json({ error: message }); +}; + +const ALLOWED_SIZES = new Set(["thumbnail", "preview"]); + +const validateParams = (req: NextApiRequest) => { + const { origin, assetId, key, thumbhash, size } = req.query; + + if (!origin || Array.isArray(origin)) { + return { error: "Query parameter 'origin' is required" }; + } + if (!assetId || Array.isArray(assetId)) { + return { error: "Query parameter 'assetId' is required" }; + } + if (!key || Array.isArray(key)) { + return { error: "Query parameter 'key' is required" }; + } + + let resolvedSize = "thumbnail"; + if (typeof size === "string") { + resolvedSize = size; + } else if (Array.isArray(size)) { + return { error: "Query parameter 'size' must be a single value" }; + } + + if (!ALLOWED_SIZES.has(resolvedSize)) { + return { error: "Query parameter 'size' must be either 'thumbnail' or 'preview'" }; + } + + try { + const parsedOrigin = new URL(origin); + return { + origin: parsedOrigin.origin, + assetId, + key, + size: resolvedSize, + thumbhash: typeof thumbhash === "string" ? thumbhash : undefined, + }; + } catch (_err) { + return { error: "Invalid origin provided" }; + } +}; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "GET") { + res.setHeader("Allow", "GET"); + return respondWithError(res, 405, "Method Not Allowed"); + } + + const params = validateParams(req); + if ("error" in params) { + return respondWithError(res, 400, params.error); + } + + const search = new URLSearchParams({ key: params.key, size: params.size }); + if (params.thumbhash) { + search.set("c", params.thumbhash); + } + + try { + const response = await fetch( + `${params.origin}/api/assets/${params.assetId}/thumbnail?${search.toString()}`, + { + headers: { + accept: "image/*", + }, + } + ); + + if (!response.ok) { + return respondWithError(res, response.status, "Failed to fetch thumbnail"); + } + + const arrayBuffer = await response.arrayBuffer(); + const contentType = response.headers.get("content-type") ?? "image/jpeg"; + + res.setHeader("Content-Type", contentType); + res.setHeader("Cache-Control", "public, max-age=60"); + return res.status(200).send(Buffer.from(arrayBuffer)); + } catch (error: any) { + console.error("Thumbnail proxy error", error); + return respondWithError(res, 500, error?.message ?? "Thumbnail proxy failed"); + } +} diff --git a/src/pages/api/import-shared/upload-all.ts b/src/pages/api/import-shared/upload-all.ts new file mode 100644 index 0000000..1fae509 --- /dev/null +++ b/src/pages/api/import-shared/upload-all.ts @@ -0,0 +1,518 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { ENV } from "@/config/environment"; +import { getCurrentUser } from "@/handlers/serverUtils/user.utils"; +import { getUserHeaders } from "@/helpers/user.helper"; +import { + HeadersRecord, + ensurePowerToolsTag, + tagAssetWithPowerTools, +} from "./helpers"; + +interface ISharedAssetPayload { + id: string; + originalFileName?: string; + type: string; + fileCreatedAt?: string | null; + localDateTime?: string | null; + duration?: string | null; + isFavorite?: boolean; + isArchived?: boolean; +} + +interface IAlbumImportOptions { + createAlbum: boolean; + albumName?: string; + addToAlbumId?: string; +} + +interface IImportAllPayload { + origin: string; + key: string; + assets: ISharedAssetPayload[]; + albumOptions?: IAlbumImportOptions | null; +} + +interface IFailureDetail { + assetId: string; + reason: string; +} + +interface DownloadedAssetPayload { + buffer: Buffer; + fileName: string; + contentType: string | null; +} + +const DEVICE_ID = "immich-power-tools"; +const ALLOWED_ASSET_TYPES = new Set(["IMAGE", "VIDEO"]); +const CONCURRENT_TRANSFERS = 4; +const makeDeviceAssetId = (assetId: string) => `shared-${assetId}`; + +const respondWithError = (res: NextApiResponse, status: number, message: string) => { + return res.status(status).json({ error: message }); +}; + +const parseBody = (req: NextApiRequest) => { + try { + return typeof req.body === "string" ? JSON.parse(req.body) : req.body; + } catch (_error) { + return null; + } +}; + +const normalizeAlbumOptions = (value: any): IAlbumImportOptions => { + if (!value || typeof value !== "object") { + return { createAlbum: false }; + } + + const createAlbum = Boolean(value.createAlbum); + const addToAlbumId = typeof value.addToAlbumId === "string" && value.addToAlbumId.trim().length > 0 ? value.addToAlbumId.trim() : undefined; + + if (!createAlbum && !addToAlbumId) { + return { createAlbum: false }; + } + + const albumName = + typeof value.albumName === "string" && value.albumName.trim().length > 0 + ? value.albumName.trim() + : undefined; + + return { + createAlbum, + albumName, + addToAlbumId, + }; +}; + +const normalizeAssetPayload = (value: any): ISharedAssetPayload | null => { + if (!value || typeof value !== "object") { + return null; + } + if (!value.id || typeof value.id !== "string") { + return null; + } + if (!value.type || typeof value.type !== "string") { + return null; + } + return { + id: value.id, + originalFileName: typeof value.originalFileName === "string" ? value.originalFileName : undefined, + type: value.type, + fileCreatedAt: value.fileCreatedAt ?? null, + localDateTime: value.localDateTime ?? null, + duration: value.duration ?? null, + isFavorite: value.isFavorite ?? false, + isArchived: value.isArchived ?? false, + }; +}; + +const validatePayload = (payload: any) => { + if (!payload || typeof payload !== "object") { + return { error: "Invalid request payload" }; + } + + const { origin, key, assets } = payload as IImportAllPayload; + const normalizedAlbumOptions = normalizeAlbumOptions((payload as IImportAllPayload).albumOptions); + + if (!origin || typeof origin !== "string") { + return { error: "Field 'origin' is required" }; + } + if (!key || typeof key !== "string") { + return { error: "Field 'key' is required" }; + } + if (!Array.isArray(assets) || assets.length === 0) { + return { error: "Field 'assets' must include at least one entry" }; + } + + let parsedOrigin: URL; + try { + parsedOrigin = new URL(origin.trim()); + } catch (_err) { + return { error: "Invalid origin provided" }; + } + + const normalizedAssets = assets + .map(normalizeAssetPayload) + .filter((asset): asset is ISharedAssetPayload => !!asset); + + if (normalizedAssets.length === 0) { + return { error: "No valid assets provided" }; + } + + return { + origin: parsedOrigin.origin, + key, + assets: normalizedAssets, + albumOptions: normalizedAlbumOptions, + }; +}; + +const inferAssetTypeFromName = (fileName: string): "IMAGE" | "VIDEO" => { + const extension = fileName.split(".").pop()?.toLowerCase(); + if (!extension) { + return "IMAGE"; + } + switch (extension) { + case "mp4": + case "mov": + case "m4v": + case "avi": + case "mkv": + case "webm": + case "3gp": + case "3g2": + case "mts": + case "m2ts": + return "VIDEO"; + default: + return "IMAGE"; + } +}; + +const parseFileNameFromDisposition = (disposition?: string | null) => { + if (!disposition) { + return null; + } + const match = disposition.match(/filename\*?=([^;]+)/i); + if (!match || !match[1]) { + return null; + } + const value = match[1].trim().replace(/^UTF-8''/i, "").replace(/^"|"$/g, "").replace(/^'|'$/g, ""); + try { + return decodeURIComponent(value); + } catch (_error) { + return value; + } +}; + +const guessContentType = (fileName: string) => { + const lower = fileName.toLowerCase(); + const extension = lower.split(".").pop(); + switch (extension) { + case "jpg": + case "jpeg": + case "jfif": + return "image/jpeg"; + case "png": + return "image/png"; + case "heic": + return "image/heic"; + case "heif": + return "image/heif"; + case "webp": + return "image/webp"; + case "gif": + return "image/gif"; + case "tif": + case "tiff": + return "image/tiff"; + case "bmp": + return "image/bmp"; + case "mp4": + case "m4v": + return "video/mp4"; + case "mov": + return "video/quicktime"; + case "avi": + return "video/x-msvideo"; + case "mkv": + return "video/x-matroska"; + case "webm": + return "video/webm"; + case "3gp": + case "3g2": + return "video/3gpp"; + case "mts": + case "m2ts": + return "video/MP2T"; + default: + return "application/octet-stream"; + } +}; + +const createImmichAlbum = async (albumName: string, headers: HeadersRecord) => { + const response = await fetch(`${ENV.IMMICH_URL}/api/albums`, { + method: "POST", + headers, + body: JSON.stringify({ albumName }), + }); + + if (!response.ok) { + const body = await response.text().catch(() => ""); + throw new Error( + `Failed to create album "${albumName}" (status ${response.status}): ${body || "Unknown error"}` + ); + } + + const album = await response.json().catch(() => null); + const albumId = album?.id; + if (!albumId || typeof albumId !== "string") { + throw new Error("Immich album creation response did not include an id"); + } + return albumId; +}; + +const addAssetToAlbum = async (albumId: string, assetId: string, headers: HeadersRecord) => { + const response = await fetch(`${ENV.IMMICH_URL}/api/albums/${albumId}/assets`, { + method: "PUT", + headers, + body: JSON.stringify({ ids: [assetId] }), + }); + + if (!response.ok) { + const body = await response.text().catch(() => ""); + throw new Error( + `Failed to attach asset ${assetId} to album ${albumId} (status ${response.status}): ${ + body || "Unknown error" + }` + ); + } +}; + +const downloadSharedAsset = async ( + asset: ISharedAssetPayload, + origin: string, + key: string +): Promise => { + const url = `${origin}/api/assets/${asset.id}/original?key=${key}`; + const response = await fetch(url, { + method: "GET", + headers: { + accept: "*/*", + }, + }); + + if (!response.ok) { + throw new Error(`Failed to download ${asset.originalFileName ?? asset.id} (status ${response.status})`); + } + + const buffer = Buffer.from(await response.arrayBuffer()); + const disposition = response.headers.get("content-disposition"); + const inferredName = parseFileNameFromDisposition(disposition); + const fallbackExtension = asset.type === "VIDEO" ? "mp4" : "jpg"; + const fileName = inferredName ?? asset.originalFileName ?? `${asset.id}.${fallbackExtension}`; + + return { + buffer, + fileName, + contentType: response.headers.get("content-type"), + }; +}; + +const uploadAssetBuffer = async ( + asset: ISharedAssetPayload, + payload: DownloadedAssetPayload, + uploadHeaders: HeadersRecord, + jsonHeaders: HeadersRecord, + tagId: string +) => { + const fileType = asset.type ?? inferAssetTypeFromName(payload.fileName); + const resolvedFileName = payload.fileName || asset.originalFileName || `${asset.id}.bin`; + const contentType = payload.contentType ?? guessContentType(resolvedFileName); + const blob = new Blob([payload.buffer], { type: contentType }); + const createdAt = asset.fileCreatedAt ?? asset.localDateTime ?? new Date().toISOString(); + const modifiedAt = asset.localDateTime ?? asset.fileCreatedAt ?? createdAt; + + const formData = new FormData(); + formData.set("deviceAssetId", makeDeviceAssetId(asset.id)); + formData.set("deviceId", DEVICE_ID); + formData.set("fileCreatedAt", createdAt); + formData.set("fileModifiedAt", modifiedAt); + formData.set("fileType", fileType); + formData.set("duration", asset.duration ?? "0:00:00.000000"); + formData.set("assetData", blob, resolvedFileName); + + if (asset.isArchived) { + formData.set("isArchived", String(asset.isArchived)); + } + if (asset.isFavorite) { + formData.set("isFavorite", String(asset.isFavorite)); + } + + const uploadResponse = await fetch(`${ENV.IMMICH_URL}/api/assets`, { + method: "POST", + headers: uploadHeaders, + body: formData, + }); + + if (!uploadResponse.ok) { + const body = await uploadResponse.text().catch(() => ""); + throw new Error( + `Upload failed for ${asset.originalFileName ?? asset.id} (status ${uploadResponse.status}): ${ + body || "Unknown error" + }` + ); + } + + const uploaded = await uploadResponse.json(); + const uploadedId = uploaded?.id; + if (!uploadedId) { + throw new Error("Immich upload response did not include an asset id"); + } + + await tagAssetWithPowerTools(tagId, uploadedId, jsonHeaders); + return uploadedId; +}; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return respondWithError(res, 405, "Method Not Allowed"); + } + + if (!ENV.IMMICH_URL) { + return respondWithError(res, 500, "IMMICH_URL must be configured"); + } + + const currentUser = await getCurrentUser(req); + if (!currentUser) { + return respondWithError(res, 401, "Unauthorized"); + } + + const payload = parseBody(req); + const validation = validatePayload(payload); + if ("error" in validation) { + return respondWithError(res, 400, validation.error ?? "Validation failed"); + } + + const { origin, key, assets, albumOptions } = validation; + const uploadableAssets = assets.filter((asset) => ALLOWED_ASSET_TYPES.has(asset.type)); + const normalizedAlbumOptions = albumOptions ?? { createAlbum: false }; + if (uploadableAssets.length === 0) { + return respondWithError(res, 400, "No image or video assets available to import"); + } + + const jsonHeaders = getUserHeaders(currentUser) as HeadersRecord; + const jsonHeadersWithContentType: HeadersRecord = { + ...jsonHeaders, + "Content-Type": "application/json", + }; + + const deviceAssetIds: string[] = []; + const deviceAssetIdLookup = new Map(); + for (const asset of uploadableAssets) { + const deviceAssetId = makeDeviceAssetId(asset.id); + deviceAssetIds.push(deviceAssetId); + deviceAssetIdLookup.set(deviceAssetId.toLowerCase(), asset.id); + } + + const existingAssetIds = new Set(); + if (deviceAssetIds.length > 0) { + try { + const checkResponse = await fetch(`${ENV.IMMICH_URL}/api/assets/exist`, { + method: "POST", + headers: jsonHeadersWithContentType, + body: JSON.stringify({ + deviceAssetIds, + deviceId: DEVICE_ID, + }), + }); + + if (checkResponse.ok) { + const existPayload = await checkResponse.json().catch(() => ({})); + const existingIds: string[] = existPayload?.existingIds ?? []; + for (const deviceAssetId of existingIds) { + if (typeof deviceAssetId !== "string") { + continue; + } + const normalizedId = deviceAssetId.toLowerCase(); + const matchedAssetId = deviceAssetIdLookup.get(normalizedId); + if (matchedAssetId) { + existingAssetIds.add(matchedAssetId); + } + } + } else { + console.warn(`Failed to check existing assets before import (status ${checkResponse.status})`); + } + } catch (error) { + console.warn("Unable to check existing assets before import", error); + } + } + + const assetsToImport = uploadableAssets.filter((asset) => !existingAssetIds.has(asset.id)); + const skippedAssetIds = uploadableAssets + .filter((asset) => existingAssetIds.has(asset.id)) + .map((asset) => asset.id); + + if (assetsToImport.length === 0) { + return res.status(200).json({ + uploadedIds: [], + processedAssetIds: [], + uploadedCount: 0, + failed: [], + requestedCount: 0, + skippedAssetIds, + }); + } + + if (skippedAssetIds.length) { + console.log(`Skipping ${skippedAssetIds.length} assets already stored in Immich`); + } + + let targetAlbumId: string | null = null; + if (normalizedAlbumOptions.createAlbum) { + const desiredAlbumName = + normalizedAlbumOptions.albumName?.trim() || `Shared import ${new Date().toISOString()}`; + try { + targetAlbumId = await createImmichAlbum(desiredAlbumName, jsonHeadersWithContentType); + console.log(`Created Immich album ${targetAlbumId} for shared import (${desiredAlbumName})`); + } catch (error: any) { + console.error("Failed to create Immich album for import", error); + return respondWithError(res, 500, error?.message ?? "Unable to create Immich album"); + } + } else if (normalizedAlbumOptions.addToAlbumId) { + targetAlbumId = normalizedAlbumOptions.addToAlbumId; + } + + const assetIds = assetsToImport.map((asset) => asset.id); + console.log( + `Starting per-asset import for ${assetIds.length} assets (concurrency ${Math.min( + CONCURRENT_TRANSFERS, + assetsToImport.length + )})` + ); + + const { ["Content-Type"]: _omitContentType, ...uploadHeaders } = jsonHeaders; + const tag = await ensurePowerToolsTag(jsonHeaders); + + const uploadedImmichIds: string[] = []; + const processedAssetIds: string[] = []; + const failed: IFailureDetail[] = []; + + let currentIndex = 0; + const concurrency = Math.min(CONCURRENT_TRANSFERS, assetsToImport.length); + + const worker = async () => { + while (true) { + const index = currentIndex++; + if (index >= assetsToImport.length) { + break; + } + + const asset = assetsToImport[index]; + try { + const downloaded = await downloadSharedAsset(asset, origin, key); + const uploadedId = await uploadAssetBuffer(asset, downloaded, uploadHeaders, jsonHeaders, tag.id); + if (targetAlbumId) { + await addAssetToAlbum(targetAlbumId, uploadedId, jsonHeadersWithContentType); + } + uploadedImmichIds.push(uploadedId); + processedAssetIds.push(asset.id); + } catch (error: any) { + failed.push({ assetId: asset.id, reason: error?.message ?? "Upload failed" }); + } + } + }; + + await Promise.all(Array.from({ length: concurrency }, worker)); + + return res.status(200).json({ + uploadedIds: uploadedImmichIds, + processedAssetIds, + uploadedCount: uploadedImmichIds.length, + failed, + requestedCount: assetsToImport.length, + skippedAssetIds, + albumId: targetAlbumId, + }); +} diff --git a/src/pages/api/import-shared/upload.ts b/src/pages/api/import-shared/upload.ts new file mode 100644 index 0000000..a1c16c8 --- /dev/null +++ b/src/pages/api/import-shared/upload.ts @@ -0,0 +1,174 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { ENV } from "@/config/environment"; +import { getCurrentUser } from "@/handlers/serverUtils/user.utils"; +import { getUserHeaders } from "@/helpers/user.helper"; +import { + HeadersRecord, + ensurePowerToolsTag, + tagAssetWithPowerTools, +} from "./helpers"; + +const respondWithError = (res: NextApiResponse, status: number, message: string) => { + return res.status(status).json({ error: message }); +}; + +const parseBody = (req: NextApiRequest) => { + try { + return typeof req.body === "string" ? JSON.parse(req.body) : req.body; + } catch (error) { + return null; + } +}; + +const validatePayload = (payload: any) => { + const { assetId, origin, key } = payload || {}; + if (!assetId || typeof assetId !== "string") { + return { error: "Field 'assetId' is required" }; + } + if (!origin || typeof origin !== "string") { + return { error: "Field 'origin' is required" }; + } + if (!key || typeof key !== "string") { + return { error: "Field 'key' is required" }; + } + + let parsedOrigin: URL | null = null; + try { + parsedOrigin = new URL(origin); + } catch (_err) { + return { error: "Invalid origin provided" }; + } + + return { + assetId, + key, + origin: parsedOrigin.origin, + }; +}; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + return respondWithError(res, 405, "Method Not Allowed"); + } + + if (!ENV.IMMICH_URL) { + return respondWithError(res, 500, "IMMICH_URL must be configured"); + } + + const currentUser = await getCurrentUser(req); + if (!currentUser) { + return respondWithError(res, 401, "Unauthorized"); + } + + const payload = parseBody(req); + if (!payload) { + return respondWithError(res, 400, "Invalid request payload"); + } + + const jsonHeaders = getUserHeaders(currentUser) as HeadersRecord; + + const validation = validatePayload(payload); + if ("error" in validation) { + return respondWithError(res, 400, validation.error); + } + + const params = validation; + + try { + const assetResponse = await fetch( + `${params.origin}/api/assets/${params.assetId}?key=${params.key}`, + { + headers: { + accept: "application/json", + }, + } + ); + + if (!assetResponse.ok) { + return respondWithError(res, assetResponse.status, "Failed to fetch remote asset metadata"); + } + + const asset = await assetResponse.json(); + + if (!asset || asset.type !== "IMAGE") { + return respondWithError(res, 400, "Only photo assets can be uploaded from this view"); + } + + const originalResponse = await fetch( + `${params.origin}/api/assets/${params.assetId}/original?key=${params.key}`, + { + headers: { + accept: "application/octet-stream", + }, + } + ); + + if (!originalResponse.ok) { + return respondWithError(res, originalResponse.status, "Failed to download original asset data"); + } + + const contentType = originalResponse.headers.get("content-type") ?? "application/octet-stream"; + const originalBuffer = await originalResponse.arrayBuffer(); + const assetBlob = new Blob([originalBuffer], { type: contentType }); + const fileName = asset.originalFileName ?? `${params.assetId}.bin`; + + const createdAt = asset.fileCreatedAt ?? asset.localDateTime ?? new Date().toISOString(); + const modifiedAt = asset.localDateTime ?? asset.fileCreatedAt ?? createdAt; + + const formData = new FormData(); + formData.set("deviceAssetId", `shared-${params.assetId}`); + formData.set("deviceId", "immich-power-tools"); + formData.set("fileCreatedAt", createdAt); + formData.set("fileModifiedAt", modifiedAt); + formData.set("fileType", asset.type ?? "IMAGE"); + formData.set("duration", asset.duration ?? "0:00:00.000000"); + formData.set("assetData", assetBlob, fileName); + + if (asset.isArchived) { + formData.set("isArchived", asset.isArchived.toString()); + } + if (asset.isFavorite) { + formData.set("isFavorite", asset.isFavorite.toString()); + } + + const { ["Content-Type"]: _omitContentType, ...uploadHeaders } = jsonHeaders; + + const uploadResponse = await fetch(`${ENV.IMMICH_URL}/api/assets`, { + method: "POST", + headers: uploadHeaders, + body: formData, + }); + + if (!uploadResponse.ok) { + const errorBody = await uploadResponse.text(); + console.error("Immich upload error", uploadResponse.status, errorBody); + return respondWithError(res, uploadResponse.status, "Failed to upload asset to Immich instance"); + } + + const uploaded = await uploadResponse.json(); + const uploadedAssetId = uploaded?.id; + + if (!uploadedAssetId) { + throw new Error("Immich upload response did not include an asset id"); + } + + const tagHeaders: HeadersRecord = { + ...jsonHeaders, + Accept: "application/json", + }; + + const tag = await ensurePowerToolsTag(tagHeaders); + await tagAssetWithPowerTools(tag.id, uploadedAssetId, tagHeaders); + + return res.status(200).json({ + status: "uploaded", + immichId: uploadedAssetId, + deviceAssetId: `shared-${params.assetId}`, + tagId: tag.id, + }); + } catch (error: any) { + console.error("Upload shared asset error", error); + return respondWithError(res, 500, error?.message ?? "Unexpected error while uploading asset"); + } +} diff --git a/src/pages/api/import-shared/video.ts b/src/pages/api/import-shared/video.ts new file mode 100644 index 0000000..3682338 --- /dev/null +++ b/src/pages/api/import-shared/video.ts @@ -0,0 +1,95 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { Readable } from "stream"; + +const respondWithError = (res: NextApiResponse, status: number, message: string) => { + return res.status(status).json({ error: message }); +}; + +const validateParams = (req: NextApiRequest) => { + const { origin, assetId, key, thumbhash } = req.query; + + if (!origin || Array.isArray(origin)) { + return { error: "Query parameter 'origin' is required" }; + } + if (!assetId || Array.isArray(assetId)) { + return { error: "Query parameter 'assetId' is required" }; + } + if (!key || Array.isArray(key)) { + return { error: "Query parameter 'key' is required" }; + } + + try { + const parsedOrigin = new URL(origin); + return { + origin: parsedOrigin.origin, + assetId, + key, + thumbhash: typeof thumbhash === "string" ? thumbhash : undefined, + }; + } catch (_err) { + return { error: "Invalid origin provided" }; + } +}; + +const passthroughHeaders = [ + "content-type", + "content-length", + "content-range", + "accept-ranges", + "cache-control", +]; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "GET") { + res.setHeader("Allow", "GET"); + return respondWithError(res, 405, "Method Not Allowed"); + } + + const params = validateParams(req); + if ("error" in params) { + return respondWithError(res, 400, params.error); + } + + const search = new URLSearchParams({ key: params.key }); + if (params.thumbhash) { + search.set("c", params.thumbhash); + } + + const targetUrl = `${params.origin}/api/assets/${params.assetId}/video/playback?${search.toString()}`; + + try { + const upstream = await fetch(targetUrl, { + headers: { + accept: "video/*", + ...(req.headers.range ? { range: req.headers.range } : {}), + referer: req.headers.referer?.toString() ?? params.origin, + "sec-fetch-dest": "video", + }, + }); + + if (!upstream.ok && upstream.status !== 206) { + return respondWithError(res, upstream.status, "Failed to fetch video playback"); + } + + passthroughHeaders.forEach((header) => { + const value = upstream.headers.get(header); + if (value) { + res.setHeader(header, value); + } + }); + + res.status(upstream.status); + + const body = upstream.body; + if (body) { + const nodeStream = Readable.fromWeb(body as any); + nodeStream.pipe(res); + } else { + const buffer = Buffer.from(await upstream.arrayBuffer()); + res.send(buffer); + } + } catch (error: any) { + console.error("Video playback proxy error", error); + return respondWithError(res, 500, error?.message ?? "Video playback proxy failed"); + } +} diff --git a/src/pages/assets/import-shared.tsx b/src/pages/assets/import-shared.tsx new file mode 100644 index 0000000..86843f4 --- /dev/null +++ b/src/pages/assets/import-shared.tsx @@ -0,0 +1,814 @@ +import React, { FormEvent, useEffect, useState } from "react"; +import { Loader2 } from "lucide-react"; +import PageLayout from "@/components/layouts/PageLayout"; +import Header from "@/components/shared/Header"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Input } from "@/components/ui/input"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Label } from "@/components/ui/label"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { listAlbums } from "@/handlers/api/album.handler"; +import { IAlbum } from "@/types/album"; + +interface IAlbumContributorCount { + userId: string; + assetCount: number; +} + +interface IImportSharedAsset { + id: string; + originalFileName: string; + type: string; + fileCreatedAt?: string | null; + localDateTime?: string | null; + description?: string | null; + location?: string | null; + thumbhash?: string | null; + fileSizeInByte?: number | null; + duration?: string | null; + isFavorite?: boolean; + isArchived?: boolean; +} + +interface IImportSharedAlbum { + albumName: string; + assetCount: number; + owner?: { + name?: string | null; + email?: string | null; + } | null; + description?: string | null; + startDate?: string | null; + endDate?: string | null; + shared?: boolean; + hasSharedLink?: boolean; + lastModifiedAssetTimestamp?: string | null; + order?: string | null; + contributorCounts?: IAlbumContributorCount[]; + assets: IImportSharedAsset[]; +} + +interface IImportSharedResponse { + link: string; + origin: string; + key: string; + sharedLink: { + id: string; + type: string; + createdAt: string; + expiresAt?: string | null; + allowUpload?: boolean; + allowDownload?: boolean; + showMetadata?: boolean; + }; + album: IImportSharedAlbum | null; +} + +const formatDate = (value?: string | null) => { + if (!value) { + return "—"; + } + const date = new Date(value); + if (Number.isNaN(date.getTime())) { + return value; + } + return date.toLocaleString(); +}; + +const formatDateOnly = (value?: string | null) => { + if (!value) { + return "—"; + } + const date = new Date(value); + if (Number.isNaN(date.getTime())) { + return value; + } + return date.toLocaleDateString(undefined, { + year: "numeric", + month: "short", + day: "numeric", + }); +}; + +const InfoRow = ({ label, value }: { label: string; value: React.ReactNode }) => ( +
+

{label}

+

{value ?? "—"}

+
+); + +const formatContributors = (counts?: IAlbumContributorCount[]) => { + if (!counts || counts.length === 0) { + return "—"; + } + return counts.map((entry) => `${entry.assetCount} assets`).join(", "); +}; + +const formatPermissions = (link?: IImportSharedResponse["sharedLink"]) => { + if (!link) { + return "View only"; + } + const labels: string[] = []; + if (link.allowDownload) { + labels.push("Download"); + } + if (link.allowUpload) { + labels.push("Upload"); + } + return labels.length ? labels.join(" / ") : "View only"; +}; + +const formatFileSize = (bytes?: number | null) => { + if (!bytes || bytes <= 0) { + return null; + } + const units = ["B", "KB", "MB", "GB", "TB"]; + let size = bytes; + let unit = 0; + while (size >= 1024 && unit < units.length - 1) { + size /= 1024; + unit += 1; + } + return `${size % 1 === 0 ? size : size.toFixed(1)} ${units[unit]}`; +}; + +export default function ImportSharedPage() { + const [shareLink, setShareLink] = useState(""); + const [submittedLink, setSubmittedLink] = useState(null); + const [sharedData, setSharedData] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [activeVideoAsset, setActiveVideoAsset] = useState(null); + const [activeImageAsset, setActiveImageAsset] = useState(null); + const [previewLoading, setPreviewLoading] = useState(false); + const [uploadBanner, setUploadBanner] = useState<{ type: "success" | "error"; message: string } | null>(null); + const [importAllLoading, setImportAllLoading] = useState(false); + const [importAllDialogOpen, setImportAllDialogOpen] = useState(false); + const [albumImportMode, setAlbumImportMode] = useState<"album" | "no-album" | "existing-album">("album"); + const [albumNameInput, setAlbumNameInput] = useState(""); + const [selectedAssetIds, setSelectedAssetIds] = useState>(new Set()); + const [existingAlbums, setExistingAlbums] = useState([]); + const [selectedAlbumId, setSelectedAlbumId] = useState(null); + + useEffect(() => { + if (importAllDialogOpen) { + listAlbums().then(setExistingAlbums).catch(console.error); + } + }, [importAllDialogOpen]); + + useEffect(() => { + if (sharedData?.album?.albumName) { + setAlbumNameInput(sharedData.album.albumName); + } else if (sharedData) { + setAlbumNameInput("Imported shared album"); + } else { + setAlbumNameInput(""); + } + }, [sharedData]); + + const handleSubmit = async (event: FormEvent) => { + event.preventDefault(); + setError(null); + setSharedData(null); + setSubmittedLink(null); + setUploadBanner(null); + setImportAllLoading(false); + setImportAllDialogOpen(false); + setAlbumImportMode("album"); + setAlbumNameInput(""); + setSelectedAssetIds(new Set()); + setSelectedAlbumId(null); + + if (!shareLink.trim()) { + setError("Please paste a shared album link."); + return; + } + + setLoading(true); + try { + const response = await fetch("/api/import-shared", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ link: shareLink }), + }); + + if (!response.ok) { + const errorPayload = await response.json().catch(() => ({})); + throw new Error(errorPayload.error || "Failed to import shared album"); + } + + const payload: IImportSharedResponse = await response.json(); + setSharedData(payload); + setSubmittedLink(payload.link); + setUploadBanner(null); + setImportAllLoading(false); + setAlbumImportMode("album"); + } catch (err) { + const message = err instanceof Error ? err.message : "Unexpected error"; + setError(message); + } finally { + setLoading(false); + } + }; + + const sharedLinkDetails = sharedData?.sharedLink; + const albumDetails = sharedData?.album; + const importableAssetCount = + albumDetails?.assets.filter((asset) => asset.type === "IMAGE" || asset.type === "VIDEO").length ?? 0; + + const buildThumbnailUrl = (asset: IImportSharedAsset) => { + if (!sharedData) { + return null; + } + const params = new URLSearchParams({ + assetId: asset.id, + origin: sharedData.origin, + key: sharedData.key, + size: "thumbnail", + }); + if (asset.thumbhash) { + params.set("thumbhash", asset.thumbhash); + } + return `/api/import-shared/thumbnail?${params.toString()}`; + }; + + const buildVideoPlaybackUrl = (asset: IImportSharedAsset) => { + if (!sharedData) { + return null; + } + const params = new URLSearchParams({ + assetId: asset.id, + origin: sharedData.origin, + key: sharedData.key, + }); + if (asset.thumbhash) { + params.set("thumbhash", asset.thumbhash); + } + return `/api/import-shared/video?${params.toString()}`; + }; + + const buildPreviewUrl = (asset: IImportSharedAsset) => { + if (!sharedData) { + return null; + } + const params = new URLSearchParams({ + assetId: asset.id, + origin: sharedData.origin, + key: sharedData.key, + size: "preview", + }); + if (asset.thumbhash) { + params.set("thumbhash", asset.thumbhash); + } + return `/api/import-shared/thumbnail?${params.toString()}`; + }; + + const handleImportAll = async (options: { createAlbum: boolean; albumName?: string; addToAlbumId?: string }) => { + if (!sharedData || !albumDetails) { + return; + } + let uploadableAssets = albumDetails.assets.filter( + (asset) => asset.type === "IMAGE" || asset.type === "VIDEO" + ); + + if (selectedAssetIds.size > 0) { + uploadableAssets = uploadableAssets.filter((asset) => selectedAssetIds.has(asset.id)); + } + + if (uploadableAssets.length === 0) { + setUploadBanner({ type: "error", message: "No assets selected to import." }); + return; + } + + const normalizedAlbumName = options.createAlbum + ? options.albumName?.trim() || albumDetails.albumName || "Imported shared album" + : undefined; + + const albumOptions = options.createAlbum + ? { createAlbum: true, albumName: normalizedAlbumName } + : options.addToAlbumId + ? { createAlbum: false, addToAlbumId: options.addToAlbumId } + : { createAlbum: false }; + + setUploadBanner(null); + setImportAllLoading(true); + try { + const response = await fetch("/api/import-shared/upload-all", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + origin: sharedData.origin, + key: sharedData.key, + assets: uploadableAssets.map((asset) => ({ + id: asset.id, + originalFileName: asset.originalFileName, + type: asset.type, + fileCreatedAt: asset.fileCreatedAt ?? null, + localDateTime: asset.localDateTime ?? null, + duration: asset.duration ?? null, + isFavorite: asset.isFavorite ?? false, + isArchived: asset.isArchived ?? false, + })), + albumOptions, + }), + }); + + const result = await response.json().catch(() => ({})); + if (!response.ok) { + throw new Error(result.error || "Failed to import shared archive"); + } + + const processedAssetIds: string[] = result.processedAssetIds ?? []; + const skippedAssetIds: string[] = result.skippedAssetIds ?? []; + const failed: { assetId: string; reason?: string }[] = result.failed ?? []; + + const failedCount = failed.length; + const skippedCount = skippedAssetIds.length; + const uploadedCount = result.uploadedCount ?? processedAssetIds.length; + let bannerType: "success" | "error" = failedCount ? "error" : "success"; + let message: string; + if (!uploadedCount && skippedCount && !failedCount) { + message = `All ${skippedCount} assets already exist on Immich.`; + } else if (failedCount) { + const skippedSuffix = skippedCount ? `, ${skippedCount} skipped` : ""; + message = `Imported ${uploadedCount} assets, ${failedCount} failed${skippedSuffix}.`; + } else if (skippedCount) { + message = `Imported ${uploadedCount} assets, skipped ${skippedCount} already on Immich.`; + } else { + message = `Imported ${uploadedCount} assets successfully.`; + } + if (options.createAlbum && uploadedCount > 0 && normalizedAlbumName) { + message = `${message} Added to album "${normalizedAlbumName}".`; + } else if (options.addToAlbumId && uploadedCount > 0) { + const album = existingAlbums.find((a) => a.id === options.addToAlbumId); + message = `${message} Added to album "${album?.albumName || "existing album"}".`; + } + setUploadBanner({ type: bannerType, message }); + } catch (err) { + const message = err instanceof Error ? err.message : "Failed to import shared archive"; + setUploadBanner({ type: "error", message }); + } finally { + setImportAllLoading(false); + } + }; + + return ( + +
{ + setSharedData(null); + setShareLink(""); + setSubmittedLink(null); + setError(null); + setActiveVideoAsset(null); + setActiveImageAsset(null); + setPreviewLoading(false); + setUploadBanner(null); + setImportAllLoading(false); + setImportAllDialogOpen(false); + setAlbumImportMode("album"); + setAlbumNameInput(""); + setSelectedAssetIds(new Set()); + setSelectedAlbumId(null); + }}> + ← Back + + ) : ( + "Import shared" + ) + } + rightComponent={ + sharedData && albumDetails ? ( +
+ {selectedAssetIds.size > 0 && ( + + )} + +
+ ) : null + } + /> +
+
+ {!sharedData && ( + + + Import a shared album + + Paste the shared public link for the album you want to import. + + + +
+
+ + setShareLink(event.target.value)} + placeholder="https://demo.immich.app/share/" + type="url" + required + /> +
+
+ +
+
+ {error && ( +
+ {error} +
+ )} +
+
+ )} + + {sharedLinkDetails && sharedData && albumDetails && ( + + + {albumDetails.albumName} + + + + {albumDetails && ( + <> + + + + + )} + + + )} + + {albumDetails && sharedData && ( + + + Gallery + + + {uploadBanner && ( +
+ {uploadBanner.message} +
+ )} + {albumDetails.description && ( +

{albumDetails.description}

+ )} +
+ {albumDetails.assets.length === 0 && ( +
+ This album has no assets yet. +
+ )} + {albumDetails.assets.map((asset) => { + const formattedSize = formatFileSize(asset.fileSizeInByte); + const thumbnailUrl = buildThumbnailUrl(asset); + const isVideoAsset = asset.type === "VIDEO"; + const isInteractive = true; + const ariaLabel = isVideoAsset + ? `Play video ${asset.originalFileName}` + : `View photo ${asset.originalFileName}`; + const isSelected = selectedAssetIds.has(asset.id); + + return ( +
{ + if (isVideoAsset) { + setActiveImageAsset(null); + setActiveVideoAsset(asset); + setPreviewLoading(false); + } else { + setActiveVideoAsset(null); + setPreviewLoading(true); + setActiveImageAsset(asset); + } + }} + role={isInteractive ? "button" : undefined} + tabIndex={isInteractive ? 0 : undefined} + aria-label={ariaLabel} + onKeyDown={(event) => { + if (!isInteractive) { + return; + } + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + if (isVideoAsset) { + setActiveImageAsset(null); + setActiveVideoAsset(asset); + setPreviewLoading(false); + } else { + setActiveVideoAsset(null); + setPreviewLoading(true); + setActiveImageAsset(asset); + } + } + }} + > +
+
e.stopPropagation()}> + { + const newSelection = new Set(selectedAssetIds); + if (newSelection.has(asset.id)) { + newSelection.delete(asset.id); + } else { + newSelection.add(asset.id); + } + setSelectedAssetIds(newSelection); + }} + className="bg-white/80 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground" + /> +
+ {thumbnailUrl ? ( + {`Thumbnail + ) : ( +
+ No preview +
+ )} + {isVideoAsset && ( +
+
+ ▶ Play +
+
+ )} +
+ + {asset.type} + + {formattedSize && ( + + {formattedSize} + + )} +
+
+
+

+ {asset.originalFileName} +

+

Captured {formatDate(asset.fileCreatedAt || asset.localDateTime)}

+ {asset.location && ( +

{asset.location}

+ )} + {asset.description && ( +

{asset.description}

+ )} +
+
+ ); + })} +
+
+
+ )} +
+
+ { + if (importAllLoading) { + return; + } + setImportAllDialogOpen(open); + }} + > + + + {selectedAssetIds.size > 0 ? "Import selected assets" : "Import all assets"} + + Decide whether to create a new Immich album for these imported assets. + + +
+
+ +
+ + + +
+
+ {albumImportMode === "album" && ( +
+ + setAlbumNameInput(event.target.value)} + placeholder="Imported shared album" + disabled={importAllLoading} + /> +
+ )} + {albumImportMode === "existing-album" && ( +
+ + +
+ )} +
+
+ + +
+
+
+ + { + if (!open) { + setActiveVideoAsset(null); + } + }} + > + + {activeVideoAsset && ( + <> + + {activeVideoAsset.originalFileName} + +
+
+ + )} +
+
+ { + if (!open) { + setActiveImageAsset(null); + setPreviewLoading(false); + } + }} + > + + {activeImageAsset && ( + <> + + {activeImageAsset.originalFileName} + +
+ {activeImageAsset.originalFileName} setPreviewLoading(false)} + onError={() => setPreviewLoading(false)} + /> + {previewLoading && ( +
+ +
+ )} +
+ + )} +
+
+ + ); +} diff --git a/src/schema/albumAssetsAssets.schema.ts b/src/schema/albumAssetsAssets.schema.ts index 5970197..4aabfd5 100644 --- a/src/schema/albumAssetsAssets.schema.ts +++ b/src/schema/albumAssetsAssets.schema.ts @@ -1,7 +1,7 @@ import { pgTable, uuid, timestamp } from 'drizzle-orm/pg-core'; export const albumsAssetsAssets = pgTable('album_asset', { - albumsId: uuid('albumsId').notNull(), - assetsId: uuid('assetsId').notNull(), + albumsId: uuid('albumId').notNull(), + assetsId: uuid('assetId').notNull(), createdAt: timestamp('createdAt', { withTimezone: true }).defaultNow().notNull(), }); \ No newline at end of file From 0821e164efa5f30f5f7e3047e59f14444fa076fd Mon Sep 17 00:00:00 2001 From: sai80082 Date: Mon, 29 Dec 2025 21:39:21 +0530 Subject: [PATCH 02/29] fix: ensure error messages are properly typed in API handlers --- bun.lockb | Bin 501396 -> 499611 bytes package.json | 1 - src/pages/api/import-shared/thumbnail.ts | 2 +- src/pages/api/import-shared/upload.ts | 2 +- src/pages/api/import-shared/video.ts | 2 +- 5 files changed, 3 insertions(+), 4 deletions(-) diff --git a/bun.lockb b/bun.lockb index cdde689296782592bbcde7988c8ac0f1642642f3..e153f664dce406ac127ab869756b6e614e4e0b32 100755 GIT binary patch delta 86066 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 x_hS7ETAF9q`flk{{RaS0R8{~ delta 86547 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 iiHm?@?e0{FiJaGYS4 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 eg7UBb_Qjy$h1QoaL8nKXe6 Date: Fri, 9 Jan 2026 16:18:21 +0530 Subject: [PATCH 03/29] chore: update @radix-ui/react-slot to version 1.2.4 --- package-lock.json | 5091 +++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 4678 insertions(+), 415 deletions(-) diff --git a/package-lock.json b/package-lock.json index a760960..d104bef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,19 @@ { "name": "immich-power-tools", - "version": "0.10.1", + "version": "0.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "immich-power-tools", - "version": "0.10.1", + "version": "0.19.0", "dependencies": { + "@google/generative-ai": "^0.21.0", "@radix-ui/react-accordion": "^1.2.1", + "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.0", "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-context-menu": "^2.2.16", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-hover-card": "^1.1.1", @@ -19,15 +22,20 @@ "@radix-ui/react-popover": "^1.1.1", "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", - "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-tooltip": "^1.1.2", - "@tanstack/react-table": "^8.20.1", + "@remotion/cli": "4.0.232", + "@remotion/eslint-plugin": "^4.0.232", + "@tanstack/react-query": "^5.69.0", + "@tanstack/react-table": "^8.21.3", "@types/cookie": "^0.6.0", "@types/qs": "^6.9.15", + "@types/react-autosuggest": "^10.1.11", "@types/react-calendar-heatmap": "^1.6.7", + "@types/react-window": "^1.8.8", "axios": "^1.7.4", "chrono-node": "^1.4.9", "class-variance-authority": "^0.7.0", @@ -37,24 +45,31 @@ "cookie": "^0.6.0", "date-fns": "^3.6.0", "drizzle-orm": "^0.33.0", + "jsonwebtoken": "^9.0.2", "leaflet": "^1.9.4", + "leaflet-defaulticon-compatibility": "0.1.2", + "leaflet.heat": "^0.2.0", "lucide-react": "^0.428.0", "next": "14.2.5", "next-themes": "^0.3.0", "pg": "^8.12.0", "qs": "^6.13.0", "react": "^18", - "react-calendar-heatmap": "^1.9.0", + "react-autosuggest": "^10.1.0", "react-day-picker": "9.0.8", "react-dom": "^18", "react-grid-gallery": "^1.0.1", + "react-hot-toast": "^2.5.1", "react-leaflet": "^4.2.1", - "react-query": "^3.39.3", + "react-mentions": "^4.4.10", + "react-window": "^1.8.11", "recharts": "^2.12.7", + "remotion": "4.0.232", "sass": "^1.77.8", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", - "yet-another-react-lightbox": "^3.21.4" + "yet-another-react-lightbox": "^3.21.4", + "zod": "^3.24.1" }, "devDependencies": { "@semantic-release/commit-analyzer": "^13.0.0", @@ -62,11 +77,15 @@ "@semantic-release/github": "^10.1.7", "@semantic-release/npm": "^12.0.1", "@semantic-release/release-notes-generator": "^14.0.1", + "@tanstack/eslint-plugin-query": "^5.68.0", "@types/jsonwebtoken": "^9.0.6", + "@types/leaflet": "^1.9.15", + "@types/leaflet.heat": "^0.2.4", "@types/node": "^20", "@types/pg": "^8.11.6", "@types/react": "^18", "@types/react-dom": "^18", + "@types/react-mentions": "^4.4.1", "autoprefixer": "^10.4.20", "drizzle-kit": "^0.24.0", "eslint": "^8", @@ -205,6 +224,18 @@ "node": ">=4" } }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.25.4", "license": "MIT", @@ -241,6 +272,363 @@ "source-map-support": "^0.5.21" } }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -307,6 +695,263 @@ "get-tsconfig": "^4.7.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.6.tgz", + "integrity": "sha512-J3lwhDSXBBppSzm/LC1uZ8yKSIpExc+5T8MxrYD9KNVZG81FOAu2VF2gXi/6A/LwDDQQ+b6DpQbYlo3VwxFepQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.6.tgz", + "integrity": "sha512-pL0Ci8P9q1sWbtPx8CXbc8JvPvvYdJJQ+LO09PLFsbz3aYNdFBGWJjiHU+CaObO4Ames+GOFpXRAJZS2L3ZK/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.6.tgz", + "integrity": "sha512-hE2vZxOlJ05aY28lUpB0y0RokngtZtcUB+TVl9vnLEnY0z/8BicSvrkThg5/iI1rbf8TwXrbr2heEjl9fLf+EA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.6.tgz", + "integrity": "sha512-/tuyl4R+QhhoROQtuQj9E/yfJtZNdv2HKaHwYhhHGQDN1Teziem2Kh7BWQMumfiY7Lu9g5rO7scWdGE4OsQ6MQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.6.tgz", + "integrity": "sha512-L7IQga2pDT+14Ti8HZwsVfbCjuKP4U213T3tuPggOzyK/p4KaUJxQFXJgfUFHKzU0zOXx8QcYRYZf0hSQtppkw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.6.tgz", + "integrity": "sha512-bq10jFv42V20Kk77NvmO+WEZaLHBKuXcvEowixnBOMkaBgS7kQaqTc77ZJDbsUpXU3KKNLQFZctfaeINmeTsZA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.6.tgz", + "integrity": "sha512-HbDLlkDZqUMBQaiday0pJzB6/8Xx/10dI3xRebJBReOEeDSeS+7GzTtW9h8ZnfB7/wBCqvtAjGtWQLTNPbR2+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.6.tgz", + "integrity": "sha512-C+5kb6rgsGMmvIdUI7v1PPgC98A6BMv233e97aXZ5AE03iMdlILFD/20HlHrOi0x2CzbspXn9HOnlE4/Ijn5Kw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.6.tgz", + "integrity": "sha512-NMY9yg/88MskEZH2s4i6biz/3av+M8xY5ua4HE7CCz5DBz542cr7REe317+v7oKjnYBCijHpkzo5vU85bkXQmQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.6.tgz", + "integrity": "sha512-AXazA0ljvQEp7cA9jscABNXsjodKbEcqPcAE3rDzKN82Vb3lYOq6INd+HOCA7hk8IegEyHW4T72Z7QGIhyCQEA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.6.tgz", + "integrity": "sha512-JjBf7TwY7ldcPgHYt9UcrjZB03+WZqg/jSwMAfzOzM5ZG+tu5umUqzy5ugH/crGI4eoDIhSOTDp1NL3Uo/05Fw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.6.tgz", + "integrity": "sha512-kATNsslryVxcH1sO3KP2nnyUWtZZVkgyhAUnyTVVa0OQQ9pmDRjTpHaE+2EQHoCM5wt/uav2edrAUqbwn3tkKQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.6.tgz", + "integrity": "sha512-B+wTKz+8pi7mcWXFQV0LA79dJ+qhiut5uK9q0omoKnq8yRIwQJwfg3/vclXoqqcX89Ri5Y5538V0Se2v5qlcLA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.6.tgz", + "integrity": "sha512-h44RBLVXFUSjvhOfseE+5UxQ/r9LVeqK2S8JziJKOm9W7SePYRPDyn7MhzhNCCFPkcjIy+soCxfhlJXHXXCR0A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.6.tgz", + "integrity": "sha512-FlYpyr2Xc2AUePoAbc84NRV+mj7xpsISeQ36HGf9etrY5rTBEA+IU9HzWVmw5mDFtC62EQxzkLRj8h5Hq85yOQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", @@ -324,18 +969,116 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.6.tgz", + "integrity": "sha512-3hgZlp7NqIM5lNG3fpdhBI5rUnPmdahraSmwAi+YX/bp7iZ7mpTv2NkypGs/XngdMtpzljICxnUG3uPfqLFd3w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.6.tgz", + "integrity": "sha512-aEWTdZQHtSRROlDYn7ygB8yAqtnall/UnmoVIJVqccKitkAWVVSYocQUWrBOxLEFk8XdlRouVrLZe6WXszyviA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.6.tgz", + "integrity": "sha512-uxk/5yAGpjKZUHOECtI9W+9IcLjKj+2m0qf+RG7f7eRBHr8wP6wsr3XbNbgtOD1qSpPapd6R2ZfSeXTkCcAo5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.6.tgz", + "integrity": "sha512-oXlXGS9zvNCGoAT/tLHAsFKrIKye1JaIIP0anCdpaI+Dc10ftaNZcqfLzEwyhdzFAYInXYH4V7kEdH4hPyo9GA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.6.tgz", + "integrity": "sha512-qh7IcAHUvvmMBmoIG+V+BbE9ZWSR0ohF51e5g8JZvU08kZF58uDFL5tHs0eoYz31H6Finv17te3W3QB042GqVA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.6.tgz", + "integrity": "sha512-9UDwkz7Wlm4N9jnv+4NL7F8vxLhSZfEkRArz2gD33HesAFfMLGIGNVXRoIHtWNw8feKsnGly9Hq1EUuRkWl0zA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -344,7 +1087,6 @@ "version": "4.11.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -354,7 +1096,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -378,7 +1119,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -391,7 +1131,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -443,11 +1182,19 @@ "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==", "license": "MIT" }, + "node_modules/@google/generative-ai": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", + "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -462,7 +1209,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -476,7 +1222,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true, "license": "BSD-3-Clause" }, "node_modules/@isaacs/cliui": { @@ -601,6 +1346,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -701,6 +1456,66 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@next/swc-linux-x64-gnu": { "version": "14.2.5", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", @@ -733,6 +1548,51 @@ "node": ">= 10" } }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -989,6 +1849,111 @@ } } }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", @@ -1150,6 +2115,24 @@ } } }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", @@ -1178,26 +2161,18 @@ } } }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", - "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -1214,10 +2189,65 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1229,14 +2259,47 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", - "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -1253,6 +2316,728 @@ } } }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-context-menu/node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-direction": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", @@ -1584,6 +3369,24 @@ } } }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popover": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", @@ -1660,6 +3463,24 @@ } } }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", @@ -1776,6 +3597,24 @@ } } }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-roving-focus": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", @@ -1948,7 +3787,7 @@ } } }, - "node_modules/@radix-ui/react-slot": { + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", @@ -1966,6 +3805,39 @@ } } }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-switch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", @@ -2223,6 +4095,24 @@ } } }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", @@ -2256,6 +4146,39 @@ } } }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", @@ -2379,6 +4302,407 @@ "react-dom": "^18.0.0" } }, + "node_modules/@remotion/bundler": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/bundler/-/bundler-4.0.232.tgz", + "integrity": "sha512-9Z4O+D2g6cJWFsLsvOy9VOfhgrEZ8YppkuMmE4WJKgh+8r1VpwWcmWp8U/3izCNdB6njI2RVlOUBUxZX0yG94w==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@remotion/studio": "4.0.232", + "@remotion/studio-shared": "4.0.232", + "css-loader": "5.2.7", + "esbuild": "0.18.6", + "react-refresh": "0.9.0", + "remotion": "4.0.232", + "source-map": "0.7.3", + "style-loader": "2.0.0", + "webpack": "5.96.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@remotion/bundler/node_modules/@esbuild/linux-x64": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.6.tgz", + "integrity": "sha512-Mc4EUSYwzLci77u0Kao6ajB2WbTe5fNc7+lHwS3a+vJISC/oprwURezUYu1SdWAYoczbsyOvKAJwuNftoAdjjg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@remotion/bundler/node_modules/esbuild": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.6.tgz", + "integrity": "sha512-5QgxWaAhU/tPBpvkxUmnFv2YINHuZzjbk0LeUUnC2i3aJHjfi5yR49lgKgF7cb98bclOp/kans8M5TGbGFfJlQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.6", + "@esbuild/android-arm64": "0.18.6", + "@esbuild/android-x64": "0.18.6", + "@esbuild/darwin-arm64": "0.18.6", + "@esbuild/darwin-x64": "0.18.6", + "@esbuild/freebsd-arm64": "0.18.6", + "@esbuild/freebsd-x64": "0.18.6", + "@esbuild/linux-arm": "0.18.6", + "@esbuild/linux-arm64": "0.18.6", + "@esbuild/linux-ia32": "0.18.6", + "@esbuild/linux-loong64": "0.18.6", + "@esbuild/linux-mips64el": "0.18.6", + "@esbuild/linux-ppc64": "0.18.6", + "@esbuild/linux-riscv64": "0.18.6", + "@esbuild/linux-s390x": "0.18.6", + "@esbuild/linux-x64": "0.18.6", + "@esbuild/netbsd-x64": "0.18.6", + "@esbuild/openbsd-x64": "0.18.6", + "@esbuild/sunos-x64": "0.18.6", + "@esbuild/win32-arm64": "0.18.6", + "@esbuild/win32-ia32": "0.18.6", + "@esbuild/win32-x64": "0.18.6" + } + }, + "node_modules/@remotion/bundler/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remotion/cli": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/cli/-/cli-4.0.232.tgz", + "integrity": "sha512-rmWVUAwH119h4Wu1DeFs57FbQ0yba3LuJdPAstlSm012462BrHs6HFt85ad7jqMNDbqV8EYrgREW1NB04QMDEQ==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@remotion/bundler": "4.0.232", + "@remotion/media-utils": "4.0.232", + "@remotion/player": "4.0.232", + "@remotion/renderer": "4.0.232", + "@remotion/studio": "4.0.232", + "@remotion/studio-server": "4.0.232", + "@remotion/studio-shared": "4.0.232", + "dotenv": "9.0.2", + "minimist": "1.2.6", + "prompts": "2.4.2", + "remotion": "4.0.232" + }, + "bin": { + "remotion": "remotion-cli.js", + "remotionb": "remotionb-cli.js", + "remotiond": "remotiond-cli.js" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@remotion/cli/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "license": "MIT" + }, + "node_modules/@remotion/compositor-darwin-arm64": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.232.tgz", + "integrity": "sha512-8hzeUWBnSRIGLohUeEK7B1a2+o4jvugXwZ3CdTgLKoChtPN0RLnwkrtrm0aqbrziDkxRyZ6bMi0nXGJNChoLhQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@remotion/compositor-darwin-x64": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.232.tgz", + "integrity": "sha512-e7QOahfe70WIfQu2hZx8fzF0w2L8ff9LHtxrGhwIpyYSMu9lxwFaEfMyJDLjbWco8mUGDfYy8+cIDJxgxOT5jw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@remotion/compositor-linux-arm64-gnu": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.232.tgz", + "integrity": "sha512-nl+cOYwWcRQVuu1ja5tFy0ZY/PClhvxHzg3JfRwHMTXd3vWb+QTAWdMR1feMTJpjlqa7UerW2CYAGmMnBv4UCA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@remotion/compositor-linux-arm64-musl": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.232.tgz", + "integrity": "sha512-dHgKH9DJHOxB9Kz4BxOalVd36nvn9E9yqi+Vy7kuxUxrOv7rYoOulZ+z847ggUUGYiaS0W0nxY7MzSrjD1bpTQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@remotion/compositor-linux-x64-gnu": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.232.tgz", + "integrity": "sha512-z84/Femk0WE60ZcHAv5b9FjcyMnHfHIilk90q7WOLmLGm9Zo0jGFAHyC4+kfC4m+VBETob32Gd06RGKg8ylAnA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@remotion/compositor-linux-x64-musl": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.232.tgz", + "integrity": "sha512-lQ0iWb7SZ+f0y/M15TmN/SQXH/ffB8KYPRAXgCSfaS1G/CF692Nuw6kq1ZsA4xwAg97gaSqNHd3oy6lPNXb5Cw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@remotion/compositor-win32-x64-msvc": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.232.tgz", + "integrity": "sha512-uKXV/mkiAchY6zyTGu82ODQqestTUFw1N4Tsv1LbeZFaOBDuBDgU7n/NBA71V3ICVVV43Vz2ikEGUXoRuGIYzQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@remotion/eslint-plugin": { + "version": "4.0.403", + "resolved": "https://registry.npmjs.org/@remotion/eslint-plugin/-/eslint-plugin-4.0.403.tgz", + "integrity": "sha512-h9fLLd6V16PBMvDNH/m++8PyNdVWgR3MU2rW7/RLM5rLMTznuf9I1rAEYI8C/jWeaUoXUXdr9zKwt+HKd6NhOg==", + "license": "ISC", + "dependencies": { + "@typescript-eslint/utils": "5.19.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/@remotion/media-utils": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/media-utils/-/media-utils-4.0.232.tgz", + "integrity": "sha512-87Q/rxLlRUsTXIriqN557f9oaaXMCZwVzd9NfYuyoCUNrd/lN3cEyw/cL7MF8BdXrloGkjYEOxMAemGPyindsA==", + "license": "MIT", + "dependencies": { + "remotion": "4.0.232" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@remotion/player": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/player/-/player-4.0.232.tgz", + "integrity": "sha512-7DpxQXICGzSR9iGdoipKHwIo8j849e9rsbQywsbuRyxm7T3/3aCPUPGUfrAnSdXQYdp4n0gyhXOP5QDedbAcGA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "remotion": "4.0.232" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@remotion/renderer": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/renderer/-/renderer-4.0.232.tgz", + "integrity": "sha512-3/tIjnEzJWUxpNs06G/vJOLm0ua4osUmh1HG78/5GDjKusPicU1PSy5Nq0mWp7ei8dNRPm4nozsCemrZvfLiJw==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@remotion/streaming": "4.0.232", + "execa": "5.1.1", + "extract-zip": "2.0.1", + "remotion": "4.0.232", + "source-map": "^0.8.0-beta.0", + "ws": "8.17.1" + }, + "optionalDependencies": { + "@remotion/compositor-darwin-arm64": "4.0.232", + "@remotion/compositor-darwin-x64": "4.0.232", + "@remotion/compositor-linux-arm64-gnu": "4.0.232", + "@remotion/compositor-linux-arm64-musl": "4.0.232", + "@remotion/compositor-linux-x64-gnu": "4.0.232", + "@remotion/compositor-linux-x64-musl": "4.0.232", + "@remotion/compositor-win32-x64-msvc": "4.0.232" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@remotion/renderer/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remotion/streaming": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/streaming/-/streaming-4.0.232.tgz", + "integrity": "sha512-WYMkRu5eN8tFPiKJDx7eMYh7ZHPrKGNYKgoMvgpbnrtsgjCy48cjksgYWCR6jUsuNgQD0KPU1AuoU8SbJrzrQg==", + "license": "MIT" + }, + "node_modules/@remotion/studio": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/studio/-/studio-4.0.232.tgz", + "integrity": "sha512-c1nsVhtjbXjwacQ5Y4d/LHKGnXhl3A6cDJEqEAcUAocArXDGxapEdcdLdrsYoT66SwrxXztjRYuG/rZUT5K41g==", + "license": "MIT", + "dependencies": { + "@remotion/media-utils": "4.0.232", + "@remotion/player": "4.0.232", + "@remotion/renderer": "4.0.232", + "@remotion/studio-shared": "4.0.232", + "memfs": "3.4.3", + "open": "^8.4.2", + "remotion": "4.0.232", + "semver": "7.5.3", + "source-map": "0.7.3" + } + }, + "node_modules/@remotion/studio-server": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/studio-server/-/studio-server-4.0.232.tgz", + "integrity": "sha512-2rIVFzzK+pgGc+5g+LrLSwNiPXJwWO7tryaS9ODSKAO5hOXe+StOpqObLHhGY1wGx2tNIs2TkfLD2TehTZbKsA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "7.24.1", + "@remotion/bundler": "4.0.232", + "@remotion/renderer": "4.0.232", + "@remotion/studio-shared": "4.0.232", + "memfs": "3.4.3", + "open": "^8.4.2", + "recast": "0.23.9", + "remotion": "4.0.232", + "semver": "7.5.3", + "source-map": "0.7.3" + } + }, + "node_modules/@remotion/studio-server/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@remotion/studio-server/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@remotion/studio-server/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remotion/studio-shared": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/@remotion/studio-shared/-/studio-shared-4.0.232.tgz", + "integrity": "sha512-eDM1yDwwHjm3GgBjKN9TdH5aLeoNIBR4qJaXKJKSxzar+XDER6Z0vJpvu0fSYFXr71NLsJHeADnvjfyy+6ZG7A==", + "license": "MIT", + "dependencies": { + "remotion": "4.0.232" + } + }, + "node_modules/@remotion/studio/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@remotion/studio/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@remotion/studio/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", @@ -2793,13 +5117,210 @@ "tslib": "^2.4.0" } }, - "node_modules/@tanstack/react-table": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.1.tgz", - "integrity": "sha512-PJK+07qbengObe5l7c8vCdtefXm8cyR4i078acWrHbdm8JKw1ES7YpmOtVt9ALUVEEFAHscdVpGRhRgikgFMbQ==", + "node_modules/@tanstack/eslint-plugin-query": { + "version": "5.91.2", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.91.2.tgz", + "integrity": "sha512-UPeWKl/Acu1IuuHJlsN+eITUHqAaa9/04geHHPedY8siVarSaWprY0SVMKrkpKfk5ehRT7+/MZ5QwWuEtkWrFw==", + "dev": true, "license": "MIT", "dependencies": { - "@tanstack/table-core": "8.20.1" + "@typescript-eslint/utils": "^8.44.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/@typescript-eslint/scope-manager": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/@typescript-eslint/types": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/@typescript-eslint/utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tanstack/eslint-plugin-query/node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.16.tgz", + "integrity": "sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.16.tgz", + "integrity": "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" }, "engines": { "node": ">=12" @@ -2814,9 +5335,9 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.1.tgz", - "integrity": "sha512-5Ly5TIRHnWH7vSDell9B/OVyV380qqIJVg7H7R7jU4fPEmOD4smqAX7VRflpYI09srWR8aj5OLD2Ccs1pI5mTg==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", "license": "MIT", "engines": { "node": ">=12" @@ -2893,6 +5414,45 @@ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2908,11 +5468,30 @@ "@types/node": "*" } }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/leaflet.heat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@types/leaflet.heat/-/leaflet.heat-0.2.5.tgz", + "integrity": "sha512-wmDePJPn2vhW9BScsWTV4pSfWayhdDwXuWIQzUuaJkvk5DCHsYsIegTD7tybo38E/0mxpuWODKV/LhsxPESWJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/leaflet": "^1.9" + } + }, "node_modules/@types/node": { "version": "20.16.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -2955,6 +5534,15 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-autosuggest": { + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@types/react-autosuggest/-/react-autosuggest-10.1.11.tgz", + "integrity": "sha512-lneJrX/5TZJzKHPJ6UuUjsh9OfeyQHKYEVHyBh5Y7LeRbCZxyIsjBmpxdPy1iH++Ger0qcyW+phPpYH+g3naLA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-calendar-heatmap": { "version": "1.9.0", "license": "MIT", @@ -2972,11 +5560,40 @@ "@types/react": "*" } }, + "node_modules/@types/react-mentions": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@types/react-mentions/-/react-mentions-4.4.1.tgz", + "integrity": "sha512-65QdcZYkGe2I4GnOLY2OhlXCGz/Csd8NhytwE5r59CoFeYafMltAE/WqFB/Y6SoPU8LvF7EyUrq6Rxrf0Kzxkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", + "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/semver": { "version": "7.5.8", "dev": true, "license": "MIT" }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", @@ -3006,6 +5623,42 @@ } } }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", @@ -3024,6 +5677,23 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/types": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", @@ -3124,6 +5794,155 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.19.0.tgz", + "integrity": "sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.19.0", + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/typescript-estree": "5.19.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz", + "integrity": "sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.19.0.tgz", + "integrity": "sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz", + "integrity": "sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.19.0", + "@typescript-eslint/visitor-keys": "5.19.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz", + "integrity": "sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.19.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", @@ -3146,14 +5965,170 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, "license": "ISC" }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3166,7 +6141,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3199,7 +6173,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3212,6 +6185,54 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ansi-escapes": { "version": "7.0.0", "dev": true, @@ -3280,7 +6301,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/argv-formatter": { @@ -3358,7 +6378,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3484,6 +6503,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -3586,16 +6617,27 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.13.tgz", + "integrity": "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/before-after-hook": { "version": "3.0.2", "dev": true, "license": "Apache-2.0" }, - "node_modules/big-integer": { - "version": "1.6.52", - "license": "Unlicense", + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { - "node": ">=0.6" + "node": "*" } }, "node_modules/binary-extensions": { @@ -3637,25 +6679,10 @@ "node": ">=8" } }, - "node_modules/broadcast-channel": { - "version": "3.7.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "detect-node": "^2.1.0", - "js-sha3": "0.8.0", - "microseconds": "0.2.0", - "nano-time": "1.0.0", - "oblivious-set": "1.0.0", - "rimraf": "3.0.2", - "unload": "2.2.0" - } - }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "dev": true, + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -3672,10 +6699,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -3684,11 +6712,25 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, "license": "MIT" }, "node_modules/busboy": { @@ -3725,7 +6767,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3741,9 +6782,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", "funding": [ { "type": "opencollective", @@ -3764,7 +6805,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3781,7 +6821,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3835,6 +6874,15 @@ "node": ">= 6" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, "node_modules/chrono-node": { "version": "1.4.9", "license": "MIT", @@ -4651,12 +7699,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cosmiconfig/node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4717,6 +7759,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4932,12 +8002,12 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -5006,7 +8076,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/define-data-property": { @@ -5026,6 +8095,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -5053,10 +8131,6 @@ "node": ">=0.4.0" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "license": "MIT" - }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -5073,7 +8147,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -5092,7 +8165,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -5122,6 +8194,15 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, "node_modules/drizzle-kit": { "version": "0.24.1", "dev": true, @@ -5272,9 +8353,19 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "dev": true, + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -5289,11 +8380,28 @@ "license": "MIT", "peer": true }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -5616,6 +8724,12 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -5672,6 +8786,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", @@ -5724,12 +8844,368 @@ "esbuild": ">=0.12 <1" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -5738,7 +9214,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -5751,7 +9226,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -5852,13 +9326,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-import-resolver-typescript": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", @@ -5913,13 +9380,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", @@ -5962,13 +9422,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/debug/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -6114,7 +9567,6 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -6127,11 +9579,37 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6144,7 +9622,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", @@ -6158,11 +9635,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -6175,7 +9664,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -6188,7 +9676,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -6198,7 +9685,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -6210,9 +9696,17 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "5.1.1", - "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -6234,7 +9728,6 @@ }, "node_modules/execa/node_modules/get-stream": { "version": "6.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -6243,11 +9736,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-equals": { @@ -6291,16 +9818,30 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -6310,6 +9851,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/figures": { "version": "6.1.0", "dev": true, @@ -6328,7 +9878,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" @@ -6353,7 +9902,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -6397,7 +9945,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -6412,7 +9959,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { @@ -6523,6 +10069,12 @@ "node": ">=14.14" } }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "license": "Unlicense" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6693,11 +10245,16 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -6713,7 +10270,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -6769,6 +10325,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/goober": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", + "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6791,7 +10356,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, "license": "MIT" }, "node_modules/handlebars": { @@ -6828,7 +10392,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6956,17 +10519,27 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -6982,7 +10555,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -6999,7 +10571,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -7030,7 +10601,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -7275,6 +10845,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7397,7 +10982,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7462,7 +11046,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7573,6 +11156,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "dev": true, @@ -7616,6 +11211,20 @@ "node": ">= 0.6.0" } }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/jiti": { "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", @@ -7625,10 +11234,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7639,7 +11244,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7652,7 +11256,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, "license": "MIT" }, "node_modules/json-parse-better-errors": { @@ -7661,18 +11264,22 @@ "license": "MIT", "peer": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, "license": "MIT" }, "node_modules/json5": { @@ -7699,6 +11306,28 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -7715,16 +11344,45 @@ "node": ">=4.0" } }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -7750,11 +11408,21 @@ "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" }, + "node_modules/leaflet-defaulticon-compatibility": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.2.tgz", + "integrity": "sha512-IrKagWxkTwzxUkFIumy/Zmo3ksjuAu3zEadtOuJcKzuXaD76Gwvg2Z1mLyx7y52ykOzM8rAH5ChBs4DnfdGa6Q==", + "license": "BSD-2-Clause" + }, + "node_modules/leaflet.heat": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/leaflet.heat/-/leaflet.heat-0.2.0.tgz", + "integrity": "sha512-Cd5PbAA/rX3X3XKxfDoUGi9qp78FyhWYurFg3nsfhntcM/MCNK08pRkf4iEenO1KNqwVPKCmkyktjW3UD+h9bQ==" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -7816,11 +11484,49 @@ "node": ">=4" } }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -7853,21 +11559,54 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "dev": true, "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "license": "MIT" }, "node_modules/lodash.uniqby": { @@ -7946,12 +11685,16 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/match-sorter": { - "version": "6.3.4", - "license": "MIT", + "node_modules/memfs": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.3.tgz", + "integrity": "sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg==", + "license": "Unlicense", "dependencies": { - "@babel/runtime": "^7.23.8", - "remove-accents": "0.5.0" + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/memoize-one": { @@ -7971,7 +11714,6 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -7994,10 +11736,6 @@ "node": ">=8.6" } }, - "node_modules/microseconds": { - "version": "0.2.0", - "license": "MIT" - }, "node_modules/mime": { "version": "4.0.4", "dev": true, @@ -8035,7 +11773,6 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -8073,9 +11810,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mz": { @@ -8089,13 +11826,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nano-time": { - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "big-integer": "^1.6.16" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -8118,12 +11848,10 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", - "dev": true, "license": "MIT" }, "node_modules/nerf-dart": { @@ -8235,10 +11963,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/normalize-package-data": { @@ -8450,7 +12177,6 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -11079,10 +14805,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/oblivious-set": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -11101,7 +14823,6 @@ }, "node_modules/onetime": { "version": "5.1.2", - "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -11113,11 +14834,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -11169,7 +14906,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -11185,7 +14921,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -11229,7 +14964,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -11290,7 +15024,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11340,12 +15073,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/pg": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", @@ -11504,9 +15242,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { @@ -11731,6 +15469,91 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/postcss-nested": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", @@ -11829,7 +15652,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -11854,6 +15676,19 @@ "dev": true, "license": "MIT" }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -11876,11 +15711,20 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -11921,6 +15765,15 @@ ], "license": "MIT" }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/rc": { "version": "1.2.8", "dev": true, @@ -11952,15 +15805,20 @@ "node": ">=0.10.0" } }, - "node_modules/react-calendar-heatmap": { - "version": "1.9.0", + "node_modules/react-autosuggest": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-autosuggest/-/react-autosuggest-10.1.0.tgz", + "integrity": "sha512-/azBHmc6z/31s/lBf6irxPf/7eejQdR0IqnZUzjdSibtlS8+Rw/R79pgDAo6Ft5QqCUTyEQ+f0FhL+1olDQ8OA==", "license": "MIT", "dependencies": { - "memoize-one": "^5.0.0", - "prop-types": "^15.6.2" + "es6-promise": "^4.2.8", + "prop-types": "^15.7.2", + "react-themeable": "^1.1.0", + "section-iterator": "^2.0.0", + "shallow-equal": "^1.2.1" }, "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "react": ">=16.3.0" } }, "node_modules/react-day-picker": { @@ -12001,6 +15859,23 @@ "react": ">=16.14.0" } }, + "node_modules/react-hot-toast": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", + "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", + "license": "MIT", + "dependencies": { + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -12020,28 +15895,44 @@ "react-dom": "^18.0.0" } }, - "node_modules/react-query": { - "version": "3.39.3", - "license": "MIT", + "node_modules/react-mentions": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/react-mentions/-/react-mentions-4.4.10.tgz", + "integrity": "sha512-JHiQlgF1oSZR7VYPjq32wy97z1w1oE4x10EuhKjPr4WUKhVzG1uFQhQjKqjQkbVqJrmahf+ldgBTv36NrkpKpA==", + "license": "BSD-3-Clause", "dependencies": { - "@babel/runtime": "^7.5.5", - "broadcast-channel": "^3.4.1", - "match-sorter": "^6.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "@babel/runtime": "7.4.5", + "invariant": "^2.2.4", + "prop-types": "^15.5.8", + "substyle": "^9.1.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "react": ">=16.8.3", + "react-dom": ">=16.8.3" + } + }, + "node_modules/react-mentions/node_modules/@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/react-mentions/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, "node_modules/react-remove-scroll": { @@ -12070,20 +15961,20 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", "dependencies": { - "react-style-singleton": "^2.2.1", + "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "engines": { "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -12107,21 +15998,20 @@ } }, "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", - "invariant": "^2.2.4", "tslib": "^2.0.0" }, "engines": { "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -12129,6 +16019,24 @@ } } }, + "node_modules/react-themeable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-themeable/-/react-themeable-1.1.0.tgz", + "integrity": "sha512-kl5tQ8K+r9IdQXZd8WLa+xxYN04lLnJXRVhHfdgwsUJr/SlKJxIejoc9z9obEkx1mdqbTw1ry43fxEUwyD9u7w==", + "license": "MIT", + "dependencies": { + "object-assign": "^3.0.0" + } + }, + "node_modules/react-themeable/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -12145,6 +16053,23 @@ "react-dom": ">=16.6.0" } }, + "node_modules/react-window": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", + "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -12214,6 +16139,22 @@ "node": ">=8.10.0" } }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/recharts": { "version": "2.12.7", "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz", @@ -12304,9 +16245,15 @@ "node": ">=14" } }, - "node_modules/remove-accents": { - "version": "0.5.0", - "license": "MIT" + "node_modules/remotion": { + "version": "4.0.232", + "resolved": "https://registry.npmjs.org/remotion/-/remotion-4.0.232.tgz", + "integrity": "sha512-tuWZ5kQckqDL8/Zq1xLeUF+Bed1dN1sZeJ5nNbO0aBw1ETXNVrlJeobzt72lZDKZ+coU8k7sPWrIq65td1y9Gg==", + "license": "SEE LICENSE IN LICENSE.md", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } }, "node_modules/require-directory": { "version": "2.1.1", @@ -12317,6 +16264,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -12449,7 +16405,6 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, "license": "MIT" }, "node_modules/safe-regex-test": { @@ -12496,6 +16451,30 @@ "loose-envify": "^1.1.0" } }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-iterator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/section-iterator/-/section-iterator-2.0.0.tgz", + "integrity": "sha512-xvTNwcbeDayXotnV32zLb3duQsP+4XosHpb/F+tu6VzEZFmIjzPdNk6/O+QOOx5XTh08KL2ufdXeCO33p380pQ==", + "license": "MIT" + }, "node_modules/semantic-release": { "version": "24.1.0", "dev": true, @@ -12765,10 +16744,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -12804,6 +16782,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -12837,6 +16824,12 @@ "node": ">= 0.4" } }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12878,7 +16871,6 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "dev": true, "license": "ISC" }, "node_modules/signale": { @@ -12987,6 +16979,12 @@ "node": ">=0.8.0" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, "node_modules/skin-tone": { "version": "2.0.0", "dev": true, @@ -13014,7 +17012,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13033,7 +17030,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -13301,7 +17297,6 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -13315,6 +17310,26 @@ "node": ">=0.10.0" } }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -13338,6 +17353,19 @@ } } }, + "node_modules/substyle": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/substyle/-/substyle-9.4.1.tgz", + "integrity": "sha512-VOngeq/W1/UkxiGzeqVvDbGDPM8XgUyJVWjrqeh+GgKqspEPiLYndK+XRcsKUHM5Muz/++1ctJ1QCF/OqRiKWA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.4", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": ">=16.8.3" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -13438,6 +17466,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/supports-hyperlinks": { "version": "3.1.0", "dev": true, @@ -13538,7 +17581,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -13591,11 +17633,121 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, "license": "MIT" }, "node_modules/thenify": { @@ -13650,6 +17802,54 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13662,6 +17862,15 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/traverse": { "version": "0.6.8", "dev": true, @@ -13712,6 +17921,27 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "license": "0BSD" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "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" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/tunnel": { "version": "0.0.6", "dev": true, @@ -13724,7 +17954,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -13825,7 +18054,6 @@ "version": "5.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -13878,7 +18106,6 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "devOptional": true, "license": "MIT" }, "node_modules/unicode-emoji-modifier-base": { @@ -13928,19 +18155,10 @@ "node": ">= 10.0.0" } }, - "node_modules/unload": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4" - } - }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -13957,8 +18175,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -13971,7 +18189,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -13986,9 +18203,9 @@ } }, "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "license": "MIT", "dependencies": { "tslib": "^2.0.0" @@ -13997,8 +18214,8 @@ "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -14007,9 +18224,9 @@ } }, "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", @@ -14019,8 +18236,8 @@ "node": ">=10" }, "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { @@ -14082,6 +18299,113 @@ "d3-timer": "^3.0.1" } }, + "node_modules/watchpack": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", + "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", @@ -14176,7 +18500,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -14228,6 +18551,27 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "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 + } + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -14246,6 +18590,12 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yaml": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", @@ -14285,6 +18635,16 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yet-another-react-lightbox": { "version": "3.21.4", "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.21.4.tgz", @@ -14302,7 +18662,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -14322,109 +18681,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", - "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } } } diff --git a/package.json b/package.json index 4574803..a0fab27 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@radix-ui/react-popover": "^1.1.1", "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", - "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-toast": "^1.2.1", From a24ccb178a33053a6ea71ca79109b246a4bdc1e6 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Fri, 9 Jan 2026 16:37:05 +0530 Subject: [PATCH 04/29] fix: improve buffer handling in uploadAssetBuffer function --- src/pages/api/import-shared/upload-all.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/api/import-shared/upload-all.ts b/src/pages/api/import-shared/upload-all.ts index 1fae509..0790d71 100644 --- a/src/pages/api/import-shared/upload-all.ts +++ b/src/pages/api/import-shared/upload-all.ts @@ -309,7 +309,9 @@ const uploadAssetBuffer = async ( const fileType = asset.type ?? inferAssetTypeFromName(payload.fileName); const resolvedFileName = payload.fileName || asset.originalFileName || `${asset.id}.bin`; const contentType = payload.contentType ?? guessContentType(resolvedFileName); - const blob = new Blob([payload.buffer], { type: contentType }); + const uint8Array = new Uint8Array(payload.buffer.byteLength); + uint8Array.set(payload.buffer); + const blob = new Blob([uint8Array.buffer], { type: contentType }); const createdAt = asset.fileCreatedAt ?? asset.localDateTime ?? new Date().toISOString(); const modifiedAt = asset.localDateTime ?? asset.fileCreatedAt ?? createdAt; From a8c81ac4d6f5615e98cd050d17cb80234fdb3b42 Mon Sep 17 00:00:00 2001 From: Sai charan Guntupalli <63032681+sai80082@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:00:54 +0530 Subject: [PATCH 05/29] Update release workflow for new repository owner --- .github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bfecd9d..6c1dae8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: jobs: release: # Only run on the original repository, not forks - if: ${{ github.repository_owner == 'varun-raj' }} + if: ${{ github.repository_owner == 'sai80082' }} runs-on: ubuntu-latest permissions: contents: write @@ -44,8 +44,8 @@ jobs: images: | ghcr.io/${{ github.repository }} tags: | - type=raw,value=latest,enable=${{ github.repository_owner != 'varun-raj' || needs.release.outputs.new-release-published == 'true' }} - type=semver,pattern={{major}}.{{minor}}.{{patch}},enable=${{ github.repository_owner == 'varun-raj' && needs.release.outputs.new-release-published == 'true' }} + type=raw,value=latest,enable=${{ github.repository_owner != 'sai80082' || needs.release.outputs.new-release-published == 'true' }} + type=semver,pattern={{major}}.{{minor}}.{{patch}},enable=${{ github.repository_owner == 'sai80082' && needs.release.outputs.new-release-published == 'true' }} type=raw,value=${{ needs.release.outputs.new-release-version }},enable=${{ needs.release.outputs.new-release-version != '' }} - uses: docker/setup-buildx-action@v3 - uses: docker/login-action@v3 @@ -65,4 +65,4 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max build-args: | - VERSION=${{ needs.release.outputs.new-release-version || 'dev' }} \ No newline at end of file + VERSION=${{ needs.release.outputs.new-release-version || 'dev' }} From 654f627c0e192a85471c4d1503aad6bb4f5a90cc Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 4 Feb 2026 06:36:08 +0000 Subject: [PATCH 06/29] chore(release): 1.0.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.0.0 ### Bug Fixes * adapt to vertical resolution and fix flickering ([8312fc1](https://github.com/sai80082/immich-power-tools/commit/8312fc183db9a8e886da0cd0d901d52aab4a5d43)) * added authentication error message block ([eb1b00e](https://github.com/sai80082/immich-power-tools/commit/eb1b00e40f98ddf345cd96f0a28e474d60ab2711)) * album creation flow ([263212c](https://github.com/sai80082/immich-power-tools/commit/263212c8b9cd21e9435a04145df2a459045d3fd9)) * album info and missing location fix ([835a7f9](https://github.com/sai80082/immich-power-tools/commit/835a7f9cc3596c52572f2bf46640e7e7e06cecb7)) * album list fix ([1132a04](https://github.com/sai80082/immich-power-tools/commit/1132a046f4e712ac838ec5d263a0b9b7c8bf2e92)) * asset filter condition revert ([3be8938](https://github.com/sai80082/immich-power-tools/commit/3be893823780aab5c645d769f9ea56e9cde5f2a2)) * authentication fixes in proxies ([1465486](https://github.com/sai80082/immich-power-tools/commit/1465486de48f3b278819e0d4f956d85125168664)) * automated release ([f784017](https://github.com/sai80082/immich-power-tools/commit/f78401721c68859fffa4d386071773d4b0ca5ed7)) * build fixes ([21e950f](https://github.com/sai80082/immich-power-tools/commit/21e950ff789f2330777475c9f64c11913062798e)) * build fixes ([bcb1247](https://github.com/sai80082/immich-power-tools/commit/bcb12473e03ba46a78e45c8bc7bea7b5200d8929)) * build fixes ([abcf6e3](https://github.com/sai80082/immich-power-tools/commit/abcf6e3880e11b71ed2ebddd7f9dd8787b293a4b)) * build fixes ([12500c9](https://github.com/sai80082/immich-power-tools/commit/12500c9c6e612c90870d3d24dda8f28aa5127bf6)) * clean up single user page ([cbfee2e](https://github.com/sai80082/immich-power-tools/commit/cbfee2ee40e505f05b24a0bc77736ac2461f0eac)) * cleaned up dockerfile for optimized build ([0f3d514](https://github.com/sai80082/immich-power-tools/commit/0f3d5141b82770cde27d15e6ac3f286c45ef3655)) * conflicts resolved ([0c37a08](https://github.com/sai80082/immich-power-tools/commit/0c37a085421dd9fc57e8825e98d37e3b0d492d68)) * conflicts resolved ([18274a3](https://github.com/sai80082/immich-power-tools/commit/18274a3449fd3a83836d13d85ba7e96572e000b5)) * conflicts resolved ([a9038da](https://github.com/sai80082/immich-power-tools/commit/a9038da6427a2c44b6bd277008c1488e356d4458)) * conflicts resolved ([ddbee4a](https://github.com/sai80082/immich-power-tools/commit/ddbee4af03e29de95f983530f40ad8375296f8f9)) * conflicts resolved ([7266a2e](https://github.com/sai80082/immich-power-tools/commit/7266a2edd689c9de21c782270f1e364aa8b9f8c6)) * convert to vertical resolution ([383b714](https://github.com/sai80082/immich-power-tools/commit/383b71422056724a149e2f5e1e3c87c1c15dd89e)) * dark mode fixes ([6c8c1cc](https://github.com/sai80082/immich-power-tools/commit/6c8c1cc3fbfa01846d5b50cade8b2edfed810fe6)) * data table fixes ([ed411ae](https://github.com/sai80082/immich-power-tools/commit/ed411ae68e1710fb461b742491fb4911475aea25)) * design and performance fixes in album list ([c64959f](https://github.com/sai80082/immich-power-tools/commit/c64959f6d6b6f6de339fe30cde3e77231b3f6e49)) * design fixes ([e305e45](https://github.com/sai80082/immich-power-tools/commit/e305e458f1630c88dda3c0a7b3128a762f1f9e61)) * design fixes ([43cfcdb](https://github.com/sai80082/immich-power-tools/commit/43cfcdbe8f8a568f2913e2a4146c802dd178100a)) * disabled nextjs image optimization due to sharp dependencies ([c7212cc](https://github.com/sai80082/immich-power-tools/commit/c7212cc53b093df2d79de3bd42e299d82d3df272)) * docker compose sample fix ([d3fd120](https://github.com/sai80082/immich-power-tools/commit/d3fd1209b9d8005c1e7e96342ec35b6965b4c66e)) * ensure error messages are properly typed in API handlers ([0821e16](https://github.com/sai80082/immich-power-tools/commit/0821e164efa5f30f5f7e3047e59f14444fa076fd)) * gemini key validation ([9f2f0ef](https://github.com/sai80082/immich-power-tools/commit/9f2f0ef7a6cf124cc305dae5a9d08ecdd1ce43f8)) * gemini response and query fixes ([1b986a8](https://github.com/sai80082/immich-power-tools/commit/1b986a831f5de50c63285e0e502337efe1aae256)) * get heatmap for past one year only ([5e41c88](https://github.com/sai80082/immich-power-tools/commit/5e41c88a89425fd51052e548580ba7ef6ac87013)) * heatmap design fixes ([7bd500b](https://github.com/sai80082/immich-power-tools/commit/7bd500b1d260b87d02c7ec8a30b6876784108571)) * improve buffer handling in uploadAssetBuffer function ([a24ccb1](https://github.com/sai80082/immich-power-tools/commit/a24ccb178a33053a6ea71ca79109b246a4bdc1e6)) * improve error handling in search API and log response from Gemini ([d47916d](https://github.com/sai80082/immich-power-tools/commit/d47916d78615db6aca8a33bbf187599acf26f6e3)) * improved ux for renaming and merging ([9a42894](https://github.com/sai80082/immich-power-tools/commit/9a428943416ebfaf275eed7a740c398f62ae0f24)) * login and logout updates ([30526e8](https://github.com/sai80082/immich-power-tools/commit/30526e8e46bb07f1186122752666a6916fcf0327)) * login page cleanup ([cb594bf](https://github.com/sai80082/immich-power-tools/commit/cb594bf8e8cfc3e7649ac958b126b1f465df8b84)) * logout button design fix ([adf6466](https://github.com/sai80082/immich-power-tools/commit/adf64667c451b0e2c0a4c3cb5701c33ece84f67e)) * merge face using dropdown ([38b736c](https://github.com/sai80082/immich-power-tools/commit/38b736c5ee4daeb1602e337cabb121c8af126ee9)) * minor auth fix ([7078768](https://github.com/sai80082/immich-power-tools/commit/707876825ea1bc123b9a530c45d05b9ba44bc876)) * minor condition fix ([e7687b9](https://github.com/sai80082/immich-power-tools/commit/e7687b9b2b0fea487a022d0d1d7b55e0e4ca4a82)) * minor design fix ([b60660f](https://github.com/sai80082/immich-power-tools/commit/b60660fe2ebe35365c392a43eda7d7bdf2212dc2)) * minor design fix ([b365e7d](https://github.com/sai80082/immich-power-tools/commit/b365e7d3ab2e23531c96425ded7afd5f27ad3cb6)) * minor design fix ([0da9504](https://github.com/sai80082/immich-power-tools/commit/0da950416142e61f144bc32b5b9cd66ddd4c0113)) * minor design fixes ([9bd314f](https://github.com/sai80082/immich-power-tools/commit/9bd314f626efc6523cce8df2a0304b39db5648c3)) * minor design fixes ([82510b8](https://github.com/sai80082/immich-power-tools/commit/82510b87805817eae90284c15fa7b0cdac1ba72d)) * minor design fixes ([ac4233d](https://github.com/sai80082/immich-power-tools/commit/ac4233d934c2f52aae533c727da90ee4b0dfb407)) * minor design fixes and navigation fixes ([3614c26](https://github.com/sai80082/immich-power-tools/commit/3614c2685f5bfc78641c53576125bdf87f14c756)) * minor fixes ([d7d6458](https://github.com/sai80082/immich-power-tools/commit/d7d64585ffed57b411bcdedeb94b4c709ad88fc4)) * package json meta update ([29581e0](https://github.com/sai80082/immich-power-tools/commit/29581e0bb33843ee7477556b77b4b8f8d417cc31)) * placeholder image for thumbnails ([8a49501](https://github.com/sai80082/immich-power-tools/commit/8a49501f54a5b96aac149ad3e910d6414ac10a04)) * proxy default header fix ([2d2781b](https://github.com/sai80082/immich-power-tools/commit/2d2781bbdcb7eb5ca78e1c202a0036ad16778dac)) * relative date for birthday ([7fdb421](https://github.com/sai80082/immich-power-tools/commit/7fdb42137ceed56439fe99c700371027379c2a7a)) * Remove build-args configuration from release.yml ([b0d4e6a](https://github.com/sai80082/immich-power-tools/commit/b0d4e6a3f1c80cc8f497a449df89df300a3da397)) * removed console logs and made db env backward compatible ([29af267](https://github.com/sai80082/immich-power-tools/commit/29af26727e2feb38f30d7c52ee59801952b09b52)) * removed thubmnail and preview paths ([992f12f](https://github.com/sai80082/immich-power-tools/commit/992f12fc1944762d6d2123ff0c23b31ed053710c)) * removed unused components ([59fb16b](https://github.com/sai80082/immich-power-tools/commit/59fb16bc21b1c7d6fbbb65b91d901c179e1aa05e)) * removed unused packages ([62fc820](https://github.com/sai80082/immich-power-tools/commit/62fc820bc7f982568026963755891f2b9a610fb0)) * selection is unified across the tool ([53fa52c](https://github.com/sai80082/immich-power-tools/commit/53fa52cfd78efb0eadc71740b529c3a4d00be84c)) * share link album sort fix ([0ea4295](https://github.com/sai80082/immich-power-tools/commit/0ea429578ec78c1d75054418225c5327b17a6c18)) * share link to show assets which are not in any of the album ([dcac170](https://github.com/sai80082/immich-power-tools/commit/dcac170d7bd74bf522ac810f46850a2d488737b5)) * support videos ([58f6435](https://github.com/sai80082/immich-power-tools/commit/58f6435689222b9cfafdcaed2e7b8bfc4781bad5)) * table view for albums ([9589be8](https://github.com/sai80082/immich-power-tools/commit/9589be88216f4938b2b76b2558662b16d4ab1eae)) * tailwind fixes ([4dd64aa](https://github.com/sai80082/immich-power-tools/commit/4dd64aa1ff47d1464f325c0344c855a37fb5ed9d)) * thershold option and fix hide person ([e0f96ce](https://github.com/sai80082/immich-power-tools/commit/e0f96cea0d3a978bb214c2a9caee52338e2e56a6)) * unified asset grid across the tool ([f1e0130](https://github.com/sai80082/immich-power-tools/commit/f1e0130232f3771d245014ebbd713f7c788950d0)) * updated bun in docker file ([3d833c4](https://github.com/sai80082/immich-power-tools/commit/3d833c48f524d62f7b5d403da9b8af895f528f02)) * updated db schema based on new immich schema ([177fecf](https://github.com/sai80082/immich-power-tools/commit/177fecffafc7c2b23a3458ef500e24e3304e5646)) * updated docker workflow ([f9d777b](https://github.com/sai80082/immich-power-tools/commit/f9d777b11f7d171ae950176855e93241752da163)) * updated immich endpoint usage to runtime env ([3ad9e9e](https://github.com/sai80082/immich-power-tools/commit/3ad9e9eea3044121b57ecb9bbbeae84492ca4ae6)) * updated permission for docker workflow ([fa246ec](https://github.com/sai80082/immich-power-tools/commit/fa246ec299e908c96b744e8e10c61ca050bc4910)) * updated readme and contribution guide ([d79f414](https://github.com/sai80082/immich-power-tools/commit/d79f41475ff743b7fee0d2be6205806f3765baec)) * updated readme and screenshot ([4766a9f](https://github.com/sai80082/immich-power-tools/commit/4766a9f559d213a91b43860b940fb3c441c8bbf5)) * updated rewind name ([b70d54e](https://github.com/sai80082/immich-power-tools/commit/b70d54eb404f48244cd9b3b6ed94efdd61fed796)) * updates according to the new api ([e9fe68e](https://github.com/sai80082/immich-power-tools/commit/e9fe68e08a1ade145ed73745fec498754ffb46ff)) * use external url for the heatmap redirection ([c994c12](https://github.com/sai80082/immich-power-tools/commit/c994c123b4f0ea6fbcb990ad8a9422a1ce3a86a3)) * version patch ([c36f94f](https://github.com/sai80082/immich-power-tools/commit/c36f94f381d7533b300716f1d468566e27fe9fb8)) * width styling of tag missing location dialog recent searches ([0d93734](https://github.com/sai80082/immich-power-tools/commit/0d9373418337394ce741af7b69b958acbd208b10)) ### Features * add healthcheck configuration to Docker Compose files ([997246d](https://github.com/sai80082/immich-power-tools/commit/997246d93760952e7b2fc8116a16632514794411)) * add logo screen at start ([7f359c1](https://github.com/sai80082/immich-power-tools/commit/7f359c10d70a34ba792a5d121a838fb7f62b99c8)) * add new analytics endpoints and charts for enhanced data visualization ([65d6c90](https://github.com/sai80082/immich-power-tools/commit/65d6c90707f6879eaf351b4d26b671a19a4cb460)) * add search functionality to PeopleList and AlbumPeople components ([5db6e41](https://github.com/sai80082/immich-power-tools/commit/5db6e414a11a5d48688afdd81ed4288b6a0ac26c)) * added ability to merge more than 5 people together ([fbb7439](https://github.com/sai80082/immich-power-tools/commit/fbb74399d622fd2e7b66b0a9720bb17915e4b1ae)) * added album list ([e390984](https://github.com/sai80082/immich-power-tools/commit/e3909847b650776d35eb80b6035f9dba884d8bbf)) * added api key notice in login ([0f05914](https://github.com/sai80082/immich-power-tools/commit/0f0591484f7c30c5d51fd5283e81d0412915422a)) * added birthday selector ([4f9b154](https://github.com/sai80082/immich-power-tools/commit/4f9b154fb83513d2236a31ea6b7ba2d3bbadb758)) * added bulk share links generation ([5b2b779](https://github.com/sai80082/immich-power-tools/commit/5b2b779a04766a53abfba98ae79ea23924cb442a)) * added current user validation to apis ([28d3dea](https://github.com/sai80082/immich-power-tools/commit/28d3deabcddc43eff00377a57685177ccd184819)) * added dark theme ([94039de](https://github.com/sai80082/immich-power-tools/commit/94039dee614d1dbdd57195371694987750532208)) * added date and asset count sorting for missing location ([c28b221](https://github.com/sai80082/immich-power-tools/commit/c28b221325fff8a021e9a965a16ccb2c83bc9831)) * added dockerfile and updated readme ([ee682b6](https://github.com/sai80082/immich-power-tools/commit/ee682b6764d0e729f9402bcb5ee5a205e8788f8a)) * added empty videos option ([cd804d0](https://github.com/sai80082/immich-power-tools/commit/cd804d04ec9b18d5dcc545ff43306e1390eed77b)) * added error debug message in root layout ([ac0db7a](https://github.com/sai80082/immich-power-tools/commit/ac0db7a741910b6db3ad899416af88e5816c19af)) * added exif analytics ([4642187](https://github.com/sai80082/immich-power-tools/commit/4642187066c088d61abf824c9b0a1a1a801877fe)) * added filters endpoint ([894b448](https://github.com/sai80082/immich-power-tools/commit/894b44877bacd1d0a6829446f14373c8ce4d79de)) * added filters in geo heatmap ([e51da37](https://github.com/sai80082/immich-power-tools/commit/e51da375183ba4e9c2b118faa4c25647fbdbf63d)) * added google heatmap ([842e323](https://github.com/sai80082/immich-power-tools/commit/842e323042d8a89f28776052efb51bfa127bf6e2)) * added grid layout for person list ([971bc77](https://github.com/sai80082/immich-power-tools/commit/971bc77b6e4f71dcc1c81a478d2741b6d740401e)) * added image gallery to album assets ([b007508](https://github.com/sai80082/immich-power-tools/commit/b0075082e2b0d94d26bc2e7b4fb6639ed1e4c93d)) * added logout and redirection to login after logout ([6c625f1](https://github.com/sai80082/immich-power-tools/commit/6c625f12734b99ccde5998b703d981e96d8c3796)) * added map location tagging feature ([d35c1ca](https://github.com/sai80082/immich-power-tools/commit/d35c1ca1dd9eccd061bb20b434f852e664f00138)) * added more info to error messages ([1013231](https://github.com/sai80082/immich-power-tools/commit/1013231f001401f8e1728b145ae1040a73920add)) * added option for link expiry ([d5c6f0a](https://github.com/sai80082/immich-power-tools/commit/d5c6f0ac2907e6a26e467346a4aa2838d68da161)) * added option in immich for potential albums asset ([610cd0e](https://github.com/sai80082/immich-power-tools/commit/610cd0e89927e8759c2a748a82115149d34e7fee)) * added option to create album from potential albums ([dcad608](https://github.com/sai80082/immich-power-tools/commit/dcad60886980fe5681224b72c6a43189fe30673b)) * added option to filter no name people ([0597f34](https://github.com/sai80082/immich-power-tools/commit/0597f346622e7981e4da9b00e53eea877f1d28a3)) * added option to group by albums for missing locations ([bb6ffeb](https://github.com/sai80082/immich-power-tools/commit/bb6ffeb4563f48d2f464bdb14d9b993b9afe2e27)) * added option to offset bulk photos ([ac8db26](https://github.com/sai80082/immich-power-tools/commit/ac8db26b8bb79e7f404a05c37de9f1fed4f92a01)) * added options to sort albums ([020ef8a](https://github.com/sai80082/immich-power-tools/commit/020ef8af38db3d90033db42be58b597642bab9a6)) * added people detail screen ([e0dd1b9](https://github.com/sai80082/immich-power-tools/commit/e0dd1b9e00bbd08ec403ec0b3adf55084230bce6)) * added preview in find ([31e5879](https://github.com/sai80082/immich-power-tools/commit/31e58793beab20160f8f116b3c7cc109e2c4758f)) * added proper error messages on load ([86ae90b](https://github.com/sai80082/immich-power-tools/commit/86ae90b16aeb619aed9e001d0fa952b7cd7013b6)) * added proper validations for errors with messages ([9fcda54](https://github.com/sai80082/immich-power-tools/commit/9fcda54e4fbc81b407d1246e647aca5fb5f71afc)) * added rewind data ([2b7dc94](https://github.com/sai80082/immich-power-tools/commit/2b7dc94775dc4082e6d0c32ef0d22f3d267d61a6)) * added secure cookie env ([23c341c](https://github.com/sai80082/immich-power-tools/commit/23c341cba5644be6017072335019bd7aa4fde9cc)) * added similar face search using embeddings ([d0a6d1d](https://github.com/sai80082/immich-power-tools/commit/d0a6d1d9b717432405ed9a7cab5939fe21d2c5dd)) * added storage drilldown in analytics ([9139e82](https://github.com/sai80082/immich-power-tools/commit/9139e821079d69858bb8e4bdebf0785be5aad5db)) * added tooltip to heatmap ([12df97b](https://github.com/sai80082/immich-power-tools/commit/12df97bb97913204e1855bd2a95581443bf45f6e)) * added version ([574f836](https://github.com/sai80082/immich-power-tools/commit/574f83615ef7de2eedc8a4de9706428191d37232)) * album info in header ([8749d88](https://github.com/sai80082/immich-power-tools/commit/8749d884c60edc27da962ea1bb7bfd78d6446ea1)) * album multi select using select ([cf59b4f](https://github.com/sai80082/immich-power-tools/commit/cf59b4fa3f35c3dcdddb62f07eb99d5c96471458)) * albums page redesigned ([ea38120](https://github.com/sai80082/immich-power-tools/commit/ea38120fcb9355780c8f603bd044f936cafe582b)) * base setup ([759d772](https://github.com/sai80082/immich-power-tools/commit/759d7724237e3a59528026197f1e93680fdfa99d)) * base setup for search photos ([c0fec68](https://github.com/sai80082/immich-power-tools/commit/c0fec68e434bff65eb11731f18dd85be19dce6e8)) * better ux for tagging people in album ([aef4e6e](https://github.com/sai80082/immich-power-tools/commit/aef4e6ee860ea57cfaa3e10f7301e9a56904c9b0)) * Build ARM compatible docker image ([8025474](https://github.com/sai80082/immich-power-tools/commit/8025474a34c2639c902871d312160f8807ec1c5e)) * bulk delete in find page and find page clean up ([2150aca](https://github.com/sai80082/immich-power-tools/commit/2150aca1545cc2bbca028ca3658ce715d985c875)) * bulk hide people from album page ([1290831](https://github.com/sai80082/immich-power-tools/commit/1290831ee3f0cd5c187b8e105126744be95eee8f)) * drizzle setup and docker setup ([2c9a33e](https://github.com/sai80082/immich-power-tools/commit/2c9a33e919f7b4bdcf7049ca626d513f2dc8a7af)) * end of year release ([e4b7580](https://github.com/sai80082/immich-power-tools/commit/e4b758018855d8dc5d5817b8589f92d38b89985a)) * end of year release ([bf301b9](https://github.com/sai80082/immich-power-tools/commit/bf301b9c44745fd0b6c158d702381e8444278e23)) * end of year release ([c37c94f](https://github.com/sai80082/immich-power-tools/commit/c37c94f1ec764eb50407c27f7ed3c56dc86d1aac)) * end of year release ([1f5202f](https://github.com/sai80082/immich-power-tools/commit/1f5202f9b5d1126de17cc9f739511634a831de7e)) * end of year release ([a23aa88](https://github.com/sai80082/immich-power-tools/commit/a23aa88ca481dff792d79f59c420b8038af5dd71)) * enhance asset deletion functionality with trash option ([6a041ff](https://github.com/sai80082/immich-power-tools/commit/6a041ff0122647c1b25437d90882aeb860ad9a63)) * enhance bulk duplicate finder with auto-selection and keyboard shortcuts ([c0d5199](https://github.com/sai80082/immich-power-tools/commit/c0d51998b66d4b069e3146889a1ab24302daca5c)) * enhance bulk duplicate management with asset deletion functionality ([ea11428](https://github.com/sai80082/immich-power-tools/commit/ea1142801be225e50f1e9538b283274ff1855e6d)) * enhance person management with merge functionality ([57c9bd2](https://github.com/sai80082/immich-power-tools/commit/57c9bd2070d3931b5f503d1af55ad73daba61546)) * enhance person merging functionality with name filtering ([6259481](https://github.com/sai80082/immich-power-tools/commit/6259481d3ebe6fa29e4ef1defa0055800b26a548)) * filter people with different attributes to find faces to hide ([b752bd2](https://github.com/sai80082/immich-power-tools/commit/b752bd2322a6f8ada3da7a600feee44ba80a5d82)) * heatmap based on the assets in past year ([360c196](https://github.com/sai80082/immich-power-tools/commit/360c19699e75e22b95fc7d6e97ff9c05114e4d1e)) * implement selection mode for managing duplicate assets ([afb2fb0](https://github.com/sai80082/immich-power-tools/commit/afb2fb09d4d518e2b542e5e327ce553be350d402)) * Importing shared assets ([ac8267b](https://github.com/sai80082/immich-power-tools/commit/ac8267b431f599137d756bb2b5d372fc7721476a)) * initial setup 🚀 ([f4c84e0](https://github.com/sai80082/immich-power-tools/commit/f4c84e0e89f76648ff3c6d35f130195351b8b8ed)) * lazy load images in potential albums and missing locations ([e8a3d50](https://github.com/sai80082/immich-power-tools/commit/e8a3d50e1144711d16a153f222eb9b9db58cd5c9)) * made lat and long into single input field ([f7ae586](https://github.com/sai80082/immich-power-tools/commit/f7ae586ed18bde18ec34d627e526619fd4d0f859)) * manage duplicates in bulk ([d443da7](https://github.com/sai80082/immich-power-tools/commit/d443da7df2061b60d65f540b38c4e3c26ab35ee0)) * minimum assets filter in potential albums list ([f173562](https://github.com/sai80082/immich-power-tools/commit/f17356252d02954f9a7dabf70bd354f71beb29c9)) * moved db config from url to individual keys ([a3e12c8](https://github.com/sai80082/immich-power-tools/commit/a3e12c8c0d0d7411e3f4d06ee1a02421e4d39b47)) * moved from google maps to open street maps for heatmaps ([0349646](https://github.com/sai80082/immich-power-tools/commit/0349646953d0cbc027138b11d20e863f253631fd)) * multi select in potential album and missing location using shift key ([4820f35](https://github.com/sai80082/immich-power-tools/commit/4820f35d2a76f69b85a49ff1057eced45609a6ab)) * New api endpoint for statistics ([7df3793](https://github.com/sai80082/immich-power-tools/commit/7df379336d461200d2621f4dd159ab652633bd69)) * new heatmap in analytics ([dbfb10b](https://github.com/sai80082/immich-power-tools/commit/dbfb10b73ae1b8ab0c38a55b40c3c6448de933e0)) * open street man integrated ([0715257](https://github.com/sai80082/immich-power-tools/commit/07152570483531db79943a734d232ba97e7844b8)) * option filter people based on visibility ([506c5a4](https://github.com/sai80082/immich-power-tools/commit/506c5a408e94ff312221337132332b80633b834a)) * option to bulk delete albums ([fdda358](https://github.com/sai80082/immich-power-tools/commit/fdda358ab192ef169f6b15e10d2c45cc48d4aa29)) * option to delete assets from missing locations page ([098701b](https://github.com/sai80082/immich-power-tools/commit/098701b828644d42af2592aca41bd2dae85f1f19)) * option to edit image ([a8bce40](https://github.com/sai80082/immich-power-tools/commit/a8bce40b3a46f7bb6966776a72d4d3f85a81433b)) * people search added ([29f80b8](https://github.com/sai80082/immich-power-tools/commit/29f80b8cd981f430bb4ffa6edd94fff2dce3cfdd)) * people selection in share link ([1fea9cc](https://github.com/sai80082/immich-power-tools/commit/1fea9ccaeec464efe7c643f2d376c09093708c39)) * potential albums feature ([21b053a](https://github.com/sai80082/immich-power-tools/commit/21b053aac6bbfd73aab15de56b3c1ceebcffadb7)) * remember the last location used ([b9d7e54](https://github.com/sai80082/immich-power-tools/commit/b9d7e54c8a9e2e12d2b95081d4acee6d9a97aaa4)) * select all in potential library ([bb405b5](https://github.com/sai80082/immich-power-tools/commit/bb405b5bdf3aacdbd17b996ae488ab9f7ba9e711)) * select all unknown people in album details ([3cad042](https://github.com/sai80082/immich-power-tools/commit/3cad04255a45c033992c0656dce421959a1720e3)) * select and tag face from album images ([7c6b75e](https://github.com/sai80082/immich-power-tools/commit/7c6b75ebd981c745ec175d55a5554795dfddd12f)) * setup auth flow to work in parallel with api key ([5e71e1e](https://github.com/sai80082/immich-power-tools/commit/5e71e1eeeb40245aea4c13d1759a96078c6a746e)) * shared album links ([34f32e4](https://github.com/sai80082/immich-power-tools/commit/34f32e49069828ec4c7ca8595636cde9daf87421)) * store date in url when filtering in missing locations and potential albums ([9af0ba0](https://github.com/sai80082/immich-power-tools/commit/9af0ba0cbe3658c10d071365f53f0ce052bd4733)) * store query in url while filtering people ([a596fa4](https://github.com/sai80082/immich-power-tools/commit/a596fa49437a44bcd1a81f75180468455c28b8e7)) * super charged albums page with people management tools ([6b27686](https://github.com/sai80082/immich-power-tools/commit/6b27686f39ce5b7d5ffbf2293de18a35f205cbef)) * tag missing location for assets ([4f6117d](https://github.com/sai80082/immich-power-tools/commit/4f6117ded2789468da508da03aa64b19bd42d466)) * unified album creation and option to delete assets from potential albums ([72dcb92](https://github.com/sai80082/immich-power-tools/commit/72dcb928efeb5b9da58761ceec75cae03eb79ea2)) * updated UI for rewind. ([37da0ed](https://github.com/sai80082/immich-power-tools/commit/37da0ed69b930fec37d073a8cdfac93341503e43)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a0fab27..44b8422 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "0.19.0", + "version": "1.0.0", "private": true, "scripts": { "dev": "next dev", From d9d8dec2d1cacbcd205c209b8592063a429428aa Mon Sep 17 00:00:00 2001 From: Sai charan Guntupalli <63032681+sai80082@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:20:18 +0530 Subject: [PATCH 07/29] Update Buy Me a Coffee username --- .github/FUNDING.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..95c7e51 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: saicharang +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From cfd8e40c811af5a72194aeaae74cc4ba99cbce69 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Wed, 4 Feb 2026 12:34:04 +0530 Subject: [PATCH 08/29] feat: transition to new repo. --- README.md | 13 +++++-------- docker-compose-all-immich.yml | 2 +- docker-compose.yml | 2 +- package.json | 6 +++--- src/components/layouts/RootLayout.tsx | 2 +- src/components/shared/ProfileInfo.tsx | 18 +----------------- 6 files changed, 12 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index d2cbcd9..b61b334 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +> [!NOTE] +> This project is a fork of [varun-raj/immich-power-tools](https://github.com/varun-raj/immich-power-tools). The original maintainer was inactive for a while, so I decided to continue development by adding new features. + # ![Logo](./public/favicon-32x32.png) Immich Power Tools A unofficial immich client to provide better tools to organize and manage your immich account. Building it to speed up your workflows in Immich to organize your people and albums. @@ -15,12 +18,6 @@ A unofficial immich client to provide better tools to organize and manage your i - **Smart Search 🔎**: Search your library with natural language, supports queries like "show me all my photos from 2024 of " - **Bulk Date Offset 📅**: Offset the date of selected assets by a given amount of time. Majorly used to fix the date of assets that are out of sync with the actual date. -### Support me 🙏 - -If you find this tool useful, please consider supporting me by buying me a coffee. - -[![Buy me a coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/varunraj) - ## 💭 Back story Recently I've migrated my entire Google photos library to Immich, I was able to successfully migrate all my assets along with its albums to immich. But there were few things like people match that was lacking. I loved Immich UI on the whole but for organizing content I felt its quite restricted and I had to do a lot of things in bulk instead of opening each asset and doing it. Hence I built this tool (continuing to itereate) to make my life and any other Immich user's life easier. @@ -41,7 +38,7 @@ services: # Other services... power-tools: container_name: immich_power_tools - image: ghcr.io/varun-raj/immich-power-tools:latest + image: ghcr.io/sai80082/immich-power-tools:latest ports: - "8001:3000" env_file: @@ -73,7 +70,7 @@ If you're using portainer, run the docker using `docker run` and add the power t ```bash # Run the power tools from docker -docker run -d --name immich_power_tools -p 8001:3000 --env-file .env ghcr.io/varun-raj/immich-power-tools:latest +docker run -d --name immich_power_tools -p 8001:3000 --env-file .env ghcr.io/sai80082/immich-power-tools:latest # Add Power tools to the same network as immich docker network connect immich_default immich_power_tools diff --git a/docker-compose-all-immich.yml b/docker-compose-all-immich.yml index a5e49ad..fb9a246 100644 --- a/docker-compose-all-immich.yml +++ b/docker-compose-all-immich.yml @@ -52,7 +52,7 @@ services: power-tools: container_name: immich_power_tools - image: ghcr.io/varun-raj/immich-power-tools:latest + image: ghcr.io/sai80082/immich-power-tools:latest ports: - "8001:3000" env_file: diff --git a/docker-compose.yml b/docker-compose.yml index b11157e..0c0646a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.8' services: immich_power_tools: container_name: immich_power_tools - image: ghcr.io/varun-raj/immich-power-tools:latest + image: ghcr.io/sai80082/immich-power-tools:latest ports: - "3000:3000" env_file: diff --git a/package.json b/package.json index 44b8422..0b63763 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "lint": "next lint" }, "author": { - "name": "Varun Raj Manoharan", - "email": "varun@skcript.com", - "url": "https://varunraj.in" + "name": "Sai Charan Guntupalli", + "email": "me@saicharang.com", + "url": "https://saicharang.com" }, "dependencies": { "@google/generative-ai": "^0.21.0", diff --git a/src/components/layouts/RootLayout.tsx b/src/components/layouts/RootLayout.tsx index 5a366a4..73cee3a 100644 --- a/src/components/layouts/RootLayout.tsx +++ b/src/components/layouts/RootLayout.tsx @@ -58,7 +58,7 @@ export default function RootLayout({ children }: RootLayoutProps) { diff --git a/src/components/shared/ProfileInfo.tsx b/src/components/shared/ProfileInfo.tsx index 87e8e73..dfc01eb 100644 --- a/src/components/shared/ProfileInfo.tsx +++ b/src/components/shared/ProfileInfo.tsx @@ -43,28 +43,12 @@ export default function ProfileInfo() { Log Out )} - )}
-

- Made with ♥ by{" "} - - @zathvarun - -

- + v{version}
From 1145b2c995e984dfe3e16298b52ea7e0bf8098c8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 4 Feb 2026 07:06:31 +0000 Subject: [PATCH 09/29] chore(release): 1.1.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.1.0 ### Features * transition to new repo. ([cfd8e40](https://github.com/sai80082/immich-power-tools/commit/cfd8e40c811af5a72194aeaae74cc4ba99cbce69)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0b63763..f43bf8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.0.0", + "version": "1.1.0", "private": true, "scripts": { "dev": "next dev", From df452d849decc8156d9b3a2bf29064641fe50431 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Thu, 5 Feb 2026 15:49:02 +0530 Subject: [PATCH 10/29] fix: DB schema update to support latest immich release --- src/pages/api/albums/[id]/assets.ts | 5 ++--- src/pages/api/albums/[id]/info.ts | 4 ++-- src/pages/api/albums/[id]/people.ts | 4 ++-- src/pages/api/albums/[id]/public-info.ts | 4 ++-- src/pages/api/albums/list.ts | 4 ++-- src/pages/api/albums/merge.ts | 4 ++-- src/pages/api/albums/potential-albums-assets.ts | 1 - src/pages/api/albums/potential-albums-dates.ts | 4 ++-- src/pages/api/assets/empty-videos.ts | 1 - src/pages/api/assets/geo-heatmap.ts | 6 +++--- src/pages/api/assets/missing-location-albums.ts | 4 ++-- src/pages/api/assets/missing-location-assets.ts | 6 ++---- src/pages/api/people/[id]/info.ts | 4 ++-- src/pages/api/rewind/stats.ts | 4 ++-- src/pages/api/share-link/[token]/assets.ts | 5 ++--- src/pages/api/share-link/[token]/people.ts | 4 ++-- src/schema/albumAssetsAssets.schema.ts | 4 ++-- src/schema/assets.schema.ts | 1 - src/schema/relationships.ts | 4 ++-- 19 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/pages/api/albums/[id]/assets.ts b/src/pages/api/albums/[id]/assets.ts index 78e5b2e..329fca4 100644 --- a/src/pages/api/albums/[id]/assets.ts +++ b/src/pages/api/albums/[id]/assets.ts @@ -36,7 +36,6 @@ export default async function handler( duration: assets.duration, encodedVideoPath: assets.encodedVideoPath, originalFileName: assets.originalFileName, - sidecarPath: assets.sidecarPath, deletedAt: assets.deletedAt, localDateTime: assets.localDateTime, exifImageWidth: exif.exifImageWidth, @@ -46,12 +45,12 @@ export default async function handler( orientation: exif.orientation, }) .from(albumsAssetsAssets) - .leftJoin(assets, eq(albumsAssetsAssets.assetsId, assets.id)) + .leftJoin(assets, eq(albumsAssetsAssets.assetId, assets.id)) .leftJoin(exif, eq(assets.id, exif.assetId)) .leftJoin(assetFaces, eq(assets.id, assetFaces.assetId)) .leftJoin(person, eq(assetFaces.personId, person.id)) .where(and( - eq(albumsAssetsAssets.albumsId, id), + eq(albumsAssetsAssets.albumId, id), eq(assets.visibility, "timeline"), eq(assets.status, "active"), faceId ? eq(assetFaces.personId, faceId) : undefined, diff --git a/src/pages/api/albums/[id]/info.ts b/src/pages/api/albums/[id]/info.ts index 8b20d42..e0fb466 100644 --- a/src/pages/api/albums/[id]/info.ts +++ b/src/pages/api/albums/[id]/info.ts @@ -31,8 +31,8 @@ export default async function handler( faceCount: count(sql`DISTINCT ${person.id}`), // Ensure unique personId }) .from(albums) - .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumsId)) - .leftJoin(assets, eq(albumsAssetsAssets.assetsId, assets.id)) + .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumId)) + .leftJoin(assets, eq(albumsAssetsAssets.assetId, assets.id)) .leftJoin(exif, and(eq(assets.id, exif.assetId), eq(assets.visibility, "timeline"))) .leftJoin(assetFaces, eq(assets.id, assetFaces.assetId)) .leftJoin(person, and(eq(assetFaces.personId, person.id), eq(person.isHidden, false))) diff --git a/src/pages/api/albums/[id]/people.ts b/src/pages/api/albums/[id]/people.ts index 81f3b3c..b39c3db 100644 --- a/src/pages/api/albums/[id]/people.ts +++ b/src/pages/api/albums/[id]/people.ts @@ -26,8 +26,8 @@ export default async function handler( numberOfPhotos: count(assets.id), }) .from(albums) - .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumsId)) - .leftJoin(assets, eq(albumsAssetsAssets.assetsId, assets.id)) + .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumId)) + .leftJoin(assets, eq(albumsAssetsAssets.assetId, assets.id)) .leftJoin(assetFaces, eq(assets.id, assetFaces.assetId)) .leftJoin(person, and(eq(assetFaces.personId, person.id), eq(person.isHidden, false))) .where(and(eq(albums.ownerId, currentUser.id), eq(albums.id, id), isNotNull(person.id))) diff --git a/src/pages/api/albums/[id]/public-info.ts b/src/pages/api/albums/[id]/public-info.ts index b844192..5296144 100644 --- a/src/pages/api/albums/[id]/public-info.ts +++ b/src/pages/api/albums/[id]/public-info.ts @@ -27,8 +27,8 @@ export default async function handler( faceCount: count(sql`DISTINCT ${person.id}`), // Ensure unique personId }) .from(albums) - .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumsId)) - .leftJoin(assets, eq(albumsAssetsAssets.assetsId, assets.id)) + .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumId)) + .leftJoin(assets, eq(albumsAssetsAssets.assetId, assets.id)) .leftJoin(exif, and(eq(assets.id, exif.assetId), eq(assets.visibility, "timeline"))) .leftJoin(assetFaces, eq(assets.id, assetFaces.assetId)) .leftJoin(person, and(eq(assetFaces.personId, person.id), eq(person.isHidden, false))) diff --git a/src/pages/api/albums/list.ts b/src/pages/api/albums/list.ts index 97df105..4eb2f17 100644 --- a/src/pages/api/albums/list.ts +++ b/src/pages/api/albums/list.ts @@ -69,9 +69,9 @@ export default async function handler( faceCount: count(sql`DISTINCT ${assetFaces.personId}`), // Ensure unique personId }) .from(albums) - .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumsId)) + .leftJoin(albumsAssetsAssets, eq(albums.id, albumsAssetsAssets.albumId)) .leftJoin(assets, and( - eq(albumsAssetsAssets.assetsId, assets.id), + eq(albumsAssetsAssets.assetId, assets.id), eq(assets.visibility, "timeline"), eq(assets.status, "active"), )) diff --git a/src/pages/api/albums/merge.ts b/src/pages/api/albums/merge.ts index b10e873..45e56ab 100644 --- a/src/pages/api/albums/merge.ts +++ b/src/pages/api/albums/merge.ts @@ -61,13 +61,13 @@ export default async function handler( const secondaryAlbumAssets = await db .select() .from(albumsAssetsAssets) - .where(inArray(albumsAssetsAssets.albumsId, secondaryAlbumIds)); + .where(inArray(albumsAssetsAssets.albumId, secondaryAlbumIds)); if (secondaryAlbumAssets.length === 0) { return res.status(404).json({ error: "Secondary album assets not found" }); } - const secondaryAlbumAssetsIds = secondaryAlbumAssets.map((albumAsset) => albumAsset.assetsId); + const secondaryAlbumAssetsIds = secondaryAlbumAssets.map((albumAsset) => albumAsset.assetId); const addAssetsToPrimaryAlbumURL = `${ENV.IMMICH_URL}/api/albums/${primaryAlbumId}/assets`; const addAssetsToPrimaryAlbum = await fetch(addAssetsToPrimaryAlbumURL, { diff --git a/src/pages/api/albums/potential-albums-assets.ts b/src/pages/api/albums/potential-albums-assets.ts index 01558a2..6ac09d2 100644 --- a/src/pages/api/albums/potential-albums-assets.ts +++ b/src/pages/api/albums/potential-albums-assets.ts @@ -16,7 +16,6 @@ const SELECT_ORPHAN_PHOTOS = (date: string, ownerId: string) => a."duration", a."encodedVideoPath", a."originalFileName", - a."sidecarPath", a."thumbhash", a."deletedAt", e."exifImageWidth", diff --git a/src/pages/api/albums/potential-albums-dates.ts b/src/pages/api/albums/potential-albums-dates.ts index 47a5c25..e9670aa 100644 --- a/src/pages/api/albums/potential-albums-dates.ts +++ b/src/pages/api/albums/potential-albums-dates.ts @@ -21,12 +21,12 @@ export default async function handler( date: sql`DATE(${exif.dateTimeOriginal})`, asset_count: desc(count(assets.id)), }).from(assets) - .leftJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetsId)) + .leftJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) .leftJoin(exif, eq(assets.id, exif.assetId)) .where(and ( eq(assets.ownerId, currentUser.id), eq(assets.visibility, "timeline"), - isNull(albumsAssetsAssets.albumsId), + isNull(albumsAssetsAssets.albumId), isNotNull(exif.dateTimeOriginal), )) diff --git a/src/pages/api/assets/empty-videos.ts b/src/pages/api/assets/empty-videos.ts index e97d877..5b2bdf4 100644 --- a/src/pages/api/assets/empty-videos.ts +++ b/src/pages/api/assets/empty-videos.ts @@ -58,7 +58,6 @@ const dbAssets = await db duration: assets.duration, encodedVideoPath: assets.encodedVideoPath, originalFileName: assets.originalFileName, - sidecarPath: assets.sidecarPath, deletedAt: assets.deletedAt, localDateTime: assets.localDateTime, exifImageWidth: exif.exifImageWidth, diff --git a/src/pages/api/assets/geo-heatmap.ts b/src/pages/api/assets/geo-heatmap.ts index e3d6eb0..b48f216 100644 --- a/src/pages/api/assets/geo-heatmap.ts +++ b/src/pages/api/assets/geo-heatmap.ts @@ -21,15 +21,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) longitude: exif.longitude, }).from(assets) .innerJoin(exif, eq(assets.id, exif.assetId)) - .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetsId)) - .innerJoin(assetFaces, eq(albumsAssetsAssets.assetsId, assetFaces.assetId)) + .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) + .innerJoin(assetFaces, eq(albumsAssetsAssets.assetId, assetFaces.assetId)) .innerJoin(person, eq(assetFaces.personId, person.id)) .where( and( eq(assets.ownerId, currentUser.id), isNotNull(exif.latitude), isNotNull(exif.longitude), - albumIds?.length > 0 ? inArray(albumsAssetsAssets.albumsId, [albumIds]) : undefined, + albumIds?.length > 0 ? inArray(albumsAssetsAssets.albumId, [albumIds]) : undefined, peopleIds?.length > 0 ? inArray(person.id, [peopleIds]) : undefined ) ); diff --git a/src/pages/api/assets/missing-location-albums.ts b/src/pages/api/assets/missing-location-albums.ts index 4bca99e..69d183e 100644 --- a/src/pages/api/assets/missing-location-albums.ts +++ b/src/pages/api/assets/missing-location-albums.ts @@ -27,8 +27,8 @@ export default async function handler( }) .from(assets) .leftJoin(exif, eq(exif.assetId, assets.id)) - .leftJoin(albumsAssetsAssets, eq(albumsAssetsAssets.assetsId, assets.id)) - .leftJoin(albums, eq(albums.id, albumsAssetsAssets.albumsId)) + .leftJoin(albumsAssetsAssets, eq(albumsAssetsAssets.assetId, assets.id)) + .leftJoin(albums, eq(albums.id, albumsAssetsAssets.albumId)) .where( and( isNull(exif.latitude), diff --git a/src/pages/api/assets/missing-location-assets.ts b/src/pages/api/assets/missing-location-assets.ts index 66a5d0e..3355ca9 100644 --- a/src/pages/api/assets/missing-location-assets.ts +++ b/src/pages/api/assets/missing-location-assets.ts @@ -22,7 +22,6 @@ const getRowsByDates = async (startDateDate: Date, endDateDate: Date, currentUse duration: assets.duration, encodedVideoPath: assets.encodedVideoPath, originalFileName: assets.originalFileName, - sidecarPath: assets.sidecarPath, deletedAt: assets.deletedAt, localDateTime: assets.localDateTime, exifImageWidth: exif.exifImageWidth, @@ -55,7 +54,6 @@ const getRowsByAlbums = async (currentUser: IUser, albumId: string) => { duration: assets.duration, encodedVideoPath: assets.encodedVideoPath, originalFileName: assets.originalFileName, - sidecarPath: assets.sidecarPath, deletedAt: assets.deletedAt, localDateTime: assets.localDateTime, exifImageWidth: exif.exifImageWidth, @@ -66,8 +64,8 @@ const getRowsByAlbums = async (currentUser: IUser, albumId: string) => { }) .from(assets) .leftJoin(exif, eq(exif.assetId, assets.id)) - .leftJoin(albumsAssetsAssets, eq(albumsAssetsAssets.assetsId, assets.id)) - .leftJoin(albums, eq(albums.id, albumsAssetsAssets.albumsId)) + .leftJoin(albumsAssetsAssets, eq(albumsAssetsAssets.assetId, assets.id)) + .leftJoin(albums, eq(albums.id, albumsAssetsAssets.albumId)) .where(and( isNull(exif.latitude), isNotNull(assets.createdAt), diff --git a/src/pages/api/people/[id]/info.ts b/src/pages/api/people/[id]/info.ts index 1961149..1f26f24 100644 --- a/src/pages/api/people/[id]/info.ts +++ b/src/pages/api/people/[id]/info.ts @@ -36,8 +36,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) .leftJoin(assetFaces, eq(assetFaces.personId, personRecord.id)) .leftJoin(assets, eq(assets.id, assetFaces.assetId)) .leftJoin(exif, eq(exif.assetId, assets.id)) - .leftJoin(albumsAssetsAssets, eq(albumsAssetsAssets.assetsId, assets.id)) - .where(eq(albumsAssetsAssets.albumsId, albums.id)) + .leftJoin(albumsAssetsAssets, eq(albumsAssetsAssets.assetId, assets.id)) + .where(eq(albumsAssetsAssets.albumId, albums.id)) .groupBy(albums.id); diff --git a/src/pages/api/rewind/stats.ts b/src/pages/api/rewind/stats.ts index d8dc1fb..3824478 100644 --- a/src/pages/api/rewind/stats.ts +++ b/src/pages/api/rewind/stats.ts @@ -66,8 +66,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) cover: albums.albumThumbnailAssetId }) .from(albumsAssetsAssets) - .leftJoin(albums, eq(albums.id, albumsAssetsAssets.albumsId)) - .leftJoin(assets, eq(assets.id, albumsAssetsAssets.assetsId)) + .leftJoin(albums, eq(albums.id, albumsAssetsAssets.albumId)) + .leftJoin(assets, eq(assets.id, albumsAssetsAssets.assetId)) .leftJoin(exif, eq(exif.assetId, assets.id)) .where(and( eq(sql`EXTRACT(YEAR FROM ${exif.dateTimeOriginal})`, year), diff --git a/src/pages/api/share-link/[token]/assets.ts b/src/pages/api/share-link/[token]/assets.ts index 635a8fb..6066e46 100644 --- a/src/pages/api/share-link/[token]/assets.ts +++ b/src/pages/api/share-link/[token]/assets.ts @@ -63,7 +63,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) duration: assets.duration, encodedVideoPath: assets.encodedVideoPath, originalFileName: assets.originalFileName, - sidecarPath: assets.sidecarPath, deletedAt: assets.deletedAt, localDateTime: assets.localDateTime, exifImageWidth: exif.exifImageWidth, @@ -76,8 +75,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) orientation: exif.orientation, }).from(assets) .innerJoin(assetFaces, eq(assets.id, assetFaces.assetId)) - .leftJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetsId)) - .leftJoin(albums, eq(albumsAssetsAssets.albumsId, albums.id)) + .leftJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) + .leftJoin(albums, eq(albumsAssetsAssets.albumId, albums.id)) .innerJoin(exif, eq(exif.assetId, assets.id)) .where(and( filteredPersonIds?.length > 0 ? inArray(assetFaces.personId, filteredPersonIds) : undefined, diff --git a/src/pages/api/share-link/[token]/people.ts b/src/pages/api/share-link/[token]/people.ts index 694ee65..02449f3 100644 --- a/src/pages/api/share-link/[token]/people.ts +++ b/src/pages/api/share-link/[token]/people.ts @@ -44,9 +44,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) assetCount: count(assets.id), }).from(assets) .innerJoin(assetFaces, eq(assets.id, assetFaces.assetId)) - .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetsId)) + .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) .innerJoin(person, eq(assetFaces.personId, person.id)) - .innerJoin(albums, eq(albumsAssetsAssets.albumsId, albums.id)) + .innerJoin(albums, eq(albumsAssetsAssets.albumId, albums.id)) .innerJoin(exif, eq(exif.assetId, assets.id)) .where(and( personIds?.length > 0 ? inArray(assetFaces.personId, personIds) : undefined, diff --git a/src/schema/albumAssetsAssets.schema.ts b/src/schema/albumAssetsAssets.schema.ts index 4aabfd5..ee0ae1f 100644 --- a/src/schema/albumAssetsAssets.schema.ts +++ b/src/schema/albumAssetsAssets.schema.ts @@ -1,7 +1,7 @@ import { pgTable, uuid, timestamp } from 'drizzle-orm/pg-core'; export const albumsAssetsAssets = pgTable('album_asset', { - albumsId: uuid('albumId').notNull(), - assetsId: uuid('assetId').notNull(), + albumId: uuid('albumId').notNull(), + assetId: uuid('assetId').notNull(), createdAt: timestamp('createdAt', { withTimezone: true }).defaultNow().notNull(), }); \ No newline at end of file diff --git a/src/schema/assets.schema.ts b/src/schema/assets.schema.ts index 0f9b564..7782143 100644 --- a/src/schema/assets.schema.ts +++ b/src/schema/assets.schema.ts @@ -19,7 +19,6 @@ export const assets = pgTable('asset', { createdAt: timestamp('createdAt', { withTimezone: true }).defaultNow().notNull(), status: varchar('status').default('active').notNull(), originalFileName: varchar('originalFileName').notNull(), - sidecarPath: varchar('sidecarPath'), // thumbhash: bytea('thumbhash'), isOffline: boolean('isOffline').default(false).notNull(), // libraryId: uuid('libraryId').references(() => libraries.id, { onDelete: 'cascade', onUpdate: 'cascade' }), diff --git a/src/schema/relationships.ts b/src/schema/relationships.ts index 4b5d15b..303c359 100644 --- a/src/schema/relationships.ts +++ b/src/schema/relationships.ts @@ -44,11 +44,11 @@ export const faceSearchRelations = relations(faceSearch, ({ one }) => ({ // Assuming there are relations to be defined with `albums` and `assets` export const albumsAssetsAssetsRelations = relations(albumsAssetsAssets, ({ one }) => ({ album: one(albums, { - fields: [albumsAssetsAssets.albumsId], + fields: [albumsAssetsAssets.albumId], references: [albums.id], }), asset: one(assets, { - fields: [albumsAssetsAssets.assetsId], + fields: [albumsAssetsAssets.assetId], references: [assets.id], }), })); From a9bcd694a0b8087ad51940bb7a0f95391a55750d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Feb 2026 10:19:55 +0000 Subject: [PATCH 11/29] chore(release): 1.1.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.1.1 ### Bug Fixes * DB schema update to support latest immich release ([df452d8](https://github.com/sai80082/immich-power-tools/commit/df452d849decc8156d9b3a2bf29064641fe50431)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f43bf8b..2979a09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.1.0", + "version": "1.1.1", "private": true, "scripts": { "dev": "next dev", From b0607f310ec3a38b146988242e5d0f9e2d33bf86 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Thu, 5 Feb 2026 15:55:23 +0530 Subject: [PATCH 12/29] fix: correct join condition for album assets in photo statistics --- src/pages/api/analytics/statistics/album-photos.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/api/analytics/statistics/album-photos.ts b/src/pages/api/analytics/statistics/album-photos.ts index 2ff2432..77d0e06 100644 --- a/src/pages/api/analytics/statistics/album-photos.ts +++ b/src/pages/api/analytics/statistics/album-photos.ts @@ -17,7 +17,7 @@ export default async function handler( value: count(sql`DISTINCT ${assets.id}`), }) .from(assets) - .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetsId)) + .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) .where(eq(assets.ownerId, currentUser.id)); // Count total photos From 86e4c1602ffb976ef3b94c99fb03e7274bba8d98 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Feb 2026 10:26:17 +0000 Subject: [PATCH 13/29] chore(release): 1.1.2 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.1.2 ### Bug Fixes * correct join condition for album assets in photo statistics ([b0607f3](https://github.com/sai80082/immich-power-tools/commit/b0607f310ec3a38b146988242e5d0f9e2d33bf86)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2979a09..37aee71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.1.1", + "version": "1.1.2", "private": true, "scripts": { "dev": "next dev", From c7b7e020113f3fba6062ef4817a6c998db978653 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Fri, 6 Feb 2026 12:00:31 +0530 Subject: [PATCH 14/29] fix: update heatmap data conversion and improve query structure for geo heatmap --- src/components/LeafletHeatMap.tsx | 13 ++++--- src/pages/api/assets/geo-heatmap.ts | 56 ++++++++++++++++++++++------- src/pages/assets/geo-heatmap.tsx | 6 +--- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/components/LeafletHeatMap.tsx b/src/components/LeafletHeatMap.tsx index c7a40d5..2a679e5 100644 --- a/src/components/LeafletHeatMap.tsx +++ b/src/components/LeafletHeatMap.tsx @@ -26,8 +26,10 @@ const LeafletHeatMap: React.FC = ({ filters, isDarkMode, on // Initialize the map const map = L.map(mapContainerRef.current, { - center: [0, 0], + center: [20, 0], zoom: 2, + minZoom: 2, + maxZoom: 18, zoomControl: true, scrollWheelZoom: true, doubleClickZoom: true, @@ -35,6 +37,9 @@ const LeafletHeatMap: React.FC = ({ filters, isDarkMode, on keyboard: true, dragging: true, touchZoom: true, + worldCopyJump: true, + maxBounds: [[-85, -Infinity], [85, Infinity]], + maxBoundsViscosity: 1.0, }); mapRef.current = map; @@ -76,10 +81,10 @@ const LeafletHeatMap: React.FC = ({ filters, isDarkMode, on } // Create new heat layer with the data - // Convert [lng, lat] to [lat, lng, intensity] format for leaflet.heat - const heatData: [number, number, number][] = data.map(([lng, lat]: [number, number]) => [ + // Convert [lon, lat] to [lat, lon, intensity] format for leaflet.heat + const heatData: [number, number, number][] = data.map(([lon, lat]: [number, number]) => [ lat, // latitude first for leaflet.heat - lng, // longitude second + lon, // longitude second 1 // intensity (weight) ]); diff --git a/src/pages/api/assets/geo-heatmap.ts b/src/pages/api/assets/geo-heatmap.ts index b48f216..a2193fd 100644 --- a/src/pages/api/assets/geo-heatmap.ts +++ b/src/pages/api/assets/geo-heatmap.ts @@ -15,24 +15,54 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } - const dbAssets = await db.select({ + // Build query with optional LEFT JOINs based on filters + let query = db.select({ assetId: assets.id, latitude: exif.latitude, longitude: exif.longitude, }).from(assets) .innerJoin(exif, eq(assets.id, exif.assetId)) - .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) - .innerJoin(assetFaces, eq(albumsAssetsAssets.assetId, assetFaces.assetId)) - .innerJoin(person, eq(assetFaces.personId, person.id)) - .where( - and( - eq(assets.ownerId, currentUser.id), - isNotNull(exif.latitude), - isNotNull(exif.longitude), - albumIds?.length > 0 ? inArray(albumsAssetsAssets.albumId, [albumIds]) : undefined, - peopleIds?.length > 0 ? inArray(person.id, [peopleIds]) : undefined - ) - ); + .$dynamic(); + + // Only join albums table if filtering by albumIds + if (albumIds) { + query = query + .innerJoin(albumsAssetsAssets, eq(assets.id, albumsAssetsAssets.assetId)) + .where( + and( + eq(assets.ownerId, currentUser.id), + isNotNull(exif.latitude), + isNotNull(exif.longitude), + inArray(albumsAssetsAssets.albumId, [albumIds]) + ) + ); + } + // Only join people table if filtering by peopleIds + else if (peopleIds) { + query = query + .innerJoin(assetFaces, eq(assets.id, assetFaces.assetId)) + .innerJoin(person, eq(assetFaces.personId, person.id)) + .where( + and( + eq(assets.ownerId, currentUser.id), + isNotNull(exif.latitude), + isNotNull(exif.longitude), + inArray(person.id, [peopleIds]) + ) + ); + } + // No filters - get all assets with location + else { + query = query.where( + and( + eq(assets.ownerId, currentUser.id), + isNotNull(exif.latitude), + isNotNull(exif.longitude) + ) + ); + } + + const dbAssets = await query; const heatmapData = dbAssets.map((asset) => [ asset.longitude, asset.latitude, diff --git a/src/pages/assets/geo-heatmap.tsx b/src/pages/assets/geo-heatmap.tsx index 3c65ee7..4fbbfc1 100644 --- a/src/pages/assets/geo-heatmap.tsx +++ b/src/pages/assets/geo-heatmap.tsx @@ -1,7 +1,7 @@ import Header from '@/components/shared/Header' import React, { useState } from 'react' import PageLayout from '@/components/layouts/PageLayout'; -import { getAssetGeoHeatmap, IHeatMapParams } from '@/handlers/api/asset.handler'; +import { IHeatMapParams } from '@/handlers/api/asset.handler'; import { useTheme } from 'next-themes'; import { X } from 'lucide-react'; import AlbumDropdown from '@/components/shared/AlbumDropdown'; @@ -15,10 +15,6 @@ const LeafletHeatMap = dynamic(() => import('../../components/LeafletHeatMap'), loading: () =>
Loading map...
}); -interface IHeatMapProps { - filters: IHeatMapParams; -} - export default function GeoHeatmap() { const { theme } = useTheme(); const [filters, setFilters] = useState<{ From a8e4f77f3a43669a03d57663543959778a888c9a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 6 Feb 2026 06:31:19 +0000 Subject: [PATCH 15/29] chore(release): 1.1.3 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.1.3 ### Bug Fixes * update heatmap data conversion and improve query structure for geo heatmap ([c7b7e02](https://github.com/sai80082/immich-power-tools/commit/c7b7e020113f3fba6062ef4817a6c998db978653)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 37aee71..fb6d32c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.1.2", + "version": "1.1.3", "private": true, "scripts": { "dev": "next dev", From 222d9a5982cccea1f8de99979712187950e32963 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Mon, 9 Feb 2026 15:08:54 +0530 Subject: [PATCH 16/29] feat: implement OAuth login functionality and update configuration --- src/components/auth/LoginForm.tsx | 71 ++++++++++---- src/config/environment.ts | 3 + src/contexts/ConfigContext.tsx | 4 + src/pages/_app.tsx | 2 + src/pages/api/auth/oauth/authorize.ts | 87 +++++++++++++++++ src/pages/api/auth/oauth/callback.ts | 134 ++++++++++++++++++++++++++ 6 files changed, 281 insertions(+), 20 deletions(-) create mode 100644 src/pages/api/auth/oauth/authorize.ts create mode 100644 src/pages/api/auth/oauth/callback.ts diff --git a/src/components/auth/LoginForm.tsx b/src/components/auth/LoginForm.tsx index 8bec9d1..c3666a5 100644 --- a/src/components/auth/LoginForm.tsx +++ b/src/components/auth/LoginForm.tsx @@ -10,13 +10,12 @@ import { } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" -import { useState } from "react" +import { useEffect, useState } from "react" import { loginUser } from "@/handlers/api/user.handler" import { useConfig } from "@/contexts/ConfigContext" import { IUser } from "@/types/user" import Head from "next/head" -import { Tooltip } from "../ui/tooltip" -import { set } from "date-fns" +import { useRouter } from "next/router" export const description = "A login form with email and password. There's an option to login with Google and a link to sign up if you don't have an account." @@ -27,7 +26,8 @@ interface ILoginFormProps { export function LoginForm( { onLogin }: ILoginFormProps ) { - const { exImmichUrl } = useConfig() + const { exImmichUrl, oauthEnabled, oauthButtonText } = useConfig() + const router = useRouter() const [formData, setFormData] = useState({ email: "", password: "", @@ -35,28 +35,43 @@ export function LoginForm( const [loading, setLoading] = useState(false); const [errorMessage, setErrorMessage] = useState(null); + // Check for error in query parameters + useEffect(() => { + if (router.query.error) { + setErrorMessage(router.query.error as string); + + // Clear the error from the URL without refreshing + const { error, ...rest } = router.query; + router.replace({ pathname: router.pathname, query: rest }, undefined, { shallow: true }); + } + }, [router.query.error]); + const handleChange = (e: React.ChangeEvent) => { setFormData({ ...formData, [e.target.id]: e.target.value }) } - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault() + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault() setLoading(true) setErrorMessage(null) loginUser(formData.email, formData.password) - .then(onLogin) - .catch((error) => { - setErrorMessage(error.message) + .then(onLogin) + .catch((error) => { + setErrorMessage(error.message) }).finally(() => { - setLoading(false) - }) + setLoading(false) + }) + } + + const handleOAuthLogin = () => { + window.location.assign("/api/auth/oauth/authorize") } return ( <> - - Immich Power Tools - Login - + + Immich Power Tools - Login +
@@ -98,12 +113,28 @@ export function LoginForm( - -

- Or Use IMMICH_API_KEY in your environment to use API Key instead of password. -

+ {oauthEnabled && ( + <> +
+
+ +
+
+ + Or continue with + +
+
+ + + )}
diff --git a/src/config/environment.ts b/src/config/environment.ts index 380495f..7f66aca 100644 --- a/src/config/environment.ts +++ b/src/config/environment.ts @@ -15,6 +15,9 @@ export const ENV = { GEMINI_API_KEY: process.env.GEMINI_API_KEY as string, IMMICH_SHARE_LINK_KEY: process.env.IMMICH_SHARE_LINK_KEY as string, POWER_TOOLS_ENDPOINT_URL: process.env.POWER_TOOLS_ENDPOINT_URL as string, + // OAuth configuration + OAUTH_ENABLED: process.env.OAUTH_ENABLED === 'true', + OAUTH_BUTTON_TEXT: (process.env.OAUTH_BUTTON_TEXT || 'Login with OAuth') as string, }; diff --git a/src/contexts/ConfigContext.tsx b/src/contexts/ConfigContext.tsx index a633fb0..c4c8c0f 100644 --- a/src/contexts/ConfigContext.tsx +++ b/src/contexts/ConfigContext.tsx @@ -5,6 +5,8 @@ export interface ConfigContextType { exImmichUrl: string; version?: string; geminiEnabled: boolean; + oauthEnabled: boolean; + oauthButtonText: string; } const ConfigContext = createContext({ @@ -12,6 +14,8 @@ const ConfigContext = createContext({ exImmichUrl: "", version: "", geminiEnabled: false, + oauthEnabled: false, + oauthButtonText: "", }); export default ConfigContext; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 2b8ea0e..16c354f 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -34,6 +34,8 @@ App.getInitialProps = async () => { immichURL: ENV.IMMICH_URL, version: ENV.VERSION, geminiEnabled: !!ENV.GEMINI_API_KEY?.length, + oauthEnabled: ENV.OAUTH_ENABLED, + oauthButtonText: ENV.OAUTH_BUTTON_TEXT, }, }; }; diff --git a/src/pages/api/auth/oauth/authorize.ts b/src/pages/api/auth/oauth/authorize.ts new file mode 100644 index 0000000..cbb0a51 --- /dev/null +++ b/src/pages/api/auth/oauth/authorize.ts @@ -0,0 +1,87 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { ENV } from "@/config/environment"; +import crypto from "crypto"; +import axios from "axios"; +import { serializeCookie } from "@/lib/cookie"; + +/** + * OAuth Authorization Endpoint + * Redirects user to OAuth provider's authorization page with PKCE + */ +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Method not allowed" }); + } + + const immichBaseUrl = ENV.EXTERNAL_IMMICH_URL || ENV.IMMICH_URL; + + // Check if OAuth is enabled + if (!ENV.OAUTH_ENABLED || !immichBaseUrl) { + return res.status(400).json({ error: "OAuth is not configured" }); + } + + try { + // Generate PKCE code verifier and challenge + const codeVerifier = crypto.randomBytes(32).toString("base64url"); + const codeChallenge = crypto + .createHash("sha256") + .update(codeVerifier) + .digest("base64url"); + + // Generate state for CSRF protection + const state = crypto.randomBytes(32).toString("base64url"); + + // Store state and code verifier in cookies + res.setHeader("Set-Cookie", [ + serializeCookie("oauth_state", state, { + httpOnly: true, + secure: ENV.SECURE_COOKIE, + sameSite: "lax", + maxAge: 600, // 10 minutes + path: "/", + }), + serializeCookie("oauth_verifier", codeVerifier, { + httpOnly: true, + secure: ENV.SECURE_COOKIE, + sameSite: "lax", + maxAge: 600, // 10 minutes + path: "/", + }), + ]); + + // Build the authorization URL + const forwardedProto = req.headers["x-forwarded-proto"]; + const protocol = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto || "http"; + const host = req.headers.host || "localhost"; + const baseUrl = ENV.POWER_TOOLS_ENDPOINT_URL || `${protocol}://${host}`; + const redirectUri = `${baseUrl}/api/auth/oauth/callback`; + + // Ask Immich to start OAuth and return the provider URL + const immichAuthorize = await axios.post( + `${immichBaseUrl}/api/oauth/authorize`, + { + redirectUri, + state, + codeChallenge, + }, + { + headers: { "Content-Type": "application/json" }, + } + ); + + const { url } = immichAuthorize.data || {}; + if (!url) { + throw new Error("No authorization URL returned from Immich"); + } + + // Redirect to OAuth provider + res.redirect(302, url); + } catch (error: any) { + console.error("OAuth authorization error:", error); + const errorMessage = error.response?.data?.message || error.message || "Failed to initiate OAuth flow"; + res.redirect(`/?error=${encodeURIComponent(errorMessage)}`); + } +} diff --git a/src/pages/api/auth/oauth/callback.ts b/src/pages/api/auth/oauth/callback.ts new file mode 100644 index 0000000..e42de03 --- /dev/null +++ b/src/pages/api/auth/oauth/callback.ts @@ -0,0 +1,134 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { ENV } from "@/config/environment"; +import { parse } from "cookie"; +import axios from "axios"; +import { serializeCookie } from "@/lib/cookie"; +import { appConfig } from "@/config/app.config"; + +/** + * OAuth Callback Endpoint + * Handles the callback from OAuth provider and exchanges code for tokens + */ +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Method not allowed" }); + } + + const immichBaseUrl = ENV.EXTERNAL_IMMICH_URL || ENV.IMMICH_URL; + + if (!ENV.OAUTH_ENABLED || !immichBaseUrl) { + return res.status(400).json({ error: "OAuth is not configured" }); + } + + try { + const { code, state, error, error_description } = req.query; + + const getSingle = (value?: string | string[]) => + Array.isArray(value) ? value[0] : value; + + // Check for OAuth provider errors + if (error) { + const errorText = getSingle(error_description) || getSingle(error) || "OAuth error"; + console.error("OAuth provider error:", errorText); + return res.redirect(`/?error=${encodeURIComponent(errorText)}`); + } + + // Validate required parameters + const codeValue = getSingle(code); + const stateValue = getSingle(state); + + if (!codeValue || !stateValue) { + return res.redirect("/?error=Missing code or state parameter"); + } + + // Get stored state and verifier from cookies + const cookies = parse(req.headers.cookie || ""); + const storedState = cookies.oauth_state; + const codeVerifier = cookies.oauth_verifier; + + if (!storedState || !codeVerifier) { + return res.redirect("/?error=OAuth session expired"); + } + + // Verify state to prevent CSRF attacks + if (stateValue !== storedState) { + return res.redirect("/?error=Invalid state parameter"); + } + + // Build the callback URL for Immich with ALL query parameters + const forwardedProto = req.headers["x-forwarded-proto"]; + const protocol = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto || "http"; + const host = req.headers.host || "localhost"; + const baseUrl = ENV.POWER_TOOLS_ENDPOINT_URL || `${protocol}://${host}`; + const redirectUri = `${baseUrl}/api/auth/oauth/callback`; + + const queryParams = new URLSearchParams(); + Object.entries(req.query).forEach(([key, value]) => { + if (!value) return; + if (Array.isArray(value)) { + value.forEach((entry) => queryParams.append(key, entry)); + return; + } + queryParams.append(key, value); + }); + const callbackUrl = `${redirectUri}?${queryParams.toString()}`; + + // Finish OAuth with Immich + const immichResponse = await axios.post( + `${immichBaseUrl}/api/oauth/callback`, + { + url: callbackUrl, + state: stateValue, + codeVerifier: codeVerifier, + }, + { + headers: { + "Content-Type": "application/json", + }, + } + ); + + const accessToken = immichResponse.data.accessToken; + + if (!accessToken) { + throw new Error("No access token received from Immich"); + } + + // Clear OAuth temporary cookies and set session cookie + res.setHeader("Set-Cookie", [ + // Clear OAuth temporary cookies + serializeCookie("oauth_state", "", { + httpOnly: true, + secure: ENV.SECURE_COOKIE, + sameSite: "lax", + maxAge: 0, + path: "/", + }), + serializeCookie("oauth_verifier", "", { + httpOnly: true, + secure: ENV.SECURE_COOKIE, + sameSite: "lax", + maxAge: 0, + path: "/", + }), + // Set session cookie with Immich access token + serializeCookie(appConfig.sessionCookieName, accessToken, { + httpOnly: true, + secure: ENV.SECURE_COOKIE, + sameSite: "lax", + maxAge: 60 * 60 * 24 * 30, // 30 days + path: "/", + }), + ]); + + // Redirect to home page + return res.redirect("/"); + } catch (error: any) { + console.error("OAuth callback error:", error); + const errorMessage = error.response?.data?.message || error.message || "Authentication failed"; + return res.redirect(`/?error=${encodeURIComponent(errorMessage)}`); + } +} From 9c0c51fd026a17f21de25612a84cb9af8b82fc98 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 9 Feb 2026 10:58:00 +0000 Subject: [PATCH 17/29] chore(release): 1.2.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.2.0 ### Features * implement OAuth login functionality and update configuration ([222d9a5](https://github.com/sai80082/immich-power-tools/commit/222d9a5982cccea1f8de99979712187950e32963)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb6d32c..924ef31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.1.3", + "version": "1.2.0", "private": true, "scripts": { "dev": "next dev", From 197c247e71bcb1e45d64303532d13d7f4032bba8 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Thu, 12 Feb 2026 14:40:28 +0530 Subject: [PATCH 18/29] fix: update birthDate type in IPerson interface and adjust cleanUpPerson function --- src/helpers/person.helper.ts | 2 +- src/types/person.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/person.helper.ts b/src/helpers/person.helper.ts index 8002fa6..97a34bc 100644 --- a/src/helpers/person.helper.ts +++ b/src/helpers/person.helper.ts @@ -11,7 +11,7 @@ export const cleanUpPerson = (person: IAPIPerson, skipMock?: boolean): IPerson = return { ...person, thumbnailPath: PERSON_THUBNAIL_PATH(person.id), - birthDate: person.birthDate ? new Date(person.birthDate) : null, + birthDate: person.birthDate, updatedAt: new Date(person.updatedAt), } } \ No newline at end of file diff --git a/src/types/person.d.ts b/src/types/person.d.ts index 3e0163b..3490140 100644 --- a/src/types/person.d.ts +++ b/src/types/person.d.ts @@ -1,7 +1,7 @@ export interface IPerson { id: string; name: string; - birthDate: Date | null; + birthDate: string | null; thumbnailPath: string; isHidden: boolean; updatedAt: Date; From 6b2d072787c0bb62bd416ba1567182c75af575ad Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 12 Feb 2026 09:11:22 +0000 Subject: [PATCH 19/29] chore(release): 1.2.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.2.1 ### Bug Fixes * update birthDate type in IPerson interface and adjust cleanUpPerson function ([197c247](https://github.com/sai80082/immich-power-tools/commit/197c247e71bcb1e45d64303532d13d7f4032bba8)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 924ef31..5b6e54c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.2.0", + "version": "1.2.1", "private": true, "scripts": { "dev": "next dev", From e2485e643ff1432e74cf5d6f473b53af3ac27417 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Tue, 17 Feb 2026 08:50:51 +0530 Subject: [PATCH 20/29] Revert "fix: update birthDate type in IPerson interface and adjust cleanUpPerson function" This reverts commit 197c247e71bcb1e45d64303532d13d7f4032bba8. --- src/helpers/person.helper.ts | 2 +- src/types/person.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/person.helper.ts b/src/helpers/person.helper.ts index 97a34bc..8002fa6 100644 --- a/src/helpers/person.helper.ts +++ b/src/helpers/person.helper.ts @@ -11,7 +11,7 @@ export const cleanUpPerson = (person: IAPIPerson, skipMock?: boolean): IPerson = return { ...person, thumbnailPath: PERSON_THUBNAIL_PATH(person.id), - birthDate: person.birthDate, + birthDate: person.birthDate ? new Date(person.birthDate) : null, updatedAt: new Date(person.updatedAt), } } \ No newline at end of file diff --git a/src/types/person.d.ts b/src/types/person.d.ts index 3490140..3e0163b 100644 --- a/src/types/person.d.ts +++ b/src/types/person.d.ts @@ -1,7 +1,7 @@ export interface IPerson { id: string; name: string; - birthDate: string | null; + birthDate: Date | null; thumbnailPath: string; isHidden: boolean; updatedAt: Date; From 3f30e71b953569d65d41667f552175c49f876481 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Tue, 17 Feb 2026 08:52:14 +0530 Subject: [PATCH 21/29] fix: update date formatting in PersonBirthdayCell to use date-fns-tz --- bun.lockb | Bin 499611 -> 500490 bytes package.json | 1 + src/components/people/PersonBirthdayCell.tsx | 10 ++++++---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/bun.lockb b/bun.lockb index e153f664dce406ac127ab869756b6e614e4e0b32..7944ab42cc3a18798e49da6bbfd12bbe47cd664d 100755 GIT binary patch delta 91560 zcmeFadq7pyzV<&SxO7eLXewG>&`c~bF)wH;Aj-tMc*VO*L_xV<6f6T$6D=(q+Q3W` z%fix%%EC$u%kq*Hm8F>$m4%ii?JTUU_j%?RtIh6sI{UomyuaT+uHBl?{C>v$J1%p~ zx#q@Aue4kJM!WmEcQyCC`BP%{tmTE7#cv&7b9>^t(amexH2N_xEcfKNJ(52XG}q@+9P}nl=*~1S#Z23BV}>2VF(n$ zaxS8F3{Op%my^qkD*>(n@Y5OAg|Y>|q5{-}jG+06DRYeVO;o~aUD1}P4KqBY?PA!h z@SJo{Y+Qz6`1`5&Goh@=(@=)Luj8YE?Ho`Jz<{K<^!af;4Z~aTv%=4(RqIT6iw^6J zI-*H=`B2m(?_m+{(>`ES3zd13mWF}+^E}BpNuJEu_>8RBbWcW{5iIh3TIDwNS53)` zk4r|gjT-a}o8}A7CUk(!)J{9$lGCk~ufs6{7_X1k#qkNT@d!`Ih|7+H9t3AyHeIXo zN%dsL2Q7@tc^~PS&U2m9vfR9+gye)&Pe#UJ1hA>C+Ny+!Q2M4^b5}c6a1A&sRt=l+ zUx%{O9z+jQ3t`h4K^@d6>j-6m6A?~r8KBa~LF*f_|8+*2JF1HOHKSJW3@gB~jQ{f5 zUT+v^Y+fBG>YR51O8&jL+C zb=sSqg{MyY+*@u`Y0?6f&b=ilHYG77-5;DK!;WK5&OtbRJweACs_kywRJuOe4uE1% z<
U9EL&e^tQ)P=D}2&}POo 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 delta 92227 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
  • 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 diff --git a/package.json b/package.json index 5b6e54c..38d51c4 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "compatibility": "^1.0.1", "cookie": "^0.6.0", "date-fns": "^3.6.0", + "date-fns-tz": "^3.2.0", "drizzle-orm": "^0.33.0", "jsonwebtoken": "^9.0.2", "leaflet": "^1.9.4", diff --git a/src/components/people/PersonBirthdayCell.tsx b/src/components/people/PersonBirthdayCell.tsx index 4909bee..cc131bd 100644 --- a/src/components/people/PersonBirthdayCell.tsx +++ b/src/components/people/PersonBirthdayCell.tsx @@ -5,6 +5,8 @@ import { updatePerson } from '@/handlers/api/people.handler'; import { formatDate } from '@/helpers/date.helper'; import { Input } from '../ui/input'; import { useToast } from '../ui/use-toast'; +import { formatInTimeZone } from 'date-fns-tz'; + // @ts-ignore import chrono from 'chrono-node' @@ -20,8 +22,8 @@ export default function PersonBirthdayCell( const [loading, setLoading] = useState(false); const { toast } = useToast(); const [errorMessage, setErrorMessage] = useState(null); - const [textDate, setTextDate] = useState(person.birthDate ? formatDate(person.birthDate?.toString(), 'PPP'): ""); - + const [textDate, setTextDate] = useState(person.birthDate ? formatInTimeZone(new Date(person.birthDate), 'UTC', 'PPP') : null); + const handleEdit = (date?: Date | null) => { const formatedDate = date ? formatDate(date.toString(), 'yyyy-MM-dd') : null; setLoading(true); @@ -44,8 +46,8 @@ export default function PersonBirthdayCell( return (
    - { From fe5946dc94d0c81f6b6ef333010fcbed70630443 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 17 Feb 2026 03:23:04 +0000 Subject: [PATCH 22/29] chore(release): 1.2.2 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.2.2 ### Bug Fixes * update date formatting in PersonBirthdayCell to use date-fns-tz ([3f30e71](https://github.com/sai80082/immich-power-tools/commit/3f30e71b953569d65d41667f552175c49f876481)) ### Reverts * Revert "fix: update birthDate type in IPerson interface and adjust cleanUpPerson function" ([e2485e6](https://github.com/sai80082/immich-power-tools/commit/e2485e643ff1432e74cf5d6f473b53af3ac27417)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 38d51c4..62375da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.2.1", + "version": "1.2.2", "private": true, "scripts": { "dev": "next dev", From 930e66396e1439cb4e632fea92fb349d3545b54b Mon Sep 17 00:00:00 2001 From: sai80082 Date: Tue, 17 Feb 2026 09:10:11 +0530 Subject: [PATCH 23/29] fix: improve date handling in PersonBirthdayCell and update formatting [skip ci] --- src/components/people/PersonBirthdayCell.tsx | 48 ++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/src/components/people/PersonBirthdayCell.tsx b/src/components/people/PersonBirthdayCell.tsx index cc131bd..b6c848f 100644 --- a/src/components/people/PersonBirthdayCell.tsx +++ b/src/components/people/PersonBirthdayCell.tsx @@ -1,11 +1,10 @@ import { IPerson } from '@/types/person' -import React, { useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import { DatePicker } from '../ui/datepicker' import { updatePerson } from '@/handlers/api/people.handler'; -import { formatDate } from '@/helpers/date.helper'; import { Input } from '../ui/input'; import { useToast } from '../ui/use-toast'; -import { formatInTimeZone } from 'date-fns-tz'; +import { format } from 'date-fns'; // @ts-ignore import chrono from 'chrono-node' @@ -16,16 +15,50 @@ interface IProps { person: IPerson } +const normalizeDateOnly = (value?: Date | string | null): Date | null => { + if (!value) { + return null; + } + + if (typeof value === 'string') { + const dateOnlyMatch = value.match(/^(\d{4})-(\d{2})-(\d{2})/); + if (dateOnlyMatch) { + const [, year, month, day] = dateOnlyMatch; + return new Date(Number(year), Number(month) - 1, Number(day)); + } + } + + const parsedDate = new Date(value); + if (Number.isNaN(parsedDate.getTime())) { + return null; + } + + return new Date( + parsedDate.getUTCFullYear(), + parsedDate.getUTCMonth(), + parsedDate.getUTCDate() + ); +} + export default function PersonBirthdayCell( { person }: IProps ) { const [loading, setLoading] = useState(false); const { toast } = useToast(); const [errorMessage, setErrorMessage] = useState(null); - const [textDate, setTextDate] = useState(person.birthDate ? formatInTimeZone(new Date(person.birthDate), 'UTC', 'PPP') : null); + const normalizedBirthDate = useMemo(() => normalizeDateOnly(person.birthDate), [person.birthDate]); + const [selectedDate, setSelectedDate] = useState(normalizedBirthDate); + const [textDate, setTextDate] = useState(normalizedBirthDate ? format(normalizedBirthDate, 'PPP') : ''); + + useEffect(() => { + setSelectedDate(normalizedBirthDate); + setTextDate(normalizedBirthDate ? format(normalizedBirthDate, 'PPP') : ''); + }, [normalizedBirthDate]); const handleEdit = (date?: Date | null) => { - const formatedDate = date ? formatDate(date.toString(), 'yyyy-MM-dd') : null; + const formatedDate = date ? format(date, 'yyyy-MM-dd') : null; + setSelectedDate(date || null); + setTextDate(date ? format(date, 'PPP') : ''); setLoading(true); return updatePerson(person.id, { birthDate: formatedDate, @@ -48,14 +81,13 @@ export default function PersonBirthdayCell(
    { if (e.key === 'Enter') { const parsedDate = chrono.parseDate(textDate || ""); if (parsedDate) { handleEdit(parsedDate); - setTextDate(formatDate(parsedDate.toString(), 'PPP')); } else { handleEdit(null); } @@ -64,7 +96,7 @@ export default function PersonBirthdayCell( disabled={loading} onChange={(e) => setTextDate(e.target.value)} /> - +
    ) } From 774a0c480bb99073dc52fbdaf9abb42a5c2925f9 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Wed, 18 Feb 2026 09:52:08 +0530 Subject: [PATCH 24/29] feat: integrate OpenAI-compatible API for query parsing and remove Gemini references --- .env.sample | 4 +- README.md | 10 ++-- bun.lockb | Bin 500490 -> 508595 bytes package.json | 7 ++- src/config/environment.ts | 4 +- src/contexts/ConfigContext.tsx | 4 +- src/helpers/ai.helper.ts | 102 +++++++++++++++++++++++++++++++ src/helpers/gemini.helper.ts | 106 --------------------------------- src/pages/_app.tsx | 2 +- src/pages/api/find/search.ts | 2 +- src/pages/find/index.tsx | 14 ++--- 11 files changed, 130 insertions(+), 125 deletions(-) create mode 100644 src/helpers/ai.helper.ts delete mode 100644 src/helpers/gemini.helper.ts diff --git a/.env.sample b/.env.sample index 1b86051..071d49f 100644 --- a/.env.sample +++ b/.env.sample @@ -10,7 +10,9 @@ DB_DATABASE_NAME="" # Name of the database SECURE_COOKIE=false # Set to true to enable secure cookies # Optional -GEMINI_API_KEY="" # Gemini API Key for parsing search query in "Find" +AI_API_KEY="" # API key for your OpenAI-compatible provider used by "Find" +AI_BASE_URL="https://api.openai.com/v1" # Base URL for OpenAI-compatible API +AI_MODEL="gpt-4o-mini" # Model used for parsing search queries in "Find" # Immich Share Link IMMICH_SHARE_LINK_KEY="" # Share link key for Immich diff --git a/README.md b/README.md index b61b334..5b5e7c3 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,9 @@ DB_PORT = "5432" DB_HOST = "immich_postgres" # Optional -GEMINI_API_KEY= # Gemini API Key +AI_API_KEY= # API key for your OpenAI-compatible provider +AI_BASE_URL=https://api.openai.com/v1 # Base URL for OpenAI-compatible API +AI_MODEL=gpt-4o-mini # Model used to parse search queries in Find ``` Refer here for obtaining Immich API Key: https://immich.app/docs/features/command-line-interface#obtain-the-api-key @@ -145,10 +147,10 @@ Google Maps Javascript API Key is used to render the maps layer for heatmap. Whe > Code where heatmap data is plotted: [src/pages/assets/geo-heatmap.tsx:32](./src/pages/assets/geo-heatmap.tsx#L32-L35) -- [Gemini](https://gemini.google.com/) for rewind video generation -Google Gemini 1.5 Flash model is used for parsing your search query in "Find" page. We do not send any personal data to Gemini, only data that is sent to Gemini is your search query and rest of the querying happes using [Immich's Smart Search API](https://immich.app/docs/api/search-smart) +- OpenAI-compatible AI provider for smart query parsing in Find +Any OpenAI-compatible model can be used for parsing your search query in the "Find" page. We do not send any personal library data to the AI provider; only your search text is sent for parsing, and the actual asset querying uses [Immich's Smart Search API](https://immich.app/docs/api/search-smart) - > Code where Gemini is used: [src/helpers/gemini.helper.ts](./src/helpers/gemini.helper.ts) + > Code where AI parsing is used: [src/helpers/ai.helper.ts](./src/helpers/ai.helper.ts) ## Contributing diff --git a/bun.lockb b/bun.lockb index 7944ab42cc3a18798e49da6bbfd12bbe47cd664d..ca9ac68b145e59c27c4dbbbb8627c953d549d06c 100755 GIT binary patch delta 103788 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 diff --git a/package.json b/package.json index 38d51c4..d83ebed 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "url": "https://saicharang.com" }, "dependencies": { - "@google/generative-ai": "^0.21.0", + "@ai-sdk/openai": "1.3.24", + "@ai-sdk/openai-compatible": "^2.0.30", + "@ai-sdk/react": "^3.0.88", "@radix-ui/react-accordion": "^1.2.1", "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.0", @@ -42,6 +44,7 @@ "@types/react-autosuggest": "^10.1.11", "@types/react-calendar-heatmap": "^1.6.7", "@types/react-window": "^1.8.8", + "ai": "^6.0.86", "axios": "^1.7.4", "chrono-node": "^1.4.9", "class-variance-authority": "^0.7.0", @@ -76,7 +79,7 @@ "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", "yet-another-react-lightbox": "^3.21.4", - "zod": "^3.24.1" + "zod": "^4.3.6" }, "devDependencies": { "@semantic-release/commit-analyzer": "^13.0.0", diff --git a/src/config/environment.ts b/src/config/environment.ts index 7f66aca..f3daf06 100644 --- a/src/config/environment.ts +++ b/src/config/environment.ts @@ -12,7 +12,9 @@ export const ENV = { JWT_SECRET: process.env.JWT_SECRET as string, SECURE_COOKIE: process.env.SECURE_COOKIE === 'true', VERSION: process.env.VERSION, - GEMINI_API_KEY: process.env.GEMINI_API_KEY as string, + AI_API_KEY: process.env.AI_API_KEY as string, + AI_BASE_URL: (process.env.AI_BASE_URL || 'https://api.openai.com/v1') as string, + AI_MODEL: process.env.AI_MODEL as string, IMMICH_SHARE_LINK_KEY: process.env.IMMICH_SHARE_LINK_KEY as string, POWER_TOOLS_ENDPOINT_URL: process.env.POWER_TOOLS_ENDPOINT_URL as string, // OAuth configuration diff --git a/src/contexts/ConfigContext.tsx b/src/contexts/ConfigContext.tsx index c4c8c0f..c6d8246 100644 --- a/src/contexts/ConfigContext.tsx +++ b/src/contexts/ConfigContext.tsx @@ -4,7 +4,7 @@ export interface ConfigContextType { immichURL: string; exImmichUrl: string; version?: string; - geminiEnabled: boolean; + aiEnabled: boolean; oauthEnabled: boolean; oauthButtonText: string; } @@ -13,7 +13,7 @@ const ConfigContext = createContext({ immichURL: "", exImmichUrl: "", version: "", - geminiEnabled: false, + aiEnabled: false, oauthEnabled: false, oauthButtonText: "", }); diff --git a/src/helpers/ai.helper.ts b/src/helpers/ai.helper.ts new file mode 100644 index 0000000..c4ecf92 --- /dev/null +++ b/src/helpers/ai.helper.ts @@ -0,0 +1,102 @@ +import { ENV } from "@/config/environment"; +import { generateText, Output } from "ai"; +import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; +import { z } from "zod"; +import { removeNullOrUndefinedProperties } from "./data.helper"; + +interface FindQuery { + query: string; + personIds?: string[]; + city?: string; + country?: string; + size?: number; + model?: string; + state?: string; + takenAfter?: string; + takenBefore?: string; + type?: string; +} + +const allowedTypes = ["IMAGE", "VIDEO", "AUDIO"]; + + +const responseSchema = z.object({ + query: z.string().describe("Gist of the query. Remove the details of tags"), + personIds: z + .array(z.string()) + .nullish() + .describe("List of person ids that match the query which starts with @"), + city: z.string().nullish().describe("City of the query"), + country: z + .string() + .nullish() + .describe("Any reference to a country in the query, return full country name"), + state: z + .string() + .nullish() + .describe("Any reference to a state (California, New York, etc) in the query"), + size: z.number().int().nullish().describe("Size of the file in bytes"), + takenAfter: z + .string() + .nullish() + .describe("Extract a valid date from query in YYYY-MM-DD format"), + takenBefore: z + .string() + .nullish() + .describe("Extract a valid date from query in YYYY-MM-DD format"), + model: z.string().nullish().describe("Name of the device that the query is about"), + type: z + .string() + .nullish() + .describe("One of the allowed media types (IMAGE, VIDEO, AUDIO, OTHER)"), +}); + + +const getOpenAICompatibleModel = () => { + if (!ENV.AI_API_KEY || !ENV.AI_MODEL) { + throw new Error("AI is not configured. Please set AI_API_KEY and AI_MODEL."); + } + + const openai = createOpenAICompatible({ + name: "openai-compatible", + apiKey: ENV.AI_API_KEY, + baseURL: ENV.AI_BASE_URL, + }); + + return openai(ENV.AI_MODEL); +}; + +export const parseFindQuery = async (query: string): Promise => { + const prompt = [ + `Parse the following query and return extracted filters as JSON: ${query}.`, + "Do not include any information that is not intentionally provided in the query.", + `Today's date is ${new Date().toISOString().split("T")[0]}.`, + "Dates must be in YYYY-MM-DD format.", + "Return ONLY valid JSON object with keys: query, personIds, city, country, state, size, model, takenAfter, takenBefore, type.", + "Do not use null values. Omit a key when it is not present in the query.", + "Use type values only IMAGE, VIDEO, AUDIO when possible.", + ].join("\n"); + + const { text } = await generateText({ + model: getOpenAICompatibleModel(), + prompt, + output: Output.object({ + name:"json", + schema: responseSchema, + }), + + }); + + const parsedResponse = JSON.parse(text) as FindQuery; + + if (parsedResponse.type) { + if (!allowedTypes.includes(parsedResponse.type)) { + delete parsedResponse.type; + } + } + const cleanedResponse = { + ...parsedResponse + }; + + return removeNullOrUndefinedProperties(cleanedResponse) as any as FindQuery; +}; diff --git a/src/helpers/gemini.helper.ts b/src/helpers/gemini.helper.ts deleted file mode 100644 index af54e9e..0000000 --- a/src/helpers/gemini.helper.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { ENV } from "@/config/environment"; -import { GoogleGenerativeAI, SchemaType } from "@google/generative-ai"; -import { z } from "zod"; -import { removeNullOrUndefinedProperties } from "./data.helper"; - -const gemini = new GoogleGenerativeAI(ENV.GEMINI_API_KEY); -const model = gemini.getGenerativeModel({ model: "gemini-2.0-flash" }); - -interface FindQuery { - query: string; - personIds?: string[]; - city?: string; - size?: number; - model?: string; - createdAfter?: string; - state?: string; - type?: string; -} - -const allowedTypes = [ - 'IMAGE', - 'VIDEO', - 'AUDIO' -] -const responseSchema = { - type: SchemaType.OBJECT, - properties: { - query: { type: SchemaType.STRING, description: "Gist of the query. Remove the details of tags" }, - personIds: { type: SchemaType.ARRAY, - description: "List of person ids that match the query which starts with @", - items: { type: SchemaType.STRING } - }, - city: { type: SchemaType.STRING, - description: "City of the query" - }, - size: { - type: SchemaType.INTEGER, - description: "Size of the file in bytes" - }, - country: { - type: SchemaType.STRING, - description: "Any reference to a country (United States, Canada, etc) in the query, return full country name" - }, - state: { - type: SchemaType.STRING, - description: "Any reference to a state (California, New York, etc) in the query" - }, - takenAfter: { - type: SchemaType.STRING, - description: "Extract the date from the query and return it in the format YYYY-MM-DD but only if it is a valid date" - }, - takenBefore: { - type: SchemaType.STRING, - description: "Extract the date from the query and return it in the format YYYY-MM-DD but only if it is a valid date" - }, - model: { - type: SchemaType.STRING, - description: "Name of the device that the query is about" - }, - type: { - type: SchemaType.STRING, - description: "One of the allowed media types (IMAGE, VIDEO, AUDIO, OTHER)", - } - }, - required: ["query"], -}; - -export const parseFindQuery = async (query: string): Promise => { - - const prompt = ` - Parse the following query and return the query and tags: ${query}. - Dont include any information that are not intentionally provided in the query. - Additional Information For Parsing: - today's date is ${new Date().toISOString().split('T')[0]} - `; - - const { response } = await model.generateContent({ - contents: [ - { - role: "user", - parts: [ - { - text: prompt, - }, - ], - }, - ], - generationConfig: { - responseMimeType: "application/json", - responseSchema, - } - }); - - const parsedResponse = JSON.parse(response.text()) as FindQuery; - - if (parsedResponse.type) { - if (!allowedTypes.includes(parsedResponse.type)) { - delete parsedResponse.type; - } - } - const cleanedResponse = { - ...parsedResponse - }; - - return removeNullOrUndefinedProperties(cleanedResponse) as any as FindQuery; -} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 16c354f..a96cf90 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -33,7 +33,7 @@ App.getInitialProps = async () => { exImmichUrl: ENV.EXTERNAL_IMMICH_URL, immichURL: ENV.IMMICH_URL, version: ENV.VERSION, - geminiEnabled: !!ENV.GEMINI_API_KEY?.length, + aiEnabled: !!ENV.AI_API_KEY?.length && !!ENV.AI_MODEL?.length, oauthEnabled: ENV.OAUTH_ENABLED, oauthButtonText: ENV.OAUTH_BUTTON_TEXT, }, diff --git a/src/pages/api/find/search.ts b/src/pages/api/find/search.ts index 2bf858a..e5fead7 100644 --- a/src/pages/api/find/search.ts +++ b/src/pages/api/find/search.ts @@ -3,7 +3,7 @@ import { ENV } from "@/config/environment"; import { ASSET_VIDEO_PATH } from "@/config/routes"; import { getCurrentUser } from "@/handlers/serverUtils/user.utils"; import { cleanUpAsset, isFlipped } from "@/helpers/asset.helper"; -import { parseFindQuery } from "@/helpers/gemini.helper"; +import { parseFindQuery } from "@/helpers/ai.helper"; import { person } from "@/schema"; import { Person } from "@/schema/person.schema"; import { inArray } from "drizzle-orm"; diff --git a/src/pages/find/index.tsx b/src/pages/find/index.tsx index b7e72cf..0518064 100644 --- a/src/pages/find/index.tsx +++ b/src/pages/find/index.tsx @@ -49,7 +49,7 @@ export default function FindPage() { // const [selectedIds, setSelectedIds] = useState([]); // const [assets, setAssets] = useState([]); const { toast } = useToast(); // Initialize toast - const { geminiEnabled, exImmichUrl } = useConfig(); + const { aiEnabled } = useConfig(); const [query, setQuery] = useState(''); const [loading, setLoading] = useState(false); const [filters, setFilters] = useState({}); @@ -216,7 +216,7 @@ export default function FindPage() { ))}

    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 Il?yBW54!Or0{{R3 delta 99392 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

    {/* Adjusted margin top */} - Power tools uses Google Gemini only for parsing your query. None of your data is sent to Gemini. + Power tools uses your configured AI model only for parsing your query. None of your library data is sent to the AI provider.

  • ) @@ -272,7 +272,7 @@ export default function FindPage() { return (
    - {geminiEnabled ? ( + {aiEnabled ? ( <>
    -

    Google Gemini is not enabled

    +

    AI parsing is not enabled

    - Currently, the Power Tools Find is relying on Google Gemini for parsing the query. - Please enable Gemini by adding GEMINI_API_KEY in the .env file. + Currently, the Power Tools Find relies on an OpenAI-compatible API for parsing the query. + Please configure AI_API_KEY and AI_MODEL in the .env file.

    - Power tools uses Google Gemini only for parsing your query. None of your data is sent to Gemini. + Power tools uses your configured AI model only for parsing your query. None of your library data is sent to the AI provider.

    From 9cfd2148d8cb448db77ee71c514ddbfac72bd030 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Wed, 18 Feb 2026 16:32:21 +0530 Subject: [PATCH 25/29] chore: update docker-compose --- docker-compose-all-immich.yml | 49 +++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/docker-compose-all-immich.yml b/docker-compose-all-immich.yml index fb9a246..e43828f 100644 --- a/docker-compose-all-immich.yml +++ b/docker-compose-all-immich.yml @@ -1,55 +1,76 @@ +# +# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose +# +# Make sure to use the docker-compose.yml of the current release: +# +# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml +# +# The compose file on main may not be compatible with the latest release. + name: immich services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} + # extends: + # file: hwaccel.transcoding.yml + # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding volumes: - - ${UPLOAD_LOCATION}:/usr/src/app/upload + # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file + - ${UPLOAD_LOCATION}:/data - /etc/localtime:/etc/localtime:ro env_file: - .env ports: - - 2283:3001 + - '2283:2283' depends_on: - redis - database restart: always + healthcheck: + disable: false immich-machine-learning: container_name: immich_machine_learning - # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag. + # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} - # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration + # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration # file: hwaccel.ml.yml - # service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable + # service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable volumes: - model-cache:/cache env_file: - .env restart: always + healthcheck: + disable: false redis: container_name: immich_redis - image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672 + image: docker.io/valkey/valkey:9@sha256:930b41430fb727f533c5982fe509b6f04233e26d0f7354e04de4b0d5c706e44e + healthcheck: + test: redis-cli ping || exit 1 restart: always database: container_name: immich_postgres - image: registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} POSTGRES_DB: ${DB_DATABASE_NAME} POSTGRES_INITDB_ARGS: '--data-checksums' - ports: - - 5432:5432 + # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs + # DB_STORAGE_TYPE: 'HDD' volumes: + # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file - ${DB_DATA_LOCATION}:/var/lib/postgresql/data + shm_size: 128mb restart: always - command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"] - + healthcheck: + disable: false power-tools: container_name: immich_power_tools image: ghcr.io/sai80082/immich-power-tools:latest @@ -65,8 +86,4 @@ services: start_period: 40s volumes: - model-cache: - -networks: - hexabase-network: - external: true + model-cache: \ No newline at end of file From d18a90b2cfee6154e75156da7d7191cf20c2e452 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 18 Feb 2026 11:03:14 +0000 Subject: [PATCH 26/29] chore(release): 1.2.3 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.2.3 ### Bug Fixes * improve date handling in PersonBirthdayCell and update formatting [skip ci] ([930e663](https://github.com/sai80082/immich-power-tools/commit/930e66396e1439cb4e632fea92fb349d3545b54b)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 62375da..92cc7fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.2.2", + "version": "1.2.3", "private": true, "scripts": { "dev": "next dev", From 1a3afef06d41c5fc6e10a73637b545b767d4235d Mon Sep 17 00:00:00 2001 From: sai80082 Date: Wed, 18 Feb 2026 23:13:44 +0530 Subject: [PATCH 27/29] chore: update @ai-sdk/openai dependency and upgrade node verion to 22 --- .dockerignore | 7 + .github/workflows/release.yml | 2 +- Dockerfile | 6 +- docker-compose.yml | 2 +- package-lock.json | 352 ++++++++++++++++++++++------------ package.json | 2 +- 6 files changed, 241 insertions(+), 130 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..72e9aa4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6c1dae8..0f02417 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 20 + node-version: 22 - name: Run semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Dockerfile b/Dockerfile index a295930..34a877d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Source: https://github.com/vercel/next.js/blob/canary/examples/with-docker/README.md # Install dependencies only when needed -FROM node:18-alpine AS deps +FROM node:22-alpine AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat @@ -10,7 +10,7 @@ COPY package.json ./ RUN npm install --frozen-lockfile # Rebuild the source code only when needed -FROM node:18-alpine AS builder +FROM node:22-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules @@ -18,7 +18,7 @@ COPY . . RUN npm run build # Production image, copy all the files and run next -FROM node:18-alpine AS runner +FROM node:22-alpine AS runner WORKDIR /app # Define a build argument ARG VERSION=dev diff --git a/docker-compose.yml b/docker-compose.yml index 0c0646a..00e4d40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.8' services: immich_power_tools: container_name: immich_power_tools - image: ghcr.io/sai80082/immich-power-tools:latest + image: ipt ports: - "3000:3000" env_file: diff --git a/package-lock.json b/package-lock.json index d104bef..cc98adb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,16 @@ { "name": "immich-power-tools", - "version": "0.19.0", + "version": "1.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "immich-power-tools", - "version": "0.19.0", + "version": "1.2.1", "dependencies": { - "@google/generative-ai": "^0.21.0", + "@ai-sdk/openai": "^3.0.29", + "@ai-sdk/openai-compatible": "^2.0.30", + "@ai-sdk/react": "^3.0.88", "@radix-ui/react-accordion": "^1.2.1", "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.0", @@ -36,6 +38,7 @@ "@types/react-autosuggest": "^10.1.11", "@types/react-calendar-heatmap": "^1.6.7", "@types/react-window": "^1.8.8", + "ai": "^6.0.86", "axios": "^1.7.4", "chrono-node": "^1.4.9", "class-variance-authority": "^0.7.0", @@ -44,6 +47,7 @@ "compatibility": "^1.0.1", "cookie": "^0.6.0", "date-fns": "^3.6.0", + "date-fns-tz": "^3.2.0", "drizzle-orm": "^0.33.0", "jsonwebtoken": "^9.0.2", "leaflet": "^1.9.4", @@ -69,7 +73,7 @@ "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", "yet-another-react-lightbox": "^3.21.4", - "zod": "^3.24.1" + "zod": "^4.3.6" }, "devDependencies": { "@semantic-release/commit-analyzer": "^13.0.0", @@ -114,6 +118,102 @@ "undici": "^5.25.4" } }, + "node_modules/@ai-sdk/gateway": { + "version": "3.0.50", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.50.tgz", + "integrity": "sha512-Jdd1a8VgbD7l7r+COj0h5SuaYRfPvOJ/AO6l0OrmTPEcI2MUQPr3C4JttfpNkcheEN+gOdy0CtZWuG17bW2fjw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.15", + "@vercel/oidc": "3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "3.0.29", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.29.tgz", + "integrity": "sha512-ugVTIVpuSLKTjzSPe1F1DWiblJT/lwrrHx0OZEKjpMk/EYP6j6VD/F7SJqM1dsqOJryeBCJWFbUzLNqc99PrMA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.15" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai-compatible": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.30.tgz", + "integrity": "sha512-iTjumHf1/u4NhjXYFn/aONM2GId3/o7J1Lp5ql8FCbgIMyRwrmanR5xy1S3aaVkfTscuDvLTzWiy1mAbGzK3nQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.15" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", + "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.15.tgz", + "integrity": "sha512-8XiKWbemmCbvNN0CLR9u3PQiet4gtEVIrX4zzLxnCj06AwsEDJwJVBbKrEI4t6qE8XRSIvU2irka0dcpziKW6w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.8", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "3.0.93", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.93.tgz", + "integrity": "sha512-FY1HmeAfCpiAGLhIZh2QR8QFzHFZfhjMmkA9D5KC/O3eGqPeY7CwBABLkzRH+5Gkf+MfxXnEm4VF0MpmvDMjpg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "4.0.15", + "ai": "6.0.91", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -1182,15 +1282,6 @@ "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==", "license": "MIT" }, - "node_modules/@google/generative-ai": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", - "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -1761,6 +1852,15 @@ "@octokit/openapi-types": "^22.2.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -5101,6 +5201,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -5967,6 +6073,15 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "license": "ISC" }, + "node_modules/@vercel/oidc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz", + "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -6169,6 +6284,24 @@ "node": ">=8" } }, + "node_modules/ai": { + "version": "6.0.91", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.91.tgz", + "integrity": "sha512-k1/8BusZMhYVxxLZt0BUZzm9HVDCCh117nyWfWUx5xjR2+tWisJbXgysL7EBMq2lgyHwgpA1jDR3tVjWSdWZXw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "3.0.50", + "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider-utils": "4.0.15", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7997,6 +8130,15 @@ "url": "https://github.com/sponsors/kossnocorp" } }, + "node_modules/date-fns-tz": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", + "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", + "license": "MIT", + "peerDependencies": { + "date-fns": "^3.0.0 || ^4.0.0" + } + }, "node_modules/dayjs": { "version": "1.11.13", "license": "MIT" @@ -8131,6 +8273,15 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -9705,6 +9856,15 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "license": "MIT", @@ -11270,6 +11430,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -11827,9 +11993,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -12187,8 +12353,6 @@ }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "inBundle": true, "license": "ISC", @@ -12206,8 +12370,6 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "inBundle": true, "license": "MIT", @@ -12220,16 +12382,12 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "inBundle": true, "license": "MIT", @@ -12247,8 +12405,6 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -12519,8 +12675,6 @@ }, "node_modules/npm/node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "inBundle": true, "license": "MIT", @@ -12661,8 +12815,6 @@ }, "node_modules/npm/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -12672,8 +12824,6 @@ }, "node_modules/npm/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "inBundle": true, "license": "MIT", @@ -12698,8 +12848,6 @@ }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "inBundle": true, "license": "MIT" @@ -12731,6 +12879,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/npm/node_modules/cacache": { "version": "18.0.4", "dev": true, @@ -12835,8 +12992,6 @@ }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -12849,8 +13004,6 @@ }, "node_modules/npm/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "inBundle": true, "license": "MIT" @@ -12863,8 +13016,6 @@ }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "inBundle": true, "license": "MIT", @@ -12879,8 +13030,6 @@ }, "node_modules/npm/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "inBundle": true, "license": "ISC", @@ -12896,8 +13045,6 @@ }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "inBundle": true, "license": "MIT", @@ -12910,8 +13057,6 @@ }, "node_modules/npm/node_modules/debug": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "inBundle": true, "license": "MIT", @@ -12929,8 +13074,6 @@ }, "node_modules/npm/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "inBundle": true, "license": "MIT" @@ -12946,16 +13089,12 @@ }, "node_modules/npm/node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "inBundle": true, "license": "MIT" @@ -13002,8 +13141,6 @@ }, "node_modules/npm/node_modules/foreground-child": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "inBundle": true, "license": "ISC", @@ -13032,8 +13169,6 @@ }, "node_modules/npm/node_modules/glob": { "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "inBundle": true, "license": "ISC", @@ -13054,8 +13189,6 @@ }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "inBundle": true, "license": "ISC" @@ -13131,8 +13264,6 @@ }, "node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "inBundle": true, "license": "MIT", @@ -13215,8 +13346,6 @@ }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "inBundle": true, "license": "MIT", @@ -13232,16 +13361,12 @@ }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -13468,8 +13593,6 @@ }, "node_modules/npm/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "inBundle": true, "license": "ISC" @@ -13499,8 +13622,6 @@ }, "node_modules/npm/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "inBundle": true, "license": "ISC", @@ -13514,21 +13635,8 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/npm/node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "inBundle": true, "license": "ISC", @@ -13893,8 +14001,6 @@ }, "node_modules/npm/node_modules/package-json-from-dist": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0" @@ -13946,8 +14052,6 @@ }, "node_modules/npm/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -13957,8 +14061,6 @@ }, "node_modules/npm/node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -14113,8 +14215,6 @@ }, "node_modules/npm/node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "inBundle": true, "license": "ISC", @@ -14127,8 +14227,6 @@ }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "inBundle": true, "license": "MIT", @@ -14141,8 +14239,6 @@ }, "node_modules/npm/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "inBundle": true, "license": "MIT", @@ -14152,8 +14248,6 @@ }, "node_modules/npm/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "inBundle": true, "license": "ISC", @@ -14281,8 +14375,6 @@ }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "inBundle": true, "license": "MIT", @@ -14298,8 +14390,6 @@ "node_modules/npm/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "inBundle": true, "license": "MIT", @@ -14314,8 +14404,6 @@ }, "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -14329,8 +14417,6 @@ "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "inBundle": true, "license": "MIT", @@ -14464,8 +14550,6 @@ }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "inBundle": true, "license": "MIT" @@ -14531,8 +14615,6 @@ }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -14551,8 +14633,6 @@ "node_modules/npm/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "inBundle": true, "license": "MIT", @@ -14570,8 +14650,6 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "inBundle": true, "license": "MIT", @@ -14587,8 +14665,6 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "inBundle": true, "license": "MIT", @@ -14601,16 +14677,12 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "inBundle": true, "license": "MIT", @@ -14628,8 +14700,6 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "inBundle": true, "license": "MIT", @@ -17521,6 +17591,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.0.tgz", + "integrity": "sha512-sUlC20T8EOt1pHmDiqueUWMmRRX03W7w5YxovWX7VR2KHEPCTMly85x05vpkP5i6Bu4h44ePSMD9Tc+G2MItFw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/tailwind-merge": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", @@ -17771,6 +17854,18 @@ "node": ">=0.8" } }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/through2": { "version": "2.0.5", "dev": true, @@ -18245,6 +18340,15 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18682,9 +18786,9 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index d83ebed..7a25aed 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "url": "https://saicharang.com" }, "dependencies": { - "@ai-sdk/openai": "1.3.24", + "@ai-sdk/openai": "^3.0.29", "@ai-sdk/openai-compatible": "^2.0.30", "@ai-sdk/react": "^3.0.88", "@radix-ui/react-accordion": "^1.2.1", From e23a036b6b0057205f1d609d5eb74bbb05ccff72 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 18 Feb 2026 17:48:57 +0000 Subject: [PATCH 28/29] chore(release): 1.3.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 🚀 **Immich Power Tools** 1.3.0 ### Features * integrate OpenAI-compatible API for query parsing and remove Gemini references ([774a0c4](https://github.com/sai80082/immich-power-tools/commit/774a0c480bb99073dc52fbdaf9abb42a5c2925f9)) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a4d16c3..99d9c76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "immich-power-tools", - "version": "1.2.3", + "version": "1.3.0", "private": true, "scripts": { "dev": "next dev", From 3eac8b6f7ad77a00cacf76ab6cb6ef3cde0e7d23 Mon Sep 17 00:00:00 2001 From: sai80082 Date: Mon, 23 Feb 2026 22:18:57 +0530 Subject: [PATCH 29/29] docs: Enhance AI configuration documentation with examples for OpenAI, Groq, and Ollama. --- README.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5b5e7c3..91df0c5 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,10 @@ EXTERNAL_IMMICH_URL = "https://external-address" # External address of immich DB_PORT = "5432" DB_HOST = "immich_postgres" -# Optional -AI_API_KEY= # API key for your OpenAI-compatible provider -AI_BASE_URL=https://api.openai.com/v1 # Base URL for OpenAI-compatible API -AI_MODEL=gpt-4o-mini # Model used to parse search queries in Find +# Optional - AI Configuration for Smart Search (Find) +AI_API_KEY=your_api_key_here # API key for your OpenAI-compatible provider +AI_BASE_URL="https://api.openai.com/v1" # e.g. https://api.openai.com/v1 (OpenAI), https://api.groq.com/openai/v1 (Groq), http://host.docker.internal:11434/v1 (Ollama) +AI_MODEL="gpt-4o-mini" # e.g. gpt-4o-mini, llama-3.1-8b-instant, llama3.1 ``` Refer here for obtaining Immich API Key: https://immich.app/docs/features/command-line-interface#obtain-the-api-key @@ -94,7 +94,12 @@ Copy paste the `.env.example` to `.env` and fill in the values. DB_PASSWORD = "" # Postgres Database Password DB_HOST = "" # Postgres Host (IP address or hostname of the database) DB_PORT = "" # Postgres Port number (Default: 5432) - DB_DATABASE_NAME = "" # Name of the database + DB_DATABASE_NAME="" # Name of the database + + # Optional - AI Configuration for Smart Search (Find) + AI_API_KEY="" # API key for your OpenAI-compatible provider + AI_BASE_URL="https://api.openai.com/v1" # Base URL for OpenAI-compatible API + AI_MODEL="gpt-4o-mini" # Model used for parsing search queries in "Find" ``` > [!NOTE] > Make sure you have postgres port exposed on you machine. @@ -148,10 +153,15 @@ Google Maps Javascript API Key is used to render the maps layer for heatmap. Whe > Code where heatmap data is plotted: [src/pages/assets/geo-heatmap.tsx:32](./src/pages/assets/geo-heatmap.tsx#L32-L35) - OpenAI-compatible AI provider for smart query parsing in Find -Any OpenAI-compatible model can be used for parsing your search query in the "Find" page. We do not send any personal library data to the AI provider; only your search text is sent for parsing, and the actual asset querying uses [Immich's Smart Search API](https://immich.app/docs/api/search-smart) +Any OpenAI-compatible API can be used for parsing your search query in the "Find" page. You can use standard providers like **OpenAI** and **Groq**, or run local models using **Ollama** or **LM Studio**. We do not send any personal library data to the AI provider; only your search text is sent for parsing. The actual asset querying uses [Immich's Smart Search API](https://immich.app/docs/api/search-smart). > Code where AI parsing is used: [src/helpers/ai.helper.ts](./src/helpers/ai.helper.ts) + **Examples:** + - **OpenAI:** `AI_BASE_URL=https://api.openai.com/v1`, `AI_MODEL=gpt-4o-mini` + - **Groq:** `AI_BASE_URL=https://api.groq.com/openai/v1`, `AI_MODEL=llama-3.1-8b-instant` + - **Ollama (local):** `AI_BASE_URL=http://localhost:11434/v1` (or `http://host.docker.internal:11434/v1` if running Power Tools in Docker), `AI_MODEL=llama3.1` + ## Contributing Feel free to contribute to this project, I'm open to any suggestions and improvements. Please read the [CONTRIBUTING.md](./CONTRIBUTING.md) for more details.