├── .github └── workflows │ └── test.yml ├── .gitignore ├── .npmignore ├── README.md ├── __tests__ ├── convert.test.ts ├── helpers │ └── create-image.ts └── resize.test.ts ├── bin ├── convert.js ├── process-web-image.js └── resize.js ├── examples ├── angular.ts ├── html.html ├── react.tsx ├── svelte.svelte └── vue.vue ├── jest.config.js ├── package.json ├── pnpm-lock.yaml ├── src ├── convert.ts ├── index.ts └── resize.ts └── tsconfig.json /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Run Tests 2 | 3 | on: 4 | push: 5 | branches: 6 | - '**' 7 | pull_request: 8 | branches: 9 | - '**' 10 | 11 | jobs: 12 | test: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - name: Checkout Repository 17 | uses: actions/checkout@v4 18 | 19 | - name: Install pnpm 20 | uses: pnpm/action-setup@v4 21 | with: 22 | version: 10 23 | - name: Use Node.js ${{ matrix.node-version }} 24 | uses: actions/setup-node@v4 25 | with: 26 | node-version: ${{ matrix.node-version }} 27 | cache: 'pnpm' 28 | - name: Install dependencies 29 | run: pnpm install 30 | 31 | - name: Run Tests 32 | run: pnpm test 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | tsconfig.tsbuildinfo 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | examples 2 | src 3 | tsconfig.json 4 | __tests__ 5 | tsconfig.tsbuildinfo 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # process-web-image 2 | 3 | **`process-web-image`** is a simple command-line tool for processing images. It converts PNG images to WebP, generates a fallback PNG, and resizes images for TailwindCSS breakpoints. 4 | 5 | ## Why does this exist? 6 | 7 | I use NextJS a whole bunch, and I love how easy next/image is to use. However, it is also a really big vendor lockin issue which i experienced as soon as i tried out Tanstack Start. The existing solutions require stuff like cdn's.. servers etc. I just wanted an easy way to generate my local images with some nice tailwind breakpoints so i can keep the speed and acccessibility of images i put on my websites. 8 | 9 | ## Features 10 | 11 | - Convert PNG images to WebP format 12 | - Generate fallback PNG images 13 | - Resize images to fit common TailwindCSS breakpoints (sm, md, lg, xl) 14 | - Efficient and fast processing 15 | - Optional `--dump` flag to skip folder creation 16 | 17 | ## Installation & Usage 18 | 19 | To use `process-web-image`, install it via `npx` or `pnpx`: 20 | 21 | ```sh 22 | npx process-web-image 23 | # or 24 | pnpx process-web-image 25 | # or 26 | bunx process-web-image 27 | ``` 28 | 29 | ### Processing Images 30 | 31 | Provide the path to your PNG image or your WebP image as an argument: 32 | 33 | ```sh 34 | pnpx process-web-image /path/to/image.png 35 | ``` 36 | 37 | This will generate a WebP version, a fallback PNG, and resized images in a folder named after the original image. 38 | 39 | ### Using the `--dump` Flag 40 | 41 | If you prefer not to create a separate folder and want the processed images to stay in the original location, use the `--dump` flag: 42 | 43 | ```sh 44 | pnpx process-web-image /path/to/image.png --dump 45 | ``` 46 | 47 | ### Output Example 48 | 49 | With default settings: 50 | 51 | ``` 52 | /path/to/image/ 53 | ├── image.webp 54 | ├── image.png 55 | ├── image-sm.webp 56 | ├── image-md.webp 57 | ├── image-lg.webp 58 | └── image-xl.webp 59 | ``` 60 | 61 | With `--dump` flag: 62 | 63 | ``` 64 | /path/to/image.webp 65 | /path/to/image.png 66 | /path/to/image-sm.webp 67 | 68 | 69 | /path/to/image-md.webp 70 | /path/to/image-lg.webp 71 | /path/to/image-xl.webp 72 | ``` 73 | 74 | ## Video Tutorial 75 | 76 | https://github.com/user-attachments/assets/ffd8472c-8a58-4f0e-a9cf-4d60bab99ceb 77 | 78 | ## Examples 79 | 80 | Some examples of how to use images generated by `process-web-image`: 81 | 82 | - [Angular](https://github.com/Arinji2/process-web-image/tree/main/examples/angular.ts) 83 | - [Html](https://github.com/Arinji2/process-web-image/tree/main/examples/html.html) 84 | - [React](https://github.com/Arinji2/process-web-image/tree/main/examples/react.tsx) 85 | - [Svelte](https://github.com/Arinji2/process-web-image/tree/main/examples/svelte.svelte) 86 | - [Vue](https://github.com/Arinji2/process-web-image/tree/main/examples/vue.vue) 87 | 88 | ## Hyperlinks 89 | 90 | - **NPM**: [process-web-image](https://www.npmjs.com/package/process-web-image) 91 | - **GitHub**: [Arinji2/process-web-image](https://github.com/Arinji2/process-web-image) 92 | 93 | ## Contact 94 | 95 | For feedback or issues, please open an issue on GitHub or contact me on X [(Arinji_i)](https://x.com/Arinj_i) 96 | 97 | Like what you see? Check out my other projects: [My Portfolio](https://arinji.com) 98 | -------------------------------------------------------------------------------- /__tests__/convert.test.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import os from "os"; 3 | import path from "path"; 4 | import sharp from "sharp"; 5 | import { convertPNGToWebP, convertWebPToPNG } from "../src/convert"; 6 | import { createTestImage } from "./helpers/create-image"; 7 | 8 | describe("Conversion Tests", () => { 9 | let tempDir: string; 10 | 11 | beforeEach(() => { 12 | tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "conversion-test-")); 13 | }); 14 | 15 | afterEach(() => { 16 | fs.rmSync(tempDir, { recursive: true, force: true }); 17 | }); 18 | 19 | describe("WebP to PNG Conversion", () => { 20 | it("should convert WebP to PNG successfully", async () => { 21 | const inputPath = path.join(tempDir, "test.webp"); 22 | const outputPath = path.join(tempDir, "test.png"); 23 | 24 | await createTestImage(inputPath, "webp"); 25 | await convertWebPToPNG(inputPath, outputPath); 26 | expect(fs.existsSync(outputPath)).toBe(true); 27 | }); 28 | }); 29 | 30 | describe("PNG to WebP Conversion", () => { 31 | const createPNG = async (filePath: string) => { 32 | await sharp({ 33 | create: { 34 | width: 100, 35 | height: 100, 36 | channels: 4, 37 | background: { r: 255, g: 255, b: 255, alpha: 1 }, 38 | }, 39 | }) 40 | .png() 41 | .toFile(filePath); 42 | }; 43 | 44 | it("should convert PNG to WebP successfully", async () => { 45 | const inputPath = path.join(tempDir, "test.png"); 46 | const outputPath = path.join(tempDir, "test.webp"); 47 | 48 | await createPNG(inputPath); 49 | await convertPNGToWebP(inputPath, outputPath); 50 | expect(fs.existsSync(outputPath)).toBe(true); 51 | }); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /__tests__/helpers/create-image.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs-extra"; 2 | import sharp from "sharp"; 3 | 4 | export async function createTestImage( 5 | outputPath: string, 6 | format: "png" | "webp", 7 | ): Promise { 8 | const width = 800; 9 | const height = 800; 10 | const image = sharp({ 11 | create: { 12 | width, 13 | height, 14 | channels: 4, 15 | background: { r: 0, g: 128, b: 255, alpha: 1 }, 16 | }, 17 | }); 18 | switch (format) { 19 | case "png": 20 | image.png(); 21 | break; 22 | case "webp": 23 | image.webp({ quality: 95 }); 24 | break; 25 | default: 26 | throw new Error("Invalid format"); 27 | } 28 | const imageBuffer = await image.toBuffer(); 29 | await fs.writeFile(outputPath, imageBuffer); 30 | } 31 | -------------------------------------------------------------------------------- /__tests__/resize.test.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs-extra"; 2 | import path from "path"; 3 | import sharp from "sharp"; 4 | import { resizeWebP } from "../src/resize"; 5 | import { createTestImage } from "./helpers/create-image"; 6 | 7 | describe("resizeWebP", () => { 8 | const tempDir = path.join(__dirname, "temp"); 9 | const inputPath = path.join(tempDir, "test.webp"); 10 | const sizes = { 11 | sm: 480, 12 | md: 768, 13 | lg: 1024, 14 | xl: 1280, 15 | }; 16 | 17 | beforeAll(async () => { 18 | await fs.ensureDir(tempDir); 19 | await createTestImage(path.join(tempDir, "test.png"), "png"); 20 | await sharp(path.join(tempDir, "test.png")) 21 | .webp({ quality: 95 }) 22 | .toFile(inputPath); 23 | }); 24 | 25 | afterAll(async () => { 26 | await fs.remove(tempDir); 27 | }); 28 | 29 | it("should resize the image to all specified sizes", async () => { 30 | await resizeWebP("test", inputPath, sizes, tempDir); 31 | 32 | for (const [sizeName, expectedWidth] of Object.entries(sizes)) { 33 | const outputPath = path.join(tempDir, `test_${sizeName}.webp`); 34 | 35 | expect(fs.existsSync(outputPath)).toBe(true); 36 | 37 | const image = sharp(outputPath); 38 | const metadata = await image.metadata(); 39 | 40 | expect(metadata.width).toBe(expectedWidth); 41 | expect(metadata.format).toBe("webp"); 42 | } 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /bin/convert.js: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import sharp from "sharp"; 3 | /** 4 | * Converts a WebP image to PNG format 5 | * @param {string} inputPath - Path to the WebP image 6 | * @param {string} outputPath - Path where the PNG image will be saved 7 | * @returns {Promise} - A promise that resolves when conversion is complete 8 | */ 9 | export async function convertWebPToPNG(inputPath, outputPath) { 10 | try { 11 | console.log(chalk.blue(`[ℹ] Converting WebP to PNG: ${outputPath}`)); 12 | await sharp(inputPath).png().toFile(outputPath); 13 | console.log(chalk.green("[✔] Succesfully converted to PNG")); 14 | } 15 | catch (error) { 16 | console.error(chalk.red("[✘] Failed to convert WebP to PNG:"), error); 17 | throw error; 18 | } 19 | } 20 | /** 21 | * Converts a PNG image to WebP format 22 | * @param {string} inputPath - Path to the PNG image 23 | * @param {string} outputPath - Path where the WebP image will be saved 24 | * @returns {Promise} - A promise that resolves when conversion is complete 25 | */ 26 | export async function convertPNGToWebP(inputPath, outputPath) { 27 | try { 28 | console.log(chalk.blue(`[ℹ] Converting PNG to WebP: ${outputPath}`)); 29 | await sharp(inputPath).webp({ quality: 95 }).toFile(outputPath); 30 | console.log(chalk.green("[✔] Succesfully converted to WebP")); 31 | } 32 | catch (error) { 33 | console.error(chalk.red("[✘] Failed to convert PNG to WebP:"), error); 34 | throw error; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /bin/process-web-image.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import chalk from "chalk"; 3 | import { Command } from "commander"; 4 | import fs from "fs"; 5 | import path from "path"; 6 | import { convertPNGToWebP, convertWebPToPNG } from "./convert.js"; 7 | import { resizeWebP } from "./resize.js"; 8 | const program = new Command(); 9 | program 10 | .name("process-web-image") 11 | .description("An image processor that creates a webp file, a fallback png, and resizes it in tailwind breakpoints") 12 | .argument("", "Path to the image file") 13 | .option("--dump", "Save files to the current directory instead of creating a new folder") 14 | .action(async (filePath, options) => { 15 | console.log(chalk.blue("[ℹ] Starting Image Processor...")); 16 | if (!fs.existsSync(filePath)) { 17 | console.error(chalk.red("[✘] File does not exist.")); 18 | process.exit(1); 19 | } 20 | const extension = path.extname(filePath).toLowerCase(); 21 | const fileName = path.basename(filePath, extension); 22 | if (!extension) { 23 | console.error(chalk.red("[✘] File has no extension.")); 24 | process.exit(1); 25 | } 26 | const fileDir = path.dirname(filePath); 27 | const outputDir = options.dump ? fileDir : path.join(fileDir, fileName); 28 | let dirCreated = false; 29 | if (!options.dump) { 30 | try { 31 | fs.mkdirSync(outputDir, { mode: 0o755 }); 32 | dirCreated = true; 33 | } 34 | catch (err) { 35 | console.error(chalk.red("[✘] Failed to create directory:"), outputDir); 36 | process.exit(1); 37 | } 38 | } 39 | const originalFileName = path.join(outputDir, fileName); 40 | const cleanExtension = extension.replace(".", ""); 41 | console.log(chalk.yellow(`[→] Starting Image Conversions...`)); 42 | try { 43 | switch (cleanExtension) { 44 | case "png": 45 | await convertPNGToWebP(filePath, `${originalFileName}.webp`); 46 | if (!options.dump) 47 | fs.copyFileSync(filePath, `${originalFileName}.png`); 48 | break; 49 | case "webp": 50 | await convertWebPToPNG(filePath, `${originalFileName}.png`); 51 | if (!options.dump) 52 | fs.copyFileSync(filePath, `${originalFileName}.webp`); 53 | break; 54 | default: 55 | console.error(chalk.red("[✘] Invalid file extension. Only PNG and WebP are supported.")); 56 | if (dirCreated) 57 | fs.rmSync(outputDir, { recursive: true, force: true }); 58 | process.exit(1); 59 | } 60 | console.log(chalk.yellow("[→] Starting Resize Operation...")); 61 | const baseResizeImage = options.dump 62 | ? filePath 63 | : `${originalFileName}.webp`; 64 | const sizes = { sm: 480, md: 768, lg: 1024, xl: 1280 }; 65 | await resizeWebP(fileName, baseResizeImage, sizes, outputDir); 66 | console.log(chalk.green("[✔] Finished Image Processing.")); 67 | console.log(chalk.magenta(`[✔✔] Files saved to: ${outputDir}`)); 68 | } 69 | catch (err) { 70 | console.error(chalk.red("[✘] Processing error:"), err); 71 | if (dirCreated) 72 | fs.rmSync(outputDir, { recursive: true, force: true }); 73 | process.exit(1); 74 | } 75 | }); 76 | program.parse(process.argv); 77 | -------------------------------------------------------------------------------- /bin/resize.js: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import path from "path"; 3 | import sharp from "sharp"; 4 | /** 5 | * Resizes a WebP image to multiple sizes 6 | * @param {string} fileName - Base name for the output files 7 | * @param {string} inputPath - Path to the WebP image 8 | * @param {Record} sizes - Object mapping size names to width in pixels 9 | * @param {string} outputDir - Directory where resized images will be saved 10 | * @returns {Promise} - A promise that resolves when all resizing operations are complete 11 | */ 12 | export async function resizeWebP(fileName, inputPath, sizes, outputDir) { 13 | console.log(chalk.yellow(`[→] Starting resizing for: ${inputPath}`)); 14 | const inputImage = sharp(inputPath); 15 | for (const [sizeName, width] of Object.entries(sizes)) { 16 | try { 17 | const outputPath = path.join(outputDir, `${fileName}_${sizeName}.webp`); 18 | console.log(chalk.blue(`[ℹ] Resizing to ${sizeName} (${width}px): ${outputPath}`)); 19 | await inputImage 20 | .clone() 21 | .resize({ width, kernel: "lanczos3" }) 22 | .webp({ quality: 95 }) 23 | .toFile(outputPath); 24 | console.log(chalk.green(`[✔] Successfully resized to ${sizeName}`)); 25 | } 26 | catch (error) { 27 | console.error(chalk.red(`[✘] Failed resizing to ${sizeName}:`), error); 28 | } 29 | } 30 | console.log(chalk.green("[✔] All resize operations completed.")); 31 | } 32 | -------------------------------------------------------------------------------- /examples/angular.ts: -------------------------------------------------------------------------------- 1 | // This is an Angular implementation example of process-web-image 2 | // 3 | // 4 | // You should delete the @ts-nocheck comment before using this code 5 | //@ts-nocheck 6 | // srcLocation -> path/to/image 7 | // Don't pass in the extension; it should only end with the file name 8 | 9 | import { Component, Input } from "@angular/core"; 10 | 11 | @Component({ 12 | selector: "app-responsive-image", 13 | template: ` 14 | 15 | 16 | 21 | 22 | 23 | 28 | 29 | 30 | 35 | 36 | 37 | 42 | 43 | 44 | 45 | 46 | 47 | 54 | 55 | `, 56 | }) 57 | export class ResponsiveImageComponent { 58 | @Input() srcLocation!: string; 59 | @Input() alt!: string; 60 | @Input() width!: number; 61 | @Input() height!: number; 62 | } 63 | -------------------------------------------------------------------------------- /examples/html.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 19 | 20 | 21 | 26 | 27 | 28 | 33 | 34 | 35 | 36 | 37 | 38 | Alt text for image 45 | 46 | -------------------------------------------------------------------------------- /examples/react.tsx: -------------------------------------------------------------------------------- 1 | // This is a React implementation example of process-web-image 2 | // 3 | // 4 | // You should delete the @ts-nocheck comment before using this code 5 | //@ts-nocheck 6 | //srcLocation -> path/to/image 7 | //Dont pass in the extension.. it should only end with the file name 8 | type Props = { 9 | srcLocation: string; 10 | alt: string; 11 | width: number; 12 | height: number; 13 | }; 14 | export default function Image({ srcLocation, alt, width, height }: Props) { 15 | return ( 16 | 17 | {/* Source for extra large screens (xl) */} 18 | 23 | 24 | {/* Source for large screens (lg) */} 25 | 30 | 31 | {/* Source for medium screens (md) */} 32 | 37 | 38 | {/* Source for small screens (sm) */} 39 | 44 | 45 | {/* Base WebP for smaller screens or default when specific sizes aren't needed */} 46 | 47 | 48 | {/* Fallback image for all other cases */} 49 | {alt} 56 | 57 | ); 58 | } 59 | -------------------------------------------------------------------------------- /examples/svelte.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {alt} 43 | 44 | -------------------------------------------------------------------------------- /examples/vue.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 32 | 33 | 56 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest').JestConfigWithTsJest} **/ 2 | export default { 3 | testEnvironment: "node", 4 | transform: { 5 | "^.+\.tsx?$": ["ts-jest", {}], 6 | }, 7 | silent: true, 8 | 9 | testPathIgnorePatterns: ["/node_modules/", "/__tests__/helpers/*"], 10 | }; 11 | 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "process-web-image", 3 | "version": "0.3.0", 4 | "description": "An image processor that creates a webp file, a fallback png, and resizes it in tailwind breakpoints", 5 | "homepage": "https://github.com/Arinji2/process-web-image#readme", 6 | "bugs": { 7 | "url": "https://github.com/Arinji2/process-web-image/issues" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/Arinji2/process-web-image.git" 12 | }, 13 | "license": "ISC", 14 | "author": "Arinji2", 15 | "type": "module", 16 | "main": "bin/process-web-image.js", 17 | "bin": { 18 | "process-web-image": "./bin/process-web-image.js" 19 | }, 20 | "scripts": { 21 | "build": "rm -rf bin && mkdir -p bin && tsc --outDir bin && mv bin/index.js bin/process-web-image.js", 22 | "start": "node bin/process-web-image.js", 23 | "dev": "tsx src/index.ts", 24 | "test": "jest" 25 | }, 26 | "devDependencies": { 27 | "@types/fs-extra": "^11.0.4", 28 | "@types/jest": "^29.5.14", 29 | "@types/node": "^22.13.11", 30 | "jest": "^29.7.0", 31 | "ts-jest": "^29.2.6", 32 | "ts-node": "^10.9.2", 33 | "tsx": "^4.19.3", 34 | "typescript": "^5.8.2" 35 | }, 36 | "dependencies": { 37 | "chalk": "v4", 38 | "commander": "^13.1.0", 39 | "fs-extra": "^11.3.0", 40 | "sharp": "^0.33.5" 41 | }, 42 | "pnpm": { 43 | "onlyBuiltDependencies": [ 44 | "esbuild", 45 | "sharp" 46 | ] 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | chalk: 12 | specifier: v4 13 | version: 4.1.2 14 | commander: 15 | specifier: ^13.1.0 16 | version: 13.1.0 17 | fs-extra: 18 | specifier: ^11.3.0 19 | version: 11.3.0 20 | sharp: 21 | specifier: ^0.33.5 22 | version: 0.33.5 23 | devDependencies: 24 | '@types/fs-extra': 25 | specifier: ^11.0.4 26 | version: 11.0.4 27 | '@types/jest': 28 | specifier: ^29.5.14 29 | version: 29.5.14 30 | '@types/node': 31 | specifier: ^22.13.11 32 | version: 22.13.11 33 | jest: 34 | specifier: ^29.7.0 35 | version: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 36 | ts-jest: 37 | specifier: ^29.2.6 38 | version: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)))(typescript@5.8.2) 39 | ts-node: 40 | specifier: ^10.9.2 41 | version: 10.9.2(@types/node@22.13.11)(typescript@5.8.2) 42 | tsx: 43 | specifier: ^4.19.3 44 | version: 4.19.3 45 | typescript: 46 | specifier: ^5.8.2 47 | version: 5.8.2 48 | 49 | packages: 50 | 51 | '@ampproject/remapping@2.3.0': 52 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 53 | engines: {node: '>=6.0.0'} 54 | 55 | '@babel/code-frame@7.26.2': 56 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 57 | engines: {node: '>=6.9.0'} 58 | 59 | '@babel/compat-data@7.26.8': 60 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 61 | engines: {node: '>=6.9.0'} 62 | 63 | '@babel/core@7.26.10': 64 | resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@babel/generator@7.26.10': 68 | resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} 69 | engines: {node: '>=6.9.0'} 70 | 71 | '@babel/helper-compilation-targets@7.26.5': 72 | resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} 73 | engines: {node: '>=6.9.0'} 74 | 75 | '@babel/helper-module-imports@7.25.9': 76 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 77 | engines: {node: '>=6.9.0'} 78 | 79 | '@babel/helper-module-transforms@7.26.0': 80 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 81 | engines: {node: '>=6.9.0'} 82 | peerDependencies: 83 | '@babel/core': ^7.0.0 84 | 85 | '@babel/helper-plugin-utils@7.26.5': 86 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 87 | engines: {node: '>=6.9.0'} 88 | 89 | '@babel/helper-string-parser@7.25.9': 90 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 91 | engines: {node: '>=6.9.0'} 92 | 93 | '@babel/helper-validator-identifier@7.25.9': 94 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 95 | engines: {node: '>=6.9.0'} 96 | 97 | '@babel/helper-validator-option@7.25.9': 98 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 99 | engines: {node: '>=6.9.0'} 100 | 101 | '@babel/helpers@7.26.10': 102 | resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} 103 | engines: {node: '>=6.9.0'} 104 | 105 | '@babel/parser@7.26.10': 106 | resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} 107 | engines: {node: '>=6.0.0'} 108 | hasBin: true 109 | 110 | '@babel/plugin-syntax-async-generators@7.8.4': 111 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 112 | peerDependencies: 113 | '@babel/core': ^7.0.0-0 114 | 115 | '@babel/plugin-syntax-bigint@7.8.3': 116 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 117 | peerDependencies: 118 | '@babel/core': ^7.0.0-0 119 | 120 | '@babel/plugin-syntax-class-properties@7.12.13': 121 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 122 | peerDependencies: 123 | '@babel/core': ^7.0.0-0 124 | 125 | '@babel/plugin-syntax-class-static-block@7.14.5': 126 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 127 | engines: {node: '>=6.9.0'} 128 | peerDependencies: 129 | '@babel/core': ^7.0.0-0 130 | 131 | '@babel/plugin-syntax-import-attributes@7.26.0': 132 | resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 133 | engines: {node: '>=6.9.0'} 134 | peerDependencies: 135 | '@babel/core': ^7.0.0-0 136 | 137 | '@babel/plugin-syntax-import-meta@7.10.4': 138 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 139 | peerDependencies: 140 | '@babel/core': ^7.0.0-0 141 | 142 | '@babel/plugin-syntax-json-strings@7.8.3': 143 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 144 | peerDependencies: 145 | '@babel/core': ^7.0.0-0 146 | 147 | '@babel/plugin-syntax-jsx@7.25.9': 148 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 149 | engines: {node: '>=6.9.0'} 150 | peerDependencies: 151 | '@babel/core': ^7.0.0-0 152 | 153 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4': 154 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 155 | peerDependencies: 156 | '@babel/core': ^7.0.0-0 157 | 158 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': 159 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0-0 162 | 163 | '@babel/plugin-syntax-numeric-separator@7.10.4': 164 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 165 | peerDependencies: 166 | '@babel/core': ^7.0.0-0 167 | 168 | '@babel/plugin-syntax-object-rest-spread@7.8.3': 169 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 170 | peerDependencies: 171 | '@babel/core': ^7.0.0-0 172 | 173 | '@babel/plugin-syntax-optional-catch-binding@7.8.3': 174 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 175 | peerDependencies: 176 | '@babel/core': ^7.0.0-0 177 | 178 | '@babel/plugin-syntax-optional-chaining@7.8.3': 179 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 180 | peerDependencies: 181 | '@babel/core': ^7.0.0-0 182 | 183 | '@babel/plugin-syntax-private-property-in-object@7.14.5': 184 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 185 | engines: {node: '>=6.9.0'} 186 | peerDependencies: 187 | '@babel/core': ^7.0.0-0 188 | 189 | '@babel/plugin-syntax-top-level-await@7.14.5': 190 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 191 | engines: {node: '>=6.9.0'} 192 | peerDependencies: 193 | '@babel/core': ^7.0.0-0 194 | 195 | '@babel/plugin-syntax-typescript@7.25.9': 196 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 197 | engines: {node: '>=6.9.0'} 198 | peerDependencies: 199 | '@babel/core': ^7.0.0-0 200 | 201 | '@babel/template@7.26.9': 202 | resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} 203 | engines: {node: '>=6.9.0'} 204 | 205 | '@babel/traverse@7.26.10': 206 | resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} 207 | engines: {node: '>=6.9.0'} 208 | 209 | '@babel/types@7.26.10': 210 | resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} 211 | engines: {node: '>=6.9.0'} 212 | 213 | '@bcoe/v8-coverage@0.2.3': 214 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 215 | 216 | '@cspotcode/source-map-support@0.8.1': 217 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 218 | engines: {node: '>=12'} 219 | 220 | '@emnapi/runtime@1.3.1': 221 | resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} 222 | 223 | '@esbuild/aix-ppc64@0.25.1': 224 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 225 | engines: {node: '>=18'} 226 | cpu: [ppc64] 227 | os: [aix] 228 | 229 | '@esbuild/android-arm64@0.25.1': 230 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 231 | engines: {node: '>=18'} 232 | cpu: [arm64] 233 | os: [android] 234 | 235 | '@esbuild/android-arm@0.25.1': 236 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 237 | engines: {node: '>=18'} 238 | cpu: [arm] 239 | os: [android] 240 | 241 | '@esbuild/android-x64@0.25.1': 242 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 243 | engines: {node: '>=18'} 244 | cpu: [x64] 245 | os: [android] 246 | 247 | '@esbuild/darwin-arm64@0.25.1': 248 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 249 | engines: {node: '>=18'} 250 | cpu: [arm64] 251 | os: [darwin] 252 | 253 | '@esbuild/darwin-x64@0.25.1': 254 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 255 | engines: {node: '>=18'} 256 | cpu: [x64] 257 | os: [darwin] 258 | 259 | '@esbuild/freebsd-arm64@0.25.1': 260 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 261 | engines: {node: '>=18'} 262 | cpu: [arm64] 263 | os: [freebsd] 264 | 265 | '@esbuild/freebsd-x64@0.25.1': 266 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 267 | engines: {node: '>=18'} 268 | cpu: [x64] 269 | os: [freebsd] 270 | 271 | '@esbuild/linux-arm64@0.25.1': 272 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 273 | engines: {node: '>=18'} 274 | cpu: [arm64] 275 | os: [linux] 276 | 277 | '@esbuild/linux-arm@0.25.1': 278 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 279 | engines: {node: '>=18'} 280 | cpu: [arm] 281 | os: [linux] 282 | 283 | '@esbuild/linux-ia32@0.25.1': 284 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 285 | engines: {node: '>=18'} 286 | cpu: [ia32] 287 | os: [linux] 288 | 289 | '@esbuild/linux-loong64@0.25.1': 290 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 291 | engines: {node: '>=18'} 292 | cpu: [loong64] 293 | os: [linux] 294 | 295 | '@esbuild/linux-mips64el@0.25.1': 296 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 297 | engines: {node: '>=18'} 298 | cpu: [mips64el] 299 | os: [linux] 300 | 301 | '@esbuild/linux-ppc64@0.25.1': 302 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 303 | engines: {node: '>=18'} 304 | cpu: [ppc64] 305 | os: [linux] 306 | 307 | '@esbuild/linux-riscv64@0.25.1': 308 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 309 | engines: {node: '>=18'} 310 | cpu: [riscv64] 311 | os: [linux] 312 | 313 | '@esbuild/linux-s390x@0.25.1': 314 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 315 | engines: {node: '>=18'} 316 | cpu: [s390x] 317 | os: [linux] 318 | 319 | '@esbuild/linux-x64@0.25.1': 320 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 321 | engines: {node: '>=18'} 322 | cpu: [x64] 323 | os: [linux] 324 | 325 | '@esbuild/netbsd-arm64@0.25.1': 326 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 327 | engines: {node: '>=18'} 328 | cpu: [arm64] 329 | os: [netbsd] 330 | 331 | '@esbuild/netbsd-x64@0.25.1': 332 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 333 | engines: {node: '>=18'} 334 | cpu: [x64] 335 | os: [netbsd] 336 | 337 | '@esbuild/openbsd-arm64@0.25.1': 338 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 339 | engines: {node: '>=18'} 340 | cpu: [arm64] 341 | os: [openbsd] 342 | 343 | '@esbuild/openbsd-x64@0.25.1': 344 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 345 | engines: {node: '>=18'} 346 | cpu: [x64] 347 | os: [openbsd] 348 | 349 | '@esbuild/sunos-x64@0.25.1': 350 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 351 | engines: {node: '>=18'} 352 | cpu: [x64] 353 | os: [sunos] 354 | 355 | '@esbuild/win32-arm64@0.25.1': 356 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 357 | engines: {node: '>=18'} 358 | cpu: [arm64] 359 | os: [win32] 360 | 361 | '@esbuild/win32-ia32@0.25.1': 362 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 363 | engines: {node: '>=18'} 364 | cpu: [ia32] 365 | os: [win32] 366 | 367 | '@esbuild/win32-x64@0.25.1': 368 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 369 | engines: {node: '>=18'} 370 | cpu: [x64] 371 | os: [win32] 372 | 373 | '@img/sharp-darwin-arm64@0.33.5': 374 | resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} 375 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 376 | cpu: [arm64] 377 | os: [darwin] 378 | 379 | '@img/sharp-darwin-x64@0.33.5': 380 | resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} 381 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 382 | cpu: [x64] 383 | os: [darwin] 384 | 385 | '@img/sharp-libvips-darwin-arm64@1.0.4': 386 | resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} 387 | cpu: [arm64] 388 | os: [darwin] 389 | 390 | '@img/sharp-libvips-darwin-x64@1.0.4': 391 | resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} 392 | cpu: [x64] 393 | os: [darwin] 394 | 395 | '@img/sharp-libvips-linux-arm64@1.0.4': 396 | resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} 397 | cpu: [arm64] 398 | os: [linux] 399 | 400 | '@img/sharp-libvips-linux-arm@1.0.5': 401 | resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} 402 | cpu: [arm] 403 | os: [linux] 404 | 405 | '@img/sharp-libvips-linux-s390x@1.0.4': 406 | resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} 407 | cpu: [s390x] 408 | os: [linux] 409 | 410 | '@img/sharp-libvips-linux-x64@1.0.4': 411 | resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} 412 | cpu: [x64] 413 | os: [linux] 414 | 415 | '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 416 | resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} 417 | cpu: [arm64] 418 | os: [linux] 419 | 420 | '@img/sharp-libvips-linuxmusl-x64@1.0.4': 421 | resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} 422 | cpu: [x64] 423 | os: [linux] 424 | 425 | '@img/sharp-linux-arm64@0.33.5': 426 | resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} 427 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 428 | cpu: [arm64] 429 | os: [linux] 430 | 431 | '@img/sharp-linux-arm@0.33.5': 432 | resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} 433 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 434 | cpu: [arm] 435 | os: [linux] 436 | 437 | '@img/sharp-linux-s390x@0.33.5': 438 | resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} 439 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 440 | cpu: [s390x] 441 | os: [linux] 442 | 443 | '@img/sharp-linux-x64@0.33.5': 444 | resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} 445 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 446 | cpu: [x64] 447 | os: [linux] 448 | 449 | '@img/sharp-linuxmusl-arm64@0.33.5': 450 | resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} 451 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 452 | cpu: [arm64] 453 | os: [linux] 454 | 455 | '@img/sharp-linuxmusl-x64@0.33.5': 456 | resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} 457 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 458 | cpu: [x64] 459 | os: [linux] 460 | 461 | '@img/sharp-wasm32@0.33.5': 462 | resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} 463 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 464 | cpu: [wasm32] 465 | 466 | '@img/sharp-win32-ia32@0.33.5': 467 | resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} 468 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 469 | cpu: [ia32] 470 | os: [win32] 471 | 472 | '@img/sharp-win32-x64@0.33.5': 473 | resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} 474 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 475 | cpu: [x64] 476 | os: [win32] 477 | 478 | '@istanbuljs/load-nyc-config@1.1.0': 479 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 480 | engines: {node: '>=8'} 481 | 482 | '@istanbuljs/schema@0.1.3': 483 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 484 | engines: {node: '>=8'} 485 | 486 | '@jest/console@29.7.0': 487 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 488 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 489 | 490 | '@jest/core@29.7.0': 491 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 492 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 493 | peerDependencies: 494 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 495 | peerDependenciesMeta: 496 | node-notifier: 497 | optional: true 498 | 499 | '@jest/environment@29.7.0': 500 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 501 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 502 | 503 | '@jest/expect-utils@29.7.0': 504 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 505 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 506 | 507 | '@jest/expect@29.7.0': 508 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 509 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 510 | 511 | '@jest/fake-timers@29.7.0': 512 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 513 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 514 | 515 | '@jest/globals@29.7.0': 516 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 517 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 518 | 519 | '@jest/reporters@29.7.0': 520 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 521 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 522 | peerDependencies: 523 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 524 | peerDependenciesMeta: 525 | node-notifier: 526 | optional: true 527 | 528 | '@jest/schemas@29.6.3': 529 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 530 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 531 | 532 | '@jest/source-map@29.6.3': 533 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 534 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 535 | 536 | '@jest/test-result@29.7.0': 537 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 538 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 539 | 540 | '@jest/test-sequencer@29.7.0': 541 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 542 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 543 | 544 | '@jest/transform@29.7.0': 545 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 546 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 547 | 548 | '@jest/types@29.6.3': 549 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 550 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 551 | 552 | '@jridgewell/gen-mapping@0.3.8': 553 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 554 | engines: {node: '>=6.0.0'} 555 | 556 | '@jridgewell/resolve-uri@3.1.2': 557 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 558 | engines: {node: '>=6.0.0'} 559 | 560 | '@jridgewell/set-array@1.2.1': 561 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 562 | engines: {node: '>=6.0.0'} 563 | 564 | '@jridgewell/sourcemap-codec@1.5.0': 565 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 566 | 567 | '@jridgewell/trace-mapping@0.3.25': 568 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 569 | 570 | '@jridgewell/trace-mapping@0.3.9': 571 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 572 | 573 | '@sinclair/typebox@0.27.8': 574 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 575 | 576 | '@sinonjs/commons@3.0.1': 577 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 578 | 579 | '@sinonjs/fake-timers@10.3.0': 580 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 581 | 582 | '@tsconfig/node10@1.0.11': 583 | resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 584 | 585 | '@tsconfig/node12@1.0.11': 586 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 587 | 588 | '@tsconfig/node14@1.0.3': 589 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 590 | 591 | '@tsconfig/node16@1.0.4': 592 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 593 | 594 | '@types/babel__core@7.20.5': 595 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 596 | 597 | '@types/babel__generator@7.6.8': 598 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 599 | 600 | '@types/babel__template@7.4.4': 601 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 602 | 603 | '@types/babel__traverse@7.20.6': 604 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 605 | 606 | '@types/fs-extra@11.0.4': 607 | resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} 608 | 609 | '@types/graceful-fs@4.1.9': 610 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 611 | 612 | '@types/istanbul-lib-coverage@2.0.6': 613 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 614 | 615 | '@types/istanbul-lib-report@3.0.3': 616 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 617 | 618 | '@types/istanbul-reports@3.0.4': 619 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 620 | 621 | '@types/jest@29.5.14': 622 | resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} 623 | 624 | '@types/jsonfile@6.1.4': 625 | resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} 626 | 627 | '@types/node@22.13.11': 628 | resolution: {integrity: sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==} 629 | 630 | '@types/stack-utils@2.0.3': 631 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 632 | 633 | '@types/yargs-parser@21.0.3': 634 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 635 | 636 | '@types/yargs@17.0.33': 637 | resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} 638 | 639 | acorn-walk@8.3.4: 640 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 641 | engines: {node: '>=0.4.0'} 642 | 643 | acorn@8.14.1: 644 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 645 | engines: {node: '>=0.4.0'} 646 | hasBin: true 647 | 648 | ansi-escapes@4.3.2: 649 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 650 | engines: {node: '>=8'} 651 | 652 | ansi-regex@5.0.1: 653 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 654 | engines: {node: '>=8'} 655 | 656 | ansi-styles@4.3.0: 657 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 658 | engines: {node: '>=8'} 659 | 660 | ansi-styles@5.2.0: 661 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 662 | engines: {node: '>=10'} 663 | 664 | anymatch@3.1.3: 665 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 666 | engines: {node: '>= 8'} 667 | 668 | arg@4.1.3: 669 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 670 | 671 | argparse@1.0.10: 672 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 673 | 674 | async@3.2.6: 675 | resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} 676 | 677 | babel-jest@29.7.0: 678 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 679 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 680 | peerDependencies: 681 | '@babel/core': ^7.8.0 682 | 683 | babel-plugin-istanbul@6.1.1: 684 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 685 | engines: {node: '>=8'} 686 | 687 | babel-plugin-jest-hoist@29.6.3: 688 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 689 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 690 | 691 | babel-preset-current-node-syntax@1.1.0: 692 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 693 | peerDependencies: 694 | '@babel/core': ^7.0.0 695 | 696 | babel-preset-jest@29.6.3: 697 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 698 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 699 | peerDependencies: 700 | '@babel/core': ^7.0.0 701 | 702 | balanced-match@1.0.2: 703 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 704 | 705 | brace-expansion@1.1.11: 706 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 707 | 708 | brace-expansion@2.0.1: 709 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 710 | 711 | braces@3.0.3: 712 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 713 | engines: {node: '>=8'} 714 | 715 | browserslist@4.24.4: 716 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 717 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 718 | hasBin: true 719 | 720 | bs-logger@0.2.6: 721 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 722 | engines: {node: '>= 6'} 723 | 724 | bser@2.1.1: 725 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 726 | 727 | buffer-from@1.1.2: 728 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 729 | 730 | callsites@3.1.0: 731 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 732 | engines: {node: '>=6'} 733 | 734 | camelcase@5.3.1: 735 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 736 | engines: {node: '>=6'} 737 | 738 | camelcase@6.3.0: 739 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 740 | engines: {node: '>=10'} 741 | 742 | caniuse-lite@1.0.30001706: 743 | resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==} 744 | 745 | chalk@4.1.2: 746 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 747 | engines: {node: '>=10'} 748 | 749 | char-regex@1.0.2: 750 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 751 | engines: {node: '>=10'} 752 | 753 | ci-info@3.9.0: 754 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 755 | engines: {node: '>=8'} 756 | 757 | cjs-module-lexer@1.4.3: 758 | resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} 759 | 760 | cliui@8.0.1: 761 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 762 | engines: {node: '>=12'} 763 | 764 | co@4.6.0: 765 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 766 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 767 | 768 | collect-v8-coverage@1.0.2: 769 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 770 | 771 | color-convert@2.0.1: 772 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 773 | engines: {node: '>=7.0.0'} 774 | 775 | color-name@1.1.4: 776 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 777 | 778 | color-string@1.9.1: 779 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 780 | 781 | color@4.2.3: 782 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} 783 | engines: {node: '>=12.5.0'} 784 | 785 | commander@13.1.0: 786 | resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} 787 | engines: {node: '>=18'} 788 | 789 | concat-map@0.0.1: 790 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 791 | 792 | convert-source-map@2.0.0: 793 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 794 | 795 | create-jest@29.7.0: 796 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 797 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 798 | hasBin: true 799 | 800 | create-require@1.1.1: 801 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 802 | 803 | cross-spawn@7.0.6: 804 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 805 | engines: {node: '>= 8'} 806 | 807 | debug@4.4.0: 808 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 809 | engines: {node: '>=6.0'} 810 | peerDependencies: 811 | supports-color: '*' 812 | peerDependenciesMeta: 813 | supports-color: 814 | optional: true 815 | 816 | dedent@1.5.3: 817 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 818 | peerDependencies: 819 | babel-plugin-macros: ^3.1.0 820 | peerDependenciesMeta: 821 | babel-plugin-macros: 822 | optional: true 823 | 824 | deepmerge@4.3.1: 825 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 826 | engines: {node: '>=0.10.0'} 827 | 828 | detect-libc@2.0.3: 829 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 830 | engines: {node: '>=8'} 831 | 832 | detect-newline@3.1.0: 833 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 834 | engines: {node: '>=8'} 835 | 836 | diff-sequences@29.6.3: 837 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 838 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 839 | 840 | diff@4.0.2: 841 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 842 | engines: {node: '>=0.3.1'} 843 | 844 | ejs@3.1.10: 845 | resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} 846 | engines: {node: '>=0.10.0'} 847 | hasBin: true 848 | 849 | electron-to-chromium@1.5.123: 850 | resolution: {integrity: sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==} 851 | 852 | emittery@0.13.1: 853 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 854 | engines: {node: '>=12'} 855 | 856 | emoji-regex@8.0.0: 857 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 858 | 859 | error-ex@1.3.2: 860 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 861 | 862 | esbuild@0.25.1: 863 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 864 | engines: {node: '>=18'} 865 | hasBin: true 866 | 867 | escalade@3.2.0: 868 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 869 | engines: {node: '>=6'} 870 | 871 | escape-string-regexp@2.0.0: 872 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 873 | engines: {node: '>=8'} 874 | 875 | esprima@4.0.1: 876 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 877 | engines: {node: '>=4'} 878 | hasBin: true 879 | 880 | execa@5.1.1: 881 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 882 | engines: {node: '>=10'} 883 | 884 | exit@0.1.2: 885 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 886 | engines: {node: '>= 0.8.0'} 887 | 888 | expect@29.7.0: 889 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 890 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 891 | 892 | fast-json-stable-stringify@2.1.0: 893 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 894 | 895 | fb-watchman@2.0.2: 896 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 897 | 898 | filelist@1.0.4: 899 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 900 | 901 | fill-range@7.1.1: 902 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 903 | engines: {node: '>=8'} 904 | 905 | find-up@4.1.0: 906 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 907 | engines: {node: '>=8'} 908 | 909 | fs-extra@11.3.0: 910 | resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} 911 | engines: {node: '>=14.14'} 912 | 913 | fs.realpath@1.0.0: 914 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 915 | 916 | fsevents@2.3.3: 917 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 918 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 919 | os: [darwin] 920 | 921 | function-bind@1.1.2: 922 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 923 | 924 | gensync@1.0.0-beta.2: 925 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 926 | engines: {node: '>=6.9.0'} 927 | 928 | get-caller-file@2.0.5: 929 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 930 | engines: {node: 6.* || 8.* || >= 10.*} 931 | 932 | get-package-type@0.1.0: 933 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 934 | engines: {node: '>=8.0.0'} 935 | 936 | get-stream@6.0.1: 937 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 938 | engines: {node: '>=10'} 939 | 940 | get-tsconfig@4.10.0: 941 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 942 | 943 | glob@7.2.3: 944 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 945 | deprecated: Glob versions prior to v9 are no longer supported 946 | 947 | globals@11.12.0: 948 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 949 | engines: {node: '>=4'} 950 | 951 | graceful-fs@4.2.11: 952 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 953 | 954 | has-flag@4.0.0: 955 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 956 | engines: {node: '>=8'} 957 | 958 | hasown@2.0.2: 959 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 960 | engines: {node: '>= 0.4'} 961 | 962 | html-escaper@2.0.2: 963 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 964 | 965 | human-signals@2.1.0: 966 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 967 | engines: {node: '>=10.17.0'} 968 | 969 | import-local@3.2.0: 970 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 971 | engines: {node: '>=8'} 972 | hasBin: true 973 | 974 | imurmurhash@0.1.4: 975 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 976 | engines: {node: '>=0.8.19'} 977 | 978 | inflight@1.0.6: 979 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 980 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 981 | 982 | inherits@2.0.4: 983 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 984 | 985 | is-arrayish@0.2.1: 986 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 987 | 988 | is-arrayish@0.3.2: 989 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 990 | 991 | is-core-module@2.16.1: 992 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 993 | engines: {node: '>= 0.4'} 994 | 995 | is-fullwidth-code-point@3.0.0: 996 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 997 | engines: {node: '>=8'} 998 | 999 | is-generator-fn@2.1.0: 1000 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1001 | engines: {node: '>=6'} 1002 | 1003 | is-number@7.0.0: 1004 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1005 | engines: {node: '>=0.12.0'} 1006 | 1007 | is-stream@2.0.1: 1008 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1009 | engines: {node: '>=8'} 1010 | 1011 | isexe@2.0.0: 1012 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1013 | 1014 | istanbul-lib-coverage@3.2.2: 1015 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1016 | engines: {node: '>=8'} 1017 | 1018 | istanbul-lib-instrument@5.2.1: 1019 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1020 | engines: {node: '>=8'} 1021 | 1022 | istanbul-lib-instrument@6.0.3: 1023 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 1024 | engines: {node: '>=10'} 1025 | 1026 | istanbul-lib-report@3.0.1: 1027 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1028 | engines: {node: '>=10'} 1029 | 1030 | istanbul-lib-source-maps@4.0.1: 1031 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1032 | engines: {node: '>=10'} 1033 | 1034 | istanbul-reports@3.1.7: 1035 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1036 | engines: {node: '>=8'} 1037 | 1038 | jake@10.9.2: 1039 | resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} 1040 | engines: {node: '>=10'} 1041 | hasBin: true 1042 | 1043 | jest-changed-files@29.7.0: 1044 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 1045 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1046 | 1047 | jest-circus@29.7.0: 1048 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 1049 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1050 | 1051 | jest-cli@29.7.0: 1052 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 1053 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1054 | hasBin: true 1055 | peerDependencies: 1056 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1057 | peerDependenciesMeta: 1058 | node-notifier: 1059 | optional: true 1060 | 1061 | jest-config@29.7.0: 1062 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 1063 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1064 | peerDependencies: 1065 | '@types/node': '*' 1066 | ts-node: '>=9.0.0' 1067 | peerDependenciesMeta: 1068 | '@types/node': 1069 | optional: true 1070 | ts-node: 1071 | optional: true 1072 | 1073 | jest-diff@29.7.0: 1074 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 1075 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1076 | 1077 | jest-docblock@29.7.0: 1078 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 1079 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1080 | 1081 | jest-each@29.7.0: 1082 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 1083 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1084 | 1085 | jest-environment-node@29.7.0: 1086 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 1087 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1088 | 1089 | jest-get-type@29.6.3: 1090 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 1091 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1092 | 1093 | jest-haste-map@29.7.0: 1094 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 1095 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1096 | 1097 | jest-leak-detector@29.7.0: 1098 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 1099 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1100 | 1101 | jest-matcher-utils@29.7.0: 1102 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 1103 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1104 | 1105 | jest-message-util@29.7.0: 1106 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 1107 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1108 | 1109 | jest-mock@29.7.0: 1110 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 1111 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1112 | 1113 | jest-pnp-resolver@1.2.3: 1114 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 1115 | engines: {node: '>=6'} 1116 | peerDependencies: 1117 | jest-resolve: '*' 1118 | peerDependenciesMeta: 1119 | jest-resolve: 1120 | optional: true 1121 | 1122 | jest-regex-util@29.6.3: 1123 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 1124 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1125 | 1126 | jest-resolve-dependencies@29.7.0: 1127 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 1128 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1129 | 1130 | jest-resolve@29.7.0: 1131 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 1132 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1133 | 1134 | jest-runner@29.7.0: 1135 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 1136 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1137 | 1138 | jest-runtime@29.7.0: 1139 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 1140 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1141 | 1142 | jest-snapshot@29.7.0: 1143 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 1144 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1145 | 1146 | jest-util@29.7.0: 1147 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 1148 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1149 | 1150 | jest-validate@29.7.0: 1151 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 1152 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1153 | 1154 | jest-watcher@29.7.0: 1155 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 1156 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1157 | 1158 | jest-worker@29.7.0: 1159 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 1160 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1161 | 1162 | jest@29.7.0: 1163 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 1164 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1165 | hasBin: true 1166 | peerDependencies: 1167 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1168 | peerDependenciesMeta: 1169 | node-notifier: 1170 | optional: true 1171 | 1172 | js-tokens@4.0.0: 1173 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1174 | 1175 | js-yaml@3.14.1: 1176 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1177 | hasBin: true 1178 | 1179 | jsesc@3.1.0: 1180 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1181 | engines: {node: '>=6'} 1182 | hasBin: true 1183 | 1184 | json-parse-even-better-errors@2.3.1: 1185 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1186 | 1187 | json5@2.2.3: 1188 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1189 | engines: {node: '>=6'} 1190 | hasBin: true 1191 | 1192 | jsonfile@6.1.0: 1193 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1194 | 1195 | kleur@3.0.3: 1196 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1197 | engines: {node: '>=6'} 1198 | 1199 | leven@3.1.0: 1200 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1201 | engines: {node: '>=6'} 1202 | 1203 | lines-and-columns@1.2.4: 1204 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1205 | 1206 | locate-path@5.0.0: 1207 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1208 | engines: {node: '>=8'} 1209 | 1210 | lodash.memoize@4.1.2: 1211 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 1212 | 1213 | lru-cache@5.1.1: 1214 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1215 | 1216 | make-dir@4.0.0: 1217 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1218 | engines: {node: '>=10'} 1219 | 1220 | make-error@1.3.6: 1221 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1222 | 1223 | makeerror@1.0.12: 1224 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 1225 | 1226 | merge-stream@2.0.0: 1227 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1228 | 1229 | micromatch@4.0.8: 1230 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1231 | engines: {node: '>=8.6'} 1232 | 1233 | mimic-fn@2.1.0: 1234 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1235 | engines: {node: '>=6'} 1236 | 1237 | minimatch@3.1.2: 1238 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1239 | 1240 | minimatch@5.1.6: 1241 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1242 | engines: {node: '>=10'} 1243 | 1244 | ms@2.1.3: 1245 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1246 | 1247 | natural-compare@1.4.0: 1248 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1249 | 1250 | node-int64@0.4.0: 1251 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 1252 | 1253 | node-releases@2.0.19: 1254 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1255 | 1256 | normalize-path@3.0.0: 1257 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1258 | engines: {node: '>=0.10.0'} 1259 | 1260 | npm-run-path@4.0.1: 1261 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1262 | engines: {node: '>=8'} 1263 | 1264 | once@1.4.0: 1265 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1266 | 1267 | onetime@5.1.2: 1268 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1269 | engines: {node: '>=6'} 1270 | 1271 | p-limit@2.3.0: 1272 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1273 | engines: {node: '>=6'} 1274 | 1275 | p-limit@3.1.0: 1276 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1277 | engines: {node: '>=10'} 1278 | 1279 | p-locate@4.1.0: 1280 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1281 | engines: {node: '>=8'} 1282 | 1283 | p-try@2.2.0: 1284 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1285 | engines: {node: '>=6'} 1286 | 1287 | parse-json@5.2.0: 1288 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1289 | engines: {node: '>=8'} 1290 | 1291 | path-exists@4.0.0: 1292 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1293 | engines: {node: '>=8'} 1294 | 1295 | path-is-absolute@1.0.1: 1296 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1297 | engines: {node: '>=0.10.0'} 1298 | 1299 | path-key@3.1.1: 1300 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1301 | engines: {node: '>=8'} 1302 | 1303 | path-parse@1.0.7: 1304 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1305 | 1306 | picocolors@1.1.1: 1307 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1308 | 1309 | picomatch@2.3.1: 1310 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1311 | engines: {node: '>=8.6'} 1312 | 1313 | pirates@4.0.6: 1314 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1315 | engines: {node: '>= 6'} 1316 | 1317 | pkg-dir@4.2.0: 1318 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1319 | engines: {node: '>=8'} 1320 | 1321 | pretty-format@29.7.0: 1322 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1323 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1324 | 1325 | prompts@2.4.2: 1326 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 1327 | engines: {node: '>= 6'} 1328 | 1329 | pure-rand@6.1.0: 1330 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 1331 | 1332 | react-is@18.3.1: 1333 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 1334 | 1335 | require-directory@2.1.1: 1336 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1337 | engines: {node: '>=0.10.0'} 1338 | 1339 | resolve-cwd@3.0.0: 1340 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1341 | engines: {node: '>=8'} 1342 | 1343 | resolve-from@5.0.0: 1344 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1345 | engines: {node: '>=8'} 1346 | 1347 | resolve-pkg-maps@1.0.0: 1348 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1349 | 1350 | resolve.exports@2.0.3: 1351 | resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} 1352 | engines: {node: '>=10'} 1353 | 1354 | resolve@1.22.10: 1355 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1356 | engines: {node: '>= 0.4'} 1357 | hasBin: true 1358 | 1359 | semver@6.3.1: 1360 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1361 | hasBin: true 1362 | 1363 | semver@7.7.1: 1364 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1365 | engines: {node: '>=10'} 1366 | hasBin: true 1367 | 1368 | sharp@0.33.5: 1369 | resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} 1370 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 1371 | 1372 | shebang-command@2.0.0: 1373 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1374 | engines: {node: '>=8'} 1375 | 1376 | shebang-regex@3.0.0: 1377 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1378 | engines: {node: '>=8'} 1379 | 1380 | signal-exit@3.0.7: 1381 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1382 | 1383 | simple-swizzle@0.2.2: 1384 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1385 | 1386 | sisteransi@1.0.5: 1387 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1388 | 1389 | slash@3.0.0: 1390 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1391 | engines: {node: '>=8'} 1392 | 1393 | source-map-support@0.5.13: 1394 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 1395 | 1396 | source-map@0.6.1: 1397 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1398 | engines: {node: '>=0.10.0'} 1399 | 1400 | sprintf-js@1.0.3: 1401 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1402 | 1403 | stack-utils@2.0.6: 1404 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 1405 | engines: {node: '>=10'} 1406 | 1407 | string-length@4.0.2: 1408 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 1409 | engines: {node: '>=10'} 1410 | 1411 | string-width@4.2.3: 1412 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1413 | engines: {node: '>=8'} 1414 | 1415 | strip-ansi@6.0.1: 1416 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1417 | engines: {node: '>=8'} 1418 | 1419 | strip-bom@4.0.0: 1420 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1421 | engines: {node: '>=8'} 1422 | 1423 | strip-final-newline@2.0.0: 1424 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1425 | engines: {node: '>=6'} 1426 | 1427 | strip-json-comments@3.1.1: 1428 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1429 | engines: {node: '>=8'} 1430 | 1431 | supports-color@7.2.0: 1432 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1433 | engines: {node: '>=8'} 1434 | 1435 | supports-color@8.1.1: 1436 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1437 | engines: {node: '>=10'} 1438 | 1439 | supports-preserve-symlinks-flag@1.0.0: 1440 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1441 | engines: {node: '>= 0.4'} 1442 | 1443 | test-exclude@6.0.0: 1444 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1445 | engines: {node: '>=8'} 1446 | 1447 | tmpl@1.0.5: 1448 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 1449 | 1450 | to-regex-range@5.0.1: 1451 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1452 | engines: {node: '>=8.0'} 1453 | 1454 | ts-jest@29.2.6: 1455 | resolution: {integrity: sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==} 1456 | engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} 1457 | hasBin: true 1458 | peerDependencies: 1459 | '@babel/core': '>=7.0.0-beta.0 <8' 1460 | '@jest/transform': ^29.0.0 1461 | '@jest/types': ^29.0.0 1462 | babel-jest: ^29.0.0 1463 | esbuild: '*' 1464 | jest: ^29.0.0 1465 | typescript: '>=4.3 <6' 1466 | peerDependenciesMeta: 1467 | '@babel/core': 1468 | optional: true 1469 | '@jest/transform': 1470 | optional: true 1471 | '@jest/types': 1472 | optional: true 1473 | babel-jest: 1474 | optional: true 1475 | esbuild: 1476 | optional: true 1477 | 1478 | ts-node@10.9.2: 1479 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 1480 | hasBin: true 1481 | peerDependencies: 1482 | '@swc/core': '>=1.2.50' 1483 | '@swc/wasm': '>=1.2.50' 1484 | '@types/node': '*' 1485 | typescript: '>=2.7' 1486 | peerDependenciesMeta: 1487 | '@swc/core': 1488 | optional: true 1489 | '@swc/wasm': 1490 | optional: true 1491 | 1492 | tslib@2.8.1: 1493 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1494 | 1495 | tsx@4.19.3: 1496 | resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} 1497 | engines: {node: '>=18.0.0'} 1498 | hasBin: true 1499 | 1500 | type-detect@4.0.8: 1501 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1502 | engines: {node: '>=4'} 1503 | 1504 | type-fest@0.21.3: 1505 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1506 | engines: {node: '>=10'} 1507 | 1508 | typescript@5.8.2: 1509 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1510 | engines: {node: '>=14.17'} 1511 | hasBin: true 1512 | 1513 | undici-types@6.20.0: 1514 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1515 | 1516 | universalify@2.0.1: 1517 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1518 | engines: {node: '>= 10.0.0'} 1519 | 1520 | update-browserslist-db@1.1.3: 1521 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1522 | hasBin: true 1523 | peerDependencies: 1524 | browserslist: '>= 4.21.0' 1525 | 1526 | v8-compile-cache-lib@3.0.1: 1527 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1528 | 1529 | v8-to-istanbul@9.3.0: 1530 | resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} 1531 | engines: {node: '>=10.12.0'} 1532 | 1533 | walker@1.0.8: 1534 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 1535 | 1536 | which@2.0.2: 1537 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1538 | engines: {node: '>= 8'} 1539 | hasBin: true 1540 | 1541 | wrap-ansi@7.0.0: 1542 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1543 | engines: {node: '>=10'} 1544 | 1545 | wrappy@1.0.2: 1546 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1547 | 1548 | write-file-atomic@4.0.2: 1549 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 1550 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 1551 | 1552 | y18n@5.0.8: 1553 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1554 | engines: {node: '>=10'} 1555 | 1556 | yallist@3.1.1: 1557 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1558 | 1559 | yargs-parser@21.1.1: 1560 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1561 | engines: {node: '>=12'} 1562 | 1563 | yargs@17.7.2: 1564 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1565 | engines: {node: '>=12'} 1566 | 1567 | yn@3.1.1: 1568 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1569 | engines: {node: '>=6'} 1570 | 1571 | yocto-queue@0.1.0: 1572 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1573 | engines: {node: '>=10'} 1574 | 1575 | snapshots: 1576 | 1577 | '@ampproject/remapping@2.3.0': 1578 | dependencies: 1579 | '@jridgewell/gen-mapping': 0.3.8 1580 | '@jridgewell/trace-mapping': 0.3.25 1581 | 1582 | '@babel/code-frame@7.26.2': 1583 | dependencies: 1584 | '@babel/helper-validator-identifier': 7.25.9 1585 | js-tokens: 4.0.0 1586 | picocolors: 1.1.1 1587 | 1588 | '@babel/compat-data@7.26.8': {} 1589 | 1590 | '@babel/core@7.26.10': 1591 | dependencies: 1592 | '@ampproject/remapping': 2.3.0 1593 | '@babel/code-frame': 7.26.2 1594 | '@babel/generator': 7.26.10 1595 | '@babel/helper-compilation-targets': 7.26.5 1596 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 1597 | '@babel/helpers': 7.26.10 1598 | '@babel/parser': 7.26.10 1599 | '@babel/template': 7.26.9 1600 | '@babel/traverse': 7.26.10 1601 | '@babel/types': 7.26.10 1602 | convert-source-map: 2.0.0 1603 | debug: 4.4.0 1604 | gensync: 1.0.0-beta.2 1605 | json5: 2.2.3 1606 | semver: 6.3.1 1607 | transitivePeerDependencies: 1608 | - supports-color 1609 | 1610 | '@babel/generator@7.26.10': 1611 | dependencies: 1612 | '@babel/parser': 7.26.10 1613 | '@babel/types': 7.26.10 1614 | '@jridgewell/gen-mapping': 0.3.8 1615 | '@jridgewell/trace-mapping': 0.3.25 1616 | jsesc: 3.1.0 1617 | 1618 | '@babel/helper-compilation-targets@7.26.5': 1619 | dependencies: 1620 | '@babel/compat-data': 7.26.8 1621 | '@babel/helper-validator-option': 7.25.9 1622 | browserslist: 4.24.4 1623 | lru-cache: 5.1.1 1624 | semver: 6.3.1 1625 | 1626 | '@babel/helper-module-imports@7.25.9': 1627 | dependencies: 1628 | '@babel/traverse': 7.26.10 1629 | '@babel/types': 7.26.10 1630 | transitivePeerDependencies: 1631 | - supports-color 1632 | 1633 | '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': 1634 | dependencies: 1635 | '@babel/core': 7.26.10 1636 | '@babel/helper-module-imports': 7.25.9 1637 | '@babel/helper-validator-identifier': 7.25.9 1638 | '@babel/traverse': 7.26.10 1639 | transitivePeerDependencies: 1640 | - supports-color 1641 | 1642 | '@babel/helper-plugin-utils@7.26.5': {} 1643 | 1644 | '@babel/helper-string-parser@7.25.9': {} 1645 | 1646 | '@babel/helper-validator-identifier@7.25.9': {} 1647 | 1648 | '@babel/helper-validator-option@7.25.9': {} 1649 | 1650 | '@babel/helpers@7.26.10': 1651 | dependencies: 1652 | '@babel/template': 7.26.9 1653 | '@babel/types': 7.26.10 1654 | 1655 | '@babel/parser@7.26.10': 1656 | dependencies: 1657 | '@babel/types': 7.26.10 1658 | 1659 | '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': 1660 | dependencies: 1661 | '@babel/core': 7.26.10 1662 | '@babel/helper-plugin-utils': 7.26.5 1663 | 1664 | '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': 1665 | dependencies: 1666 | '@babel/core': 7.26.10 1667 | '@babel/helper-plugin-utils': 7.26.5 1668 | 1669 | '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': 1670 | dependencies: 1671 | '@babel/core': 7.26.10 1672 | '@babel/helper-plugin-utils': 7.26.5 1673 | 1674 | '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': 1675 | dependencies: 1676 | '@babel/core': 7.26.10 1677 | '@babel/helper-plugin-utils': 7.26.5 1678 | 1679 | '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': 1680 | dependencies: 1681 | '@babel/core': 7.26.10 1682 | '@babel/helper-plugin-utils': 7.26.5 1683 | 1684 | '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': 1685 | dependencies: 1686 | '@babel/core': 7.26.10 1687 | '@babel/helper-plugin-utils': 7.26.5 1688 | 1689 | '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': 1690 | dependencies: 1691 | '@babel/core': 7.26.10 1692 | '@babel/helper-plugin-utils': 7.26.5 1693 | 1694 | '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': 1695 | dependencies: 1696 | '@babel/core': 7.26.10 1697 | '@babel/helper-plugin-utils': 7.26.5 1698 | 1699 | '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': 1700 | dependencies: 1701 | '@babel/core': 7.26.10 1702 | '@babel/helper-plugin-utils': 7.26.5 1703 | 1704 | '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': 1705 | dependencies: 1706 | '@babel/core': 7.26.10 1707 | '@babel/helper-plugin-utils': 7.26.5 1708 | 1709 | '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': 1710 | dependencies: 1711 | '@babel/core': 7.26.10 1712 | '@babel/helper-plugin-utils': 7.26.5 1713 | 1714 | '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': 1715 | dependencies: 1716 | '@babel/core': 7.26.10 1717 | '@babel/helper-plugin-utils': 7.26.5 1718 | 1719 | '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': 1720 | dependencies: 1721 | '@babel/core': 7.26.10 1722 | '@babel/helper-plugin-utils': 7.26.5 1723 | 1724 | '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': 1725 | dependencies: 1726 | '@babel/core': 7.26.10 1727 | '@babel/helper-plugin-utils': 7.26.5 1728 | 1729 | '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': 1730 | dependencies: 1731 | '@babel/core': 7.26.10 1732 | '@babel/helper-plugin-utils': 7.26.5 1733 | 1734 | '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': 1735 | dependencies: 1736 | '@babel/core': 7.26.10 1737 | '@babel/helper-plugin-utils': 7.26.5 1738 | 1739 | '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': 1740 | dependencies: 1741 | '@babel/core': 7.26.10 1742 | '@babel/helper-plugin-utils': 7.26.5 1743 | 1744 | '@babel/template@7.26.9': 1745 | dependencies: 1746 | '@babel/code-frame': 7.26.2 1747 | '@babel/parser': 7.26.10 1748 | '@babel/types': 7.26.10 1749 | 1750 | '@babel/traverse@7.26.10': 1751 | dependencies: 1752 | '@babel/code-frame': 7.26.2 1753 | '@babel/generator': 7.26.10 1754 | '@babel/parser': 7.26.10 1755 | '@babel/template': 7.26.9 1756 | '@babel/types': 7.26.10 1757 | debug: 4.4.0 1758 | globals: 11.12.0 1759 | transitivePeerDependencies: 1760 | - supports-color 1761 | 1762 | '@babel/types@7.26.10': 1763 | dependencies: 1764 | '@babel/helper-string-parser': 7.25.9 1765 | '@babel/helper-validator-identifier': 7.25.9 1766 | 1767 | '@bcoe/v8-coverage@0.2.3': {} 1768 | 1769 | '@cspotcode/source-map-support@0.8.1': 1770 | dependencies: 1771 | '@jridgewell/trace-mapping': 0.3.9 1772 | 1773 | '@emnapi/runtime@1.3.1': 1774 | dependencies: 1775 | tslib: 2.8.1 1776 | optional: true 1777 | 1778 | '@esbuild/aix-ppc64@0.25.1': 1779 | optional: true 1780 | 1781 | '@esbuild/android-arm64@0.25.1': 1782 | optional: true 1783 | 1784 | '@esbuild/android-arm@0.25.1': 1785 | optional: true 1786 | 1787 | '@esbuild/android-x64@0.25.1': 1788 | optional: true 1789 | 1790 | '@esbuild/darwin-arm64@0.25.1': 1791 | optional: true 1792 | 1793 | '@esbuild/darwin-x64@0.25.1': 1794 | optional: true 1795 | 1796 | '@esbuild/freebsd-arm64@0.25.1': 1797 | optional: true 1798 | 1799 | '@esbuild/freebsd-x64@0.25.1': 1800 | optional: true 1801 | 1802 | '@esbuild/linux-arm64@0.25.1': 1803 | optional: true 1804 | 1805 | '@esbuild/linux-arm@0.25.1': 1806 | optional: true 1807 | 1808 | '@esbuild/linux-ia32@0.25.1': 1809 | optional: true 1810 | 1811 | '@esbuild/linux-loong64@0.25.1': 1812 | optional: true 1813 | 1814 | '@esbuild/linux-mips64el@0.25.1': 1815 | optional: true 1816 | 1817 | '@esbuild/linux-ppc64@0.25.1': 1818 | optional: true 1819 | 1820 | '@esbuild/linux-riscv64@0.25.1': 1821 | optional: true 1822 | 1823 | '@esbuild/linux-s390x@0.25.1': 1824 | optional: true 1825 | 1826 | '@esbuild/linux-x64@0.25.1': 1827 | optional: true 1828 | 1829 | '@esbuild/netbsd-arm64@0.25.1': 1830 | optional: true 1831 | 1832 | '@esbuild/netbsd-x64@0.25.1': 1833 | optional: true 1834 | 1835 | '@esbuild/openbsd-arm64@0.25.1': 1836 | optional: true 1837 | 1838 | '@esbuild/openbsd-x64@0.25.1': 1839 | optional: true 1840 | 1841 | '@esbuild/sunos-x64@0.25.1': 1842 | optional: true 1843 | 1844 | '@esbuild/win32-arm64@0.25.1': 1845 | optional: true 1846 | 1847 | '@esbuild/win32-ia32@0.25.1': 1848 | optional: true 1849 | 1850 | '@esbuild/win32-x64@0.25.1': 1851 | optional: true 1852 | 1853 | '@img/sharp-darwin-arm64@0.33.5': 1854 | optionalDependencies: 1855 | '@img/sharp-libvips-darwin-arm64': 1.0.4 1856 | optional: true 1857 | 1858 | '@img/sharp-darwin-x64@0.33.5': 1859 | optionalDependencies: 1860 | '@img/sharp-libvips-darwin-x64': 1.0.4 1861 | optional: true 1862 | 1863 | '@img/sharp-libvips-darwin-arm64@1.0.4': 1864 | optional: true 1865 | 1866 | '@img/sharp-libvips-darwin-x64@1.0.4': 1867 | optional: true 1868 | 1869 | '@img/sharp-libvips-linux-arm64@1.0.4': 1870 | optional: true 1871 | 1872 | '@img/sharp-libvips-linux-arm@1.0.5': 1873 | optional: true 1874 | 1875 | '@img/sharp-libvips-linux-s390x@1.0.4': 1876 | optional: true 1877 | 1878 | '@img/sharp-libvips-linux-x64@1.0.4': 1879 | optional: true 1880 | 1881 | '@img/sharp-libvips-linuxmusl-arm64@1.0.4': 1882 | optional: true 1883 | 1884 | '@img/sharp-libvips-linuxmusl-x64@1.0.4': 1885 | optional: true 1886 | 1887 | '@img/sharp-linux-arm64@0.33.5': 1888 | optionalDependencies: 1889 | '@img/sharp-libvips-linux-arm64': 1.0.4 1890 | optional: true 1891 | 1892 | '@img/sharp-linux-arm@0.33.5': 1893 | optionalDependencies: 1894 | '@img/sharp-libvips-linux-arm': 1.0.5 1895 | optional: true 1896 | 1897 | '@img/sharp-linux-s390x@0.33.5': 1898 | optionalDependencies: 1899 | '@img/sharp-libvips-linux-s390x': 1.0.4 1900 | optional: true 1901 | 1902 | '@img/sharp-linux-x64@0.33.5': 1903 | optionalDependencies: 1904 | '@img/sharp-libvips-linux-x64': 1.0.4 1905 | optional: true 1906 | 1907 | '@img/sharp-linuxmusl-arm64@0.33.5': 1908 | optionalDependencies: 1909 | '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 1910 | optional: true 1911 | 1912 | '@img/sharp-linuxmusl-x64@0.33.5': 1913 | optionalDependencies: 1914 | '@img/sharp-libvips-linuxmusl-x64': 1.0.4 1915 | optional: true 1916 | 1917 | '@img/sharp-wasm32@0.33.5': 1918 | dependencies: 1919 | '@emnapi/runtime': 1.3.1 1920 | optional: true 1921 | 1922 | '@img/sharp-win32-ia32@0.33.5': 1923 | optional: true 1924 | 1925 | '@img/sharp-win32-x64@0.33.5': 1926 | optional: true 1927 | 1928 | '@istanbuljs/load-nyc-config@1.1.0': 1929 | dependencies: 1930 | camelcase: 5.3.1 1931 | find-up: 4.1.0 1932 | get-package-type: 0.1.0 1933 | js-yaml: 3.14.1 1934 | resolve-from: 5.0.0 1935 | 1936 | '@istanbuljs/schema@0.1.3': {} 1937 | 1938 | '@jest/console@29.7.0': 1939 | dependencies: 1940 | '@jest/types': 29.6.3 1941 | '@types/node': 22.13.11 1942 | chalk: 4.1.2 1943 | jest-message-util: 29.7.0 1944 | jest-util: 29.7.0 1945 | slash: 3.0.0 1946 | 1947 | '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2))': 1948 | dependencies: 1949 | '@jest/console': 29.7.0 1950 | '@jest/reporters': 29.7.0 1951 | '@jest/test-result': 29.7.0 1952 | '@jest/transform': 29.7.0 1953 | '@jest/types': 29.6.3 1954 | '@types/node': 22.13.11 1955 | ansi-escapes: 4.3.2 1956 | chalk: 4.1.2 1957 | ci-info: 3.9.0 1958 | exit: 0.1.2 1959 | graceful-fs: 4.2.11 1960 | jest-changed-files: 29.7.0 1961 | jest-config: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 1962 | jest-haste-map: 29.7.0 1963 | jest-message-util: 29.7.0 1964 | jest-regex-util: 29.6.3 1965 | jest-resolve: 29.7.0 1966 | jest-resolve-dependencies: 29.7.0 1967 | jest-runner: 29.7.0 1968 | jest-runtime: 29.7.0 1969 | jest-snapshot: 29.7.0 1970 | jest-util: 29.7.0 1971 | jest-validate: 29.7.0 1972 | jest-watcher: 29.7.0 1973 | micromatch: 4.0.8 1974 | pretty-format: 29.7.0 1975 | slash: 3.0.0 1976 | strip-ansi: 6.0.1 1977 | transitivePeerDependencies: 1978 | - babel-plugin-macros 1979 | - supports-color 1980 | - ts-node 1981 | 1982 | '@jest/environment@29.7.0': 1983 | dependencies: 1984 | '@jest/fake-timers': 29.7.0 1985 | '@jest/types': 29.6.3 1986 | '@types/node': 22.13.11 1987 | jest-mock: 29.7.0 1988 | 1989 | '@jest/expect-utils@29.7.0': 1990 | dependencies: 1991 | jest-get-type: 29.6.3 1992 | 1993 | '@jest/expect@29.7.0': 1994 | dependencies: 1995 | expect: 29.7.0 1996 | jest-snapshot: 29.7.0 1997 | transitivePeerDependencies: 1998 | - supports-color 1999 | 2000 | '@jest/fake-timers@29.7.0': 2001 | dependencies: 2002 | '@jest/types': 29.6.3 2003 | '@sinonjs/fake-timers': 10.3.0 2004 | '@types/node': 22.13.11 2005 | jest-message-util: 29.7.0 2006 | jest-mock: 29.7.0 2007 | jest-util: 29.7.0 2008 | 2009 | '@jest/globals@29.7.0': 2010 | dependencies: 2011 | '@jest/environment': 29.7.0 2012 | '@jest/expect': 29.7.0 2013 | '@jest/types': 29.6.3 2014 | jest-mock: 29.7.0 2015 | transitivePeerDependencies: 2016 | - supports-color 2017 | 2018 | '@jest/reporters@29.7.0': 2019 | dependencies: 2020 | '@bcoe/v8-coverage': 0.2.3 2021 | '@jest/console': 29.7.0 2022 | '@jest/test-result': 29.7.0 2023 | '@jest/transform': 29.7.0 2024 | '@jest/types': 29.6.3 2025 | '@jridgewell/trace-mapping': 0.3.25 2026 | '@types/node': 22.13.11 2027 | chalk: 4.1.2 2028 | collect-v8-coverage: 1.0.2 2029 | exit: 0.1.2 2030 | glob: 7.2.3 2031 | graceful-fs: 4.2.11 2032 | istanbul-lib-coverage: 3.2.2 2033 | istanbul-lib-instrument: 6.0.3 2034 | istanbul-lib-report: 3.0.1 2035 | istanbul-lib-source-maps: 4.0.1 2036 | istanbul-reports: 3.1.7 2037 | jest-message-util: 29.7.0 2038 | jest-util: 29.7.0 2039 | jest-worker: 29.7.0 2040 | slash: 3.0.0 2041 | string-length: 4.0.2 2042 | strip-ansi: 6.0.1 2043 | v8-to-istanbul: 9.3.0 2044 | transitivePeerDependencies: 2045 | - supports-color 2046 | 2047 | '@jest/schemas@29.6.3': 2048 | dependencies: 2049 | '@sinclair/typebox': 0.27.8 2050 | 2051 | '@jest/source-map@29.6.3': 2052 | dependencies: 2053 | '@jridgewell/trace-mapping': 0.3.25 2054 | callsites: 3.1.0 2055 | graceful-fs: 4.2.11 2056 | 2057 | '@jest/test-result@29.7.0': 2058 | dependencies: 2059 | '@jest/console': 29.7.0 2060 | '@jest/types': 29.6.3 2061 | '@types/istanbul-lib-coverage': 2.0.6 2062 | collect-v8-coverage: 1.0.2 2063 | 2064 | '@jest/test-sequencer@29.7.0': 2065 | dependencies: 2066 | '@jest/test-result': 29.7.0 2067 | graceful-fs: 4.2.11 2068 | jest-haste-map: 29.7.0 2069 | slash: 3.0.0 2070 | 2071 | '@jest/transform@29.7.0': 2072 | dependencies: 2073 | '@babel/core': 7.26.10 2074 | '@jest/types': 29.6.3 2075 | '@jridgewell/trace-mapping': 0.3.25 2076 | babel-plugin-istanbul: 6.1.1 2077 | chalk: 4.1.2 2078 | convert-source-map: 2.0.0 2079 | fast-json-stable-stringify: 2.1.0 2080 | graceful-fs: 4.2.11 2081 | jest-haste-map: 29.7.0 2082 | jest-regex-util: 29.6.3 2083 | jest-util: 29.7.0 2084 | micromatch: 4.0.8 2085 | pirates: 4.0.6 2086 | slash: 3.0.0 2087 | write-file-atomic: 4.0.2 2088 | transitivePeerDependencies: 2089 | - supports-color 2090 | 2091 | '@jest/types@29.6.3': 2092 | dependencies: 2093 | '@jest/schemas': 29.6.3 2094 | '@types/istanbul-lib-coverage': 2.0.6 2095 | '@types/istanbul-reports': 3.0.4 2096 | '@types/node': 22.13.11 2097 | '@types/yargs': 17.0.33 2098 | chalk: 4.1.2 2099 | 2100 | '@jridgewell/gen-mapping@0.3.8': 2101 | dependencies: 2102 | '@jridgewell/set-array': 1.2.1 2103 | '@jridgewell/sourcemap-codec': 1.5.0 2104 | '@jridgewell/trace-mapping': 0.3.25 2105 | 2106 | '@jridgewell/resolve-uri@3.1.2': {} 2107 | 2108 | '@jridgewell/set-array@1.2.1': {} 2109 | 2110 | '@jridgewell/sourcemap-codec@1.5.0': {} 2111 | 2112 | '@jridgewell/trace-mapping@0.3.25': 2113 | dependencies: 2114 | '@jridgewell/resolve-uri': 3.1.2 2115 | '@jridgewell/sourcemap-codec': 1.5.0 2116 | 2117 | '@jridgewell/trace-mapping@0.3.9': 2118 | dependencies: 2119 | '@jridgewell/resolve-uri': 3.1.2 2120 | '@jridgewell/sourcemap-codec': 1.5.0 2121 | 2122 | '@sinclair/typebox@0.27.8': {} 2123 | 2124 | '@sinonjs/commons@3.0.1': 2125 | dependencies: 2126 | type-detect: 4.0.8 2127 | 2128 | '@sinonjs/fake-timers@10.3.0': 2129 | dependencies: 2130 | '@sinonjs/commons': 3.0.1 2131 | 2132 | '@tsconfig/node10@1.0.11': {} 2133 | 2134 | '@tsconfig/node12@1.0.11': {} 2135 | 2136 | '@tsconfig/node14@1.0.3': {} 2137 | 2138 | '@tsconfig/node16@1.0.4': {} 2139 | 2140 | '@types/babel__core@7.20.5': 2141 | dependencies: 2142 | '@babel/parser': 7.26.10 2143 | '@babel/types': 7.26.10 2144 | '@types/babel__generator': 7.6.8 2145 | '@types/babel__template': 7.4.4 2146 | '@types/babel__traverse': 7.20.6 2147 | 2148 | '@types/babel__generator@7.6.8': 2149 | dependencies: 2150 | '@babel/types': 7.26.10 2151 | 2152 | '@types/babel__template@7.4.4': 2153 | dependencies: 2154 | '@babel/parser': 7.26.10 2155 | '@babel/types': 7.26.10 2156 | 2157 | '@types/babel__traverse@7.20.6': 2158 | dependencies: 2159 | '@babel/types': 7.26.10 2160 | 2161 | '@types/fs-extra@11.0.4': 2162 | dependencies: 2163 | '@types/jsonfile': 6.1.4 2164 | '@types/node': 22.13.11 2165 | 2166 | '@types/graceful-fs@4.1.9': 2167 | dependencies: 2168 | '@types/node': 22.13.11 2169 | 2170 | '@types/istanbul-lib-coverage@2.0.6': {} 2171 | 2172 | '@types/istanbul-lib-report@3.0.3': 2173 | dependencies: 2174 | '@types/istanbul-lib-coverage': 2.0.6 2175 | 2176 | '@types/istanbul-reports@3.0.4': 2177 | dependencies: 2178 | '@types/istanbul-lib-report': 3.0.3 2179 | 2180 | '@types/jest@29.5.14': 2181 | dependencies: 2182 | expect: 29.7.0 2183 | pretty-format: 29.7.0 2184 | 2185 | '@types/jsonfile@6.1.4': 2186 | dependencies: 2187 | '@types/node': 22.13.11 2188 | 2189 | '@types/node@22.13.11': 2190 | dependencies: 2191 | undici-types: 6.20.0 2192 | 2193 | '@types/stack-utils@2.0.3': {} 2194 | 2195 | '@types/yargs-parser@21.0.3': {} 2196 | 2197 | '@types/yargs@17.0.33': 2198 | dependencies: 2199 | '@types/yargs-parser': 21.0.3 2200 | 2201 | acorn-walk@8.3.4: 2202 | dependencies: 2203 | acorn: 8.14.1 2204 | 2205 | acorn@8.14.1: {} 2206 | 2207 | ansi-escapes@4.3.2: 2208 | dependencies: 2209 | type-fest: 0.21.3 2210 | 2211 | ansi-regex@5.0.1: {} 2212 | 2213 | ansi-styles@4.3.0: 2214 | dependencies: 2215 | color-convert: 2.0.1 2216 | 2217 | ansi-styles@5.2.0: {} 2218 | 2219 | anymatch@3.1.3: 2220 | dependencies: 2221 | normalize-path: 3.0.0 2222 | picomatch: 2.3.1 2223 | 2224 | arg@4.1.3: {} 2225 | 2226 | argparse@1.0.10: 2227 | dependencies: 2228 | sprintf-js: 1.0.3 2229 | 2230 | async@3.2.6: {} 2231 | 2232 | babel-jest@29.7.0(@babel/core@7.26.10): 2233 | dependencies: 2234 | '@babel/core': 7.26.10 2235 | '@jest/transform': 29.7.0 2236 | '@types/babel__core': 7.20.5 2237 | babel-plugin-istanbul: 6.1.1 2238 | babel-preset-jest: 29.6.3(@babel/core@7.26.10) 2239 | chalk: 4.1.2 2240 | graceful-fs: 4.2.11 2241 | slash: 3.0.0 2242 | transitivePeerDependencies: 2243 | - supports-color 2244 | 2245 | babel-plugin-istanbul@6.1.1: 2246 | dependencies: 2247 | '@babel/helper-plugin-utils': 7.26.5 2248 | '@istanbuljs/load-nyc-config': 1.1.0 2249 | '@istanbuljs/schema': 0.1.3 2250 | istanbul-lib-instrument: 5.2.1 2251 | test-exclude: 6.0.0 2252 | transitivePeerDependencies: 2253 | - supports-color 2254 | 2255 | babel-plugin-jest-hoist@29.6.3: 2256 | dependencies: 2257 | '@babel/template': 7.26.9 2258 | '@babel/types': 7.26.10 2259 | '@types/babel__core': 7.20.5 2260 | '@types/babel__traverse': 7.20.6 2261 | 2262 | babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): 2263 | dependencies: 2264 | '@babel/core': 7.26.10 2265 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) 2266 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) 2267 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) 2268 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) 2269 | '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) 2270 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) 2271 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) 2272 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) 2273 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) 2274 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) 2275 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) 2276 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) 2277 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) 2278 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) 2279 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) 2280 | 2281 | babel-preset-jest@29.6.3(@babel/core@7.26.10): 2282 | dependencies: 2283 | '@babel/core': 7.26.10 2284 | babel-plugin-jest-hoist: 29.6.3 2285 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) 2286 | 2287 | balanced-match@1.0.2: {} 2288 | 2289 | brace-expansion@1.1.11: 2290 | dependencies: 2291 | balanced-match: 1.0.2 2292 | concat-map: 0.0.1 2293 | 2294 | brace-expansion@2.0.1: 2295 | dependencies: 2296 | balanced-match: 1.0.2 2297 | 2298 | braces@3.0.3: 2299 | dependencies: 2300 | fill-range: 7.1.1 2301 | 2302 | browserslist@4.24.4: 2303 | dependencies: 2304 | caniuse-lite: 1.0.30001706 2305 | electron-to-chromium: 1.5.123 2306 | node-releases: 2.0.19 2307 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 2308 | 2309 | bs-logger@0.2.6: 2310 | dependencies: 2311 | fast-json-stable-stringify: 2.1.0 2312 | 2313 | bser@2.1.1: 2314 | dependencies: 2315 | node-int64: 0.4.0 2316 | 2317 | buffer-from@1.1.2: {} 2318 | 2319 | callsites@3.1.0: {} 2320 | 2321 | camelcase@5.3.1: {} 2322 | 2323 | camelcase@6.3.0: {} 2324 | 2325 | caniuse-lite@1.0.30001706: {} 2326 | 2327 | chalk@4.1.2: 2328 | dependencies: 2329 | ansi-styles: 4.3.0 2330 | supports-color: 7.2.0 2331 | 2332 | char-regex@1.0.2: {} 2333 | 2334 | ci-info@3.9.0: {} 2335 | 2336 | cjs-module-lexer@1.4.3: {} 2337 | 2338 | cliui@8.0.1: 2339 | dependencies: 2340 | string-width: 4.2.3 2341 | strip-ansi: 6.0.1 2342 | wrap-ansi: 7.0.0 2343 | 2344 | co@4.6.0: {} 2345 | 2346 | collect-v8-coverage@1.0.2: {} 2347 | 2348 | color-convert@2.0.1: 2349 | dependencies: 2350 | color-name: 1.1.4 2351 | 2352 | color-name@1.1.4: {} 2353 | 2354 | color-string@1.9.1: 2355 | dependencies: 2356 | color-name: 1.1.4 2357 | simple-swizzle: 0.2.2 2358 | 2359 | color@4.2.3: 2360 | dependencies: 2361 | color-convert: 2.0.1 2362 | color-string: 1.9.1 2363 | 2364 | commander@13.1.0: {} 2365 | 2366 | concat-map@0.0.1: {} 2367 | 2368 | convert-source-map@2.0.0: {} 2369 | 2370 | create-jest@29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)): 2371 | dependencies: 2372 | '@jest/types': 29.6.3 2373 | chalk: 4.1.2 2374 | exit: 0.1.2 2375 | graceful-fs: 4.2.11 2376 | jest-config: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 2377 | jest-util: 29.7.0 2378 | prompts: 2.4.2 2379 | transitivePeerDependencies: 2380 | - '@types/node' 2381 | - babel-plugin-macros 2382 | - supports-color 2383 | - ts-node 2384 | 2385 | create-require@1.1.1: {} 2386 | 2387 | cross-spawn@7.0.6: 2388 | dependencies: 2389 | path-key: 3.1.1 2390 | shebang-command: 2.0.0 2391 | which: 2.0.2 2392 | 2393 | debug@4.4.0: 2394 | dependencies: 2395 | ms: 2.1.3 2396 | 2397 | dedent@1.5.3: {} 2398 | 2399 | deepmerge@4.3.1: {} 2400 | 2401 | detect-libc@2.0.3: {} 2402 | 2403 | detect-newline@3.1.0: {} 2404 | 2405 | diff-sequences@29.6.3: {} 2406 | 2407 | diff@4.0.2: {} 2408 | 2409 | ejs@3.1.10: 2410 | dependencies: 2411 | jake: 10.9.2 2412 | 2413 | electron-to-chromium@1.5.123: {} 2414 | 2415 | emittery@0.13.1: {} 2416 | 2417 | emoji-regex@8.0.0: {} 2418 | 2419 | error-ex@1.3.2: 2420 | dependencies: 2421 | is-arrayish: 0.2.1 2422 | 2423 | esbuild@0.25.1: 2424 | optionalDependencies: 2425 | '@esbuild/aix-ppc64': 0.25.1 2426 | '@esbuild/android-arm': 0.25.1 2427 | '@esbuild/android-arm64': 0.25.1 2428 | '@esbuild/android-x64': 0.25.1 2429 | '@esbuild/darwin-arm64': 0.25.1 2430 | '@esbuild/darwin-x64': 0.25.1 2431 | '@esbuild/freebsd-arm64': 0.25.1 2432 | '@esbuild/freebsd-x64': 0.25.1 2433 | '@esbuild/linux-arm': 0.25.1 2434 | '@esbuild/linux-arm64': 0.25.1 2435 | '@esbuild/linux-ia32': 0.25.1 2436 | '@esbuild/linux-loong64': 0.25.1 2437 | '@esbuild/linux-mips64el': 0.25.1 2438 | '@esbuild/linux-ppc64': 0.25.1 2439 | '@esbuild/linux-riscv64': 0.25.1 2440 | '@esbuild/linux-s390x': 0.25.1 2441 | '@esbuild/linux-x64': 0.25.1 2442 | '@esbuild/netbsd-arm64': 0.25.1 2443 | '@esbuild/netbsd-x64': 0.25.1 2444 | '@esbuild/openbsd-arm64': 0.25.1 2445 | '@esbuild/openbsd-x64': 0.25.1 2446 | '@esbuild/sunos-x64': 0.25.1 2447 | '@esbuild/win32-arm64': 0.25.1 2448 | '@esbuild/win32-ia32': 0.25.1 2449 | '@esbuild/win32-x64': 0.25.1 2450 | 2451 | escalade@3.2.0: {} 2452 | 2453 | escape-string-regexp@2.0.0: {} 2454 | 2455 | esprima@4.0.1: {} 2456 | 2457 | execa@5.1.1: 2458 | dependencies: 2459 | cross-spawn: 7.0.6 2460 | get-stream: 6.0.1 2461 | human-signals: 2.1.0 2462 | is-stream: 2.0.1 2463 | merge-stream: 2.0.0 2464 | npm-run-path: 4.0.1 2465 | onetime: 5.1.2 2466 | signal-exit: 3.0.7 2467 | strip-final-newline: 2.0.0 2468 | 2469 | exit@0.1.2: {} 2470 | 2471 | expect@29.7.0: 2472 | dependencies: 2473 | '@jest/expect-utils': 29.7.0 2474 | jest-get-type: 29.6.3 2475 | jest-matcher-utils: 29.7.0 2476 | jest-message-util: 29.7.0 2477 | jest-util: 29.7.0 2478 | 2479 | fast-json-stable-stringify@2.1.0: {} 2480 | 2481 | fb-watchman@2.0.2: 2482 | dependencies: 2483 | bser: 2.1.1 2484 | 2485 | filelist@1.0.4: 2486 | dependencies: 2487 | minimatch: 5.1.6 2488 | 2489 | fill-range@7.1.1: 2490 | dependencies: 2491 | to-regex-range: 5.0.1 2492 | 2493 | find-up@4.1.0: 2494 | dependencies: 2495 | locate-path: 5.0.0 2496 | path-exists: 4.0.0 2497 | 2498 | fs-extra@11.3.0: 2499 | dependencies: 2500 | graceful-fs: 4.2.11 2501 | jsonfile: 6.1.0 2502 | universalify: 2.0.1 2503 | 2504 | fs.realpath@1.0.0: {} 2505 | 2506 | fsevents@2.3.3: 2507 | optional: true 2508 | 2509 | function-bind@1.1.2: {} 2510 | 2511 | gensync@1.0.0-beta.2: {} 2512 | 2513 | get-caller-file@2.0.5: {} 2514 | 2515 | get-package-type@0.1.0: {} 2516 | 2517 | get-stream@6.0.1: {} 2518 | 2519 | get-tsconfig@4.10.0: 2520 | dependencies: 2521 | resolve-pkg-maps: 1.0.0 2522 | 2523 | glob@7.2.3: 2524 | dependencies: 2525 | fs.realpath: 1.0.0 2526 | inflight: 1.0.6 2527 | inherits: 2.0.4 2528 | minimatch: 3.1.2 2529 | once: 1.4.0 2530 | path-is-absolute: 1.0.1 2531 | 2532 | globals@11.12.0: {} 2533 | 2534 | graceful-fs@4.2.11: {} 2535 | 2536 | has-flag@4.0.0: {} 2537 | 2538 | hasown@2.0.2: 2539 | dependencies: 2540 | function-bind: 1.1.2 2541 | 2542 | html-escaper@2.0.2: {} 2543 | 2544 | human-signals@2.1.0: {} 2545 | 2546 | import-local@3.2.0: 2547 | dependencies: 2548 | pkg-dir: 4.2.0 2549 | resolve-cwd: 3.0.0 2550 | 2551 | imurmurhash@0.1.4: {} 2552 | 2553 | inflight@1.0.6: 2554 | dependencies: 2555 | once: 1.4.0 2556 | wrappy: 1.0.2 2557 | 2558 | inherits@2.0.4: {} 2559 | 2560 | is-arrayish@0.2.1: {} 2561 | 2562 | is-arrayish@0.3.2: {} 2563 | 2564 | is-core-module@2.16.1: 2565 | dependencies: 2566 | hasown: 2.0.2 2567 | 2568 | is-fullwidth-code-point@3.0.0: {} 2569 | 2570 | is-generator-fn@2.1.0: {} 2571 | 2572 | is-number@7.0.0: {} 2573 | 2574 | is-stream@2.0.1: {} 2575 | 2576 | isexe@2.0.0: {} 2577 | 2578 | istanbul-lib-coverage@3.2.2: {} 2579 | 2580 | istanbul-lib-instrument@5.2.1: 2581 | dependencies: 2582 | '@babel/core': 7.26.10 2583 | '@babel/parser': 7.26.10 2584 | '@istanbuljs/schema': 0.1.3 2585 | istanbul-lib-coverage: 3.2.2 2586 | semver: 6.3.1 2587 | transitivePeerDependencies: 2588 | - supports-color 2589 | 2590 | istanbul-lib-instrument@6.0.3: 2591 | dependencies: 2592 | '@babel/core': 7.26.10 2593 | '@babel/parser': 7.26.10 2594 | '@istanbuljs/schema': 0.1.3 2595 | istanbul-lib-coverage: 3.2.2 2596 | semver: 7.7.1 2597 | transitivePeerDependencies: 2598 | - supports-color 2599 | 2600 | istanbul-lib-report@3.0.1: 2601 | dependencies: 2602 | istanbul-lib-coverage: 3.2.2 2603 | make-dir: 4.0.0 2604 | supports-color: 7.2.0 2605 | 2606 | istanbul-lib-source-maps@4.0.1: 2607 | dependencies: 2608 | debug: 4.4.0 2609 | istanbul-lib-coverage: 3.2.2 2610 | source-map: 0.6.1 2611 | transitivePeerDependencies: 2612 | - supports-color 2613 | 2614 | istanbul-reports@3.1.7: 2615 | dependencies: 2616 | html-escaper: 2.0.2 2617 | istanbul-lib-report: 3.0.1 2618 | 2619 | jake@10.9.2: 2620 | dependencies: 2621 | async: 3.2.6 2622 | chalk: 4.1.2 2623 | filelist: 1.0.4 2624 | minimatch: 3.1.2 2625 | 2626 | jest-changed-files@29.7.0: 2627 | dependencies: 2628 | execa: 5.1.1 2629 | jest-util: 29.7.0 2630 | p-limit: 3.1.0 2631 | 2632 | jest-circus@29.7.0: 2633 | dependencies: 2634 | '@jest/environment': 29.7.0 2635 | '@jest/expect': 29.7.0 2636 | '@jest/test-result': 29.7.0 2637 | '@jest/types': 29.6.3 2638 | '@types/node': 22.13.11 2639 | chalk: 4.1.2 2640 | co: 4.6.0 2641 | dedent: 1.5.3 2642 | is-generator-fn: 2.1.0 2643 | jest-each: 29.7.0 2644 | jest-matcher-utils: 29.7.0 2645 | jest-message-util: 29.7.0 2646 | jest-runtime: 29.7.0 2647 | jest-snapshot: 29.7.0 2648 | jest-util: 29.7.0 2649 | p-limit: 3.1.0 2650 | pretty-format: 29.7.0 2651 | pure-rand: 6.1.0 2652 | slash: 3.0.0 2653 | stack-utils: 2.0.6 2654 | transitivePeerDependencies: 2655 | - babel-plugin-macros 2656 | - supports-color 2657 | 2658 | jest-cli@29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)): 2659 | dependencies: 2660 | '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 2661 | '@jest/test-result': 29.7.0 2662 | '@jest/types': 29.6.3 2663 | chalk: 4.1.2 2664 | create-jest: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 2665 | exit: 0.1.2 2666 | import-local: 3.2.0 2667 | jest-config: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 2668 | jest-util: 29.7.0 2669 | jest-validate: 29.7.0 2670 | yargs: 17.7.2 2671 | transitivePeerDependencies: 2672 | - '@types/node' 2673 | - babel-plugin-macros 2674 | - supports-color 2675 | - ts-node 2676 | 2677 | jest-config@29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)): 2678 | dependencies: 2679 | '@babel/core': 7.26.10 2680 | '@jest/test-sequencer': 29.7.0 2681 | '@jest/types': 29.6.3 2682 | babel-jest: 29.7.0(@babel/core@7.26.10) 2683 | chalk: 4.1.2 2684 | ci-info: 3.9.0 2685 | deepmerge: 4.3.1 2686 | glob: 7.2.3 2687 | graceful-fs: 4.2.11 2688 | jest-circus: 29.7.0 2689 | jest-environment-node: 29.7.0 2690 | jest-get-type: 29.6.3 2691 | jest-regex-util: 29.6.3 2692 | jest-resolve: 29.7.0 2693 | jest-runner: 29.7.0 2694 | jest-util: 29.7.0 2695 | jest-validate: 29.7.0 2696 | micromatch: 4.0.8 2697 | parse-json: 5.2.0 2698 | pretty-format: 29.7.0 2699 | slash: 3.0.0 2700 | strip-json-comments: 3.1.1 2701 | optionalDependencies: 2702 | '@types/node': 22.13.11 2703 | ts-node: 10.9.2(@types/node@22.13.11)(typescript@5.8.2) 2704 | transitivePeerDependencies: 2705 | - babel-plugin-macros 2706 | - supports-color 2707 | 2708 | jest-diff@29.7.0: 2709 | dependencies: 2710 | chalk: 4.1.2 2711 | diff-sequences: 29.6.3 2712 | jest-get-type: 29.6.3 2713 | pretty-format: 29.7.0 2714 | 2715 | jest-docblock@29.7.0: 2716 | dependencies: 2717 | detect-newline: 3.1.0 2718 | 2719 | jest-each@29.7.0: 2720 | dependencies: 2721 | '@jest/types': 29.6.3 2722 | chalk: 4.1.2 2723 | jest-get-type: 29.6.3 2724 | jest-util: 29.7.0 2725 | pretty-format: 29.7.0 2726 | 2727 | jest-environment-node@29.7.0: 2728 | dependencies: 2729 | '@jest/environment': 29.7.0 2730 | '@jest/fake-timers': 29.7.0 2731 | '@jest/types': 29.6.3 2732 | '@types/node': 22.13.11 2733 | jest-mock: 29.7.0 2734 | jest-util: 29.7.0 2735 | 2736 | jest-get-type@29.6.3: {} 2737 | 2738 | jest-haste-map@29.7.0: 2739 | dependencies: 2740 | '@jest/types': 29.6.3 2741 | '@types/graceful-fs': 4.1.9 2742 | '@types/node': 22.13.11 2743 | anymatch: 3.1.3 2744 | fb-watchman: 2.0.2 2745 | graceful-fs: 4.2.11 2746 | jest-regex-util: 29.6.3 2747 | jest-util: 29.7.0 2748 | jest-worker: 29.7.0 2749 | micromatch: 4.0.8 2750 | walker: 1.0.8 2751 | optionalDependencies: 2752 | fsevents: 2.3.3 2753 | 2754 | jest-leak-detector@29.7.0: 2755 | dependencies: 2756 | jest-get-type: 29.6.3 2757 | pretty-format: 29.7.0 2758 | 2759 | jest-matcher-utils@29.7.0: 2760 | dependencies: 2761 | chalk: 4.1.2 2762 | jest-diff: 29.7.0 2763 | jest-get-type: 29.6.3 2764 | pretty-format: 29.7.0 2765 | 2766 | jest-message-util@29.7.0: 2767 | dependencies: 2768 | '@babel/code-frame': 7.26.2 2769 | '@jest/types': 29.6.3 2770 | '@types/stack-utils': 2.0.3 2771 | chalk: 4.1.2 2772 | graceful-fs: 4.2.11 2773 | micromatch: 4.0.8 2774 | pretty-format: 29.7.0 2775 | slash: 3.0.0 2776 | stack-utils: 2.0.6 2777 | 2778 | jest-mock@29.7.0: 2779 | dependencies: 2780 | '@jest/types': 29.6.3 2781 | '@types/node': 22.13.11 2782 | jest-util: 29.7.0 2783 | 2784 | jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2785 | optionalDependencies: 2786 | jest-resolve: 29.7.0 2787 | 2788 | jest-regex-util@29.6.3: {} 2789 | 2790 | jest-resolve-dependencies@29.7.0: 2791 | dependencies: 2792 | jest-regex-util: 29.6.3 2793 | jest-snapshot: 29.7.0 2794 | transitivePeerDependencies: 2795 | - supports-color 2796 | 2797 | jest-resolve@29.7.0: 2798 | dependencies: 2799 | chalk: 4.1.2 2800 | graceful-fs: 4.2.11 2801 | jest-haste-map: 29.7.0 2802 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2803 | jest-util: 29.7.0 2804 | jest-validate: 29.7.0 2805 | resolve: 1.22.10 2806 | resolve.exports: 2.0.3 2807 | slash: 3.0.0 2808 | 2809 | jest-runner@29.7.0: 2810 | dependencies: 2811 | '@jest/console': 29.7.0 2812 | '@jest/environment': 29.7.0 2813 | '@jest/test-result': 29.7.0 2814 | '@jest/transform': 29.7.0 2815 | '@jest/types': 29.6.3 2816 | '@types/node': 22.13.11 2817 | chalk: 4.1.2 2818 | emittery: 0.13.1 2819 | graceful-fs: 4.2.11 2820 | jest-docblock: 29.7.0 2821 | jest-environment-node: 29.7.0 2822 | jest-haste-map: 29.7.0 2823 | jest-leak-detector: 29.7.0 2824 | jest-message-util: 29.7.0 2825 | jest-resolve: 29.7.0 2826 | jest-runtime: 29.7.0 2827 | jest-util: 29.7.0 2828 | jest-watcher: 29.7.0 2829 | jest-worker: 29.7.0 2830 | p-limit: 3.1.0 2831 | source-map-support: 0.5.13 2832 | transitivePeerDependencies: 2833 | - supports-color 2834 | 2835 | jest-runtime@29.7.0: 2836 | dependencies: 2837 | '@jest/environment': 29.7.0 2838 | '@jest/fake-timers': 29.7.0 2839 | '@jest/globals': 29.7.0 2840 | '@jest/source-map': 29.6.3 2841 | '@jest/test-result': 29.7.0 2842 | '@jest/transform': 29.7.0 2843 | '@jest/types': 29.6.3 2844 | '@types/node': 22.13.11 2845 | chalk: 4.1.2 2846 | cjs-module-lexer: 1.4.3 2847 | collect-v8-coverage: 1.0.2 2848 | glob: 7.2.3 2849 | graceful-fs: 4.2.11 2850 | jest-haste-map: 29.7.0 2851 | jest-message-util: 29.7.0 2852 | jest-mock: 29.7.0 2853 | jest-regex-util: 29.6.3 2854 | jest-resolve: 29.7.0 2855 | jest-snapshot: 29.7.0 2856 | jest-util: 29.7.0 2857 | slash: 3.0.0 2858 | strip-bom: 4.0.0 2859 | transitivePeerDependencies: 2860 | - supports-color 2861 | 2862 | jest-snapshot@29.7.0: 2863 | dependencies: 2864 | '@babel/core': 7.26.10 2865 | '@babel/generator': 7.26.10 2866 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) 2867 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) 2868 | '@babel/types': 7.26.10 2869 | '@jest/expect-utils': 29.7.0 2870 | '@jest/transform': 29.7.0 2871 | '@jest/types': 29.6.3 2872 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) 2873 | chalk: 4.1.2 2874 | expect: 29.7.0 2875 | graceful-fs: 4.2.11 2876 | jest-diff: 29.7.0 2877 | jest-get-type: 29.6.3 2878 | jest-matcher-utils: 29.7.0 2879 | jest-message-util: 29.7.0 2880 | jest-util: 29.7.0 2881 | natural-compare: 1.4.0 2882 | pretty-format: 29.7.0 2883 | semver: 7.7.1 2884 | transitivePeerDependencies: 2885 | - supports-color 2886 | 2887 | jest-util@29.7.0: 2888 | dependencies: 2889 | '@jest/types': 29.6.3 2890 | '@types/node': 22.13.11 2891 | chalk: 4.1.2 2892 | ci-info: 3.9.0 2893 | graceful-fs: 4.2.11 2894 | picomatch: 2.3.1 2895 | 2896 | jest-validate@29.7.0: 2897 | dependencies: 2898 | '@jest/types': 29.6.3 2899 | camelcase: 6.3.0 2900 | chalk: 4.1.2 2901 | jest-get-type: 29.6.3 2902 | leven: 3.1.0 2903 | pretty-format: 29.7.0 2904 | 2905 | jest-watcher@29.7.0: 2906 | dependencies: 2907 | '@jest/test-result': 29.7.0 2908 | '@jest/types': 29.6.3 2909 | '@types/node': 22.13.11 2910 | ansi-escapes: 4.3.2 2911 | chalk: 4.1.2 2912 | emittery: 0.13.1 2913 | jest-util: 29.7.0 2914 | string-length: 4.0.2 2915 | 2916 | jest-worker@29.7.0: 2917 | dependencies: 2918 | '@types/node': 22.13.11 2919 | jest-util: 29.7.0 2920 | merge-stream: 2.0.0 2921 | supports-color: 8.1.1 2922 | 2923 | jest@29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)): 2924 | dependencies: 2925 | '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 2926 | '@jest/types': 29.6.3 2927 | import-local: 3.2.0 2928 | jest-cli: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 2929 | transitivePeerDependencies: 2930 | - '@types/node' 2931 | - babel-plugin-macros 2932 | - supports-color 2933 | - ts-node 2934 | 2935 | js-tokens@4.0.0: {} 2936 | 2937 | js-yaml@3.14.1: 2938 | dependencies: 2939 | argparse: 1.0.10 2940 | esprima: 4.0.1 2941 | 2942 | jsesc@3.1.0: {} 2943 | 2944 | json-parse-even-better-errors@2.3.1: {} 2945 | 2946 | json5@2.2.3: {} 2947 | 2948 | jsonfile@6.1.0: 2949 | dependencies: 2950 | universalify: 2.0.1 2951 | optionalDependencies: 2952 | graceful-fs: 4.2.11 2953 | 2954 | kleur@3.0.3: {} 2955 | 2956 | leven@3.1.0: {} 2957 | 2958 | lines-and-columns@1.2.4: {} 2959 | 2960 | locate-path@5.0.0: 2961 | dependencies: 2962 | p-locate: 4.1.0 2963 | 2964 | lodash.memoize@4.1.2: {} 2965 | 2966 | lru-cache@5.1.1: 2967 | dependencies: 2968 | yallist: 3.1.1 2969 | 2970 | make-dir@4.0.0: 2971 | dependencies: 2972 | semver: 7.7.1 2973 | 2974 | make-error@1.3.6: {} 2975 | 2976 | makeerror@1.0.12: 2977 | dependencies: 2978 | tmpl: 1.0.5 2979 | 2980 | merge-stream@2.0.0: {} 2981 | 2982 | micromatch@4.0.8: 2983 | dependencies: 2984 | braces: 3.0.3 2985 | picomatch: 2.3.1 2986 | 2987 | mimic-fn@2.1.0: {} 2988 | 2989 | minimatch@3.1.2: 2990 | dependencies: 2991 | brace-expansion: 1.1.11 2992 | 2993 | minimatch@5.1.6: 2994 | dependencies: 2995 | brace-expansion: 2.0.1 2996 | 2997 | ms@2.1.3: {} 2998 | 2999 | natural-compare@1.4.0: {} 3000 | 3001 | node-int64@0.4.0: {} 3002 | 3003 | node-releases@2.0.19: {} 3004 | 3005 | normalize-path@3.0.0: {} 3006 | 3007 | npm-run-path@4.0.1: 3008 | dependencies: 3009 | path-key: 3.1.1 3010 | 3011 | once@1.4.0: 3012 | dependencies: 3013 | wrappy: 1.0.2 3014 | 3015 | onetime@5.1.2: 3016 | dependencies: 3017 | mimic-fn: 2.1.0 3018 | 3019 | p-limit@2.3.0: 3020 | dependencies: 3021 | p-try: 2.2.0 3022 | 3023 | p-limit@3.1.0: 3024 | dependencies: 3025 | yocto-queue: 0.1.0 3026 | 3027 | p-locate@4.1.0: 3028 | dependencies: 3029 | p-limit: 2.3.0 3030 | 3031 | p-try@2.2.0: {} 3032 | 3033 | parse-json@5.2.0: 3034 | dependencies: 3035 | '@babel/code-frame': 7.26.2 3036 | error-ex: 1.3.2 3037 | json-parse-even-better-errors: 2.3.1 3038 | lines-and-columns: 1.2.4 3039 | 3040 | path-exists@4.0.0: {} 3041 | 3042 | path-is-absolute@1.0.1: {} 3043 | 3044 | path-key@3.1.1: {} 3045 | 3046 | path-parse@1.0.7: {} 3047 | 3048 | picocolors@1.1.1: {} 3049 | 3050 | picomatch@2.3.1: {} 3051 | 3052 | pirates@4.0.6: {} 3053 | 3054 | pkg-dir@4.2.0: 3055 | dependencies: 3056 | find-up: 4.1.0 3057 | 3058 | pretty-format@29.7.0: 3059 | dependencies: 3060 | '@jest/schemas': 29.6.3 3061 | ansi-styles: 5.2.0 3062 | react-is: 18.3.1 3063 | 3064 | prompts@2.4.2: 3065 | dependencies: 3066 | kleur: 3.0.3 3067 | sisteransi: 1.0.5 3068 | 3069 | pure-rand@6.1.0: {} 3070 | 3071 | react-is@18.3.1: {} 3072 | 3073 | require-directory@2.1.1: {} 3074 | 3075 | resolve-cwd@3.0.0: 3076 | dependencies: 3077 | resolve-from: 5.0.0 3078 | 3079 | resolve-from@5.0.0: {} 3080 | 3081 | resolve-pkg-maps@1.0.0: {} 3082 | 3083 | resolve.exports@2.0.3: {} 3084 | 3085 | resolve@1.22.10: 3086 | dependencies: 3087 | is-core-module: 2.16.1 3088 | path-parse: 1.0.7 3089 | supports-preserve-symlinks-flag: 1.0.0 3090 | 3091 | semver@6.3.1: {} 3092 | 3093 | semver@7.7.1: {} 3094 | 3095 | sharp@0.33.5: 3096 | dependencies: 3097 | color: 4.2.3 3098 | detect-libc: 2.0.3 3099 | semver: 7.7.1 3100 | optionalDependencies: 3101 | '@img/sharp-darwin-arm64': 0.33.5 3102 | '@img/sharp-darwin-x64': 0.33.5 3103 | '@img/sharp-libvips-darwin-arm64': 1.0.4 3104 | '@img/sharp-libvips-darwin-x64': 1.0.4 3105 | '@img/sharp-libvips-linux-arm': 1.0.5 3106 | '@img/sharp-libvips-linux-arm64': 1.0.4 3107 | '@img/sharp-libvips-linux-s390x': 1.0.4 3108 | '@img/sharp-libvips-linux-x64': 1.0.4 3109 | '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 3110 | '@img/sharp-libvips-linuxmusl-x64': 1.0.4 3111 | '@img/sharp-linux-arm': 0.33.5 3112 | '@img/sharp-linux-arm64': 0.33.5 3113 | '@img/sharp-linux-s390x': 0.33.5 3114 | '@img/sharp-linux-x64': 0.33.5 3115 | '@img/sharp-linuxmusl-arm64': 0.33.5 3116 | '@img/sharp-linuxmusl-x64': 0.33.5 3117 | '@img/sharp-wasm32': 0.33.5 3118 | '@img/sharp-win32-ia32': 0.33.5 3119 | '@img/sharp-win32-x64': 0.33.5 3120 | 3121 | shebang-command@2.0.0: 3122 | dependencies: 3123 | shebang-regex: 3.0.0 3124 | 3125 | shebang-regex@3.0.0: {} 3126 | 3127 | signal-exit@3.0.7: {} 3128 | 3129 | simple-swizzle@0.2.2: 3130 | dependencies: 3131 | is-arrayish: 0.3.2 3132 | 3133 | sisteransi@1.0.5: {} 3134 | 3135 | slash@3.0.0: {} 3136 | 3137 | source-map-support@0.5.13: 3138 | dependencies: 3139 | buffer-from: 1.1.2 3140 | source-map: 0.6.1 3141 | 3142 | source-map@0.6.1: {} 3143 | 3144 | sprintf-js@1.0.3: {} 3145 | 3146 | stack-utils@2.0.6: 3147 | dependencies: 3148 | escape-string-regexp: 2.0.0 3149 | 3150 | string-length@4.0.2: 3151 | dependencies: 3152 | char-regex: 1.0.2 3153 | strip-ansi: 6.0.1 3154 | 3155 | string-width@4.2.3: 3156 | dependencies: 3157 | emoji-regex: 8.0.0 3158 | is-fullwidth-code-point: 3.0.0 3159 | strip-ansi: 6.0.1 3160 | 3161 | strip-ansi@6.0.1: 3162 | dependencies: 3163 | ansi-regex: 5.0.1 3164 | 3165 | strip-bom@4.0.0: {} 3166 | 3167 | strip-final-newline@2.0.0: {} 3168 | 3169 | strip-json-comments@3.1.1: {} 3170 | 3171 | supports-color@7.2.0: 3172 | dependencies: 3173 | has-flag: 4.0.0 3174 | 3175 | supports-color@8.1.1: 3176 | dependencies: 3177 | has-flag: 4.0.0 3178 | 3179 | supports-preserve-symlinks-flag@1.0.0: {} 3180 | 3181 | test-exclude@6.0.0: 3182 | dependencies: 3183 | '@istanbuljs/schema': 0.1.3 3184 | glob: 7.2.3 3185 | minimatch: 3.1.2 3186 | 3187 | tmpl@1.0.5: {} 3188 | 3189 | to-regex-range@5.0.1: 3190 | dependencies: 3191 | is-number: 7.0.0 3192 | 3193 | ts-jest@29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)))(typescript@5.8.2): 3194 | dependencies: 3195 | bs-logger: 0.2.6 3196 | ejs: 3.1.10 3197 | fast-json-stable-stringify: 2.1.0 3198 | jest: 29.7.0(@types/node@22.13.11)(ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2)) 3199 | jest-util: 29.7.0 3200 | json5: 2.2.3 3201 | lodash.memoize: 4.1.2 3202 | make-error: 1.3.6 3203 | semver: 7.7.1 3204 | typescript: 5.8.2 3205 | yargs-parser: 21.1.1 3206 | optionalDependencies: 3207 | '@babel/core': 7.26.10 3208 | '@jest/transform': 29.7.0 3209 | '@jest/types': 29.6.3 3210 | babel-jest: 29.7.0(@babel/core@7.26.10) 3211 | 3212 | ts-node@10.9.2(@types/node@22.13.11)(typescript@5.8.2): 3213 | dependencies: 3214 | '@cspotcode/source-map-support': 0.8.1 3215 | '@tsconfig/node10': 1.0.11 3216 | '@tsconfig/node12': 1.0.11 3217 | '@tsconfig/node14': 1.0.3 3218 | '@tsconfig/node16': 1.0.4 3219 | '@types/node': 22.13.11 3220 | acorn: 8.14.1 3221 | acorn-walk: 8.3.4 3222 | arg: 4.1.3 3223 | create-require: 1.1.1 3224 | diff: 4.0.2 3225 | make-error: 1.3.6 3226 | typescript: 5.8.2 3227 | v8-compile-cache-lib: 3.0.1 3228 | yn: 3.1.1 3229 | 3230 | tslib@2.8.1: 3231 | optional: true 3232 | 3233 | tsx@4.19.3: 3234 | dependencies: 3235 | esbuild: 0.25.1 3236 | get-tsconfig: 4.10.0 3237 | optionalDependencies: 3238 | fsevents: 2.3.3 3239 | 3240 | type-detect@4.0.8: {} 3241 | 3242 | type-fest@0.21.3: {} 3243 | 3244 | typescript@5.8.2: {} 3245 | 3246 | undici-types@6.20.0: {} 3247 | 3248 | universalify@2.0.1: {} 3249 | 3250 | update-browserslist-db@1.1.3(browserslist@4.24.4): 3251 | dependencies: 3252 | browserslist: 4.24.4 3253 | escalade: 3.2.0 3254 | picocolors: 1.1.1 3255 | 3256 | v8-compile-cache-lib@3.0.1: {} 3257 | 3258 | v8-to-istanbul@9.3.0: 3259 | dependencies: 3260 | '@jridgewell/trace-mapping': 0.3.25 3261 | '@types/istanbul-lib-coverage': 2.0.6 3262 | convert-source-map: 2.0.0 3263 | 3264 | walker@1.0.8: 3265 | dependencies: 3266 | makeerror: 1.0.12 3267 | 3268 | which@2.0.2: 3269 | dependencies: 3270 | isexe: 2.0.0 3271 | 3272 | wrap-ansi@7.0.0: 3273 | dependencies: 3274 | ansi-styles: 4.3.0 3275 | string-width: 4.2.3 3276 | strip-ansi: 6.0.1 3277 | 3278 | wrappy@1.0.2: {} 3279 | 3280 | write-file-atomic@4.0.2: 3281 | dependencies: 3282 | imurmurhash: 0.1.4 3283 | signal-exit: 3.0.7 3284 | 3285 | y18n@5.0.8: {} 3286 | 3287 | yallist@3.1.1: {} 3288 | 3289 | yargs-parser@21.1.1: {} 3290 | 3291 | yargs@17.7.2: 3292 | dependencies: 3293 | cliui: 8.0.1 3294 | escalade: 3.2.0 3295 | get-caller-file: 2.0.5 3296 | require-directory: 2.1.1 3297 | string-width: 4.2.3 3298 | y18n: 5.0.8 3299 | yargs-parser: 21.1.1 3300 | 3301 | yn@3.1.1: {} 3302 | 3303 | yocto-queue@0.1.0: {} 3304 | -------------------------------------------------------------------------------- /src/convert.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import sharp from "sharp"; 3 | 4 | /** 5 | * Converts a WebP image to PNG format 6 | * @param {string} inputPath - Path to the WebP image 7 | * @param {string} outputPath - Path where the PNG image will be saved 8 | * @returns {Promise} - A promise that resolves when conversion is complete 9 | */ 10 | export async function convertWebPToPNG( 11 | inputPath: string, 12 | outputPath: string, 13 | ): Promise { 14 | try { 15 | console.log(chalk.blue(`[ℹ] Converting WebP to PNG: ${outputPath}`)); 16 | await sharp(inputPath).png().toFile(outputPath); 17 | console.log(chalk.green("[✔] Succesfully converted to PNG")); 18 | } catch (error) { 19 | console.error(chalk.red("[✘] Failed to convert WebP to PNG:"), error); 20 | throw error; 21 | } 22 | } 23 | 24 | /** 25 | * Converts a PNG image to WebP format 26 | * @param {string} inputPath - Path to the PNG image 27 | * @param {string} outputPath - Path where the WebP image will be saved 28 | * @returns {Promise} - A promise that resolves when conversion is complete 29 | */ 30 | export async function convertPNGToWebP( 31 | inputPath: string, 32 | outputPath: string, 33 | ): Promise { 34 | try { 35 | console.log(chalk.blue(`[ℹ] Converting PNG to WebP: ${outputPath}`)); 36 | await sharp(inputPath).webp({ quality: 95 }).toFile(outputPath); 37 | console.log(chalk.green("[✔] Succesfully converted to WebP")); 38 | } catch (error) { 39 | console.error(chalk.red("[✘] Failed to convert PNG to WebP:"), error); 40 | throw error; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import chalk from "chalk"; 4 | import { Command } from "commander"; 5 | import fs from "fs"; 6 | import path from "path"; 7 | import { convertPNGToWebP, convertWebPToPNG } from "./convert.js"; 8 | import { resizeWebP } from "./resize.js"; 9 | 10 | const program = new Command(); 11 | 12 | program 13 | .name("process-web-image") 14 | .description( 15 | "An image processor that creates a webp file, a fallback png, and resizes it in tailwind breakpoints", 16 | ) 17 | .argument("", "Path to the image file") 18 | .option( 19 | "--dump", 20 | "Save files to the current directory instead of creating a new folder", 21 | ) 22 | .action(async (filePath, options) => { 23 | console.log(chalk.blue("[ℹ] Starting Image Processor...")); 24 | 25 | if (!fs.existsSync(filePath)) { 26 | console.error(chalk.red("[✘] File does not exist.")); 27 | process.exit(1); 28 | } 29 | 30 | const extension = path.extname(filePath).toLowerCase(); 31 | const fileName = path.basename(filePath, extension); 32 | 33 | if (!extension) { 34 | console.error(chalk.red("[✘] File has no extension.")); 35 | process.exit(1); 36 | } 37 | 38 | const fileDir = path.dirname(filePath); 39 | const outputDir = options.dump ? fileDir : path.join(fileDir, fileName); 40 | let dirCreated = false; 41 | 42 | if (!options.dump) { 43 | try { 44 | fs.mkdirSync(outputDir, { mode: 0o755 }); 45 | dirCreated = true; 46 | } catch (err) { 47 | console.error(chalk.red("[✘] Failed to create directory:"), outputDir); 48 | process.exit(1); 49 | } 50 | } 51 | 52 | const originalFileName = path.join(outputDir, fileName); 53 | const cleanExtension = extension.replace(".", ""); 54 | console.log(chalk.yellow(`[→] Starting Image Conversions...`)); 55 | try { 56 | switch (cleanExtension) { 57 | case "png": 58 | await convertPNGToWebP(filePath, `${originalFileName}.webp`); 59 | if (!options.dump) 60 | fs.copyFileSync(filePath, `${originalFileName}.png`); 61 | break; 62 | case "webp": 63 | await convertWebPToPNG(filePath, `${originalFileName}.png`); 64 | if (!options.dump) 65 | fs.copyFileSync(filePath, `${originalFileName}.webp`); 66 | break; 67 | default: 68 | console.error( 69 | chalk.red( 70 | "[✘] Invalid file extension. Only PNG and WebP are supported.", 71 | ), 72 | ); 73 | if (dirCreated) 74 | fs.rmSync(outputDir, { recursive: true, force: true }); 75 | process.exit(1); 76 | } 77 | 78 | console.log(chalk.yellow("[→] Starting Resize Operation...")); 79 | const baseResizeImage = options.dump 80 | ? filePath 81 | : `${originalFileName}.webp`; 82 | const sizes = { sm: 480, md: 768, lg: 1024, xl: 1280 }; 83 | await resizeWebP(fileName, baseResizeImage, sizes, outputDir); 84 | 85 | console.log(chalk.green("[✔] Finished Image Processing.")); 86 | console.log(chalk.magenta(`[✔✔] Files saved to: ${outputDir}`)); 87 | } catch (err) { 88 | console.error(chalk.red("[✘] Processing error:"), err); 89 | if (dirCreated) fs.rmSync(outputDir, { recursive: true, force: true }); 90 | process.exit(1); 91 | } 92 | }); 93 | 94 | program.parse(process.argv); 95 | -------------------------------------------------------------------------------- /src/resize.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import path from "path"; 3 | import sharp from "sharp"; 4 | 5 | /** 6 | * Resizes a WebP image to multiple sizes 7 | * @param {string} fileName - Base name for the output files 8 | * @param {string} inputPath - Path to the WebP image 9 | * @param {Record} sizes - Object mapping size names to width in pixels 10 | * @param {string} outputDir - Directory where resized images will be saved 11 | * @returns {Promise} - A promise that resolves when all resizing operations are complete 12 | */ 13 | export async function resizeWebP( 14 | fileName: string, 15 | inputPath: string, 16 | sizes: Record, 17 | outputDir: string, 18 | ): Promise { 19 | console.log(chalk.yellow(`[→] Starting resizing for: ${inputPath}`)); 20 | 21 | const inputImage = sharp(inputPath); 22 | for (const [sizeName, width] of Object.entries(sizes)) { 23 | try { 24 | const outputPath = path.join(outputDir, `${fileName}_${sizeName}.webp`); 25 | console.log( 26 | chalk.blue(`[ℹ] Resizing to ${sizeName} (${width}px): ${outputPath}`), 27 | ); 28 | 29 | await inputImage 30 | .clone() 31 | .resize({ width, kernel: "lanczos3" }) 32 | .webp({ quality: 95 }) 33 | .toFile(outputPath); 34 | 35 | console.log(chalk.green(`[✔] Successfully resized to ${sizeName}`)); 36 | } catch (error) { 37 | console.error(chalk.red(`[✘] Failed resizing to ${sizeName}:`), error); 38 | } 39 | } 40 | console.log(chalk.green("[✔] All resize operations completed.")); 41 | } 42 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": [ 5 | "esnext" 6 | ], 7 | "allowJs": true, 8 | "skipLibCheck": true, 9 | "strict": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "outDir": "bin", 15 | "declaration": false, 16 | "isolatedModules": true, 17 | "noUnusedLocals": false, 18 | "noUnusedParameters": false, 19 | "incremental": true, 20 | "paths": { 21 | "@/*": [ 22 | "./src/*" 23 | ] 24 | } 25 | }, 26 | "include": [ 27 | "src/**/*.ts" 28 | ], 29 | "exclude": [ 30 | "node_modules", 31 | "examples", 32 | "**/*.test.ts", 33 | "**/helpers/**/*" 34 | ], 35 | "ts-node": { 36 | "esm": true, 37 | "experimentalSpecifierResolution": "node" 38 | } 39 | } 40 | --------------------------------------------------------------------------------