diff --git a/.dockerignore b/.dockerignore index 9b58d4a..c269af9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,14 +1,28 @@ node_modules +**/node_modules .next +**/.next .git # .npmrc is allowed as it contains the registry template dist +**/dist build +**/build out +**/out coverage +**/coverage .vercel +**/.vercel .turbo +**/.turbo *.log +**/*.log .DS_Store +**/.DS_Store .pnpm-store +**/.pnpm-store .gitea +**/.gitea +models +**/models diff --git a/.env b/.env index 4255329..ea06df3 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ # Project -IMAGE_TAG=v1.8.10 +IMAGE_TAG=v1.8.6 PROJECT_NAME=at-mintel PROJECT_COLOR=#82ed20 GITEA_TOKEN=ccce002e30fe16a31a6c9d5a414740af2f72a582 diff --git a/.gitea/workflows/pipeline.yml b/.gitea/workflows/pipeline.yml index e4dee76..b2ee396 100644 --- a/.gitea/workflows/pipeline.yml +++ b/.gitea/workflows/pipeline.yml @@ -192,6 +192,9 @@ jobs: - image: directus file: packages/infra/docker/Dockerfile.directus name: Directus (Base) + - image: image-processor + file: apps/image-service/Dockerfile + name: Image Processor steps: - name: Checkout uses: actions/checkout@v4 diff --git a/apps/image-service/package.json b/apps/image-service/package.json new file mode 100644 index 0000000..8fcf016 --- /dev/null +++ b/apps/image-service/package.json @@ -0,0 +1,23 @@ +{ + "name": "image-service", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "lint": "eslint src" + }, + "dependencies": { + "@mintel/image-processor": "workspace:*", + "fastify": "^4.26.2" + }, + "devDependencies": { + "@mintel/eslint-config": "workspace:*", + "@mintel/tsconfig": "workspace:*", + "@types/node": "^20.0.0", + "tsx": "^4.7.1", + "typescript": "^5.0.0" + } +} diff --git a/apps/image-service/src/index.ts b/apps/image-service/src/index.ts new file mode 100644 index 0000000..f7d228c --- /dev/null +++ b/apps/image-service/src/index.ts @@ -0,0 +1,80 @@ +import Fastify from "fastify"; +import { processImageWithSmartCrop } from "@mintel/image-processor"; + +const fastify = Fastify({ + logger: true, +}); + +fastify.get("/unsafe/:options/:urlSafeB64", async (request, reply) => { + // Compatibility endpoint for old imgproxy calls (optional, but requested by some systems sometimes) + // For now, replacing logic in clients is preferred. So we just redirect or error. + return reply + .status(400) + .send({ error: "Legacy imgproxy API not supported. Use /process" }); +}); + +fastify.get("/process", async (request, reply) => { + const query = request.query as { + url?: string; + w?: string; + h?: string; + q?: string; + format?: string; + }; + + const { url } = query; + const width = parseInt(query.w || "800", 10); + const height = parseInt(query.h || "600", 10); + const quality = parseInt(query.q || "80", 10); + const format = (query.format || "webp") as "webp" | "jpeg" | "png" | "avif"; + + if (!url) { + return reply.status(400).send({ error: 'Parameter "url" is required' }); + } + + try { + const response = await fetch(url); + if (!response.ok) { + return reply + .status(response.status) + .send({ + error: `Failed to fetch source image: ${response.statusText}`, + }); + } + + const arrayBuffer = await response.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + + const processedBuffer = await processImageWithSmartCrop(buffer, { + width, + height, + format, + quality, + }); + + reply.header("Content-Type", `image/${format}`); + reply.header("Cache-Control", "public, max-age=31536000, immutable"); + return reply.send(processedBuffer); + } catch (err) { + fastify.log.error(err); + return reply + .status(500) + .send({ error: "Internal Server Error processing image" }); + } +}); + +fastify.get("/health", async () => { + return { status: "ok" }; +}); + +const start = async () => { + try { + await fastify.listen({ port: 8080, host: "0.0.0.0" }); + console.log(`Server listening on 8080`); + } catch (err) { + fastify.log.error(err); + process.exit(1); + } +}; + +start(); diff --git a/apps/image-service/tsconfig.json b/apps/image-service/tsconfig.json new file mode 100644 index 0000000..6ac2154 --- /dev/null +++ b/apps/image-service/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@mintel/tsconfig/base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noEmit": false + }, + "include": ["src/**/*"] +} diff --git a/package.json b/package.json index d03e96e..056740b 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,18 @@ }, "version": "1.8.6", "pnpm": { + "onlyBuiltDependencies": [ + "@parcel/watcher", + "@sentry/cli", + "@swc/core", + "@tensorflow/tfjs-node", + "canvas", + "core-js", + "esbuild", + "sharp", + "unrs-resolver", + "vue-demi" + ], "overrides": { "next": "16.1.6", "@sentry/nextjs": "10.38.0" diff --git a/packages/image-processor/package.json b/packages/image-processor/package.json index e5c2262..18b8f43 100644 --- a/packages/image-processor/package.json +++ b/packages/image-processor/package.json @@ -18,6 +18,7 @@ "lint": "eslint src" }, "dependencies": { + "@tensorflow/tfjs-node": "^4.22.0", "@vladmandic/face-api": "^1.7.13", "canvas": "^2.11.2", "sharp": "^0.33.2" diff --git a/packages/image-processor/scripts/download-models.ts b/packages/image-processor/scripts/download-models.ts index 1a9630d..dad60e3 100644 --- a/packages/image-processor/scripts/download-models.ts +++ b/packages/image-processor/scripts/download-models.ts @@ -1,48 +1,55 @@ -import * as fs from 'node:fs'; -import * as path from 'node:path'; -import * as https from 'node:https'; +import * as fs from "node:fs"; +import * as path from "node:path"; +import * as https from "node:https"; -const MODELS_DIR = path.join(process.cwd(), 'models'); -const BASE_URL = 'https://raw.githubusercontent.com/vladmandic/face-api/master/model/'; +import { fileURLToPath } from "node:url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const MODELS_DIR = path.join(__dirname, "..", "models"); +const BASE_URL = + "https://raw.githubusercontent.com/vladmandic/face-api/master/model/"; const models = [ - 'tiny_face_detector_model-weights_manifest.json', - 'tiny_face_detector_model-shard1' + "tiny_face_detector_model-weights_manifest.json", + "tiny_face_detector_model-shard1", ]; async function downloadModel(filename: string) { - const destPath = path.join(MODELS_DIR, filename); - if (fs.existsSync(destPath)) { - console.log(`Model ${filename} already exists.`); - return; - } + const destPath = path.join(MODELS_DIR, filename); + if (fs.existsSync(destPath)) { + console.log(`Model ${filename} already exists.`); + return; + } - return new Promise((resolve, reject) => { - console.log(`Downloading ${filename}...`); - const file = fs.createWriteStream(destPath); - https.get(BASE_URL + filename, (response) => { - response.pipe(file); - file.on('finish', () => { - file.close(); - resolve(true); - }); - }).on('error', (err) => { - fs.unlinkSync(destPath); - reject(err); + return new Promise((resolve, reject) => { + console.log(`Downloading ${filename}...`); + const file = fs.createWriteStream(destPath); + https + .get(BASE_URL + filename, (response) => { + response.pipe(file); + file.on("finish", () => { + file.close(); + resolve(true); }); - }); + }) + .on("error", (err) => { + fs.unlinkSync(destPath); + reject(err); + }); + }); } async function main() { - if (!fs.existsSync(MODELS_DIR)) { - fs.mkdirSync(MODELS_DIR, { recursive: true }); - } + if (!fs.existsSync(MODELS_DIR)) { + fs.mkdirSync(MODELS_DIR, { recursive: true }); + } - for (const model of models) { - await downloadModel(model); - } + for (const model of models) { + await downloadModel(model); + } - console.log('All models downloaded successfully!'); + console.log("All models downloaded successfully!"); } main().catch(console.error); diff --git a/packages/image-processor/src/processor.ts b/packages/image-processor/src/processor.ts index 4cf9f97..349d255 100644 --- a/packages/image-processor/src/processor.ts +++ b/packages/image-processor/src/processor.ts @@ -1,139 +1,140 @@ -import * as faceapi from '@vladmandic/face-api'; +import * as faceapi from "@vladmandic/face-api"; // Provide Canvas fallback for face-api in Node.js -import { Canvas, Image, ImageData } from 'canvas'; -import sharp from 'sharp'; -import * as path from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { Canvas, Image, ImageData } from "canvas"; +import sharp from "sharp"; +import * as path from "node:path"; +import { fileURLToPath } from "node:url"; -// @ts-ignore +// @ts-expect-error FaceAPI does not have type definitions for monkeyPatch faceapi.env.monkeyPatch({ Canvas, Image, ImageData }); const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Path to the downloaded models -const MODELS_PATH = path.join(__dirname, '..', 'models'); +const MODELS_PATH = path.join(__dirname, "..", "models"); let isModelsLoaded = false; async function loadModels() { - if (isModelsLoaded) return; - await faceapi.nets.tinyFaceDetector.loadFromDisk(MODELS_PATH); - isModelsLoaded = true; + if (isModelsLoaded) return; + await faceapi.nets.tinyFaceDetector.loadFromDisk(MODELS_PATH); + isModelsLoaded = true; } export interface ProcessImageOptions { - width: number; - height: number; - format?: 'webp' | 'jpeg' | 'png' | 'avif'; - quality?: number; + width: number; + height: number; + format?: "webp" | "jpeg" | "png" | "avif"; + quality?: number; } export async function processImageWithSmartCrop( - inputBuffer: Buffer, - options: ProcessImageOptions + inputBuffer: Buffer, + options: ProcessImageOptions, ): Promise { - await loadModels(); + await loadModels(); - // Load image via Canvas for face-api - const img = new Image(); - img.src = inputBuffer; + // Load image via Canvas for face-api + const img = new Image(); + img.src = inputBuffer; - // Detect faces - const detections = await faceapi.detectAllFaces( - // @ts-ignore - img, - new faceapi.TinyFaceDetectorOptions() - ); + // Detect faces + const detections = await faceapi.detectAllFaces( + // @ts-expect-error FaceAPI does not have type definitions for monkeyPatch + img, + new faceapi.TinyFaceDetectorOptions(), + ); - const sharpImage = sharp(inputBuffer); - const metadata = await sharpImage.metadata(); + const sharpImage = sharp(inputBuffer); + const metadata = await sharpImage.metadata(); - if (!metadata.width || !metadata.height) { - throw new Error('Could not read image metadata'); + if (!metadata.width || !metadata.height) { + throw new Error("Could not read image metadata"); + } + + // If faces are found, calculate the bounding box containing all faces + if (detections.length > 0) { + let minX = metadata.width; + let minY = metadata.height; + let maxX = 0; + let maxY = 0; + + for (const det of detections) { + const { x, y, width, height } = det.box; + if (x < minX) minX = Math.max(0, x); + if (y < minY) minY = Math.max(0, y); + if (x + width > maxX) maxX = Math.min(metadata.width, x + width); + if (y + height > maxY) maxY = Math.min(metadata.height, y + height); } - // If faces are found, calculate the bounding box containing all faces - if (detections.length > 0) { - let minX = metadata.width; - let minY = metadata.height; - let maxX = 0; - let maxY = 0; + const faceBoxWidth = maxX - minX; + const faceBoxHeight = maxY - minY; - for (const det of detections) { - const { x, y, width, height } = det.box; - if (x < minX) minX = Math.max(0, x); - if (y < minY) minY = Math.max(0, y); - if (x + width > maxX) maxX = Math.min(metadata.width, x + width); - if (y + height > maxY) maxY = Math.min(metadata.height, y + height); - } + // Calculate center of the faces + const centerX = Math.floor(minX + faceBoxWidth / 2); + const centerY = Math.floor(minY + faceBoxHeight / 2); - const faceBoxWidth = maxX - minX; - const faceBoxHeight = maxY - minY; + // Provide this as a focus point for sharp's extract or resize + // We can use sharp's resize with `position` focusing on crop options, + // or calculate an exact bounding box. However, extracting an exact bounding box + // and then resizing usually yields the best results when focusing on a specific coordinate. - // Calculate center of the faces - const centerX = Math.floor(minX + faceBoxWidth / 2); - const centerY = Math.floor(minY + faceBoxHeight / 2); + // A simpler approach is to crop a rectangle with the target aspect ratio + // centered on the faces, then resize. Let's calculate the crop box. - // Provide this as a focus point for sharp's extract or resize - // We can use sharp's resize with `position` focusing on crop options, - // or calculate an exact bounding box. However, extracting an exact bounding box - // and then resizing usually yields the best results when focusing on a specific coordinate. + const targetRatio = options.width / options.height; + const currentRatio = metadata.width / metadata.height; - // A simpler approach is to crop a rectangle with the target aspect ratio - // centered on the faces, then resize. Let's calculate the crop box. + let cropWidth = metadata.width; + let cropHeight = metadata.height; - const targetRatio = options.width / options.height; - const currentRatio = metadata.width / metadata.height; - - let cropWidth = metadata.width; - let cropHeight = metadata.height; - - if (currentRatio > targetRatio) { - // Image is wider than target, calculate new width - cropWidth = Math.floor(metadata.height * targetRatio); - } else { - // Image is taller than target, calculate new height - cropHeight = Math.floor(metadata.width / targetRatio); - } - - // Try to center the crop box around the faces - let cropX = Math.floor(centerX - cropWidth / 2); - let cropY = Math.floor(centerY - cropHeight / 2); - - // Keep crop box within image bounds - if (cropX < 0) cropX = 0; - if (cropY < 0) cropY = 0; - if (cropX + cropWidth > metadata.width) cropX = metadata.width - cropWidth; - if (cropY + cropHeight > metadata.height) cropY = metadata.height - cropHeight; - - sharpImage.extract({ - left: cropX, - top: cropY, - width: cropWidth, - height: cropHeight - }); + if (currentRatio > targetRatio) { + // Image is wider than target, calculate new width + cropWidth = Math.floor(metadata.height * targetRatio); + } else { + // Image is taller than target, calculate new height + cropHeight = Math.floor(metadata.width / targetRatio); } - // Finally, resize to the requested dimensions and format - let finalImage = sharpImage.resize(options.width, options.height, { - // If faces weren't found, default to entropy/attention based cropping as fallback - fit: 'cover', - position: detections.length > 0 ? 'center' : 'attention' + // Try to center the crop box around the faces + let cropX = Math.floor(centerX - cropWidth / 2); + let cropY = Math.floor(centerY - cropHeight / 2); + + // Keep crop box within image bounds + if (cropX < 0) cropX = 0; + if (cropY < 0) cropY = 0; + if (cropX + cropWidth > metadata.width) cropX = metadata.width - cropWidth; + if (cropY + cropHeight > metadata.height) + cropY = metadata.height - cropHeight; + + sharpImage.extract({ + left: cropX, + top: cropY, + width: cropWidth, + height: cropHeight, }); + } - const format = options.format || 'webp'; - const quality = options.quality || 80; + // Finally, resize to the requested dimensions and format + let finalImage = sharpImage.resize(options.width, options.height, { + // If faces weren't found, default to entropy/attention based cropping as fallback + fit: "cover", + position: detections.length > 0 ? "center" : "attention", + }); - if (format === 'webp') { - finalImage = finalImage.webp({ quality }); - } else if (format === 'jpeg') { - finalImage = finalImage.jpeg({ quality }); - } else if (format === 'png') { - finalImage = finalImage.png({ quality }); - } else if (format === 'avif') { - finalImage = finalImage.avif({ quality }); - } + const format = options.format || "webp"; + const quality = options.quality || 80; - return finalImage.toBuffer(); + if (format === "webp") { + finalImage = finalImage.webp({ quality }); + } else if (format === "jpeg") { + finalImage = finalImage.jpeg({ quality }); + } else if (format === "png") { + finalImage = finalImage.png({ quality }); + } else if (format === "avif") { + finalImage = finalImage.avif({ quality }); + } + + return finalImage.toBuffer(); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc91244..2e2412d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,6 +101,31 @@ importers: specifier: ^4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.33)(@vitest/ui@4.0.18)(happy-dom@20.5.3)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + apps/image-service: + dependencies: + '@mintel/image-processor': + specifier: workspace:* + version: link:../../packages/image-processor + fastify: + specifier: ^4.26.2 + version: 4.29.1 + devDependencies: + '@mintel/eslint-config': + specifier: workspace:* + version: link:../../packages/eslint-config + '@mintel/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@types/node': + specifier: ^20.0.0 + version: 20.19.33 + tsx: + specifier: ^4.7.1 + version: 4.21.0 + typescript: + specifier: ^5.0.0 + version: 5.9.3 + apps/sample-website: dependencies: '@mintel/image-processor': @@ -432,6 +457,9 @@ importers: packages/image-processor: dependencies: + '@tensorflow/tfjs-node': + specifier: ^4.22.0 + version: 4.22.0(seedrandom@3.0.5) '@vladmandic/face-api': specifier: ^1.7.13 version: 1.7.15 @@ -717,7 +745,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.10)(@vitest/ui@4.0.18)(happy-dom@20.5.3)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0) + version: 2.1.9(@types/node@22.19.10)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.5.3)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0) packages/pdf-library: dependencies: @@ -2054,6 +2082,18 @@ packages: '@noble/hashes': optional: true + '@fastify/ajv-compiler@3.6.0': + resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + '@formatjs/ecma402-abstract@3.1.1': resolution: {integrity: sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==} @@ -2385,6 +2425,10 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true + '@mapbox/node-pre-gyp@1.0.9': + resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==} + hasBin: true + '@medv/finder@4.0.2': resolution: {integrity: sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ==} @@ -3389,6 +3433,46 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tensorflow/tfjs-backend-cpu@4.22.0': + resolution: {integrity: sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==} + engines: {yarn: '>= 1.3.2'} + peerDependencies: + '@tensorflow/tfjs-core': 4.22.0 + + '@tensorflow/tfjs-backend-webgl@4.22.0': + resolution: {integrity: sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==} + engines: {yarn: '>= 1.3.2'} + peerDependencies: + '@tensorflow/tfjs-core': 4.22.0 + + '@tensorflow/tfjs-converter@4.22.0': + resolution: {integrity: sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==} + peerDependencies: + '@tensorflow/tfjs-core': 4.22.0 + + '@tensorflow/tfjs-core@4.22.0': + resolution: {integrity: sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==} + engines: {yarn: '>= 1.3.2'} + + '@tensorflow/tfjs-data@4.22.0': + resolution: {integrity: sha512-dYmF3LihQIGvtgJrt382hSRH4S0QuAp2w1hXJI2+kOaEqo5HnUPG0k5KA6va+S1yUhx7UBToUKCBHeLHFQRV4w==} + peerDependencies: + '@tensorflow/tfjs-core': 4.22.0 + seedrandom: ^3.0.5 + + '@tensorflow/tfjs-layers@4.22.0': + resolution: {integrity: sha512-lybPj4ZNj9iIAPUj7a8ZW1hg8KQGfqWLlCZDi9eM/oNKCCAgchiyzx8OrYoWmRrB+AM6VNEeIT+2gZKg5ReihA==} + peerDependencies: + '@tensorflow/tfjs-core': 4.22.0 + + '@tensorflow/tfjs-node@4.22.0': + resolution: {integrity: sha512-uHrXeUlfgkMxTZqHkESSV7zSdKdV0LlsBeblqkuKU9nnfxB1pC6DtoyYVaLxznzZy7WQSegjcohxxCjAf6Dc7w==} + engines: {node: '>=8.11.0'} + + '@tensorflow/tfjs@4.22.0': + resolution: {integrity: sha512-0TrIrXs6/b7FLhLVNmfh8Sah6JgjBPH4mZ8JGb7NU6WW+cx00qK5BcAZxw7NCzxj6N8MRAIfHq+oNbPUNG5VAg==} + hasBin: true + '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -3502,6 +3586,9 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -3523,6 +3610,12 @@ packages: '@types/node@22.19.10': resolution: {integrity: sha512-tF5VOugLS/EuDlTBijk0MqABfP8UxgYazTLo3uIn3b4yJgg26QRbVYJYsDtHrjdDUIRfP70+VfhTTc+CE1yskw==} + '@types/offscreencanvas@2019.3.0': + resolution: {integrity: sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==} + + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3555,6 +3648,9 @@ packages: '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/seedrandom@2.4.34': + resolution: {integrity: sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==} + '@types/send@1.2.1': resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} @@ -3967,6 +4063,9 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@webgpu/types@0.1.38': + resolution: {integrity: sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -3983,6 +4082,9 @@ packages: abs-svg-path@0.1.1: resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -4008,6 +4110,10 @@ packages: resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} engines: {node: '>=12.0'} + agent-base@4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -4028,6 +4134,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: @@ -4178,6 +4292,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + avvio@8.4.0: + resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + axe-core@4.11.1: resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} @@ -4419,6 +4536,9 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4528,6 +4648,13 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.29.1: + resolution: {integrity: sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==} + cosmiconfig-typescript-loader@6.2.0: resolution: {integrity: sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==} engines: {node: '>=v18'} @@ -4937,6 +5064,12 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -5145,9 +5278,15 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + fast-copy@4.0.2: resolution: {integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==} + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} @@ -5165,15 +5304,27 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastify@4.29.1: + resolution: {integrity: sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -5214,6 +5365,10 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} + find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + engines: {node: '>=14'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5291,6 +5446,10 @@ packages: forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} @@ -5466,6 +5625,9 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + google-protobuf@3.21.4: + resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} + google-trends-api@4.9.2: resolution: {integrity: sha512-gjVSHCM8B7LyAAUpXb4B0/TfnmpwQ2z1w/mQ2bL0AKpr2j3gLS1j2YOnifpfsGJRxAGXB/NoC+nGwC5qSnZIiA==} @@ -5583,6 +5745,10 @@ packages: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@2.2.4: + resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} + engines: {node: '>= 4.5.0'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -5706,6 +5872,10 @@ packages: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-any-array@2.0.1: resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} @@ -5971,6 +6141,9 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -6054,6 +6227,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + light-my-request@5.14.0: + resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} + lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -6221,6 +6397,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6508,6 +6687,15 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-fetch@2.6.13: + resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -6834,6 +7022,9 @@ packages: typescript: optional: true + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-abstract-transport@3.0.0: resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} @@ -6848,6 +7039,10 @@ packages: resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} hasBin: true + pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} + hasBin: true + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -7163,6 +7358,9 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} @@ -7184,6 +7382,10 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-chain@2.7.1: resolution: {integrity: sha512-LtXu0miohJYrHWJxv8wA6EoGreRcX1hxKb7qlE1pMFH+BXE7bqMvpyhzR/JvR6M5SzYKzyHFpvfmYJrZeMtwAg==} engines: {node: '>=14'} @@ -7286,6 +7488,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -7352,6 +7557,10 @@ packages: restructure@3.0.2: resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -7363,6 +7572,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -7427,6 +7641,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -7457,9 +7674,15 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -7478,6 +7701,9 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7840,6 +8066,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + thread-stream@4.0.0: resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} engines: {node: '>=20'} @@ -7917,6 +8146,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} @@ -8505,10 +8738,18 @@ packages: yargonaut@1.1.4: resolution: {integrity: sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -9824,6 +10065,22 @@ snapshots: '@exodus/bytes@1.12.0': {} + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + fast-uri: 2.4.0 + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + '@formatjs/ecma402-abstract@3.1.1': dependencies: '@formatjs/fast-memoize': 3.1.0 @@ -10128,6 +10385,21 @@ snapshots: - encoding - supports-color + '@mapbox/node-pre-gyp@1.0.9': + dependencies: + detect-libc: 2.1.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.7.4 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + '@medv/finder@4.0.2': {} '@napi-rs/wasm-runtime@0.2.12': @@ -11213,6 +11485,82 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.19(tsx@4.21.0)(yaml@2.8.2) + '@tensorflow/tfjs-backend-cpu@4.22.0(@tensorflow/tfjs-core@4.22.0)': + dependencies: + '@tensorflow/tfjs-core': 4.22.0 + '@types/seedrandom': 2.4.34 + seedrandom: 3.0.5 + + '@tensorflow/tfjs-backend-webgl@4.22.0(@tensorflow/tfjs-core@4.22.0)': + dependencies: + '@tensorflow/tfjs-backend-cpu': 4.22.0(@tensorflow/tfjs-core@4.22.0) + '@tensorflow/tfjs-core': 4.22.0 + '@types/offscreencanvas': 2019.3.0 + '@types/seedrandom': 2.4.34 + seedrandom: 3.0.5 + + '@tensorflow/tfjs-converter@4.22.0(@tensorflow/tfjs-core@4.22.0)': + dependencies: + '@tensorflow/tfjs-core': 4.22.0 + + '@tensorflow/tfjs-core@4.22.0': + dependencies: + '@types/long': 4.0.2 + '@types/offscreencanvas': 2019.7.3 + '@types/seedrandom': 2.4.34 + '@webgpu/types': 0.1.38 + long: 4.0.0 + node-fetch: 2.6.13 + seedrandom: 3.0.5 + transitivePeerDependencies: + - encoding + + '@tensorflow/tfjs-data@4.22.0(@tensorflow/tfjs-core@4.22.0)(seedrandom@3.0.5)': + dependencies: + '@tensorflow/tfjs-core': 4.22.0 + '@types/node-fetch': 2.6.13 + node-fetch: 2.6.13 + seedrandom: 3.0.5 + string_decoder: 1.3.0 + transitivePeerDependencies: + - encoding + + '@tensorflow/tfjs-layers@4.22.0(@tensorflow/tfjs-core@4.22.0)': + dependencies: + '@tensorflow/tfjs-core': 4.22.0 + + '@tensorflow/tfjs-node@4.22.0(seedrandom@3.0.5)': + dependencies: + '@mapbox/node-pre-gyp': 1.0.9 + '@tensorflow/tfjs': 4.22.0(seedrandom@3.0.5) + adm-zip: 0.5.16 + google-protobuf: 3.21.4 + https-proxy-agent: 2.2.4 + progress: 2.0.3 + rimraf: 2.7.1 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - seedrandom + - supports-color + + '@tensorflow/tfjs@4.22.0(seedrandom@3.0.5)': + dependencies: + '@tensorflow/tfjs-backend-cpu': 4.22.0(@tensorflow/tfjs-core@4.22.0) + '@tensorflow/tfjs-backend-webgl': 4.22.0(@tensorflow/tfjs-core@4.22.0) + '@tensorflow/tfjs-converter': 4.22.0(@tensorflow/tfjs-core@4.22.0) + '@tensorflow/tfjs-core': 4.22.0 + '@tensorflow/tfjs-data': 4.22.0(@tensorflow/tfjs-core@4.22.0)(seedrandom@3.0.5) + '@tensorflow/tfjs-layers': 4.22.0(@tensorflow/tfjs-core@4.22.0) + argparse: 1.0.10 + chalk: 4.1.2 + core-js: 3.29.1 + regenerator-runtime: 0.13.11 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - seedrandom + '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.0 @@ -11363,6 +11711,8 @@ snapshots: dependencies: '@types/node': 20.19.33 + '@types/long@4.0.2': {} + '@types/ms@2.1.0': optional: true @@ -11389,6 +11739,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/offscreencanvas@2019.3.0': {} + + '@types/offscreencanvas@2019.7.3': {} + '@types/parse-json@4.0.2': {} '@types/pg-pool@2.0.7': @@ -11424,6 +11778,8 @@ snapshots: dependencies: '@types/node': 20.19.33 + '@types/seedrandom@2.4.34': {} + '@types/send@1.2.1': dependencies: '@types/node': 20.19.33 @@ -11963,6 +12319,8 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@webgpu/types@0.1.38': {} + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -11975,6 +12333,8 @@ snapshots: abs-svg-path@0.1.1: {} + abstract-logging@2.0.1: {} + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -11991,6 +12351,10 @@ snapshots: adm-zip@0.5.16: {} + agent-base@4.3.0: + dependencies: + es6-promisify: 5.0.0 + agent-base@6.0.2: dependencies: debug: 4.4.3 @@ -12007,6 +12371,10 @@ snapshots: optionalDependencies: ajv: 8.17.1 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: ajv: 8.17.1 @@ -12174,6 +12542,11 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + avvio@8.4.0: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.20.1 + axe-core@4.11.1: {} axios@1.13.5: @@ -12448,6 +12821,12 @@ snapshots: client-only@0.0.1: {} + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -12531,6 +12910,10 @@ snapshots: convert-source-map@2.0.0: {} + cookie@0.7.2: {} + + core-js@3.29.1: {} + cosmiconfig-typescript-loader@6.2.0(@types/node@20.19.33)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: '@types/node': 20.19.33 @@ -13018,6 +13401,12 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -13418,8 +13807,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-content-type-parse@1.1.0: {} + fast-copy@4.0.2: {} + fast-decode-uri-component@1.0.1: {} + fast-deep-equal@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -13442,12 +13835,47 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + fast-levenshtein@2.0.6: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + fast-safe-stringify@2.1.1: {} + fast-uri@2.4.0: {} + fast-uri@3.1.0: {} + fastify@4.29.1: + dependencies: + '@fastify/ajv-compiler': 3.6.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.4.0 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.1 + find-my-way: 8.2.2 + light-my-request: 5.14.0 + pino: 9.14.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.7.4 + toad-cache: 3.7.0 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -13485,6 +13913,12 @@ snapshots: filter-obj@1.1.0: {} + find-my-way@8.2.2: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -13565,6 +13999,8 @@ snapshots: forwarded-parse@2.1.2: {} + forwarded@0.2.0: {} + fraction.js@5.3.4: {} framer-motion@11.18.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -13763,6 +14199,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + google-protobuf@3.21.4: {} + google-trends-api@4.9.2: {} gopd@1.2.0: {} @@ -13917,6 +14355,13 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@2.2.4: + dependencies: + agent-base: 4.3.0 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -14066,6 +14511,8 @@ snapshots: ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} + is-any-array@2.0.1: {} is-array-buffer@3.0.5: @@ -14353,6 +14800,10 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -14426,6 +14877,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + light-my-request@5.14.0: + dependencies: + cookie: 0.7.2 + process-warning: 3.0.0 + set-cookie-parser: 2.7.2 + lightningcss-android-arm64@1.30.2: optional: true @@ -14568,6 +15025,8 @@ snapshots: strip-ansi: 7.1.2 wrap-ansi: 9.0.2 + long@4.0.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -14807,6 +15266,10 @@ snapshots: node-domexception@1.0.0: {} + node-fetch@2.6.13: + dependencies: + whatwg-url: 5.0.0 + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -15133,6 +15596,10 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + pino-abstract-transport@3.0.0: dependencies: split2: 4.2.0 @@ -15169,6 +15636,20 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 4.0.0 + pino@9.14.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.7: {} pkg-dir@4.2.0: @@ -15452,6 +15933,8 @@ snapshots: prismjs@1.29.0: {} + process-warning@3.0.0: {} + process-warning@5.0.0: {} process@0.11.10: @@ -15476,6 +15959,11 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-chain@2.7.1: dependencies: socks: 2.8.7 @@ -15589,6 +16077,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regenerator-runtime@0.13.11: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -15658,12 +16148,18 @@ snapshots: restructure@3.0.2: {} + ret@0.4.3: {} + retry@0.12.0: {} reusify@1.1.0: {} rfdc@1.4.1: {} + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -15774,6 +16270,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-regex2@3.1.0: + dependencies: + ret: 0.4.3 + safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} @@ -15804,8 +16304,12 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + secure-json-parse@2.7.0: {} + secure-json-parse@4.1.0: {} + seedrandom@3.0.5: {} + selderee@0.11.0: dependencies: parseley: 0.12.1 @@ -15820,6 +16324,8 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.7.2: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -16294,6 +16800,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + thread-stream@4.0.0: dependencies: real-require: 0.2.0 @@ -16349,6 +16859,8 @@ snapshots: dependencies: is-number: 7.0.0 + toad-cache@3.7.0: {} + token-types@6.1.2: dependencies: '@borewit/text-codec': 0.2.1 @@ -16670,7 +17182,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vitest@2.1.9(@types/node@22.19.10)(@vitest/ui@4.0.18)(happy-dom@20.5.3)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0): + vitest@2.1.9(@types/node@22.19.10)(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.5.3)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0): dependencies: '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.10)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.46.0)) @@ -17035,8 +17547,20 @@ snapshots: figlet: 1.10.0 parent-require: 1.0.0 + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1