diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index 83f71c80..0817a9a0 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -5,7 +5,7 @@ on: types: [published] jobs: - package: + publish_npm: runs-on: windows-latest permissions: @@ -30,9 +30,6 @@ jobs: - name: Install node-gyp run: npm install -g node-gyp - - name: Install dependencies - run: yarn install --ignore-scripts - - name: Build package run: npm run build diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index ed76c5aa..fa1a624d 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -5,29 +5,30 @@ on: types: [opened, synchronize, reopened] jobs: - checks: + pull_request: runs-on: windows-latest + permissions: + contents: read + id-token: write + packages: write + steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 - - name: Install dependencies - run: yarn install --ignore-scripts - - - name: Run TypeScript compiler - run: npm run type-check - - - name: Run Prettier - run: npm run format + - name: Setup Python + uses: actions/setup-python@v3 + with: + python-version: "3.10" - - name: Run Eslint - run: npm run lint + - name: Install node-gyp + run: npm install -g node-gyp - - name: Run tests - run: npm run test:once + - name: Build package + run: npm run build diff --git a/.gitignore b/.gitignore index bc299f21..7d4adc46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,4 @@ -/.env /.vscode -/addon.node /build /dist -/examples/tmp -/node_modules -/package-lock.json -/test-files /venv \ No newline at end of file diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 56d7ef99..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - arrowParens: "always", - bracketSameLine: true, - bracketSpacing: true, - endOfLine: "crlf", - importOrder: ["^@/(.*)$", "^[./]"], - importOrderParserPlugins: ["typescript", "decorators-legacy"], - importOrderSeparation: true, - plugins: [require.resolve("@trivago/prettier-plugin-sort-imports")], - printWidth: 120, - proseWrap: "never", - semi: true, - singleQuote: false, - tabWidth: 2, - trailingComma: "all", - useTabs: false, -}; diff --git a/README.md b/README.md index 5a52cfcb..e3e45cce 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/internxt/node-win) + # Setup This guide explains how to set up and build the `node-win` project. @@ -13,12 +15,6 @@ Before proceeding, ensure you have the following tools installed: nvm install 18 ``` -- **yarn** - -```bash -npm install -g yarn -``` - - **node-gyp** ```bash diff --git a/assets/icon.ico b/assets/icon.ico deleted file mode 100644 index b0ff735f..00000000 Binary files a/assets/icon.ico and /dev/null differ diff --git a/bin/win32-x64-118/node-win.node b/bin/win32-x64-118/node-win.node new file mode 100644 index 00000000..4d7b852f Binary files /dev/null and b/bin/win32-x64-118/node-win.node differ diff --git a/binding.gyp b/binding.gyp index d5767ea6..ca45c750 100644 --- a/binding.gyp +++ b/binding.gyp @@ -53,12 +53,6 @@ "addon" ], "copies": [ - { - "destination": ".", - "files": [ - "<(PRODUCT_DIR)/addon.node" - ] - }, { "destination": "dist", "files": [ diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 2eb0cdb7..00000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,17 +0,0 @@ -import js from "@eslint/js"; -import { defineConfig, globalIgnores } from "eslint/config"; -import globals from "globals"; -import tseslint from "typescript-eslint"; - -export default defineConfig([ - { files: ["**/*.{js,mjs,cjs,ts}"], plugins: { js }, extends: ["js/recommended"] }, - { files: ["**/*.{js,mjs,cjs,ts}"], languageOptions: { globals: globals.node } }, - tseslint.configs.recommended, - globalIgnores(["dist"]), - { - rules: { - "@typescript-eslint/no-explicit-any": "warn", - "object-shorthand": "error", - }, - }, -]); diff --git a/examples/callbacks/cancel-fetch-data.callback.ts b/examples/callbacks/cancel-fetch-data.callback.ts deleted file mode 100644 index 8a9ab730..00000000 --- a/examples/callbacks/cancel-fetch-data.callback.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { logger } from "examples/drive"; - -export const cancelFetchDataCallback = (fileId: string) => { - logger.debug({ msg: "cancelFetchDataCallback", fileId }); -}; diff --git a/examples/callbacks/notify-delete.callback.ts b/examples/callbacks/notify-delete.callback.ts deleted file mode 100644 index b8b2fe73..00000000 --- a/examples/callbacks/notify-delete.callback.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { logger } from "examples/drive"; - -export const notifyDeleteCallback = (fileId: string, callback: (response: boolean) => void) => { - logger.debug({ msg: "notifyDeleteCallback", fileId }); - callback(true); -}; diff --git a/examples/callbacks/notify-fetch-data.callback.ts b/examples/callbacks/notify-fetch-data.callback.ts deleted file mode 100644 index 45febbb4..00000000 --- a/examples/callbacks/notify-fetch-data.callback.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { logger } from "examples/drive"; -import { getInfoItem } from "examples/info-items-manager"; - -import { TFetchDataCallback } from "@/types/callbacks.type"; -import { sleep } from "@/utils"; - -export const fetchDataCallback = async (id: string, callback: Parameters[1]) => { - logger.debug({ msg: "fetchDataCallback", id }); - const path = await getInfoItem(id); - - let finish = false; - while (!finish) { - const result = await callback(true, path); - finish = result.finished; - await sleep(1000); - } -}; diff --git a/examples/callbacks/notify-message.callback.ts b/examples/callbacks/notify-message.callback.ts deleted file mode 100644 index 530b5d2c..00000000 --- a/examples/callbacks/notify-message.callback.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { logger } from "examples/drive"; - -export const notifyMessageCallback = ( - message: string, - action: string, - errorName: string, - callback: (response: boolean) => void, -) => { - logger.debug({ msg: "notifyMessageCallback", message, action, errorName }); - callback(true); -}; diff --git a/examples/callbacks/notify-rename.callback.ts b/examples/callbacks/notify-rename.callback.ts deleted file mode 100644 index 513949f4..00000000 --- a/examples/callbacks/notify-rename.callback.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { logger } from "examples/drive"; - -export const notifyRenameCallback = (newName: string, fileId: string, callback: (response: boolean) => void) => { - logger.debug({ msg: "notifyRenameCallback", newName, fileId }); - callback(true); -}; diff --git a/examples/disconnect.ts b/examples/disconnect.ts deleted file mode 100644 index 95a800bc..00000000 --- a/examples/disconnect.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { drive } from "./drive"; - -drive.disconnectSyncRoot(); diff --git a/examples/drive.ts b/examples/drive.ts deleted file mode 100644 index c1b5a5e3..00000000 --- a/examples/drive.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TBody } from "@/logger"; -import VirtualDrive from "@/virtual-drive"; - -import settings from "./settings"; - -export const logger = { - debug(body: TBody) { - console.debug(body); - }, - info(body: TBody) { - console.info(body); - }, - warn(body: TBody) { - console.warn(body); - }, - error(body: TBody) { - console.error(body); - }, -}; - -export const drive = new VirtualDrive({ - syncRootPath: settings.syncRootPath, - providerId: settings.providerid, - loggerPath: settings.defaultLogPath, - logger, -}); diff --git a/examples/get-state.ts b/examples/get-state.ts deleted file mode 100644 index 980fc5f9..00000000 --- a/examples/get-state.ts +++ /dev/null @@ -1,27 +0,0 @@ -import yargs from "yargs"; -import z from "zod"; - -import { drive, logger } from "./drive"; - -const argv = yargs - .command("file", "El path del archivo para obtener el estado", { - path: { - description: "el path del archivo", - alias: "f", - type: "string", - }, - }) - .help() - .alias("help", "h").argv; - -const { data } = z.object({ file: z.string() }).safeParse(argv); - -if (data) { - const path = data.file; - const state = drive.getPlaceholderState({ - path, - }); - logger.debug({ msg: "state", state }); -} else { - logger.error({ msg: "Please specify a file with --file " }); -} diff --git a/examples/handlers/handle-add.ts b/examples/handlers/handle-add.ts deleted file mode 100644 index 4e6a50da..00000000 --- a/examples/handlers/handle-add.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { drive, logger } from "examples/drive"; -import { addInfoItem } from "examples/info-items-manager"; -import { v4 } from "uuid"; - -import { QueueItem } from "@/queue/queueManager"; - -export const handleAdd = async (task: QueueItem) => { - try { - logger.debug({ msg: "handleAdd", task }); - const id = task.isFolder ? v4() : addInfoItem(task.path); - drive.convertToPlaceholder({ - itemPath: task.path, - id, - }); - } catch (error) { - logger.error({ msg: "handleAdd", error }); - } -}; diff --git a/examples/handlers/handle-change-size.ts b/examples/handlers/handle-change-size.ts deleted file mode 100644 index fcc54712..00000000 --- a/examples/handlers/handle-change-size.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { drive, logger } from "examples/drive"; -import { v4 } from "uuid"; - -import { QueueItem } from "@/queue/queueManager"; - -export const handleChangeSize = async (task: QueueItem) => { - try { - logger.debug({ msg: "handleChangeSize", path: task.path }); - const id = v4(); - drive.convertToPlaceholder({ - itemPath: task.path, - id, - }); - drive.updateFileIdentity({ - itemPath: task.path, - id, - isDirectory: task.isFolder, - }); - } catch (error) { - logger.error({ msg: "handleChangeSize", error }); - } -}; diff --git a/examples/handlers/handle-dehydrate.ts b/examples/handlers/handle-dehydrate.ts deleted file mode 100644 index 6d3da690..00000000 --- a/examples/handlers/handle-dehydrate.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { drive, logger } from "examples/drive"; - -import { QueueItem } from "@/queue/queueManager"; - -export const handleDehydrate = async (task: QueueItem) => { - try { - logger.debug({ msg: "handleDehydrate", path: task.path }); - drive.dehydrateFile({ - itemPath: task.path, - }); - } catch (error) { - logger.error({ msg: "handleDehydrate", error }); - } -}; diff --git a/examples/handlers/handle-hydrate.ts b/examples/handlers/handle-hydrate.ts deleted file mode 100644 index aab8616b..00000000 --- a/examples/handlers/handle-hydrate.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { drive, logger } from "examples/drive"; - -import { QueueItem } from "@/queue/queueManager"; - -export const handleHydrate = async (task: QueueItem) => { - try { - logger.debug({ msg: "handleHydrate", path: task.path }); - await drive.hydrateFile({ - itemPath: task.path, - }); - } catch (error) { - logger.error({ msg: "handleHydrate", error }); - } -}; diff --git a/examples/info-items-manager.ts b/examples/info-items-manager.ts deleted file mode 100644 index 74cf1643..00000000 --- a/examples/info-items-manager.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; -import { basename, join } from "path"; -import { v4 } from "uuid"; - -import { TMP_PATH } from "./settings"; - -const infoItemsPath = join(TMP_PATH, "info-items.json"); -const serverPath = join(TMP_PATH, "fake-server"); - -export const initInfoItems = () => { - if (!existsSync(infoItemsPath)) { - writeFileSync(infoItemsPath, JSON.stringify({})); - } - - if (!existsSync(serverPath)) { - mkdirSync(serverPath); - } -}; - -export const getInfoItems = () => { - return JSON.parse(readFileSync(infoItemsPath, "utf8")); -}; - -export const deleteInfoItems = () => { - writeFileSync(infoItemsPath, JSON.stringify({})); -}; - -export const addInfoItem = (itemPath: string) => { - const fileName = basename(itemPath); - const serverItemPath = join(serverPath, fileName); - copyFileSync(itemPath, serverItemPath); - - const id = v4(); - const infoItems = getInfoItems(); - infoItems[id] = serverItemPath; - - writeFileSync(infoItemsPath, JSON.stringify(infoItems, null, 2)); - return id; -}; - -export const getInfoItem = (id: string) => { - const infoItems = getInfoItems(); - return infoItems[id]; -}; diff --git a/examples/populate.ts b/examples/populate.ts deleted file mode 100644 index eea362f8..00000000 --- a/examples/populate.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { execSync } from "child_process"; -import { join } from "path"; -import { v4 } from "uuid"; - -import "@/virtual-drive"; - -import settings from "./settings"; - -const rootFileName1 = v4(); -const rootZipFileName = `${v4()}.zip`; -const rootFile1 = join(settings.syncRootPath, rootFileName1); -const rootFile2ChangeSize = join(settings.syncRootPath, `change-size-${v4()}.txt`); -const rootFile3 = join(settings.syncRootPath, `${v4()}.txt`); -const rootFile3Moved = join(settings.syncRootPath, `moved-${v4()}.txt`); -const rootFile4 = join(settings.syncRootPath, `${v4()}.txt`); -const rootFolder1 = join(settings.syncRootPath, v4()); -const rootFolder2 = join(settings.syncRootPath, v4()); -const folder1File1 = join(rootFolder1, `${v4()}.pdf`); -const folder1Folder1 = join(rootFolder1, v4()); -const folder1Folder1File1 = join(folder1Folder1, `${v4()}.xlsx`); - -execSync(`echo Hello, world! > ${rootFile1}`); // Sync -execSync(`echo Hello, world! > ${rootFile2ChangeSize}`); -execSync(`echo Hello, world! >> ${rootFile2ChangeSize}`); // Sync -execSync(`echo Hello, world! > ${rootFile3}`); -execSync(`type nul > ${rootFile4}`); // No sync (0 bytes) -execSync(`cd ${settings.syncRootPath} && tar -cf ${rootZipFileName} ${rootFileName1}`); // Sync -execSync(`mv ${rootFile3} ${rootFile3Moved}`); // Sync -execSync(`mkdir ${rootFolder1}`); // Sync -execSync(`mkdir ${rootFolder2}`); // Cloud (no files inside) -execSync(`echo Hello, world! > ${folder1File1}`); // Sync -execSync(`mkdir ${folder1Folder1}`); // Sync -execSync(`echo Hello, world! > ${folder1Folder1File1}`); // Sync diff --git a/examples/register.ts b/examples/register.ts deleted file mode 100644 index e09e85ab..00000000 --- a/examples/register.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { QueueManager } from "@/queue/queue-manager"; - -import { cancelFetchDataCallback } from "./callbacks/cancel-fetch-data.callback"; -import { notifyDeleteCallback } from "./callbacks/notify-delete.callback"; -import { fetchDataCallback } from "./callbacks/notify-fetch-data.callback"; -import { notifyMessageCallback } from "./callbacks/notify-message.callback"; -import { notifyRenameCallback } from "./callbacks/notify-rename.callback"; -import { drive, logger } from "./drive"; -import { handleAdd } from "./handlers/handle-add"; -import { handleChangeSize } from "./handlers/handle-change-size"; -import { handleDehydrate } from "./handlers/handle-dehydrate"; -import { handleHydrate } from "./handlers/handle-hydrate"; -import { initInfoItems } from "./info-items-manager"; -import settings from "./settings"; - -const callbacks = { - notifyDeleteCallback, - notifyRenameCallback, - fetchDataCallback, - cancelFetchDataCallback, - notifyMessageCallback, -}; -const handlers = { handleAdd, handleHydrate, handleDehydrate, handleChangeSize }; - -const queueManager = new QueueManager({ handlers, persistPath: settings.queuePersistPath }); - -drive.registerSyncRoot({ - providerName: settings.driveName, - providerVersion: settings.driveVersion, - logoPath: settings.iconPath, -}); - -drive.connectSyncRoot({ callbacks }); - -try { - initInfoItems(); - drive.watchAndWait({ queueManager }); -} catch (error) { - logger.error({ msg: "Error when register", error }); - drive.disconnectSyncRoot(); - drive.unregisterSyncRoot(); -} diff --git a/examples/settings.ts b/examples/settings.ts deleted file mode 100644 index 0653b85a..00000000 --- a/examples/settings.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { mkdirSync } from "fs"; -import { join } from "path"; -import { cwd } from "process"; - -export const TMP_PATH = join(cwd(), "examples", "tmp"); -mkdirSync(TMP_PATH, { recursive: true }); - -const settings = { - driveName: "Internxt", - driveVersion: "2.0.4", - providerid: "{12345678-1234-1234-1234-123456789012}", - syncRootPath: join(TMP_PATH, "sync-root"), - iconPath: join(cwd(), "assets", "icon.ico"), - defaultLogPath: join(TMP_PATH, "drive.log"), - watcherLogPath: join(TMP_PATH, "watcher.log"), - queuePersistPath: join(TMP_PATH, "queue-manager.json"), -}; - -export default settings; diff --git a/examples/unregister.ts b/examples/unregister.ts deleted file mode 100644 index 586814b1..00000000 --- a/examples/unregister.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { drive } from "./drive"; -import { deleteInfoItems } from "./info-items-manager"; - -drive.unregisterSyncRoot(); -deleteInfoItems(); diff --git a/examples/utils.ts b/examples/utils.ts deleted file mode 100644 index fc0dd972..00000000 --- a/examples/utils.ts +++ /dev/null @@ -1,46 +0,0 @@ -import fs from "fs"; -import path from "path"; - -interface FileDetail { - path: string; - size: number; - baseDir: string; -} - -function readFilesRecursively(dir: string, fileList: FileDetail[] = []): FileDetail[] { - fs.readdirSync(dir).forEach((file) => { - const filePath = path.join(dir, file); - if (fs.statSync(filePath).isDirectory()) { - readFilesRecursively(filePath, fileList); - } else { - fileList.push({ - path: filePath, - size: fs.statSync(filePath).size, - baseDir: dir, - }); - } - }); - return fileList; -} - -function createFilesWithSize(sourceFolder: string, destFolder: string): void { - const files: FileDetail[] = readFilesRecursively(sourceFolder); - - if (!fs.existsSync(destFolder)) { - fs.mkdirSync(destFolder, { recursive: true }); - } - - files.forEach((file) => { - const relativePath = path.relative(file.baseDir, file.path); - const destFilePath = path.join(file.baseDir.replace(sourceFolder, destFolder), relativePath); //path.join(destFolder, relativePath); - const destFileDir = file.baseDir.replace(sourceFolder, destFolder); //path.dirname(destFilePath); - - if (!fs.existsSync(destFileDir)) { - fs.mkdirSync(destFileDir, { recursive: true }); - } - - fs.writeFileSync(destFilePath, Buffer.alloc(file.size)); - }); -} - -export { createFilesWithSize }; diff --git a/examples/utils/generate-random-file-tree.ts b/examples/utils/generate-random-file-tree.ts deleted file mode 100644 index fa4c798f..00000000 --- a/examples/utils/generate-random-file-tree.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { v4 as uuidv4 } from "uuid"; - -import VirtualDrive from "@/virtual-drive"; - -interface GenerateOptions { - rootPath: string; - depth: number; - filesPerFolder: number; - foldersPerLevel: number; - meanSize: number; - stdDev: number; - timeOffset?: number; -} - -function generateRandomId(): string { - return uuidv4(); -} - -function randomNormal(mean: number, stdDev: number): number { - const u1 = Math.random() || 1e-10; - const u2 = Math.random() || 1e-10; - const z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2); - - const value = z0 * stdDev + mean; - - return Math.max(value, 0); -} - -function getRandomExtension(): string { - const extensions = [".txt", ".pdf", ".rar", ".jpg", ".docx", ".xlsx", ".mp4", ".mkv", ".json", ""]; - const index = Math.floor(Math.random() * extensions.length); - return extensions[index]; -} - -async function createStructureRecursively( - drive: VirtualDrive, - currentPath: string, - level: number, - options: GenerateOptions, - result: Record, -): Promise { - if (level < 0) return; - - const { filesPerFolder, foldersPerLevel, meanSize, stdDev, timeOffset } = options; - - for (let i = 0; i < filesPerFolder; i++) { - const fileName = `file_${generateRandomId()}${getRandomExtension()}`; - const fullPath = `${currentPath}/${fileName}`; - - const fileSize = Math.floor(randomNormal(meanSize, stdDev)); - - const fileId = generateRandomId(); - const createdAt = Date.now() - (timeOffset || 0); - const updatedAt = Date.now() - (timeOffset || 0) + 2000; - - drive.createFileByPath({ - relativePath: fullPath, - itemId: fileId, - size: fileSize, - creationTime: createdAt, - lastWriteTime: updatedAt, - }); - - result[fileId] = fullPath; - } - - for (let j = 0; j < foldersPerLevel; j++) { - const folderName = `folder_${generateRandomId()}`; - const newFolderPath = `${currentPath}/${folderName}`; - - const folderId = generateRandomId(); - const createdAt = Date.now() - (timeOffset || 0) - 10000; // Ejemplo - const updatedAt = Date.now() - (timeOffset || 0); - - drive.createFolderByPath({ - relativePath: newFolderPath, - itemId: folderId, - creationTime: createdAt, - lastWriteTime: updatedAt, - }); - - await createStructureRecursively(drive, newFolderPath, level - 1, options, result); - } -} - -async function generateRandomFilesAndFolders( - drive: VirtualDrive, - options: GenerateOptions, -): Promise> { - const { rootPath } = options; - - const result: Record = {}; - - await createStructureRecursively(drive, rootPath, options.depth, options, result); - - return result; -} - -export { generateRandomFilesAndFolders }; -export type { GenerateOptions }; diff --git a/examples/utils/generate-random-tree.unit.test.ts b/examples/utils/generate-random-tree.unit.test.ts deleted file mode 100644 index 1031c193..00000000 --- a/examples/utils/generate-random-tree.unit.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { generateRandomFilesAndFolders } from "examples/utils/generate-random-file-tree"; - -import VirtualDrive from "@/virtual-drive"; - -class MockVirtualDrive implements Partial { - private files: Record = {}; - private folders: Record = {}; - - createFileByPath({ - relativePath, - itemId, - size = 0, - creationTime = Date.now(), - lastWriteTime = Date.now(), - }: { - relativePath: string; - itemId: string; - size?: number; - creationTime?: number; - lastWriteTime?: number; - }): void { - this.files[relativePath] = { itemId, size, creationTime, lastWriteTime }; - } - - createFolderByPath({ - relativePath, - itemId, - size = 0, - creationTime = Date.now(), - lastWriteTime = Date.now(), - }: { - relativePath: string; - itemId: string; - size?: number; - creationTime?: number; - lastWriteTime?: number; - }): void { - this.folders[relativePath] = { itemId, size, creationTime, lastWriteTime }; - } - - getFiles(): Record { - return this.files; - } -} - -describe("When call generateRandomFilesAndFolders", () => { - it("Then it generates the correct structure of files and folders with sizes following a normal distribution", async () => { - // Arrange - const mockDrive = new MockVirtualDrive(); - const meanSizeMB = 1; - const stdDevMB = 0.5; - const options = { - rootPath: "/root", - depth: 2, - filesPerFolder: 100, - foldersPerLevel: 2, - meanSize: meanSizeMB, - stdDev: stdDevMB, - timeOffset: 1000, - }; - - // Act - await generateRandomFilesAndFolders(mockDrive as unknown as VirtualDrive, options); - - // Assert - const files = mockDrive.getFiles(); - expect(Object.keys(files).length).toBeGreaterThan(0); - - const sizes = Object.values(files).map((file) => file.size / (1024 * 1024)); - - const lowerBound = meanSizeMB - 3 * stdDevMB; - const upperBound = meanSizeMB + 3 * stdDevMB; - - const withinRange = sizes.filter((size) => size >= lowerBound && size <= upperBound); - const percentageWithinRange = (withinRange.length / sizes.length) * 100; - - expect(percentageWithinRange).toBeGreaterThanOrEqual(99); - }); -}); diff --git a/index.ts b/index.ts deleted file mode 100644 index dd8d060f..00000000 --- a/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Addon } from "@/addon-wrapper"; -import { QueueManager } from "@/queue/queue-manager"; -import { QueueItem, typeQueue, HandleAction, HandleActions } from "@/queue/queueManager"; -import { Callbacks } from "@/types/callbacks.type"; -import { PinState, SyncState } from "@/types/placeholder.type"; -import VirtualDrive from "@/virtual-drive"; - -export { - Addon, - VirtualDrive, - QueueItem, - typeQueue, - HandleAction, - HandleActions, - QueueManager, - Callbacks, - PinState, - SyncState, -}; diff --git a/nodemon.json b/nodemon.json deleted file mode 100644 index d3e21b5f..00000000 --- a/nodemon.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "watch": ["examples", "src"], - "ext": "ts", - "exec": "ts-node -r tsconfig-paths/register ./examples/register.ts" -} diff --git a/package.json b/package.json index 7362fc49..13be83f1 100644 --- a/package.json +++ b/package.json @@ -2,63 +2,18 @@ "name": "@internxt/node-win", "version": "1.0.12", "description": "Drive desktop node addon", - "main": "dist/index.ts", + "main": "dist/index.js", "types": "dist/index.d.ts", "author": "Internxt ", "license": "MIT", "gypfile": true, "repository": { - "type": "git", - "url": "git+https://github.com/internxt/node-win.git" + "url": "https://github.com/internxt/node-win" }, "scripts": { - "========== Testing ==========": "", - "test": "vitest", - "test:once": "npm run test -- --run", - "test:one": "npm run test -- related x", - "========== Build ==========": "", "clean": "node-gyp clean", "build:gyp": "node-gyp configure build", - "build:ts": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json", "config:gyp": "python gyp.config.py", - "build": "python gyp.config.py && node-gyp clean && node-gyp configure build && npm run build:ts", - "========== Linter ==========": "", - "lint": "eslint . --ext .ts,.tsx --max-warnings 13", - "lint:fix": "npm run run lint --fix", - "format": "prettier . --check", - "format:fix": "prettier . --write", - "type-check": "tsc", - "========== Examples ==========": "", - "register": "nodemon", - "populate": "ts-node -r tsconfig-paths/register ./examples/populate.ts", - "get-state": "ts-node -r tsconfig-paths/register ./examples/get-state.ts", - "unregister": "ts-node -r tsconfig-paths/register ./examples/unregister.ts", - "disconnect": "ts-node -r tsconfig-paths/register ./examples/disconnect.ts" - }, - "devDependencies": { - "@eslint/js": "^9.24.0", - "@trivago/prettier-plugin-sort-imports": "^5.2.1", - "@types/lodash.chunk": "^4.2.9", - "@types/node": "^20.5.0", - "@types/yargs": "^17.0.32", - "eslint": "^9.24.0", - "globals": "^16.0.0", - "nodemon": "^3.1.9", - "prettier": "^3.4.2", - "ts-node": "^10.9.2", - "tsc-alias": "^1.8.10", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.6", - "typescript-eslint": "^8.30.1", - "uuid": "^11.1.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.0.5", - "vitest-mock-extended": "^2.0.2", - "yargs": "^17.7.2" - }, - "dependencies": { - "chokidar": "^3.6.0", - "lodash.chunk": "^4.2.0", - "zod": "^3.24.1" + "build": "python gyp.config.py && node-gyp clean && node-gyp configure build" } } diff --git a/src/addon-wrapper.ts b/src/addon-wrapper.ts deleted file mode 100644 index e245d28f..00000000 --- a/src/addon-wrapper.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { addon } from "./addon"; -import { addonZod } from "./addon/addon-zod"; -import { Callbacks } from "./types/callbacks.type"; - -export class Addon { - syncRootPath!: string; - - private parseAddonZod(fn: keyof typeof addonZod, data: T) { - const schema = addonZod[fn]; - const result = schema.safeParse(data); - if (result.error) console.error(fn, result.error); - return data; - } - - registerSyncRoot({ - providerName, - providerVersion, - providerId, - logoPath, - }: { - providerName: string; - providerVersion: string; - providerId: string; - logoPath: string; - }) { - const result = addon.registerSyncRoot(this.syncRootPath, providerName, providerVersion, providerId, logoPath); - return this.parseAddonZod("registerSyncRoot", result); - } - - getRegisteredSyncRoots() { - const result = addon.getRegisteredSyncRoots(); - return this.parseAddonZod("getRegisteredSyncRoots", result); - } - - connectSyncRoot({ callbacks }: { callbacks: Callbacks }) { - const result = addon.connectSyncRoot(this.syncRootPath, callbacks); - return this.parseAddonZod("connectSyncRoot", result); - } - - unregisterSyncRoot({ providerId }: { providerId: string }) { - const result = addon.unregisterSyncRoot(providerId); - return this.parseAddonZod("unregisterSyncRoot", result); - } - - disconnectSyncRoot({ syncRootPath }: { syncRootPath: string }) { - return addon.disconnectSyncRoot(syncRootPath); - } - - addLogger({ logPath }: { logPath: string }) { - const result = addon.addLoggerPath(logPath); - return this.parseAddonZod("addLoggerPath", result); - } - - getPlaceholderState({ path }: { path: string }) { - const result = addon.getPlaceholderState(path); - return this.parseAddonZod("getPlaceholderState", result); - } - - getPlaceholderWithStatePending() { - const result = addon.getPlaceholderWithStatePending(this.syncRootPath); - return this.parseAddonZod("getPlaceholderWithStatePending", result); - } - - getFileIdentity({ path }: { path: string }) { - const result = addon.getFileIdentity(path); - return this.parseAddonZod("getFileIdentity", result); - } - - async deleteFileSyncRoot({ path }: { path: string }) { - return addon.deleteFileSyncRoot(path); - } - - createPlaceholderFile({ - fileName, - fileId, - fileSize, - fileAttributes, - creationTime, - lastWriteTime, - lastAccessTime, - basePath, - }: { - fileName: string; - fileId: string; - fileSize: number; - fileAttributes: number; - creationTime: string; - lastWriteTime: string; - lastAccessTime: string; - basePath: string; - }) { - return addon.createPlaceholderFile( - fileName, - fileId, - fileSize, - fileAttributes, - creationTime, - lastWriteTime, - lastAccessTime, - basePath, - ); - } - - createPlaceholderDirectory({ - itemName, - itemId, - isDirectory, - itemSize, - folderAttributes, - creationTime, - lastWriteTime, - lastAccessTime, - path, - }: { - itemName: string; - itemId: string; - isDirectory: boolean; - itemSize: number; - folderAttributes: number; - creationTime: string; - lastWriteTime: string; - lastAccessTime: string; - path: string; - }) { - return addon.createEntry( - itemName, - itemId, - isDirectory, - itemSize, - folderAttributes, - creationTime, - lastWriteTime, - lastAccessTime, - path, - ); - } - - /** - * @deprecated - */ - updateSyncStatus({ path, isDirectory, sync }: { path: string; isDirectory: boolean; sync: boolean }) { - const result = addon.updateSyncStatus(path, sync, isDirectory); - return this.parseAddonZod("updateSyncStatus", result); - } - - convertToPlaceholder({ path, id }: { path: string; id: string }) { - const result = addon.convertToPlaceholder(path, id); - return this.parseAddonZod("convertToPlaceholder", result); - } - - updateFileIdentity({ path, id, isDirectory }: { path: string; id: string; isDirectory: boolean }) { - addon.updateFileIdentity(path, id, isDirectory); - } - - dehydrateFile({ path }: { path: string }) { - const result = addon.dehydrateFile(path); - return this.parseAddonZod("dehydrateFile", result); - } - - async hydrateFile({ path }: { path: string }) { - const result = await addon.hydrateFile(path); - return this.parseAddonZod("hydrateFile", result); - } -} - -export class DependencyInjectionAddonProvider { - private static _addon: Addon; - - static get() { - if (DependencyInjectionAddonProvider._addon) return DependencyInjectionAddonProvider._addon; - - DependencyInjectionAddonProvider._addon = new Addon(); - - return DependencyInjectionAddonProvider._addon; - } -} diff --git a/src/addon.ts b/src/addon.ts deleted file mode 100644 index b8ffc373..00000000 --- a/src/addon.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { z } from "zod"; - -import { addonZod } from "./addon/addon-zod"; -import { InputSyncCallbacks } from "./types/callbacks.type"; - -// eslint-disable-next-line @typescript-eslint/no-require-imports -export const addon: TAddon = require("../addon.node"); - -export type TAddon = { - addLoggerPath(path: string): z.infer; - createPlaceholderFile( - fileName: string, - fileId: string, - fileSize: number, - fileAttributes: number, - creationTime: string, - lastWriteTime: string, - lastAccessTime: string, - path: string, - ): any; - createEntry( - itemName: string, - itemId: string, - isDirectory: boolean, - itemSize: number, - fileAttributes: number, - creationTime: string, - lastWriteTime: string, - lastAccessTime: string, - path: string, - ): any; - hydrateFile(path: string): Promise>; - dehydrateFile(path: string): z.infer; - connectSyncRoot(path: string, callbacks: InputSyncCallbacks): z.infer; - convertToPlaceholder(path: string, id: string): z.infer; - deleteFileSyncRoot(path: string): any; - getFileIdentity(path: string): z.infer; - /** - * TODO: Not all paths return value - */ - disconnectSyncRoot(path: string): unknown; - getPlaceholderState(path: string): z.infer; - getPlaceholderWithStatePending(path: string): z.infer; - registerSyncRoot( - providerName: string, - providerVersion: string, - providerId: string, - callbacks: any, - logoPath: string, - ): z.infer; - unregisterSyncRoot(path: string): z.infer; - updateSyncStatus(path: string, sync: boolean, isDirectory: boolean): z.infer; - /** - * TODO: Returns a type in c++ that is not initialized - */ - updateFileIdentity(itemPath: string, id: string, isDirectory: boolean): any; - getRegisteredSyncRoots(): z.infer; -}; diff --git a/src/addon/addon-zod.ts b/src/addon/addon-zod.ts deleted file mode 100644 index c55e8b14..00000000 --- a/src/addon/addon-zod.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { z } from "zod"; - -import { PinState, SyncState } from "@/types/placeholder.type"; - -export const addonZod = { - addLoggerPath: z.boolean(), - connectSyncRoot: z.object({ hr: z.literal(0), connectionKey: z.string() }), - convertToPlaceholder: z.boolean(), - dehydrateFile: z.boolean(), - getFileIdentity: z.string(), - getPlaceholderState: z.object({ pinState: z.nativeEnum(PinState), syncState: z.nativeEnum(SyncState) }), - getPlaceholderWithStatePending: z.array(z.string()), - hydrateFile: z.undefined(), - registerSyncRoot: z.literal(0), - updateSyncStatus: z.boolean(), - unregisterSyncRoot: z.number(), - getRegisteredSyncRoots: z.array( - z.object({ - id: z.string(), - path: z.string(), - displayName: z.string(), - version: z.string(), - }), - ), -}; diff --git a/src/logger.ts b/src/logger.ts deleted file mode 100644 index 6470ab2a..00000000 --- a/src/logger.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type TBody = { - msg: string; - [key: string]: unknown; -}; - -export type TLogger = { - debug: (body: TBody) => void; - info: (body: TBody) => void; - warn: (body: TBody) => void; - error: (body: TBody) => void; -}; diff --git a/src/queue/queue-manager.ts b/src/queue/queue-manager.ts deleted file mode 100644 index 963e0469..00000000 --- a/src/queue/queue-manager.ts +++ /dev/null @@ -1,206 +0,0 @@ -import fs from "fs"; -import lodashChunk from "lodash.chunk"; - -import { TLogger } from "@/logger"; - -import { HandleAction, HandleActions, QueueItem, typeQueue } from "./queueManager"; - -export type QueueHandler = { - handleAdd: HandleAction; - handleHydrate: HandleAction; - handleDehydrate: HandleAction; - handleChange?: HandleAction; - handleChangeSize: HandleAction; -}; - -/** - * * @deprecated - */ -export type QueueManagerCallback = { - onTaskSuccess: () => Promise; - onTaskProcessing: () => Promise; -}; - -export class QueueManager { - private queues: { [key: string]: QueueItem[] } = { - add: [], - hydrate: [], - dehydrate: [], - change: [], - changeSize: [], - }; - - private isProcessing: { [key: string]: boolean } = { - add: false, - hydrate: false, - dehydrate: false, - change: false, - changeSize: false, - }; - - private enqueueTimeout: NodeJS.Timeout | null = null; - private enqueueDelay = 2000; - - // private readonly notify: QueueManagerCallback; - private readonly persistPath: string; - - logger?: TLogger; - actions: HandleActions; - - constructor({ handlers, persistPath }: { handlers: QueueHandler; persistPath: string }) { - this.actions = { - add: handlers.handleAdd, - hydrate: handlers.handleHydrate, - dehydrate: handlers.handleDehydrate, - changeSize: handlers.handleChangeSize, - change: handlers.handleChange || (() => Promise.resolve()), - }; - // this.notify = notify; - this.persistPath = persistPath; - if (!fs.existsSync(this.persistPath)) { - fs.writeFileSync(this.persistPath, JSON.stringify(this.queues)); - } else { - this.loadQueueStateFromFile(); - } - } - private saveQueueStateToFile(): void { - if (!this.persistPath) return; - - fs.writeFileSync( - this.persistPath, - JSON.stringify( - { - add: [], - hydrate: this.queues.hydrate, - dehydrate: this.queues.dehydrate, - change: [], - changeSize: [], - }, - null, - 2, - ), - ); - } - - private loadQueueStateFromFile(): void { - this.logger?.debug({ msg: "Loading queue state from file:" + this.persistPath }); - if (this.persistPath) { - if (!fs.existsSync(this.persistPath)) { - this.saveQueueStateToFile(); - } - - const data = fs.readFileSync(this.persistPath, "utf-8"); - if (!data) { - return; - } - this.queues = JSON.parse(data); - } - } - - public clearQueue(): void { - this.queues = { - add: [], - hydrate: [], - dehydrate: [], - change: [], - changeSize: [], - }; - this.saveQueueStateToFile(); - } - - public enqueue(task: QueueItem): void { - this.logger?.debug({ msg: "enqueue", task }); - const existingTask = this.queues[task.type].find((item) => item.path === task.path && item.type === task.type); - - if (existingTask) { - this.logger?.info({ msg: "Task already exists in queue. Skipping." }); - return; - } - - this.queues[task.type].push(task); - this.sortQueue(task.type); - this.saveQueueStateToFile(); - this.resetEnqueueTimeout(); - } - - private resetEnqueueTimeout(): void { - if (this.enqueueTimeout) { - clearTimeout(this.enqueueTimeout); - } - - // Inicia el temporizador de espera - this.enqueueTimeout = setTimeout(() => { - this.processAll(); - }, this.enqueueDelay); - } - - private sortQueue(type: typeQueue): void { - this.queues[type].sort((a, b) => { - const depthA = a.path.split("\\").length; - const depthB = b.path.split("\\").length; - - if (depthA !== depthB) { - return depthA - depthB; - } - - if (a.isFolder !== b.isFolder) { - return a.isFolder ? 1 : -1; - } - - return a.path.localeCompare(b.path); - }); - } - - private async processQueue(type: typeQueue): Promise { - if (this.isProcessing[type]) return; - - this.isProcessing[type] = true; - - if (type === typeQueue.add) { - await this.processInChunks(type, 7); - } else { - await this.processSequentially(type); - } - - this.isProcessing[type] = false; - } - - private async processInChunks(type: typeQueue, chunkSize: number): Promise { - const chunks = lodashChunk(this.queues[type], chunkSize); - - for (const chunk of chunks) { - // await this.notify.onTaskProcessing(); - await Promise.all(chunk.map((task) => this.processTask(type, task))); - this.queues[type] = this.queues[type].slice(chunk.length); - } - } - - private async processSequentially(type: typeQueue): Promise { - while (this.queues[type].length > 0) { - // await this.notify.onTaskProcessing(); - - const task = this.queues[type].shift(); - this.saveQueueStateToFile(); - - if (task) await this.processTask(type, task); - } - } - - private async processTask(type: typeQueue, task: QueueItem) { - this.logger?.debug({ msg: "processTask", task }); - - try { - await this.actions[task.type](task); - } catch (error) { - this.logger?.error({ msg: `Failed to process ${type} task`, error }); - } - } - - public async processAll(): Promise { - this.logger?.debug({ msg: "processAll" }); - const taskTypes = Object.keys(this.queues) as typeQueue[]; - // await this.notify.onTaskProcessing(); - await Promise.all(taskTypes.map((type: typeQueue) => this.processQueue(type))); - // await this.notify.onTaskSuccess(); - } -} diff --git a/src/queue/queue-manager.unit.test.ts b/src/queue/queue-manager.unit.test.ts deleted file mode 100644 index b47f5ffc..00000000 --- a/src/queue/queue-manager.unit.test.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { join } from "path"; -import { TEST_FILES } from "test/utils/setup.helper.test"; -import { v4 } from "uuid"; -import { describe, it, expect, vi, beforeEach } from "vitest"; -import { mockDeep } from "vitest-mock-extended"; - -import { QueueHandler, QueueManager } from "./queue-manager"; -import { QueueItem, typeQueue } from "./queueManager"; - -describe("QueueManager", () => { - const mockHandlers = mockDeep(); - let queueManager: QueueManager; - - const persistPath = join(TEST_FILES, v4()); - - beforeEach(() => { - vi.clearAllMocks(); - queueManager = new QueueManager({ handlers: mockHandlers, persistPath }); - }); - - it("should add a task to the queue and sort it correctly", async () => { - const tasks: QueueItem[] = [ - { path: "\\test\\folder4", isFolder: true, type: typeQueue.add }, - { path: "\\test\\folder\\test.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\test.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test", isFolder: true, type: typeQueue.add }, - { path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder", isFolder: true, type: typeQueue.add }, - { path: "\\test\\folder2\\file-pdf", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder3", isFolder: true, type: typeQueue.add }, - { path: "\\test\\folder3\\file12.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder3\\folder3", isFolder: true, type: typeQueue.add }, - ]; - - tasks.forEach((task) => queueManager.enqueue(task)); - - expect(queueManager["queues"][typeQueue.add]).toStrictEqual([ - { path: "\\test", isFolder: true, type: typeQueue.add }, - { path: "\\test\\test.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\test2.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder", isFolder: true, type: typeQueue.add }, - { path: "\\test\\folder3", isFolder: true, type: typeQueue.add }, - { path: "\\test\\folder4", isFolder: true, type: typeQueue.add }, - { path: "\\test\\folder\\test.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder2\\file-pdf", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder3\\file12.txt", isFolder: false, type: typeQueue.add }, - { path: "\\test\\folder3\\folder3", isFolder: true, type: typeQueue.add }, - ]); - }); - - it("should not add a duplicate task", () => { - const task: QueueItem = { path: "\\test.txt", isFolder: false, type: typeQueue.add }; - queueManager.enqueue(task); - queueManager.enqueue(task); - - expect(queueManager["queues"][typeQueue.add].length).toBe(1); - }); - - it("should clear the queue", () => { - queueManager.enqueue({ path: "\\test", isFolder: true, type: typeQueue.add }); - queueManager.clearQueue(); - - expect(queueManager["queues"][typeQueue.add].length).toBe(0); - }); - - it("should correctly order deeply nested structures", () => { - const tasks: QueueItem[] = [ - { path: "\\folder", isFolder: true, type: typeQueue.add }, - { path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add }, - { path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add }, - { path: "\\folder\\subfolder\\file2.txt", isFolder: false, type: typeQueue.add }, - { path: "\\folder\\subfolder\\deep", isFolder: true, type: typeQueue.add }, - { path: "\\folder\\subfolder\\deep\\file3.txt", isFolder: false, type: typeQueue.add }, - ]; - - tasks.forEach((task) => queueManager.enqueue(task)); - - expect(queueManager["queues"][typeQueue.add]).toStrictEqual([ - { path: "\\folder", isFolder: true, type: typeQueue.add }, - { path: "\\folder\\file.txt", isFolder: false, type: typeQueue.add }, - { path: "\\folder\\subfolder", isFolder: true, type: typeQueue.add }, - { path: "\\folder\\subfolder\\file2.txt", isFolder: false, type: typeQueue.add }, - { path: "\\folder\\subfolder\\deep", isFolder: true, type: typeQueue.add }, - { path: "\\folder\\subfolder\\deep\\file3.txt", isFolder: false, type: typeQueue.add }, - ]); - }); - - it("should handle mixed folder\\file ordering properly", () => { - const tasks: QueueItem[] = [ - { path: "\\alpha", isFolder: true, type: typeQueue.add }, - { path: "\\alpha\\file1.txt", isFolder: false, type: typeQueue.add }, - { path: "\\alpha\\file2.txt", isFolder: false, type: typeQueue.add }, - { path: "\\beta", isFolder: true, type: typeQueue.add }, - { path: "\\beta\\file3.txt", isFolder: false, type: typeQueue.add }, - { path: "\\gamma\\file4.txt", isFolder: false, type: typeQueue.add }, - { path: "\\gamma", isFolder: true, type: typeQueue.add }, - ]; - - tasks.forEach((task) => queueManager.enqueue(task)); - - expect(queueManager["queues"][typeQueue.add]).toStrictEqual([ - { path: "\\alpha", isFolder: true, type: typeQueue.add }, - { path: "\\beta", isFolder: true, type: typeQueue.add }, - { path: "\\gamma", isFolder: true, type: typeQueue.add }, - { path: "\\alpha\\file1.txt", isFolder: false, type: typeQueue.add }, - { path: "\\alpha\\file2.txt", isFolder: false, type: typeQueue.add }, - { path: "\\beta\\file3.txt", isFolder: false, type: typeQueue.add }, - { path: "\\gamma\\file4.txt", isFolder: false, type: typeQueue.add }, - ]); - }); -}); diff --git a/src/queue/queueManager.ts b/src/queue/queueManager.ts deleted file mode 100644 index 920db88a..00000000 --- a/src/queue/queueManager.ts +++ /dev/null @@ -1,20 +0,0 @@ -export enum typeQueue { - add = "add", - hydrate = "hydrate", - dehydrate = "dehydrate", - change = "change", - changeSize = "changeSize", -} - -export type QueueItem = { - path: string; - isFolder: boolean; - type: typeQueue; - fileId?: string; -}; - -export type HandleAction = (task: QueueItem) => Promise; - -export type HandleActions = { - [key in typeQueue]: HandleAction; -}; diff --git a/src/types/callbacks.type.ts b/src/types/callbacks.type.ts deleted file mode 100644 index 1e99234a..00000000 --- a/src/types/callbacks.type.ts +++ /dev/null @@ -1,33 +0,0 @@ -export type NapiCallbackFunction = (...args: any[]) => any; - -export type FilePlaceholderIdPrefixType = "FILE:"; - -export type FilePlaceholderId = `${FilePlaceholderIdPrefixType}${string}`; - -export type TFetchDataCallback = ( - id: FilePlaceholderId, - callback: ( - data: boolean, - path: string, - errorHandler?: () => void, - ) => Promise<{ finished: boolean; progress: number }>, -) => void; - -export type InputSyncCallbacks = { - fetchDataCallback: TFetchDataCallback; - validateDataCallback?: NapiCallbackFunction; - cancelFetchDataCallback?: NapiCallbackFunction; - fetchPlaceholdersCallback?: NapiCallbackFunction; - cancelFetchPlaceholdersCallback?: NapiCallbackFunction; - notifyFileOpenCompletionCallback?: NapiCallbackFunction; - notifyFileCloseCompletionCallback?: NapiCallbackFunction; - notifyDehydrateCallback?: NapiCallbackFunction; - notifyDehydrateCompletionCallback?: NapiCallbackFunction; - notifyDeleteCallback?: NapiCallbackFunction; - notifyDeleteCompletionCallback?: NapiCallbackFunction; - notifyRenameCallback?: NapiCallbackFunction; - notifyRenameCompletionCallback?: NapiCallbackFunction; - noneCallback?: NapiCallbackFunction; -}; - -export type Callbacks = InputSyncCallbacks; diff --git a/src/types/placeholder.type.ts b/src/types/placeholder.type.ts deleted file mode 100644 index 861bff7f..00000000 --- a/src/types/placeholder.type.ts +++ /dev/null @@ -1,46 +0,0 @@ -export enum SyncState { - /** - * Status that occurs when an error occurs while reading the status. - */ - Undefined = -1, - NotInSync = 0, - InSync = 1, -} - -export enum PinState { - /** - * The pin state is derived from the state of the parent folder. - * For example new remote files start out in this state, following the state of their parent folder. - * This state is used purely for resetting pin states to their derived value. - * The effective state for an item will never be "Inherited". - */ - Inherited = 0, - - /** - * The file shall be available and up to date locally. Also known as "pinned". - * Pinned dehydrated files shall be hydrated as soon as possible. - */ - AlwaysLocal = 1, - - /** - * File shall be a dehydrated placeholder, filled on demand. - * Also known as "unpinned". Unpinned hydrated files shall be dehydrated as soon as possible. - * If a unpinned file becomes hydrated - * (such as due to an implicit hydration where the user requested access to the file's data) - * Its pin state changes to Unspecified. - */ - OnlineOnly = 2, - - /** - * The user hasn't made a decision. - * The client or platform may hydrate or dehydrate as they see fit. - * New remote files in unspecified directories start unspecified, and dehydrated (which is an arbitrary decision). - */ - Unspecified = 3, - - /** - * The file will never be synced to the cloud. - * Useful for ignored files to indicate to the OS the file will never besynced - */ - Excluded = 4, -} diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 8425be72..00000000 --- a/src/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const sleep = (ms: number) => { - return new Promise((resolve) => setTimeout(resolve, ms)); -}; diff --git a/src/virtual-drive.ts b/src/virtual-drive.ts deleted file mode 100644 index 8712c751..00000000 --- a/src/virtual-drive.ts +++ /dev/null @@ -1,327 +0,0 @@ -import fs from "fs"; -import path, { join, posix, win32 } from "path"; - -import { Addon, DependencyInjectionAddonProvider } from "./addon-wrapper"; -import { TLogger } from "./logger"; -import { QueueManager } from "./queue/queue-manager"; -import { Callbacks } from "./types/callbacks.type"; -import { Watcher } from "./watcher/watcher"; - -const PLACEHOLDER_ATTRIBUTES = { - FILE_ATTRIBUTE_READONLY: 0x1, - FILE_ATTRIBUTE_HIDDEN: 0x2, - FOLDER_ATTRIBUTE_READONLY: 0x1, - FILE_ATTRIBUTE_NORMAL: 0x1, -}; - -class VirtualDrive { - syncRootPath: string; - providerId: string; - callbacks?: Callbacks; - watcher = new Watcher(); - logger: TLogger; - - addon: Addon; - - constructor({ - syncRootPath, - providerId, - loggerPath, - logger, - }: { - syncRootPath: string; - providerId: string; - loggerPath: string; - logger: TLogger; - }) { - this.addon = DependencyInjectionAddonProvider.get(); - this.syncRootPath = this.convertToWindowsPath({ path: syncRootPath }); - loggerPath = this.convertToWindowsPath({ path: loggerPath }); - this.providerId = providerId; - - this.addon.syncRootPath = this.syncRootPath; - - this.createSyncRootFolder(); - this.addLoggerPath(loggerPath); - this.logger = logger; - } - - private convertToWindowsTime(jsTime: number) { - return BigInt(jsTime) * 10000n + 116444736000000000n; - } - - convertToWindowsPath({ path }: { path: string }) { - return path.replaceAll(posix.sep, win32.sep); - } - - fixPath(path: string) { - path = this.convertToWindowsPath({ path }); - if (path.includes(this.syncRootPath)) { - return path; - } else { - return join(this.syncRootPath, path); - } - } - - addLoggerPath(logPath: string) { - this.addon.addLogger({ logPath }); - } - - getPlaceholderState({ path }: { path: string }) { - return this.addon.getPlaceholderState({ path: this.fixPath(path) }); - } - - getPlaceholderWithStatePending() { - return this.addon.getPlaceholderWithStatePending(); - } - - createSyncRootFolder() { - if (!fs.existsSync(this.syncRootPath)) { - fs.mkdirSync(this.syncRootPath, { recursive: true }); - } - } - - getFileIdentity({ path }: { path: string }) { - return this.addon.getFileIdentity({ path: this.fixPath(path) }); - } - - async deleteFileSyncRoot({ path }: { path: string }) { - return this.addon.deleteFileSyncRoot({ path: this.fixPath(path) }); - } - - connectSyncRoot({ callbacks }: { callbacks: Callbacks }) { - const connectionKey = this.addon.connectSyncRoot({ callbacks }); - - this.logger.debug({ msg: "connectSyncRoot", connectionKey }); - return connectionKey; - } - - disconnectSyncRoot() { - this.addon.disconnectSyncRoot({ syncRootPath: this.syncRootPath }); - } - - private createPlaceholderFile({ - fileName, - fileId, - fileSize, - fileAttributes, - creationTime, - lastWriteTime, - lastAccessTime, - basePath = this.syncRootPath, - }: { - fileName: string; - fileId: string; - fileSize: number; - fileAttributes: number; - creationTime: number; - lastWriteTime: number; - lastAccessTime: number; - basePath?: string; - }): any { - const creationTimeStr = this.convertToWindowsTime(creationTime).toString(); - const lastWriteTimeStr = this.convertToWindowsTime(lastWriteTime).toString(); - const lastAccessTimeStr = this.convertToWindowsTime(lastAccessTime).toString(); - - return this.addon.createPlaceholderFile({ - fileName, - fileId, - fileSize, - fileAttributes, - creationTime: creationTimeStr, - lastWriteTime: lastWriteTimeStr, - lastAccessTime: lastAccessTimeStr, - basePath, - }); - } - - private createPlaceholderDirectory({ - itemName, - itemId, - isDirectory, - itemSize, - folderAttributes, - creationTime, - lastWriteTime, - lastAccessTime, - path = this.syncRootPath, - }: { - itemName: string; - itemId: string; - isDirectory: boolean; - itemSize: number; - folderAttributes: number; - creationTime: number; - lastWriteTime: number; - lastAccessTime: number; - path?: string; - }) { - const creationTimeStr = this.convertToWindowsTime(creationTime).toString(); - const lastWriteTimeStr = this.convertToWindowsTime(lastWriteTime).toString(); - const lastAccessTimeStr = this.convertToWindowsTime(lastAccessTime).toString(); - - return this.addon.createPlaceholderDirectory({ - itemName, - itemId, - isDirectory, - itemSize, - folderAttributes, - creationTime: creationTimeStr, - lastWriteTime: lastWriteTimeStr, - lastAccessTime: lastAccessTimeStr, - path, - }); - } - - async registerSyncRoot({ - providerName, - providerVersion, - logoPath, - }: { - providerName: string; - providerVersion: string; - logoPath: string; - }): Promise { - this.logger.debug({ msg: "Registering sync root", syncRootPath: this.syncRootPath }); - return this.addon.registerSyncRoot({ - providerName, - providerVersion, - providerId: this.providerId, - logoPath, - }); - } - - static getRegisteredSyncRoots() { - return DependencyInjectionAddonProvider.get().getRegisteredSyncRoots(); - } - - unregisterSyncRoot() { - return this.addon.unregisterSyncRoot({ providerId: this.providerId }); - } - - static unRegisterSyncRootByProviderId({ providerId }: { providerId: string }) { - return DependencyInjectionAddonProvider.get().unregisterSyncRoot({ providerId }); - } - - watchAndWait({ queueManager }: { queueManager: QueueManager }): void { - this.watcher.addon = this.addon; - this.watcher.queueManager = queueManager; - this.watcher.logger = this.logger; - this.watcher.syncRootPath = this.syncRootPath; - this.watcher.options = { - ignored: /(^|[/\\])\../, - persistent: true, - ignoreInitial: true, - followSymlinks: true, - depth: undefined, - awaitWriteFinish: { - stabilityThreshold: 2000, - pollInterval: 100, - }, - usePolling: true, - }; - - this.watcher.watchAndWait(); - } - - createFileByPath({ - relativePath, - itemId, - size = 0, - creationTime = Date.now(), - lastWriteTime = Date.now(), - }: { - relativePath: string; - itemId: string; - size?: number; - creationTime?: number; - lastWriteTime?: number; - }) { - const fullPath = path.join(this.syncRootPath, relativePath); - const splitPath = relativePath.split("/").filter((p) => p); - const directoryPath = path.resolve(this.syncRootPath); - let currentPath = directoryPath; - try { - for (let i = 0; i < splitPath.length - 1; i++) { - // everything except last element - const dir = splitPath[i]; - - currentPath = path.join(currentPath, dir); - } - // last element is the file - this.createPlaceholderFile({ - fileName: path.basename(fullPath), - fileId: itemId, - fileSize: size, - fileAttributes: PLACEHOLDER_ATTRIBUTES.FILE_ATTRIBUTE_NORMAL, - creationTime, - lastWriteTime, - lastAccessTime: Date.now(), - basePath: currentPath, - }); - } catch (error) { - this.logger.error({ msg: "Error creating placeholder", error }); - } - } - - createFolderByPath({ - relativePath, - itemId, - size = 0, - creationTime = Date.now(), - lastWriteTime = Date.now(), - }: { - relativePath: string; - itemId: string; - size?: number; - creationTime?: number; - lastWriteTime?: number; - }) { - const splitPath = relativePath.split("/").filter((p) => p); - const directoryPath = path.resolve(this.syncRootPath); - let currentPath = directoryPath; - // solo crear el ultimo directorio - for (let i = 0; i < splitPath.length; i++) { - const dir = splitPath[i]; - const last = i === splitPath.length - 1; - if (last) { - if (fs.existsSync(currentPath)) { - this.createPlaceholderDirectory({ - itemName: dir, - itemId, - isDirectory: true, - itemSize: size, - folderAttributes: PLACEHOLDER_ATTRIBUTES.FOLDER_ATTRIBUTE_READONLY, - creationTime, - lastWriteTime, - lastAccessTime: Date.now(), - path: currentPath, - }); - } - } - currentPath = path.join(currentPath, dir); - } - } - - updateSyncStatus({ itemPath, isDirectory, sync = true }: { itemPath: string; isDirectory: boolean; sync?: boolean }) { - return this.addon.updateSyncStatus({ path: this.fixPath(itemPath), isDirectory, sync }); - } - - convertToPlaceholder({ itemPath, id }: { itemPath: string; id: string }) { - return this.addon.convertToPlaceholder({ path: this.fixPath(itemPath), id }); - } - - updateFileIdentity({ itemPath, id, isDirectory }: { itemPath: string; id: string; isDirectory: boolean }) { - return this.addon.updateFileIdentity({ path: this.fixPath(itemPath), id, isDirectory }); - } - - dehydrateFile({ itemPath }: { itemPath: string }) { - return this.addon.dehydrateFile({ path: this.fixPath(itemPath) }); - } - - hydrateFile({ itemPath }: { itemPath: string }) { - return this.addon.hydrateFile({ path: this.fixPath(itemPath) }); - } -} - -export default VirtualDrive; diff --git a/src/virtual-drive.unit.test.ts b/src/virtual-drive.unit.test.ts deleted file mode 100644 index bc19b158..00000000 --- a/src/virtual-drive.unit.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import fs from "fs"; -import { v4 } from "uuid"; -import { Mock } from "vitest"; -import { mockDeep } from "vitest-mock-extended"; - -import { addon } from "@/addon"; - -import { TLogger } from "./logger"; -import VirtualDrive from "./virtual-drive"; - -vi.mock(import("fs")); -vi.mock("@/addon", () => ({ - addon: { - addLoggerPath: vi.fn().mockReturnValue(true), - connectSyncRoot: vi.fn(), - createPlaceholderFile: vi.fn(), - registerSyncRoot: vi.fn().mockReturnValue(0), - }, -})); - -describe("VirtualDrive", () => { - const mockExistsSync = fs.existsSync as Mock; - const loggerMock = mockDeep(); - - const syncRootPath = "C:\\test-drive"; - const loggerPath = "C:\\test-logs"; - - beforeEach(() => { - vi.clearAllMocks(); - }); - - describe("When convertToWindowsPath is called", () => { - const providerId = v4(); - - // Arrange - const drive = new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - - it("When unix path, then convert to windows path", () => { - // Assert - const result = drive.convertToWindowsPath({ path: "C:/test-drive/test.txt" }); - expect(result).toBe("C:\\test-drive\\test.txt"); - }); - - it("When windows path, then do not modify it", () => { - // Assert - const result = drive.convertToWindowsPath({ path: "C:\\test-drive\\test.txt" }); - expect(result).toBe("C:\\test-drive\\test.txt"); - }); - }); - - describe("When fixPath is called", () => { - const providerId = v4(); - - // Arrange - const drive = new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - - it("When absolute windows path, then do not modify it", () => { - // Assert - expect(drive.fixPath("C:\\test-drive\\test.txt")).toBe("C:\\test-drive\\test.txt"); - }); - - it("When absolute unix path, then convert to absolute windows path", () => { - // Assert - expect(drive.fixPath("C:/test-drive/test.txt")).toBe("C:\\test-drive\\test.txt"); - }); - - it("When relative path, then convert to absolute windows path", () => { - // Assert - expect(drive.fixPath("test.txt")).toBe("C:\\test-drive\\test.txt"); - }); - - it("When relative windows path, then convert to absolute windows path", () => { - // Assert - expect(drive.fixPath("\\test.txt")).toBe("C:\\test-drive\\test.txt"); - }); - - it("When relative unix path, then convert to absolute windows path", () => { - // Assert - expect(drive.fixPath("/test.txt")).toBe("C:\\test-drive\\test.txt"); - }); - }); - - describe("When VirtualDrive is created", () => { - it("When syncRootPath does not exist, then it creates it", () => { - // Arrange - mockExistsSync.mockReturnValue(false); - - const providerId = v4(); - - // Act - new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - - // Assert - expect(fs.mkdirSync).toHaveBeenCalledWith(syncRootPath, { - recursive: true, - }); - }); - - it("When syncRootPath exists, then it doesn't create it", () => { - // Arrange - mockExistsSync.mockReturnValue(true); - - const providerId = v4(); - - // Act - new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - - // Assert - expect(fs.mkdirSync).not.toHaveBeenCalled(); - }); - - it("Then it calls addon.addLoggerPath with logPath provided", () => { - // Act - const providerId = v4(); - - new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - - // Assert - expect(addon.addLoggerPath).toHaveBeenCalledWith(loggerPath); - }); - }); - - describe("When call createFileByPath", () => { - it("Then it calls addon.createPlaceholderFile", () => { - // Arrange - mockExistsSync.mockReturnValue(true); - const providerId = v4(); - - const drive = new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - - // Act - drive.createFileByPath({ - relativePath: "folder/subfolder/file.txt", - itemId: "file-id", - size: 1234, - creationTime: 1660000000000, - lastWriteTime: 1660000001000, - }); - - // Assert - expect(addon.createPlaceholderFile).toHaveBeenCalledWith( - "file.txt", - "file-id", - 1234, - 1, - expect.any(String), - expect.any(String), - expect.any(String), - expect.stringContaining("C:\\test-drive\\folder\\subfolder"), - ); - }); - }); - - describe("When call registerSyncRoot", () => { - it("Then it assigns callbacks and calls addon.registerSyncRoot", async () => { - // Arrange - const providerId = v4(); - const drive = new VirtualDrive({ syncRootPath, providerId, loggerPath, logger: loggerMock }); - const providerName = "MyProvider"; - const providerVersion = "1.0.0"; - const logoPath = "C:\\iconPath"; - - // Act - await drive.registerSyncRoot({ providerName, providerVersion, logoPath }); - - // Assert - expect(addon.registerSyncRoot).toHaveBeenCalledWith( - syncRootPath, - providerName, - providerVersion, - providerId, - logoPath, - ); - }); - }); -}); diff --git a/src/watcher/detect-context-menu-action.service.ts b/src/watcher/detect-context-menu-action.service.ts deleted file mode 100644 index bb3626e6..00000000 --- a/src/watcher/detect-context-menu-action.service.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Stats } from "fs"; - -import { typeQueue } from "@/queue/queueManager"; -import { PinState, SyncState } from "@/types/placeholder.type"; - -import { Watcher } from "./watcher"; - -export class DetectContextMenuActionService { - async execute({ self, details, path, isFolder }: TProps) { - const { prev, curr } = details; - - const status = self.addon.getPlaceholderState({ path }); - const itemId = self.addon.getFileIdentity({ path }); - const isInDevice = self.fileInDevice.has(path); - - self.logger.debug({ - msg: "change", - path, - status, - itemId, - isInDevice, - prev: { - size: prev.size, - ctimeMs: prev.ctimeMs, - mtimeMs: prev.mtimeMs, - }, - curr: { - size: curr.size, - ctimeMs: curr.ctimeMs, - mtimeMs: curr.mtimeMs, - }, - }); - - if ( - prev.size === curr.size && - prev.ctimeMs !== curr.ctimeMs && - prev.mtimeMs === curr.mtimeMs && - status.pinState === PinState.AlwaysLocal && - status.syncState === SyncState.InSync && - !isInDevice - ) { - self.fileInDevice.add(path); - - if (curr.blocks !== 0) { - // This event is triggered from the addon - return "Doble click en el archivo"; - } - - self.queueManager.enqueue({ path, type: typeQueue.hydrate, isFolder, fileId: itemId }); - return "Mantener siempre en el dispositivo"; - } - - if ( - prev.size === curr.size && - prev.ctimeMs !== curr.ctimeMs && - status.pinState == PinState.OnlineOnly && - status.syncState == SyncState.InSync - ) { - // TODO: we need to disable this for now even if dehydate it's called two times - // because files that are a .zip have blocks === 0, so they never dehydrate - // because it's seems that it's already been dehydrated - // if (curr.blocks === 0) { - // return "Liberando espacio"; - // } - - self.fileInDevice.delete(path); - self.queueManager.enqueue({ path, type: typeQueue.dehydrate, isFolder, fileId: itemId }); - return "Liberar espacio"; - } - - if (prev.size !== curr.size) { - self.queueManager.enqueue({ path, type: typeQueue.changeSize, isFolder, fileId: itemId }); - self.fileInDevice.add(path); - return "Cambio de tamaño"; - } - } -} - -type TProps = { - self: Watcher; - details: { - prev: Stats; - curr: Stats; - }; - path: string; - isFolder: boolean; -}; diff --git a/src/watcher/events/on-add-dir.service.ts b/src/watcher/events/on-add-dir.service.ts deleted file mode 100644 index bfe7cbdf..00000000 --- a/src/watcher/events/on-add-dir.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Stats } from "fs"; - -import { typeQueue } from "@/queue/queueManager"; -import { PinState, SyncState } from "@/types/placeholder.type"; - -import { Watcher } from "../watcher"; - -export class OnAddDirService { - execute({ self, path }: TProps) { - try { - const status = self.addon.getPlaceholderState({ path }); - self.logger.debug({ msg: "onAddDir", path, status }); - - if ( - status.pinState === PinState.AlwaysLocal || - status.pinState === PinState.OnlineOnly || - status.syncState === SyncState.InSync - ) { - return; - } - - self.queueManager.enqueue({ path, type: typeQueue.add, isFolder: true }); - } catch (error) { - self.logger.error({ msg: "Error en onAddDir", error }); - } - } -} - -type TProps = { - self: Watcher; - path: string; - stats: Stats; -}; diff --git a/src/watcher/events/on-add.service.ts b/src/watcher/events/on-add.service.ts deleted file mode 100644 index 7212efda..00000000 --- a/src/watcher/events/on-add.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Stats } from "fs"; - -import { typeQueue } from "@/queue/queueManager"; -import { PinState, SyncState } from "@/types/placeholder.type"; - -import { Watcher } from "../watcher"; - -export class OnAddService { - execute({ self, path, stats }: { self: Watcher; path: string; stats: Stats }) { - try { - const { size, birthtime, mtime } = stats; - - if (size === 0 || size > 20 * 1024 * 1024 * 1024) return; - - const itemId = self.addon.getFileIdentity({ path }); - const status = self.addon.getPlaceholderState({ path }); - - const creationTime = new Date(birthtime).getTime(); - const modificationTime = new Date(mtime).getTime(); - - let isNewFile = false; - let isMovedFile = false; - - if (!itemId) { - isNewFile = true; - } else if (creationTime !== modificationTime) { - isMovedFile = true; - } - - if ( - status.pinState === PinState.AlwaysLocal || - status.pinState === PinState.OnlineOnly || - status.syncState === SyncState.InSync - ) { - return; - } - - if (isNewFile) { - self.fileInDevice.add(path); - self.queueManager.enqueue({ path, type: typeQueue.add, isFolder: false }); - } else if (isMovedFile) { - self.logger.debug({ msg: "File moved", path }); - } - } catch (error) { - self.logger.error({ msg: "onAddService", error }); - } - } -} diff --git a/src/watcher/events/on-add.service.unit.test.ts b/src/watcher/events/on-add.service.unit.test.ts deleted file mode 100644 index a503237f..00000000 --- a/src/watcher/events/on-add.service.unit.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Stats } from "fs"; -import { mockDeep } from "vitest-mock-extended"; - -import { typeQueue } from "@/queue/queueManager"; -import { PinState, SyncState } from "@/types/placeholder.type"; - -import { Watcher } from "../watcher"; -import { OnAddService } from "./on-add.service"; - -describe("Watcher onAdd", () => { - const watcher = mockDeep(); - const onAdd = new OnAddService(); - - beforeEach(() => { - vi.clearAllMocks(); - }); - - it('Should enqueue an "add" task if the file is new', () => { - // Arrange - watcher.addon.getFileIdentity.mockReturnValue(""); - watcher.addon.getPlaceholderState.mockReturnValue({ - pinState: PinState.Unspecified, - syncState: SyncState.NotInSync, - }); - - const path = "C:\\test-drive\\folder\\newfile.txt"; - const stats = { size: 1024, birthtime: new Date(), mtime: new Date() }; - - // Act - onAdd.execute({ self: watcher, path, stats: stats as unknown as Stats }); - - // Assert - expect(watcher.addon.getFileIdentity).toHaveBeenCalledWith({ path }); - expect(watcher.addon.getPlaceholderState).toHaveBeenCalledWith({ path }); - expect(watcher.queueManager.enqueue).toHaveBeenCalledWith({ path, type: typeQueue.add, isFolder: false }); - }); - - it("Should not enqueue if the file is already in AlwaysLocal and InSync states", () => { - // Arrange - watcher.addon.getFileIdentity.mockReturnValue("existing-file-id"); - watcher.addon.getPlaceholderState.mockReturnValue({ - pinState: PinState.AlwaysLocal, - syncState: SyncState.InSync, - }); - - const path = "C:\\test-drive\\folder\\existingFile.txt"; - const stats = { size: 2048, birthtime: new Date(), mtime: new Date() }; - - // Act - onAdd.execute({ self: watcher, path, stats: stats as unknown as Stats }); - - // Assert - expect(watcher.queueManager.enqueue).not.toHaveBeenCalled(); - }); -}); diff --git a/src/watcher/events/on-raw.service.ts b/src/watcher/events/on-raw.service.ts deleted file mode 100644 index 5dc16d1b..00000000 --- a/src/watcher/events/on-raw.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { stat } from "fs/promises"; - -import { DetectContextMenuActionService } from "../detect-context-menu-action.service"; -import { Watcher } from "../watcher"; - -export class OnRawService { - constructor(private readonly detectContextMenuAction = new DetectContextMenuActionService()) {} - - async execute({ self, event, path, details }: TProps) { - try { - if (event === "change" && details.prev && details.curr) { - const item = await stat(path); - if (item.isDirectory()) { - self.logger.debug({ msg: "change", path, details: "Is directory" }); - return; - } - - const action = await this.detectContextMenuAction.execute({ self, details, path, isFolder: false }); - - if (action) { - self.logger.debug({ msg: "change", path, action }); - } - } - } catch (error) { - self.logger.error({ msg: "Error on change", error }); - } - } -} - -type TProps = { - self: Watcher; - event: string; - path: string; - details: any; -}; diff --git a/src/watcher/watcher.ts b/src/watcher/watcher.ts deleted file mode 100644 index fc01d26a..00000000 --- a/src/watcher/watcher.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { watch, WatchOptions, FSWatcher } from "chokidar"; - -import { Addon } from "@/addon-wrapper"; -import { TLogger } from "@/logger"; -import { QueueManager } from "@/queue/queue-manager"; - -import { OnAddDirService } from "./events/on-add-dir.service"; -import { OnAddService } from "./events/on-add.service"; -import { OnRawService } from "./events/on-raw.service"; - -export class Watcher { - syncRootPath!: string; - options!: WatchOptions; - addon!: Addon; - queueManager!: QueueManager; - logger!: TLogger; - fileInDevice = new Set(); - chokidar?: FSWatcher; - - constructor( - private readonly onAdd: OnAddService = new OnAddService(), - private readonly onAddDir: OnAddDirService = new OnAddDirService(), - private readonly onRaw: OnRawService = new OnRawService(), - ) {} - - init(queueManager: QueueManager, syncRootPath: string, options: WatchOptions, logger: TLogger, addon: Addon) { - this.queueManager = queueManager; - this.syncRootPath = syncRootPath; - this.options = options; - this.logger = logger; - this.addon = addon; - } - - private onChange = (path: string) => { - this.logger.debug({ msg: "onChange", path }); - }; - - private onError = (error: Error) => { - this.logger.error({ msg: "onError", error }); - }; - - private onReady = () => { - this.logger.debug({ msg: "onReady" }); - }; - - public watchAndWait() { - try { - this.chokidar = watch(this.syncRootPath, this.options); - this.chokidar - .on("add", (path, stats) => this.onAdd.execute({ self: this, path, stats: stats! })) - .on("change", this.onChange) - .on("addDir", (path, stats) => this.onAddDir.execute({ self: this, path, stats: stats! })) - .on("error", this.onError) - .on("raw", (event, path, details) => this.onRaw.execute({ self: this, event, path, details })) - .on("ready", this.onReady); - } catch (exc) { - this.logger.error({ msg: "watchAndWait", exc }); - } - } -} diff --git a/src/watcher/watcher.unit.test.ts b/src/watcher/watcher.unit.test.ts deleted file mode 100644 index 80fc8226..00000000 --- a/src/watcher/watcher.unit.test.ts +++ /dev/null @@ -1,499 +0,0 @@ -import { execSync } from "child_process"; -import { existsSync } from "fs"; -import { appendFile, mkdir, rename, rm, unlink, writeFile } from "fs/promises"; -import { join } from "path"; -import { TEST_FILES } from "test/utils/setup.helper.test"; -import { v4 } from "uuid"; -import { beforeEach } from "vitest"; -import { mockDeep } from "vitest-mock-extended"; - -import { Addon } from "@/addon-wrapper"; -import { TLogger } from "@/logger"; -import { QueueManager } from "@/queue/queue-manager"; -import { sleep } from "@/utils"; - -import { OnAddDirService } from "./events/on-add-dir.service"; -import { OnAddService } from "./events/on-add.service"; -import { OnRawService } from "./events/on-raw.service"; -import { Watcher } from "./watcher"; - -describe("Watcher", () => { - let watcher: Watcher | undefined; - - const addon = mockDeep(); - const queueManager = mockDeep(); - const logger = mockDeep(); - const options = {}; - - const onAll = vi.fn(); - const onAdd = mockDeep(); - const onAddDir = mockDeep(); - const onRaw = mockDeep(); - - const setupWatcher = async (syncRootPath: string) => { - if (!existsSync(syncRootPath)) { - await mkdir(syncRootPath); - } - - watcher = new Watcher(onAdd, onAddDir, onRaw); - watcher.init(queueManager, syncRootPath, options, logger, addon); - watcher.watchAndWait(); - watcher.chokidar?.on("all", (event, path) => onAll({ event, path })); - }; - - const getEvents = () => { - return onAll.mock.calls.map((call) => ({ event: call[0].event, path: call[0].path })); - }; - - beforeEach(() => { - vi.clearAllMocks(); - }); - - afterEach(() => { - watcher?.chokidar?.close(); - }); - - describe("[Watcher] When call watchAndWait", () => { - it("When folder is empty, then emit one addDir event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - await mkdir(syncRootPath); - - // Act - await sleep(50); - await setupWatcher(syncRootPath); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual([{ event: "addDir", path: syncRootPath }]); - }); - - it("When folder has one file, then emit one addDir and one add event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const file = join(syncRootPath, v4()); - await mkdir(syncRootPath); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - await setupWatcher(syncRootPath); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - ]), - ); - }); - }); - - describe("[Watcher] When add items", () => { - it("When add an empty folder, then emit one addDir event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - - // Act - await sleep(50); - await mkdir(folder); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - ]), - ); - }); - - it("When add a file, then emit one add event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const file = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - - // Act - await sleep(50); - await writeFile(file, Buffer.alloc(1000)); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - ]), - ); - }); - - it("When add a file of zero size, then emit one add event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const file = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - - // Act - await sleep(50); - await writeFile(file, Buffer.alloc(0)); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - ]), - ); - }); - - it("When add a folder and a file inside, then emit one addDir and one add event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - const file = join(folder, v4()); - await setupWatcher(syncRootPath); - - // Act - await sleep(50); - await mkdir(folder); - await writeFile(file, Buffer.alloc(1000)); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - { event: "add", path: file }, - ]), - ); - }); - }); - - describe("[Watcher] When modify items", () => { - it("When modify a file, then emit one change event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const fileName = v4(); - const file = join(syncRootPath, fileName); - await setupWatcher(syncRootPath); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - await appendFile(file, Buffer.alloc(1000)); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - { event: "change", path: file }, - ]), - ); - }); - }); - - describe("[Addon] When rename items", () => { - it("When rename a file, then do not emit any event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const fileName1 = v4(); - const fileName2 = v4(); - const file1 = join(syncRootPath, fileName1); - const file2 = join(syncRootPath, fileName2); - await setupWatcher(syncRootPath); - await writeFile(file1, Buffer.alloc(1000)); - - // Act - await sleep(50); - await rename(file1, file2); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file1 }, - { event: "add", path: file2 }, - ]), - ); - }); - - it("When rename a folder, then do not emit any event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder1 = join(syncRootPath, v4()); - const folder2 = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - await mkdir(folder1); - - // Act - await sleep(50); - await rename(folder1, folder2); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder1 }, - { event: "unlinkDir", path: folder1 }, - { event: "addDir", path: folder2 }, - ]), - ); - }); - }); - - describe("[Addon] When move items", () => { - it("When move a file to a folder, then do not emit any event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - const fileName = v4(); - const file = join(syncRootPath, fileName); - const movedFile = join(folder, fileName); - await setupWatcher(syncRootPath); - await mkdir(folder); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - await rename(file, movedFile); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - { event: "addDir", path: folder }, - { event: "add", path: movedFile }, - ]), - ); - }); - - it("When move a folder to a folder, then emit one unlinkDir and one addDir event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - const folderName = v4(); - const folder1 = join(syncRootPath, folderName); - const folder2 = join(folder, folderName); - await setupWatcher(syncRootPath); - await mkdir(folder); - await mkdir(folder1); - - // Act - await sleep(50); - await rename(folder1, folder2); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - { event: "addDir", path: folder1 }, - { event: "unlinkDir", path: folder1 }, - { event: "addDir", path: folder2 }, - ]), - ); - }); - }); - - describe("[Addon] When delete items", () => { - it("When delete a file, then emit one unlink event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const file = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - await unlink(file); - await sleep(150); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - { event: "unlink", path: file }, - ]), - ); - }); - - it("When delete a folder, then emit one unlinkDir event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - await mkdir(folder); - - // Act - await sleep(50); - await rm(folder, { recursive: true, force: true }); - await sleep(150); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - { event: "unlinkDir", path: folder }, - ]), - ); - }); - }); - - describe("[Watcher] When pin items", () => { - it("When pin a file, then emit one change event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const fileName = v4(); - const file = join(syncRootPath, fileName); - await setupWatcher(syncRootPath); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - execSync(`attrib +P ${file}`); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - { event: "change", path: file }, - ]), - ); - }); - - it("When pin a folder, then do not emit any event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - await mkdir(folder); - - // Act - await sleep(50); - execSync(`attrib +P ${folder}`); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - ]), - ); - }); - }); - - describe("[Watcher] When unpin items", () => { - it("When unpin a file, then emit one change event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const fileName = v4(); - const file = join(syncRootPath, fileName); - await setupWatcher(syncRootPath); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - execSync(`attrib +P ${file}`); - await sleep(50); - execSync(`attrib -P ${file}`); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - { event: "change", path: file }, - { event: "change", path: file }, - ]), - ); - }); - - it("When unpin a folder, then do not emit any event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - await mkdir(folder); - - // Act - await sleep(50); - execSync(`attrib +P ${folder}`); - await sleep(50); - execSync(`attrib -P ${folder}`); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - ]), - ); - }); - }); - - describe("[Watcher] When set items to online only", () => { - it("When set a file to online only, then emit one change event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const fileName = v4(); - const file = join(syncRootPath, fileName); - await setupWatcher(syncRootPath); - await writeFile(file, Buffer.alloc(1000)); - - // Act - await sleep(50); - execSync(`attrib -P +U ${file}`); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "add", path: file }, - { event: "change", path: file }, - ]), - ); - }); - - it("When set a folder to online only, then do not emit any event", async () => { - // Arrange - const syncRootPath = join(TEST_FILES, v4()); - const folder = join(syncRootPath, v4()); - await setupWatcher(syncRootPath); - await mkdir(folder); - - // Act - await sleep(50); - execSync(`attrib -P +U ${folder}`); - await sleep(50); - - // Assert - expect(getEvents()).toStrictEqual( - expect.arrayContaining([ - { event: "addDir", path: syncRootPath }, - { event: "addDir", path: folder }, - ]), - ); - }); - }); -}); diff --git a/test/utils/setup.helper.test.ts b/test/utils/setup.helper.test.ts deleted file mode 100644 index f9e72a40..00000000 --- a/test/utils/setup.helper.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { mkdirSync } from "fs"; -import { join } from "path"; -import { cwd } from "process"; - -export const TEST_FILES = join(cwd(), "test-files"); - -mkdirSync(TEST_FILES, { recursive: true }); diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index 911d3259..00000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "declaration": true, - "noEmit": false, - "outDir": "./dist", - "types": [] - }, - "exclude": ["**/*.test.ts"], - "extends": "./tsconfig.json", - "include": ["index.ts", "src"] -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 6408cdd1..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "esModuleInterop": true, - "lib": ["ES2023"], - "module": "Node16", - "moduleResolution": "node16", - "noEmit": true, - "paths": { - "@/*": ["./src/*"] - }, - "skipLibCheck": true, - "strict": true, - "target": "ES2022", - "types": ["vitest/globals"] - }, - "exclude": ["node_modules", "dist"] -} diff --git a/vitest.config.mts b/vitest.config.mts deleted file mode 100644 index 7ec11eb1..00000000 --- a/vitest.config.mts +++ /dev/null @@ -1,13 +0,0 @@ -import tsconfigPaths from "vite-tsconfig-paths"; -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - plugins: [tsconfigPaths()], - test: { - include: ["**/*.unit.test.ts"], - setupFiles: "./test/utils/setup.helper.test.ts", - globals: true, - root: "./", - watch: true, - }, -}); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 690862be..00000000 --- a/yarn.lock +++ /dev/null @@ -1,1961 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/generator@^7.26.2", "@babel/generator@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" - integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== - dependencies: - "@babel/types" "^7.26.7" - -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.25.9": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" - integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" - integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@esbuild/aix-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz#b87036f644f572efb2b3c75746c97d1d2d87ace8" - integrity sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag== - -"@esbuild/android-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz#5ca7dc20a18f18960ad8d5e6ef5cf7b0a256e196" - integrity sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w== - -"@esbuild/android-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.2.tgz#3c49f607b7082cde70c6ce0c011c362c57a194ee" - integrity sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA== - -"@esbuild/android-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.2.tgz#8a00147780016aff59e04f1036e7cb1b683859e2" - integrity sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg== - -"@esbuild/darwin-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz#486efe7599a8d90a27780f2bb0318d9a85c6c423" - integrity sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA== - -"@esbuild/darwin-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz#95ee222aacf668c7a4f3d7ee87b3240a51baf374" - integrity sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA== - -"@esbuild/freebsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz#67efceda8554b6fc6a43476feba068fb37fa2ef6" - integrity sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w== - -"@esbuild/freebsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz#88a9d7ecdd3adadbfe5227c2122d24816959b809" - integrity sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ== - -"@esbuild/linux-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz#87be1099b2bbe61282333b084737d46bc8308058" - integrity sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g== - -"@esbuild/linux-arm@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz#72a285b0fe64496e191fcad222185d7bf9f816f6" - integrity sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g== - -"@esbuild/linux-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz#337a87a4c4dd48a832baed5cbb022be20809d737" - integrity sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ== - -"@esbuild/linux-loong64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz#1b81aa77103d6b8a8cfa7c094ed3d25c7579ba2a" - integrity sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w== - -"@esbuild/linux-mips64el@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz#afbe380b6992e7459bf7c2c3b9556633b2e47f30" - integrity sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q== - -"@esbuild/linux-ppc64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz#6bf8695cab8a2b135cca1aa555226dc932d52067" - integrity sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g== - -"@esbuild/linux-riscv64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz#43c2d67a1a39199fb06ba978aebb44992d7becc3" - integrity sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw== - -"@esbuild/linux-s390x@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz#419e25737ec815c6dce2cd20d026e347cbb7a602" - integrity sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q== - -"@esbuild/linux-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz#22451f6edbba84abe754a8cbd8528ff6e28d9bcb" - integrity sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg== - -"@esbuild/netbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz#744affd3b8d8236b08c5210d828b0698a62c58ac" - integrity sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw== - -"@esbuild/netbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz#dbbe7521fd6d7352f34328d676af923fc0f8a78f" - integrity sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg== - -"@esbuild/openbsd-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz#f9caf987e3e0570500832b487ce3039ca648ce9f" - integrity sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg== - -"@esbuild/openbsd-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz#d2bb6a0f8ffea7b394bb43dfccbb07cabd89f768" - integrity sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw== - -"@esbuild/sunos-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz#49b437ed63fe333b92137b7a0c65a65852031afb" - integrity sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA== - -"@esbuild/win32-arm64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz#081424168463c7d6c7fb78f631aede0c104373cf" - integrity sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q== - -"@esbuild/win32-ia32@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz#3f9e87143ddd003133d21384944a6c6cadf9693f" - integrity sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg== - -"@esbuild/win32-x64@0.25.2": - version "0.25.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz#839f72c2decd378f86b8f525e1979a97b920c67d" - integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz#bfe67b3d334a8579a35e48fe240dc0638d1bcd91" - integrity sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/config-array@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" - integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== - dependencies: - "@eslint/object-schema" "^2.1.6" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/config-helpers@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.1.tgz#26042c028d1beee5ce2235a7929b91c52651646d" - integrity sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw== - -"@eslint/core@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" - integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" - integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.24.0", "@eslint/js@^9.24.0": - version "9.24.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.24.0.tgz#685277980bb7bf84ecc8e4e133ccdda7545a691e" - integrity sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA== - -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== - -"@eslint/plugin-kit@^0.2.7": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" - integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== - dependencies: - "@eslint/core" "^0.13.0" - levn "^0.4.1" - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" - integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/rollup-android-arm-eabi@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz#d964ee8ce4d18acf9358f96adc408689b6e27fe3" - integrity sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg== - -"@rollup/rollup-android-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz#9b5e130ecc32a5fc1e96c09ff371743ee71a62d3" - integrity sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w== - -"@rollup/rollup-darwin-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz#ef439182c739b20b3c4398cfc03e3c1249ac8903" - integrity sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ== - -"@rollup/rollup-darwin-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz#d7380c1531ab0420ca3be16f17018ef72dd3d504" - integrity sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA== - -"@rollup/rollup-freebsd-arm64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz#cbcbd7248823c6b430ce543c59906dd3c6df0936" - integrity sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg== - -"@rollup/rollup-freebsd-x64@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz#96bf6ff875bab5219c3472c95fa6eb992586a93b" - integrity sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw== - -"@rollup/rollup-linux-arm-gnueabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz#d80cd62ce6d40f8e611008d8dbf03b5e6bbf009c" - integrity sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA== - -"@rollup/rollup-linux-arm-musleabihf@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz#75440cfc1e8d0f87a239b4c31dfeaf4719b656b7" - integrity sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg== - -"@rollup/rollup-linux-arm64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz#ac527485ecbb619247fb08253ec8c551a0712e7c" - integrity sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg== - -"@rollup/rollup-linux-arm64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz#74d2b5cb11cf714cd7d1682e7c8b39140e908552" - integrity sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz#a0a310e51da0b5fea0e944b0abd4be899819aef6" - integrity sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz#4077e2862b0ac9f61916d6b474d988171bd43b83" - integrity sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw== - -"@rollup/rollup-linux-riscv64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz#5812a1a7a2f9581cbe12597307cc7ba3321cf2f3" - integrity sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA== - -"@rollup/rollup-linux-riscv64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz#973aaaf4adef4531375c36616de4e01647f90039" - integrity sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ== - -"@rollup/rollup-linux-s390x-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz#9bad59e907ba5bfcf3e9dbd0247dfe583112f70b" - integrity sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw== - -"@rollup/rollup-linux-x64-gnu@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz#68b045a720bd9b4d905f462b997590c2190a6de0" - integrity sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ== - -"@rollup/rollup-linux-x64-musl@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz#8e703e2c2ad19ba7b2cb3d8c3a4ad11d4ee3a282" - integrity sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw== - -"@rollup/rollup-win32-arm64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz#c5bee19fa670ff5da5f066be6a58b4568e9c650b" - integrity sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ== - -"@rollup/rollup-win32-ia32-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz#846e02c17044bd922f6f483a3b4d36aac6e2b921" - integrity sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA== - -"@rollup/rollup-win32-x64-msvc@4.40.0": - version "4.40.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz#fd92d31a2931483c25677b9c6698106490cbbc76" - integrity sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ== - -"@trivago/prettier-plugin-sort-imports@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.1.tgz#34adffe6d2ea48d960d957185b13f62a2e6c901a" - integrity sha512-NDZndt0fmVThIx/8cExuJHLZagUVzfGCoVrwH9x6aZvwfBdkrDFTYujecek6X2WpG4uUFsVaPg5+aNQPSyjcmw== - dependencies: - "@babel/generator" "^7.26.2" - "@babel/parser" "^7.26.2" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" - javascript-natural-sort "^0.7.1" - lodash "^4.17.21" - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/lodash.chunk@^4.2.9": - version "4.2.9" - resolved "https://registry.yarnpkg.com/@types/lodash.chunk/-/lodash.chunk-4.2.9.tgz#60da44c404dfa8b01b426034c1183e5eb9b09727" - integrity sha512-Z9VtFUSnmT0No/QymqfG9AGbfOA4O5qB/uyP89xeZBqDAsKsB4gQFTqt7d0pHjbsTwtQ4yZObQVHuKlSOhIJ5Q== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.17.15" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.15.tgz#12d4af0ed17cc7600ce1f9980cec48fc17ad1e89" - integrity sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw== - -"@types/node@^20.5.0": - version "20.17.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.16.tgz#b33b0edc1bf925b27349e494b871ca4451fabab4" - integrity sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw== - dependencies: - undici-types "~6.19.2" - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.32": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz#9beb9e4fbfdde40410e96587cc56dded1942cdf1" - integrity sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/type-utils" "8.30.1" - "@typescript-eslint/utils" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^2.0.1" - -"@typescript-eslint/parser@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.30.1.tgz#8a9fa650b046e64656e21d4fdff86535b6a084b6" - integrity sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg== - dependencies: - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/typescript-estree" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz#f99c7efd53b5ff9fb57e55be71eb855603fd80b7" - integrity sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg== - dependencies: - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - -"@typescript-eslint/type-utils@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz#151ee0529d6e6df19d8a3a23e81c809d2e4f6b1a" - integrity sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA== - dependencies: - "@typescript-eslint/typescript-estree" "8.30.1" - "@typescript-eslint/utils" "8.30.1" - debug "^4.3.4" - ts-api-utils "^2.0.1" - -"@typescript-eslint/types@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.30.1.tgz#20ff6d66ab3d8fe0533aeb7092a487393d53f925" - integrity sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw== - -"@typescript-eslint/typescript-estree@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz#f5c133e4a76a54d25607434f2c276409d7bec4ba" - integrity sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ== - dependencies: - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.0.1" - -"@typescript-eslint/utils@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.30.1.tgz#23d4824394765948fe73dc7113892f85fdc80efd" - integrity sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/typescript-estree" "8.30.1" - -"@typescript-eslint/visitor-keys@8.30.1": - version "8.30.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz#510955ef1fb56e08da4b7953a3377258e5942e36" - integrity sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA== - dependencies: - "@typescript-eslint/types" "8.30.1" - eslint-visitor-keys "^4.2.0" - -"@vitest/expect@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.1.1.tgz#d64ddfdcf9e877d805e1eee67bd845bf0708c6c2" - integrity sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA== - dependencies: - "@vitest/spy" "3.1.1" - "@vitest/utils" "3.1.1" - chai "^5.2.0" - tinyrainbow "^2.0.0" - -"@vitest/mocker@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.1.1.tgz#7689d99f87498684c71e9fe9defdbd13ffb7f1ac" - integrity sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA== - dependencies: - "@vitest/spy" "3.1.1" - estree-walker "^3.0.3" - magic-string "^0.30.17" - -"@vitest/pretty-format@3.1.1", "@vitest/pretty-format@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.1.1.tgz#5b4d577771daccfced47baf3bf026ad59b52c283" - integrity sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA== - dependencies: - tinyrainbow "^2.0.0" - -"@vitest/runner@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.1.1.tgz#76b598700737089d66c74272b2e1c94ca2891a49" - integrity sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA== - dependencies: - "@vitest/utils" "3.1.1" - pathe "^2.0.3" - -"@vitest/snapshot@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.1.1.tgz#42b6aa0d0e2b3b48b95a5c76efdcc66a44cb11f3" - integrity sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw== - dependencies: - "@vitest/pretty-format" "3.1.1" - magic-string "^0.30.17" - pathe "^2.0.3" - -"@vitest/spy@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.1.1.tgz#deca0b025e151302ab514f38390fd7777e294837" - integrity sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ== - dependencies: - tinyspy "^3.0.2" - -"@vitest/utils@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.1.1.tgz#2893c30219ab6bdf109f07ce5cd287fe8058438d" - integrity sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg== - dependencies: - "@vitest/pretty-format" "3.1.1" - loupe "^3.1.3" - tinyrainbow "^2.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - -acorn@^8.14.0: - version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chai@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05" - integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - -chokidar@^3.5.2, chokidar@^3.5.3, chokidar@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^9.0.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -es-module-lexer@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" - integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== - -esbuild@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.2.tgz#55a1d9ebcb3aa2f95e8bba9e900c1a5061bc168b" - integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.2" - "@esbuild/android-arm" "0.25.2" - "@esbuild/android-arm64" "0.25.2" - "@esbuild/android-x64" "0.25.2" - "@esbuild/darwin-arm64" "0.25.2" - "@esbuild/darwin-x64" "0.25.2" - "@esbuild/freebsd-arm64" "0.25.2" - "@esbuild/freebsd-x64" "0.25.2" - "@esbuild/linux-arm" "0.25.2" - "@esbuild/linux-arm64" "0.25.2" - "@esbuild/linux-ia32" "0.25.2" - "@esbuild/linux-loong64" "0.25.2" - "@esbuild/linux-mips64el" "0.25.2" - "@esbuild/linux-ppc64" "0.25.2" - "@esbuild/linux-riscv64" "0.25.2" - "@esbuild/linux-s390x" "0.25.2" - "@esbuild/linux-x64" "0.25.2" - "@esbuild/netbsd-arm64" "0.25.2" - "@esbuild/netbsd-x64" "0.25.2" - "@esbuild/openbsd-arm64" "0.25.2" - "@esbuild/openbsd-x64" "0.25.2" - "@esbuild/sunos-x64" "0.25.2" - "@esbuild/win32-arm64" "0.25.2" - "@esbuild/win32-ia32" "0.25.2" - "@esbuild/win32-x64" "0.25.2" - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" - integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - -eslint@^9.24.0: - version "9.24.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.24.0.tgz#9a7f2e6cb2de81c405ab244b02f4584c79dc6bee" - integrity sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.20.0" - "@eslint/config-helpers" "^0.2.0" - "@eslint/core" "^0.12.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.24.0" - "@eslint/plugin-kit" "^0.2.7" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.3.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== - dependencies: - acorn "^8.14.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -expect-type@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f" - integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" - integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^16.0.0: - version "16.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" - integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== - -globby@^11.0.4: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -javascript-natural-sort@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.chunk@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" - integrity sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loupe@^3.1.0, loupe@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.3.tgz#042a8f7986d77f3d0f98ef7990a2b2fef18b0fd2" - integrity sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug== - -magic-string@^0.30.17: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mylas@^2.1.9: - version "2.1.13" - resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" - integrity sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg== - -nanoid@^3.3.8: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nodemon@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.9.tgz#df502cdc3b120e1c3c0c6e4152349019efa7387b" - integrity sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -plimit-lit@^1.2.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/plimit-lit/-/plimit-lit-1.6.1.tgz#a34594671b31ee8e93c72d505dfb6852eb72374a" - integrity sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA== - dependencies: - queue-lit "^1.5.1" - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" - integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-lit@^1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/queue-lit/-/queue-lit-1.5.2.tgz#83c24d4f4764802377b05a6e5c73017caf3f8747" - integrity sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rollup@^4.30.1: - version "4.40.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.0.tgz#13742a615f423ccba457554f006873d5a4de1920" - integrity sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.40.0" - "@rollup/rollup-android-arm64" "4.40.0" - "@rollup/rollup-darwin-arm64" "4.40.0" - "@rollup/rollup-darwin-x64" "4.40.0" - "@rollup/rollup-freebsd-arm64" "4.40.0" - "@rollup/rollup-freebsd-x64" "4.40.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.40.0" - "@rollup/rollup-linux-arm-musleabihf" "4.40.0" - "@rollup/rollup-linux-arm64-gnu" "4.40.0" - "@rollup/rollup-linux-arm64-musl" "4.40.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-gnu" "4.40.0" - "@rollup/rollup-linux-riscv64-musl" "4.40.0" - "@rollup/rollup-linux-s390x-gnu" "4.40.0" - "@rollup/rollup-linux-x64-gnu" "4.40.0" - "@rollup/rollup-linux-x64-musl" "4.40.0" - "@rollup/rollup-win32-arm64-msvc" "4.40.0" - "@rollup/rollup-win32-ia32-msvc" "4.40.0" - "@rollup/rollup-win32-x64-msvc" "4.40.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -semver@^7.5.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -semver@^7.6.0: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -std-env@^3.8.1: - version "3.9.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" - integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" - integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== - -tinypool@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.2.tgz#706193cc532f4c100f66aa00b01c42173d9051b2" - integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== - -tinyrainbow@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" - integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== - -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -touch@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" - integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== - -ts-api-utils@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== - -ts-essentials@>=10.0.0: - version "10.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-10.0.4.tgz#db8381c2e44cddb3339a2286174c4763bc1dcedb" - integrity sha512-lwYdz28+S4nicm+jFi6V58LaAIpxzhg9rLdgNC1VsdP/xiFBseGhF1M/shwCk6zMmwahBZdXcl34LVHrEang3A== - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsc-alias@^1.8.10: - version "1.8.10" - resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.10.tgz#279f9bf0dd8bc10fb27820393d4881db5a303938" - integrity sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw== - dependencies: - chokidar "^3.5.3" - commander "^9.0.0" - globby "^11.0.4" - mylas "^2.1.9" - normalize-path "^3.0.0" - plimit-lit "^1.2.6" - -tsconfck@^3.0.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.4.tgz#de01a15334962e2feb526824339b51be26712229" - integrity sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ== - -tsconfig-paths@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -typescript-eslint@^8.30.1: - version "8.30.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.30.1.tgz#c9ed49b459bd98e325fb78e2c86943dce7bb1cc0" - integrity sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row== - dependencies: - "@typescript-eslint/eslint-plugin" "8.30.1" - "@typescript-eslint/parser" "8.30.1" - "@typescript-eslint/utils" "8.30.1" - -typescript@^5.1.6: - version "5.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -vite-node@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.1.1.tgz#ad186c07859a6e5fca7c7f563e55fb11b16557bc" - integrity sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w== - dependencies: - cac "^6.7.14" - debug "^4.4.0" - es-module-lexer "^1.6.0" - pathe "^2.0.3" - vite "^5.0.0 || ^6.0.0" - -vite-tsconfig-paths@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz#d9a71106a7ff2c1c840c6f1708042f76a9212ed4" - integrity sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - tsconfck "^3.0.3" - -"vite@^5.0.0 || ^6.0.0": - version "6.2.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.6.tgz#7f0ccf2fdc0c1eda079ce258508728e2473d3f61" - integrity sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw== - dependencies: - esbuild "^0.25.0" - postcss "^8.5.3" - rollup "^4.30.1" - optionalDependencies: - fsevents "~2.3.3" - -vitest-mock-extended@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vitest-mock-extended/-/vitest-mock-extended-2.0.2.tgz#bde329b0ca0cdfc2b0a3c71291e1af64559e23b2" - integrity sha512-n3MBqVITKyclZ0n0y66hkT4UiiEYFQn9tteAnIxT0MPz1Z8nFcPUG3Cf0cZOyoPOj/cq6Ab1XFw2lM/qM5EDWQ== - dependencies: - ts-essentials ">=10.0.0" - -vitest@^3.0.5: - version "3.1.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.1.1.tgz#39fa2356e510513fccdc5d16465a9fc066ef1fc6" - integrity sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q== - dependencies: - "@vitest/expect" "3.1.1" - "@vitest/mocker" "3.1.1" - "@vitest/pretty-format" "^3.1.1" - "@vitest/runner" "3.1.1" - "@vitest/snapshot" "3.1.1" - "@vitest/spy" "3.1.1" - "@vitest/utils" "3.1.1" - chai "^5.2.0" - debug "^4.4.0" - expect-type "^1.2.0" - magic-string "^0.30.17" - pathe "^2.0.3" - std-env "^3.8.1" - tinybench "^2.9.0" - tinyexec "^0.3.2" - tinypool "^1.0.2" - tinyrainbow "^2.0.0" - vite "^5.0.0 || ^6.0.0" - vite-node "3.1.1" - why-is-node-running "^2.3.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod@^3.24.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" - integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==