From 501e0ac8b6521b8a6860bd6687f3f2c7770aa82f Mon Sep 17 00:00:00 2001 From: Pierre Date: Sat, 24 Jan 2026 22:18:45 +0100 Subject: [PATCH] test improvement --- package-lock.json | 1799 +++++++++++++++++++++++++++- package.json | 7 +- src/meta-core-client.ts | 22 +- src/webdav-client.ts | 4 +- test/fixtures/generate-fixtures.sh | 42 + test/fixtures/test-audio.mp3 | Bin 0 -> 8586 bytes test/fixtures/test-file.json | 1 + test/fixtures/test-file.txt | 1 + test/fixtures/test-image.png | Bin 0 -> 69 bytes test/fixtures/test-video.mp4 | Bin 0 -> 23784 bytes test/integration.test.ts | 155 +++ vitest.config.ts | 10 + 12 files changed, 2020 insertions(+), 21 deletions(-) create mode 100644 test/fixtures/generate-fixtures.sh create mode 100644 test/fixtures/test-audio.mp3 create mode 100644 test/fixtures/test-file.json create mode 100644 test/fixtures/test-file.txt create mode 100644 test/fixtures/test-image.png create mode 100644 test/fixtures/test-video.mp4 create mode 100644 test/integration.test.ts create mode 100644 vitest.config.ts diff --git a/package-lock.json b/package-lock.json index 31fb4cd..6c83b11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ }, "devDependencies": { "@types/node": "^20.0.0", - "typescript": "^5.3.0" + "typescript": "^5.3.0", + "vitest": "^1.0.0" }, "engines": { "node": ">=20.0.0" @@ -29,6 +30,397 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@fastify/ajv-compiler": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", @@ -134,6 +526,26 @@ "ipaddr.js": "^2.1.0" } }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, "node_modules/@metazla/filename-tools": { "version": "1.0.0", "resolved": "git+ssh://git@github.com/worph/filename-tool.git#e1fc075b7b52b29b38af17ba2aa6507e4c05dcee", @@ -150,16 +562,380 @@ "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", + "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", + "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", + "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", + "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", + "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", + "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", + "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", + "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", + "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", + "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", + "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", + "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", + "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", + "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", + "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", + "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", + "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", @@ -169,11 +945,111 @@ "undici-types": "~6.21.0" } }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -205,6 +1081,29 @@ } } }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/atomic-sleep": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", @@ -222,6 +1121,48 @@ "fastq": "^1.17.1" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, "node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", @@ -231,6 +1172,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -243,6 +1191,52 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -251,6 +1245,115 @@ "node": ">=6" } }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -401,6 +1504,31 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/get-stream": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", @@ -416,6 +1544,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -454,6 +1592,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, "node_modules/iso-639-1": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.5.tgz", @@ -471,6 +1616,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-ref-resolver": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", @@ -529,6 +1681,90 @@ } ] }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/n-gram": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/n-gram/-/n-gram-2.0.2.tgz", @@ -538,6 +1774,54 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/on-exit-leak-free": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", @@ -546,6 +1830,65 @@ "node": ">=14.0.0" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/peek-readable": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.4.2.tgz", @@ -558,6 +1901,13 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/pino": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/pino/-/pino-10.2.0.tgz", @@ -592,6 +1942,69 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==" }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/process-warning": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", @@ -612,6 +2025,13 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -650,6 +2070,51 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" }, + "node_modules/rollup": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.56.0", + "@rollup/rollup-android-arm64": "4.56.0", + "@rollup/rollup-darwin-arm64": "4.56.0", + "@rollup/rollup-darwin-x64": "4.56.0", + "@rollup/rollup-freebsd-arm64": "4.56.0", + "@rollup/rollup-freebsd-x64": "4.56.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", + "@rollup/rollup-linux-arm64-gnu": "4.56.0", + "@rollup/rollup-linux-arm64-musl": "4.56.0", + "@rollup/rollup-linux-loong64-gnu": "4.56.0", + "@rollup/rollup-linux-loong64-musl": "4.56.0", + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", + "@rollup/rollup-linux-ppc64-musl": "4.56.0", + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", + "@rollup/rollup-linux-riscv64-musl": "4.56.0", + "@rollup/rollup-linux-s390x-gnu": "4.56.0", + "@rollup/rollup-linux-x64-gnu": "4.56.0", + "@rollup/rollup-linux-x64-musl": "4.56.0", + "@rollup/rollup-openbsd-x64": "4.56.0", + "@rollup/rollup-openharmony-arm64": "4.56.0", + "@rollup/rollup-win32-arm64-msvc": "4.56.0", + "@rollup/rollup-win32-ia32-msvc": "4.56.0", + "@rollup/rollup-win32-x64-gnu": "4.56.0", + "@rollup/rollup-win32-x64-msvc": "4.56.0", + "fsevents": "~2.3.2" + } + }, "node_modules/safe-regex2": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", @@ -707,6 +2172,49 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sonic-boom": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", @@ -715,6 +2223,16 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -723,6 +2241,46 @@ "node": ">= 10.x" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/strtok3": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.1.1.tgz", @@ -750,6 +2308,33 @@ "node": ">=20" } }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/toad-cache": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", @@ -788,6 +2373,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -801,6 +2396,13 @@ "node": ">=14.17" } }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/uint8array-extras": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", @@ -817,6 +2419,201 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 7bcc41f..721a178 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "main": "dist/index.js", "scripts": { "build": "tsc", - "start": "node dist/index.js" + "start": "node dist/index.js", + "test": "vitest run", + "test:watch": "vitest" }, "dependencies": { "fastify": "^5.0.0", @@ -15,7 +17,8 @@ }, "devDependencies": { "@types/node": "^20.0.0", - "typescript": "^5.3.0" + "typescript": "^5.3.0", + "vitest": "^1.0.0" }, "engines": { "node": ">=20.0.0" diff --git a/src/meta-core-client.ts b/src/meta-core-client.ts index edbe17c..ff111ca 100644 --- a/src/meta-core-client.ts +++ b/src/meta-core-client.ts @@ -1,6 +1,6 @@ /** * meta-core API Client for writing metadata - * Fails gracefully if meta-core is unavailable (logs warning, returns without throwing) + * Fails gracefully if meta-core is unavailable (returns without throwing) */ export class MetaCoreClient { @@ -9,8 +9,8 @@ export class MetaCoreClient { private async safeFetch(url: string, options: RequestInit): Promise { try { return await fetch(url, { ...options, signal: AbortSignal.timeout(5000) }); - } catch (error) { - console.warn(`[MetaCoreClient] Warning: meta-core unavailable at ${this.baseUrl}`); + } catch { + // meta-core unavailable - fail silently (expected in standalone/test mode) return null; } } @@ -21,9 +21,7 @@ export class MetaCoreClient { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ value }), }); - if (response && !response.ok) { - console.warn(`[MetaCoreClient] Failed to set property: ${response.status}`); - } + // Silently ignore errors (expected in standalone/test mode) } async getProperty(hashId: string, key: string): Promise { @@ -40,16 +38,12 @@ export class MetaCoreClient { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(metadata), }); - if (response && !response.ok) { - console.warn(`[MetaCoreClient] Failed to merge metadata: ${response.status}`); - } + // Silently ignore errors (expected in standalone/test mode) } async deleteProperty(hashId: string, key: string): Promise { const response = await this.safeFetch(`${this.baseUrl}/meta/${hashId}/${key}`, { method: 'DELETE' }); - if (response && !response.ok && response.status !== 404) { - console.warn(`[MetaCoreClient] Failed to delete property: ${response.status}`); - } + // Silently ignore errors (expected in standalone/test mode) } async addToSet(hashId: string, key: string, value: string): Promise { @@ -58,9 +52,7 @@ export class MetaCoreClient { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ value }), }); - if (response && !response.ok) { - console.warn(`[MetaCoreClient] Failed to add to set: ${response.status}`); - } + // Silently ignore errors (expected in standalone/test mode) } async getMetadata(hashId: string): Promise> { diff --git a/src/webdav-client.ts b/src/webdav-client.ts index ffa9db3..3718852 100644 --- a/src/webdav-client.ts +++ b/src/webdav-client.ts @@ -175,14 +175,12 @@ export class WebDAVClient { /** * Create a WebDAV client from environment variables + * Returns null if WEBDAV_URL is not set (plugin will use direct filesystem access) */ export function createWebDAVClient(): WebDAVClient | null { const webdavUrl = process.env.WEBDAV_URL; - if (!webdavUrl) { - console.warn('[webdav-client] WEBDAV_URL not set, WebDAV client unavailable'); return null; } - return new WebDAVClient(webdavUrl); } diff --git a/test/fixtures/generate-fixtures.sh b/test/fixtures/generate-fixtures.sh new file mode 100644 index 0000000..0476e54 --- /dev/null +++ b/test/fixtures/generate-fixtures.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Generate test fixtures for file-info plugin tests + +set -e +cd "$(dirname "$0")" + +echo "Generating test fixtures..." + +# Create a simple video file (if ffmpeg is available) +if command -v ffmpeg &> /dev/null; then + echo "Creating test-video.mp4..." + ffmpeg -y -f lavfi -i testsrc=duration=1:size=160x120:rate=10 \ + -f lavfi -i sine=frequency=440:duration=1 \ + -c:v libx264 -preset ultrafast -c:a aac \ + test-video.mp4 2>/dev/null + + echo "Creating test-audio.mp3..." + ffmpeg -y -f lavfi -i sine=frequency=440:duration=1 \ + -c:a libmp3lame \ + test-audio.mp3 2>/dev/null +else + echo "Warning: ffmpeg not found, creating minimal video/audio stubs" + # Create minimal MP4 file header (not a valid video, but has magic bytes) + printf '\x00\x00\x00\x1c\x66\x74\x79\x70\x69\x73\x6f\x6d' > test-video.mp4 + # Create minimal MP3 file header + printf '\xff\xfb\x90\x00' > test-audio.mp3 +fi + +# Create a simple PNG image (1x1 pixel, red) +echo "Creating test-image.png..." +printf '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\x0cIDATx\x9cc\xf8\xcf\xc0\x00\x00\x00\x03\x00\x01\x00\x05\xfe\xd4\x00\x00\x00\x00IEND\xaeB`\x82' > test-image.png + +# Create a text file +echo "Creating test-file.txt..." +echo "This is a test file for file-info plugin tests." > test-file.txt + +# Create a JSON file +echo "Creating test-file.json..." +echo '{"test": true, "name": "test-fixture"}' > test-file.json + +echo "Test fixtures generated:" +ls -la *.mp4 *.mp3 *.png *.txt *.json 2>/dev/null || true diff --git a/test/fixtures/test-audio.mp3 b/test/fixtures/test-audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b273ce5aa1aaa1a85e8f2a2ac1b1d16751b1683e GIT binary patch literal 8586 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 Hdi(zYAZ&`g literal 0 HcmV?d00001 diff --git a/test/fixtures/test-file.json b/test/fixtures/test-file.json new file mode 100644 index 0000000..bf04c8d --- /dev/null +++ b/test/fixtures/test-file.json @@ -0,0 +1 @@ +{"test": true, "name": "test-fixture"} diff --git a/test/fixtures/test-file.txt b/test/fixtures/test-file.txt new file mode 100644 index 0000000..237796a --- /dev/null +++ b/test/fixtures/test-file.txt @@ -0,0 +1 @@ +This is a test file for file-info plugin tests. diff --git a/test/fixtures/test-image.png b/test/fixtures/test-image.png new file mode 100644 index 0000000000000000000000000000000000000000..7607db25c8a2b2f4917659998d11de8950614e86 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6yf1E!6QLO PWHETU`njxgN@xNAx3~`* literal 0 HcmV?d00001 diff --git a/test/fixtures/test-video.mp4 b/test/fixtures/test-video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..672fe827c2983530f5e20490db08cc964e924631 GIT binary patch literal 23784 zcmZ_0bzGC*`#*lRu~DO2!jTRbH9|m;(IH9*NJ(ylbc3Rdl9ZNGDM2L#M8F=6g4ie~ zp@<3+7AUgs8L!vt{dxTU_}$#Q^PF>^yq?$dx-JC(;QXQ!!ULniLI6Ml#u@&I-m$)F zA>kTo000)hND2i2$C(hacl28(U=81CYAdU$YbdL!ssf~YvrA)cq-~CM(_8U~NcT)5 z7H&=|_E~jAusQEow_wC#pqI?}wctH_%O-y8JwMtlenWnuO*;g0%cW{?vZd?U%cqOc z!9NJaU;HN@UB2&Gen-=xezGOT_f>vqu7>w{EP2?PJZxECY1v*0k7kANs>;7&KDMyQ zKdel`K&90ETKwwVh_ZW!=}4{}B^zJ&|F@gineyA2WM*a-WKVLZv1M|?7CT_jbh_

l(jg-PH67ZMmxA$u~)V&w3Q^bYl> z=&Nbrd;=oGLcBd;RyAC7BqcaFFbby7j@KspM#Br=h!A)rQ@qJX!$K+gL^Xn%8qUu< zD%vwVDkv}O*RT&O_L^z|I?X!2hzLpMr5EV@chiwfE zhrJ5N4tBZ*9H9t(RX_!Rx0;ffrYmC$c+oQ~0LLOP$L)Qg66{bPKAUZ1PNyNyNXhM9 zAjbi=;LP%OwT17Hepv>#hc({40Nm$B2j#7Bi@v%d^mTBmdt*NpsrBlEmYwVgarq=w zfJ3B;DaF1Fted9)-OLqC+5|hL)S9?6XMb}8u0r8wEG7}hS!fiM6PdJ7{^yI_R3xxQ zCLk1=DwR{dpYDyJqP0w{!yb+<2k>Q;dHg(O{)Q?jLC4H2Kj2DMH>tj)Tp6|~oCLVM zB*(SdpWMZy59fQ(m_mB)1*0zy08jV9hrL2%K{bz=g;#0|as!aPxw2 zu+thr1HC%a{N*SrNahACC}0a>R3!luLX4+XVxUQimSp6UvJQ^Rzf3nbKfZNPT1M+L z#hRVx7K;t4RI|m^V{>sHU?RI#*o#OALZ<>#tKL#sYYO3ya&}N zTYv?Tfj?@~_wjDBYX(dbjHcOHJZD+a`Bh3tLxWF- zcg)Fo~ns@hV%Y*;xdK{@KX7>wX?&LpSOi^!q()Jhi@lBq%(cmPy}J2 zXU(*ca~o&z8`Ba#p(M>DdYAC1WL9MUdZcg}exP9Rni*j6@?^T=N7(JG@yPdS>Sf@} zBE=g>4d0j@$DFU-u@aeWew_9mAZ&&AexSpelf3?viUBri-!G*jl;@Y-p0@<5?_9ys z5a5xMlCqb*g<9!?xfJHV&gLo^y~}aE!eyX~6}{E$J1Tm6nGOh`09-G8Zy(QjE6OlH zb1;XDe3ZHJ-Ps_Z`t{$u&2Kqtk&f_rpnkiZLhA zt{4~KBg`(s{m8;0LLZ+oO!jeFd> zczihtu%O|RQbjx`!l!tcipqIy6E3uWpQ^%T$PbW!#_Ya1PNzSl)4x2w>~RZLK@RkA z`H)MB&tM;g(WzYCY=`pu@}#zwxB)W>gXmnDhO6I8R0Z(tjJc??K~H`x*8YjpLtJu< zhLC$qy7NcuHGN%-WquzgQY*&(ANCsjehUnkr_nI=N zPNZN9BeTSkc7dX>I{GY?SLBt_Rfp_-&0t|*6mwIe|&kK=EVwxdif}=aU>*P z@N|iT1TaL4uzdDgSajfmd21MXb-M%s65$1K)IMJcctrv@EQkpJY24|RdRawseXTDE zlz*y-Qw92I@@8C8URgCkvH8MEOp<>2Qsk_5#?5(flDk1zFDpeZx%DN#SJ(e#mj?)h z%uf2IHj)#Tzo7hP=?!BWA&GZCwgybhR6s&DQRC@UUTjSr-P+qWm0kJC1^~EV#(>>O zro(okykK3?ui%#RDC- zdjIw8`a?xH`(WQ2vQonVH#k{#^7$FL)x^=l}#?meQ;k{QQkBnz>d0 zGeT^tZc&UW$}gu!95Atr0G=S%)1-Mn!+uV(7*$2`dTI)mEQSES>bPkn zFlHQl)u~8Hd|1u3_A`1im?eRv)B=%$a3qkgU>pzP!dZ}mXVbixhNTTJ>6EFZP2DCII+{y6WZ#j zsoL7=dDyvB?QlSnu@D2KfP!`xul8wR0t#{AKngs^#cVbhW9 zsVoX876pFXCEJvmdKG?LDvhXK`@)3y1)hTNWa||qZUguR)^Yvy-#VzBcK6r|#KR*j**Svocha(w zHd}9XuU#n6S89!?uO@5CZ9?s(385<4T2lfi}|{&N5BTl)0vrA$jq2zsp4v?Hj1QS&kQhB4*neC zI5<)OSXh4G01e<&3b;hCZixY^-l#SL@ZW!-4M@yH2y6hOGJQCreUPDV9~lC}Z`m)J%f z&}0d~v;g+i>mh2&ELQk-Q7a?>2coTD1xS-PqVo~Nc-8{MTX4=4c}Mcx1O`#WkCMS- zENrm_H6oHEq7jvx4(>7oB&->%o=!2fLYuXa2B@eCF{sz@-=$fXqNzwee!c~{Fy|CL z>>7!4SKr{ecD0yIYSv1`UhQhnKALfGIzYHE^Q^_C(hP9#QR=a};AwJ-&?Rq{3fcNM zmp8*9h+v2)Dnb}=Xw(Y!y%4A;95uZG7N9iBCQVN>MPm1Ou4}`tLBkGW0toAs?WsD= z&8$w9#UYY45YuUrFD}tj)5J!_SR}|d#F(&TP8N;3@JlQ_2S8@jTS88To?Ju5rmEd1 zo#4HkGTWt9DAN!+sGG>=@=7eoZk9WJG#ndQ42c+j3J=!Fqlmk5Bm~n3#5IQwIV4fLsqF!j=xDQ zz``Ys7S$jhO8_}5D)KR`!b^xGc5v;pJw%yG)u8IhfWJTtU>^dDdL}uu z@>h)|fn*R}$=Bs_g5*AOXBymcwsn(c@i_UyO>n3q*o}G9ZRcvg*ywwaLi*0tQS2y^ z58Upt<*K1S()=#QV^9tVNVb&ZPgQs61d%~UZzqKz=Vk$)7RT(4L7u`X5CD*DY9tovrGUgn<^&`O8D#PPkRXIPToq7+0xB18 zB=DdD5-W|c1dxPG@oP!%0rd%PIyrZ>Lin_WgLi@+Cno|Xo@N3ULPux_>^RzU1kJtQ zd6X9H?(XjSEWCzTmX9IBsq7Dg?+armk-149kKMRkB}btHc5j?QXu4kYXD^jM9~?dL z8p$(v_2NYscrrJQzGmi!;Aee#?CtuH3NN1&se*>NpPr{+BqY2$5NZyulO7=bIg?#b znP~C~9xrm49s;#4$>dxFeL0T}rJH@HuOCfBokaK*ou!GPfZk(ffCUnPg2Z7U7Yvw~ zi1t*d9w1+UKZm!p0adLa9Ik?UquNm65@CjGLam|z3Go$G)QbV=QLNCr>1l4bbYXKf znE@5HnRHNHQW$th=%6^}iuB`C4U7OovXDAyR~RCuh}KDK4~Gi}c^?;!MOPXpduR(x zPa~*|njpEs6^n4i5#&vf63%gh${da`-|FT^mm-G{KGaT{a}B{(5YH|KSgFFJ(}3zL zn{toJ5MnqinSnUQvLtdki46HhB-m{Ct4K(>!d!%rDs}NGmH%h=P3D9XxkBu9RK!Cj zas=Qhyg#ygCkXbM7i(u~|C6&kA3E;ZdgxdXs@8s!JL@#iu+k7~+^c7280;Z)L;9-J<0WQYNTyKr4~ zageYzTJsCe;YnvteXni}q@p?&(*52<0wEf6>gGP5*7I(EquIO=HRxwTkn@!~WP4m^sEuYx$9-Vl8gX6^2)A?Tq7ZVo`^gX4=?(+TU6N{7p!t?2W=Or48 z$8pl0f0Or^R^ya~!xo{qun2j2@4@E$HrJhyNSk=CA$0oH%zLIe_kpxI_rIyNqG?`% zzjTwS2NdLPr>3dQ!-aYD$-jilAt3BVW{3E%uq_fu;kcFoxD9&@00OIe^uvkfYWw~> zzQ4yYMn4zYFsmUaXv+VwuD#MyJLK8&b~PZDQoXfWWi%r9F0DW|l_{(Ri33Y=YUmMy zDLLEY>qYyMTviStK=`F^J{5_=onJA0yyKdrO461x2(BA$sXhYqcFwwqgzQ-UQln8( zXY*8O|L&ih&bV>IK8)91z@cDWpwf9PiRvmm6(U%t?vET+c3lHxm} zZ64K#8@Q^2~p* z4Z1EPDoveYN=1=pb|FsPNE^puzw(9)iw9V?hvz@`T&}y#Pw;ce zk(XJj&krtat6hhKLbP59Mo&HQB|g&KWxY^P(qKRR#2q2?qm_f# zs~mV7^LNxJvM7>4GqD`*`dav-`g>wgfw3s_hk5*MX9A9Eq&GbP`~P0!k+L5 zt)YrSiJLNU;lU9jf?jcL=5d&dVi9EKMAgDUk;b74#GChV+K9?_68av2U${3vt4)ZR28wrWE;!|1f#!;~YZ5j2Yew&RjPOZ!Aw zMb6d6ziJxxw)P8sFExPtq4Yp8;@6}1Df{(TZ=T&Fo3NPs5kDY)tL*v&@%5dY#CrR6 z`z6Z*u_dR^$^NWX-kF!##yY{0CacPA(c%u~HCrA|>SC>u`SlGn5`*k#c+V4>8u0Q~ zH5Wtu1mr#!W;i3uppb3bz-F1HY0RXGL1*^M>?25< z;zl30%*z}gsva;udgx4#-$`VwRjz!CgSjZTLp6(>uGeH*2P+n_Lo@bUM3=Wo@)`93 z`>VDa1M=+n`j)Aowy#d9A6&my-}}z|Ni){zx9x)tli?k2U$Y%_J=)`cYWLkXH1~b> z>xV>%Ems0eDx;ab+F345gRhz`OB%x0-W<>9Zu_48%#Bh1T8EmHp`unoGqM&RVHt4; zS-iO;rYP})(~akrTCF>}j#OGUK~KdQ*7}NtBJrv~;io(kSJ?Ee=W+aRj2{w&ZZW<6 zKm@#U?4yPO7u8uJ1zBGU#-{tD)OnQ_IJ|NiE}Z(dlI)`6s1z_fb?Qq3Ugye#B;62i z`(nM_Ke(^Xwd%H_-z&Fd8zYWdHa#^ubpCeC5cNPD@*r@opaFpRU|177&Iy>3eDpUi$!JeMm(bnv!%r@rJITPMdx@o-=o~nKXd1{HG$24+Ma(lMqg739DywDiE zc_mhqo%n!`Jt4;-H`=IWN+r^Ki)kU91Vk0;r55{`SzqKg?{@c_FM?H6R(E@M#IURB zX$exQH`-r#xSZiA@|^V>@b+^#BU}Apgm5HSNJVSk^TA(n@h!dXN~L4z{ZnDEYy~`K z`%gqQ!1->f(J+V1Xrr9RPT3Q25zej4dkqY-hkQDm&-43qm_7P-!a#AhF4rzw%?v*z ze4amS;PtzVYfW&YZ>MUp%N`P4-FTP(V8~Qtncx4Glf(H=r!l%~PPWf%b+Jf!i<6?j z##aM_RmWDxLz_@(b9X-|#6L;&i}h8f(+4EDvtcv$N&B7nJ35vdP2# zGO!x(4gb(?{x{|0Q&r2otwTw(jP2~fDfd{(=#S^OOJ&mI`}PUUoK1a$dY!7py8Le9!>Jzi zHm5!K(UY0HYH612l3ZvBNfw#= zw|~T7VjtM5R-Q~^UNH7Id;IQ1*DEt*>n$4=GV1WL; zr{+)CYuj92x$4kwzBzj8^vOT77P?sL_llp4ynda$sMfWEwf}p1hH9%tru_lNid+21 zCg%R?yTr?(#X?Z&Mo%Qn>=yZpi@Eo3SMyxy!yKc4!2;uT#)Yu}g{Z^KztmE(ag zd%K<9tln$e`_iW*$a2OgarUR%Wr1G%;_GZ|&$P{s?NT!eXu;ho)@BUPO0;x(Q3n5> zB-EU{J2z;MH!5jDeMMi*5Ty>)@e=EGl7{RJa_%JXeAZfU_P;njQjs4RMoi$FH;;cW zw;I5bGD97W`zo(he)*5%#3K=_>C9g_f%7-@DW<_%S?KOP=!n#8r9>PV`5yb;^$*?8?D35F6xF$BWy47ufBbK z+1P68enMQ!g#YowwI09btR>!Sy zuf~OEm5wQtG_Wa@$iGZzXngt97a_BFH)yMnZ-c%TUd=Qz=Er+VvGS0{rN@+((uyPd zrMxIIR*J@prW?x*`a^c($i9S6UBE+1&c3&%EB4^O8#lxA}6v zm`l4&R`jl_)Sko9cjPkF4}CC+j!1c)arr=JU+V$UtF5tmlYeiCTvsn-oBVy>^0`(> zK-aCm9DD9*4iKCV#ALfT7dRJ{AT`Rz-!Nz;%*U!`I~X{S=@ptkO4M=6m~I3Y+Jnf0FYGi9>Q z2W%-clmT~0r~HDmW=r-@)7+k}7ridz*91zgXmIu`sbOaWK1D59jMo^(X-eRXR9`9T z()F&UhLA!xvh(({ZqwZM6LQvs)6?xSPoc2eLDp@*xw7I@!GBO{fI#fN>srdO_4eK1 zJ(Cxna(x#}KYZXHjq&y_6;`v(mM`>kj{NXR`!d$@^PM+$_)vARrbdf70OJgJGE5fp zeBe3HK#PMYq+*aJsgfI5Xi6lE5#6M+$rqeEv^Ndpj1IQ$7fe{xZnU#@hO%@(b4tVeo2(CHo6aJJ+&0@!cL! zgf}Y|%l_}38D7ooSn6eB4%sgF&X6hQMa?TmNBxlzKdvi6daF?n2x`{tLqu;^%Ds8x z$q2)$Rl}-3$0GCY{-Mt{Dc3PX?A)UB*cHxsywAz)y}UNtcTuq-vTL-J_zT*clQz|~ zuDV{PZwXgVBd>e!mIt5skKUT2ao3p@8-OF@E@Nk&7I3IPBVoQtsTGL(a2@K+pymZ| zSFB&E%@!_bcmAhbVT}u>Q7Veo*-sQZoEhlCz>mFQL&2SRANa}bMDnSDg|3tjfdxN` zw=={1-EWn8PRqlmi$%}A&h~JBOa92Ez0?2xx~-e?KQ*3!TO8Z`VP6HVnatcn0=6XceCbA;6X{5140eR!C2bL zg$G>wTis{kfg9$_^|zBj6H~T`lP3eErCv(v0t0Y}>rt5DT z%1vEkL+;5>9unVoGL-hJ)Y_0wFFZbNWwFxX`n^WOQE_Cf5vpGv5X?~k7^P9Ju+ ziC+6?r+fdJ)BKH|H|nS4-d7(t`5^2aQ5kaj_j#U9;>d_i4mL=T*Y5PePq+NeUdi1b zGF3X_Cmep+E%xl674?^oDhtm(EZ`%Q@DR>rzR@-V+z#Q43NLB!@H?z}7Op00OA={K z4gB&}wfZ)S`xLEe+RUUfSGU5ASBi%%q8_>Cd!BbX<LTG_f9Bv!gnaVN6>s%+vqtf5bQ@-@v&4>!N|%sQgt4)Ct45c2X5>JZNb3)Rc=jdZABTT?_J>*r z`4`{RSk!89(7xZ(v0$BGvUpW?Q2EDhs||s?#Q^EvC&!n@qPpwXyR+sR``ph==}t74 zI}p2eW^>m#Tvrc|if9d>l~AmN@}D~~%|M+QrEFN~WyQ5Nd1s|e`4`>Ynv0`?`Ba4< zU}~Tu45npA_PKJ=5;);j*u>ma%O7oprB?v##*ERxRF-PgR zjk=$;XczHP+tTqh2;6snLo!!oh$Ua!bbQ-WBC4HtF9JXN%~Q#?HOc&S?iI1!H%)A=(e}QSxb(WuG8tpNqm^Jmh7~a9DpR!5V<`QeSIGB5(1sE zf|LrD!&QCHQmu1{1NiZ6P&pxo7Hi~G0$ zcXp;^%u;yCH>3u%*K^H?ueq)YloGo~TRXLxOR?h48l&wK27!kLA4Aqa>6(Dk?3Yw3 zvh}aD4ie#V87URG;QniBxhF0%ChY2+Y(~PIJR7*TkjEDXZ6b{M)&ARwon&j51Xr@Y z|E)JYAs4QEoXPy$>fWa=r>(k^PJi7u#qZ5>36c&qv!mmeYvb8ivyiO&aj%@TOaK#@ ze!oNG%igADac$J=!5qg6%tivtKcI2VmS4~WftI1Yaw;b=p)zo@YCDHaQT%G8A*?Oq z%Ou(zhwQs$r)5T4DvsT_k^R~!F_78m-v5w{foDz?0^>K2_6HFlpya#Tj$HP+>EvX6 zN}=qA=b7x+cBK$yb8Y>Hf_uO8JsG#1(6gP`>*UZ%l;}*R5AX=LDOL;m?Brh8{nnc3 z4i=y?IIJs{D--8gvp(4{C~Ioy(7+~dCEP~%l&Wz(*{j4_M_K>tY*JeF0ltr2__(uY z_6WujK39xSG|HD=xT+N)%NrZW)KDVKA$*s~4==xPvYqfH5mk47me)1u=2a!@U)dZf zK^i|EPjf})Jhl_K)Q;E5aeW)L-0&^;Yb=L{uKlT!!OUv{fAY_j50pI5vg=;yv|Zkv zvB&B0a-o+2+w0qg0-b|P;zeHRjipvcTbWHHcdK%hv>ZEA^D~*dN`&`Uwd;W&4K3kc z`fEdbd0iV(Qk&b9%0WFnFKb(8ckRujB*RuIl%O>0g96+%$!FbH_nNPnl+B!4(D`Pt`$Fk|C@w(1AICsjVH^%cxk+)LjxuSY)rb5r;nUuwz= z+G*EsR-C_d*{L>6>wz{fd13RV5$tfqAsLc+0A$eZpJ6Kd&5R$5wOyX!oVRbo6UD(swW5taL4& z^B!*pv65v4ENZq|_ptiDtP-zwJS({4 zSM5>ldGYzheAds89Fe^JeG`o`!}+S`!rymMe!I9i+w0VezLc*UT>WidlA42TzS$7) z9;C;Z0OhpP`Z5+4hO$X)RqT_>j?t%0|DO5u#!ijX^48n#VmE=BR`!a+6g#9(v2It8 zg{i}%Uj9eySteRpp-~}Xvo93Ns%xzUp5T45NPT$Psjii|_&0nh0pBgTyONcev>9r^ zVviKwY1Pwvsci=jR9m2N&(uEc+iukke4}t}SP-k_#=OnIJ8{cLLmqyi&u@5ES1rXn zIjs4mt*qmdOtgZ>+L0IKm%B`ljow^3`dqhl;Q>44{VvwdeYCP8iHZFBTBRo}8|B9$ zU&rmZY_F#M)FaXCB&i=2jzM01CeYI{qMNsIxN^YWyeh1^JJEUhaxup#6^c9SXm$VH z{RDLt1*cdu4HfbBFCxP=N{^>;pjR70q@7_U)s^Snw}HySHV%ez}oP#I@_wEkez*Na(kOpqJ%5ZvJCQc5J7a2+gKht`=WL4m zja4;0c@Y)rLM@q(+zxi(i*e_hOiwyf`0u`OrkvXq#~hq3AzZXT;4v60TYZPB6)4bE zSQ7+j3O8rEsH7pjVBy-dgU9p|)mI*^e#c62rM2L5{{W%y8P&IqfNeM66L-cQl%kEH z@D~^sHEjECak64hfxS|%ZDhS2gF#_^+xQ(|#RgW@o@JGa9LsI=RVqUy4CW=!*1AVM z7!AhQS=YBeeQ{^-Zt4F1sbE59=c{}@G;Ak|fKkzAkVb6#j;^NbGnqGT+<0|E2?nxk zI$YXsM59D>GtOx$AMa;)l7ooza&6{+U5s^3^=do-I-X}R*xOV$|N_YB>!%dZEl1Hb-C=@^BOZ?1Uy~AATENaLfH3qu{DlE@BiGnUF z_%o8GgEwuT+CFpijV#)04cnmp>*hvN8!nNwuDZXB{_EK?orhr`Um3O%vtMl_w6vbG&b5rQJ)X_<8#rYM7=YOk4m4_v08b zhw8XvjW3?H&p*G8q>401I&)~Chfw+Q-cV@R9wEx^s)#uCWz~z>jr!esDjs*2jY%m% zQY9mM`mgONuvu%Z?OBOlTeLcDdeZJwQKjt1Q-90?O4FY`m9%qBhM}A9A?RdCi?EpT z=@}TVHs4?vz6`Az*pHkJ+wE=R*IvAfbyww|#C>xak7iwOe(#cWJM~NY1dq<&V?Wn^ zhJ6hA(EVj}sO=W#E2h)AOCzYUU!6f8PlYwi1P&M<_q;K@%YL*_>bYT#I=NC}s%9u< z(%DJSh{fTTm65`vcs41G4RAfm^J$7$ndH@J=vlsEuXv3$;mB1Fwn<2){(6fB`Rf0+ z7CyOevuHENIApj?So0^-u=s96p$(PG9pS$w>h3I!d^uw}*>WiT=9RQbk%CZ6vs2II zZS$Ak5tiI!z6Fn+g{w!)e7oL@QU-1KCh{itH$srY=k9|>H8Tot3y2~PC_ z-!4p?3DJt48lRxlS@~V6Xs*1_+GKS>pq2VQP?W2=`OMWIXJa(Y;fd2_cTtP%?9*?5 zD#QknyPDhkcC@1lJ*d2-1kEj+v2Bo{V7dBWFk95-4f&AEQu_^AC{D7>w&R~Ku=?i& zl9+unhwxn4$K0!|6aLQde=h#p8emo8=3^m5`zx;@)Y9ly=ZsfTt!2O{)CkxFQqlx& zR6k7&%Hl!TI?9`}H6SZf&Y;fK4ApUW4QgK=_c5SWXEP;~?nsZA@5Xd9yP20=A^e(( z?0@~RyTk*_uJhqs+edG$J5$pv2UduVXkr)bF~25|K?l7~HHe5hhirKNd8J>w%Z0}L zD@@RGA>&>E3G=otiZIN1Fn+y1!+H3t8q36&0Z%!6mCZqvPfEg^_P&SrMLv(*J{#?EWbe0lKcNyw8=O`W@#%{ANj-P%|Liz*78W;UFzLQrD5Vpv&o#NGVw zGX3Ok)!~o51`mFCl6cy|y8+RP?h^)UtJN@6bmiHjuStd_5|@4%%m%-7+wVI&5)YVW zmK`K8GRMvsev*wFf|B%$XG^q7y+=w;YtB-K)?ldgv9~ZpRQ*SDGhGz0zgZ89TKJ`x z{c@xF9S@xzlGQEu;*5{lMp7~TRF`7Fng{*IU=sb6&-RPlq(rk{tx!0d)BkR#3&|Xz zi}r-R>m33Ixh9_4PYR05rcVKxS15x(Gn~ zU`H__<0e7GcV)L&y5HyuB~>CGdR7=X`c8VjQc-K4TzNdWS4`Fzk)$DOrV(^4t*^ma zLS@~9ued$Mr5ZX3P;PrfFfI^hQJb-YG5n^MonlpjU<~-YpCPO;=i`2sxGVVtqXl?X z^kjAlowaD0VnB}5lq{Kmp+koZxzr~f`gXpJIH8)kkcN7!Ou{nIdYBIiY>Hs;(fw_@vYsH)K#Pb|vFdn;|=mx7d}I;(jd3OSk>o7#DV5 zkSCoFle|ZA6B6r=@JKI(5*b^|;%Nai)!U75#kyB_w8v|R$Uw~psC%qL2(8Jb%yTh~ zhH|D%kepMfzFA(n&d!*4#Maf~$T14EU-m!)sh!<65X%>uR0v|6nPEsX8p^v;0kZn)z+*%A+{^2S9W}qp@MQ}pmHFLMS^Su3w9shXmhAW-^`3`;d5;({S9N6}&PNNNJ&?XF{_iZt1 z)%^R*O7<6A%5&Y@qzpHe&#C|ov2z<{Z86T zB=>Qw=IPWB_e+rNqNtf>9R+`MGIcU{-^Aqkn74WuF$plwt~J3f1L4-zEP-{X5I1fM zfJ3Gh1P}W|j_*Sip)sX|Go|1$@yus|g-ng0tR+#bG_t-zKxXXC8;0Yr_5A$i2?*X8 zJfpFUcH@OVzz)0SLX^0&erf(Ar&u)nX@|oD+0rg8)o<#nx(_tWs52%7oL3A(f|}`I zw%phdnsJ=?vFFDmE}#9&aM?*IWd}aoX{J%hMqMDq4`lN zJjWd!-T(Z~!>Xq)EvLP=qi=Cp=`a7f{fgatt>5`L39K;efZRPMum4_JpS+N1)$ZuX zk8jwU!Y-n5b&qSZq_lTdz^$h?AIvYXE(O@m@nMg3d|hEUw}!8iFIWdvUKg+0klSG? zA&zFb&EIE5NwjlC$`8pLKWcH;LyTn?k!jv%;l~+}%euz|Moktkm!_;BiAA&HE9IuX zClZdl8=k#n_Px&rwexzkQS=r^7 z;u*Ynv3DEN_na7b<$8nr5?bDh-x05I=d@@@##9?`bVu6ncYQvdRn;CvD@s;7T)&?4 z^vr+${L_z5Q_aeJW5%5iTNKo@txl0o4y&KpLfV$jw2Ziv)K69k8egnz7kQ7=j^8u& z>7my^zhULgN?>?}16GyfGip8M9!wDRkDj zU1DbR@EUJ3zAX|tx^LT3yCkFC`uUFGDx{VQ3IbMkMkO^vEvGNC2X=C4$`pyc!t6mn&4TZcBn%vt`^Z(A z%FPXm(k;4h;kGA_8A+n|l_zZ+K!qA$o+u@>*|8JO(c8-uLq!w$7p#gC-R^yxw~W#l;+dX3BSXOWSXNlmE}~&)8d&Rb5w9d}^_U_hU+; z%8{pgSQ&IP%&?Mn1e0jZh4C|-DJ=8?_RfGm*XCfKJ`-&;t;3hMq8%DkbPb{jGzM}>|Hmq6N6Hs6oWIWAj&b% z`j$~22j{?5uNfc9xp^~<=fXi*QK^&)i3BgN#|%FnjY56aTKaDA{>lFFo5JJg(kl{7 zw__{*kL_u3E?dF`RLy<$9=5V1ahAo@TJb_05FkN{lLxugC?tNeo#N27_F_-gN(?mR zLTb7)SXt>vUoU5$`x;h5hiFi@?M{9~1 z$hJy^W?5DS$;8%Gpk3>oF*=8(rdzrT!V@MW?6$EHW;dyjTlMl!%9;xAc4NM2(UE=c zexb{@G6178pih!Wi@`-UJ-(a;!$D4cMxB7tCI3boft-?EbN@;!y;MRSa3#mlB-KPMOP^u6s}>BqZeM=)9Y_ICMIKv`rWP zfjnr;jhQhFzGfH<1?r}Q1+u0c6VEuf4h=b9GhtB9<@`(6bE*=&{HvVBiZzC19Ew#K zq!hAEHI*yxd@rU8j#b=JS--T+O5tHn&R?-YUHe}N|IbOpl?<~%=i1#eNRn^V_)lE8 zBOrtqA}QM{QwsoFjSN6uVg;ZHNdgMVzPPaiWrf(q)B!~mNC+V-+>X6~He9EQW2$Ww z7)CpW;wRFExca`ZJyAI+P3&yCY8e34#VrK~gaevNAxTi%v9^pqHPV3l8u$Av+eX*~ zo#3rum^`wVrBf;$ZPhDYM(BakyvH; z1*0;q4ZO?0zwY}f;$J&2c5Vozz1GQSp+vjVX_eWA4wv9<2V&UByzZ)-GGyq`>F~d9 z*M^31WjifXbmxYPqoZee>R#c@zP??lDPf2v%D%DLoy>_4!nl&BE(`rDna`xOZhYS z_n)pI6PA8|bpwZMsmlT6^Y->k&TR{|pH+RX+|d)} zL!ZNW9UNf50$ScMcy>(bfIy9dtVD&f+k8q=_Oc+~r-w`N`yf}-os4!FKP{*+H8@;p zJC|yyKCy&5a@)DF+3WcqYil!nl>SO-rmK2F5@zCYt9G+`OZ-Y$+bZpYUh@atwc!ep z?|)Pd9=hJ?S1=Lu-Q?|6mLqMkH{aOixO?1dbzQmGn%+ zbNi694)wWz67L@1`0|poORA*2N9xgqB=Uf?X$J+ue7(Dx-<);_bw`~w%Duj8u1o&?!O`Z?i-sDqjjFqF;W{?d zLh-fXOOnx2qLMLHpLyyHGgvU{Ae7rr_;=yiPb~xlpS@(Kt}D6wVMxHaPqG18xWeln z+nT`aCRg~a*VP{2026bnqvMH|=NB8?cI2C5Lyk1=JuZ;8SnMI!KRs{MFEDv)%y$oe z>S6EKeyuX=_N&twKDUo7S(IufB<3kqi426rTVLGM^+?L&hY+{7$Gw$*JP5?IPOEUT zXro{3ZP+O-H|pC-vF>rpDpMrphN8m%7Fd z`q~BZmqwaoR`BJmncU{#-PMKQ$>T13Mj+1fzp@Pc(J5tZ3^?aFu8$yzMARf7TSH#dUL{*Wx?i;d2D_Fehm&86t^g6ag@a5;pe#P-5@&L_fR&dZ4OaqYEW zOKG&?x4*RGEZbLRQ7;(k(=n)Xr*F+5-^PdMOH6=s&hP6%ZyqCpQBbn9TNN!hX+P$8r*+~? z=U~@k`Af8BT@MPYwRAvdS?+@>g6>!!_T1O&4ax;l=LKq}A^09QteoBkU+j45fVvb7 zbhQH|w3AhNV4i7>MfnOBJ7F7eBjh*YwWgTw?}K>C{?Ve90WUCS?A;FRrk4fW`~N9!v24Zm?HN7;_9Zg?y17MPl6~hPclc5%NfKg_6K^x#gdQvA&28f!T3Un)dasqEum7cJ~>8g3bvh?O@?3x8KJWNwNaH5asjENUF3Kd0$>}c z$s5&WS%kLeP8zsbSD^s?qUB4;Zc^h{l3$hKkQfc2{yYK}gk^(ylU(5)c5%D@9XKPsq87P&KobKFcqUXT~N`$sr z1vlx8QWRbu+J#}=G4e$hOf&Y%xhq36cqEGp*^K~=*$Qq9Wdb^biy5X|Q5Ho7dqu_B zkO5^k{CBXfd&F>h{O$^n9|Oq8-P^&FP=D#($FQUak4vnG2B*XB#oFBZ_+YD%pc{~J~9y4C%F{zJ=MxF2xhIsRg!<|5Tc5!rw6YDqi_BMt=cgn6xFO@ zAfz9GGL<|2|Fx(>Vi{PL@2ul;$;wTIp0og6&IaP>1f__!{7W2SV8Zy_iK} zTI`MYC)*R((*kQ2;6|J*cZnhHloa-<8|D*aM+p5jnWo8>qN7trek?NH}N{A;j(}6T?xfSL% zIfs~StFR+wi(wpAn~Df$$i^iNk<3hd{PFhn$;wPCYLk5le*;E3OXJ45Rx?#ziJDTI z`C5a_oq~54R=#U9ef{$F%jVxdjh7`B!$+_lfgD%%<>UA>~LDKkr?uQ<7pG7 zpiF+6@irA%?2+a%F@~}8`69o$nx8(*x<$MP!>6rmZL|+kx~4)_sBttSb7&7NkXhKOvFGCqh`LBI0)vy2i|33fCx_h6s_u1#1 zeb(LUuC=~Rr0F*-*ivL9O;5f6awmo?Gt5g;;di|9#twJ1j@*y4I$b zyC~(!kB9qvJFIM4sJb7_KT1XDZZNkl3e+k-_+C7cPqjT}Oy!E%?Y*X}UGA0D$oa%s zj~;Sytynx(TM;_YLvO$1f~1z@nKcpy3E9_qE=&Oq(7d%o$~c;^exLzaz7rp1Bbem^ zuD8rTN@JCUHv?{ZL+AH`Wy2@r!>ZQtFwZElU0OUgnK3b2acbmEG)Ogay zx5v!>+Y6xuB@yNR@P$`hSzQuooZ_KjpHd=y<3GJ?ko=R;Q17pbDumymXr*E_g%uMi zrkoJgfaQ?si0<@mu?^D=0^3X7`8U7Vw!Y;YEf6U(iQIlAqUUkr5V<;yQ$b}xfso1` zG5Sg@Rk8-ATio+^(T_b9P1=h@|DkC*PhMV~3U+`|c7$XZNlZ5YJW>xCVk#f#WArCQ zmYyvh=qE$%xzdibtYlt-HMr4C|n1&I+L&`X+8Gp%J0#qa` z%=wclSIz*evRw`!m?dq>wR=qgmI*LTZ#d#)(|y%nn$~`L?iBkXQQ)#f7%>_gxUG^c znYo~fLL8gkcc`h zYRSI+W^K>`SLtDL1^YL5e%1cDkeR#i(034^2Xs0|55RRs9H^n@rMdFt$kh>;eoH3H zI(Pu75Q4#Baw_;nnQ-V*n;?_bkqo@3dS^JYv(nwQ@AS9AdYEKa%s?7CM?iTG(nOi5 z;znwZqw{YUM(2Y$Cu-kh^{d9J(Bp4wMQW?Q@etu3LqAThuqm%8uV~WzENNuqEMOmL zlREiMt*=N)vFcdJ+)P8@*V-z*(t~qLje3ocI;SW#2u)9$y_Y9(CP2hoR+2S<$RApz zH`WH&d<;tm-)E^NCZpYeQ4KLUUW~O7ywjRk%|?1w{hg|%(;+P8tIqn^Y>Ki^%H0$t zkh{@t+Gu>o)>x~yMu6ggw!;7AjK=F19_szD!{x4r3m%F!|)eOG=4%9$&rB85tz(A02|vA)l0Mhi8Rd zO=FLm=V%u~{Bo1llhuKSM+{Z+!xg1`4+QXKb#0V}s(Lrrz4&U{+((~603I`C6Gxd5F+f3cvTvXTM^Rm>(>#2!R(u*uv z$IYg$CJIG^<=0PsGd{p*nR4x!;A?-?q1b|mO~p^vk7>W1iI*~W(FyeaCi70*2#YFj z8U4&JBktYGcvzC5ZyABPNxVxmBJVF80`!0&U4F6$lGry&*Q_D$T0ix zx6-<3ndUshcWWx|Rf@{M0)t9XX|)5=ss|#Zh*#M?Vb7zCB*tI)G!s)oxcg35rX5APmi+=I+b!fkHETp+E+s&en>_<=~nI7(*plb2ymm@0dP5j|v6GTNP z{#=o|34kgcIlHUFQopamQpeU~SJ|bbjDB;}8|+4%`=1M?ueqs1ufZ#C6HDnJ-tXej z=TCj=yQBYpHXVI&OFyCIQgRaSI@ZBI&N49br!(1hzGtemwjMXR@*uI7u{$H8isL}h zRGNqK`J%_Q=KCv5H+x1XG^yuao-XezDpKj@L8Ydzy^Vv@@m*=K=#m*HBe zVk^E&$6)yBdtCdCajJOBWC_H5xL)0;AiLv;jNe zCdmx+5?PRBV>2O0`d!Lt#U6lFRk;6hN@ejt1oh?-+bSmjyr4w^Ol&+PuuW_oLyil? zAFKQ4^n7y3@mPPSyUZMMK{kdmnox=B1ORa2u{7al&#Vs3CwX%ZtkTv1E3c*mQ{o8I z5PP#>StHHa{te3zRA}f>z%WY6fpum`D*@640(YjC z?i{71{VLLWJjiH*K%E*D$H{Q2k}j^1rx&^XRDnck^I`fB;m`~QBaQ-6wohg>KP=Do za%sfv?y!Tr12r|Gv+s)jJIf1^%{8W8#3I0j+fY{re}se=CQ1c-eiqtdTO=gbuA{ zDW$<*Mn>L2)Gq5)V@%CuWI(MD?(U2xsr$FG;K0!=>JdI%5!k1Wv=2m36eXt{x^|Y( zpe2SX0q6NPB?4;yFtG;kqt(7A=NG2o!pO+sZDlZ~OV*4E-DaNrRBKhr?vc z5w+GUXlWh3MggH?09IO$Jf-;a(bO2yUy^OjQW3`!!KQ3}YN#@vHr+&Nb37iKn=_jc ze8OyM%4}-7!9D~qGW4F;)UC3Rvv(xq7^txmp9(BUAxKRl0}8jICKl>NlQMCm6{F#K z8wpp|;I^%$L>Rdi;IPIg5|`NY+~>i9^3?s%g^f$g{*D}(i*AXFn)9JcObUr>@!-xD zZgy=s8f36BnOs`14_r)K&MsvSM~C<#_5aXG_S3)ka&Ia3yP|Tt>jQaCSAXYFcPJHt+I7aLw}+ehCu5=p5@*NC7uvi_9vu#T z&Aj7z%2W6C92QS!O{{FKOWv%(1kRzUy@Mn!1XhL}#BlIsV^KM5U#_SB<;k;m7cO^`+Q3A{MTq5zK)=GW?6qX^;-FsDcQe#))wtNCah#E zV^%n1nH+I*qiJ78s+)wnZ?|Mwci~at_d?U21Ob!cEfo@6dRg4D?XtyWrE`3Rx6d2q zaJ(%lHZ3x@yYWTIVb-R(|Lf!R2Hgf4hKG9FWX`Fmk)g3=0=UT^v zBMl14V=4K%);mQ@VD*>s8gJ;>5T4+nK$NX)S?ALe_qQBp*%NK`>F3GUh>HZ~er*Dp;mmvOl=*f{^J{NA!jE)Px*_QCCj#rB`#MtKc%T$BEd$a=wwK! zp6#R;S&UXDoS}Hzlc8Ks@usZ25Y*;6+MO42lz#4$#>s@o)`ub@l>T=M8vn%^Ak=TQe-o^}+F z9sDBbLcFkvDs7AjNg)^_3=^Pu4!@&6*9bhQ5dLp}-UX7M|xRnk6j<`0JEk0L7l z7x{#7!q26H&6oc#`K0P%7*+S*eMm@%6h?Kr8JBpuExth&0v;gw91d;x_{I0JQ^k0F?qg0788u9(-N!_NXnY zN6!dfweMdS^nA(~#u+J0_&7|5TQN*25W}{6Vc2dM7ro0EMpVbJ!{}ZFDaSlX zXpp@;$Y}OL<4nM37$J)NF;6&JsX>j<2%+5mB+1(jatk*{JclAC{_|uDUjQ#VPfyh2 l_oQ%~Hls@wczd94w=nEbjygddqJ7GpV4w2s+t4=U{{x;j*1G@z literal 0 HcmV?d00001 diff --git a/test/integration.test.ts b/test/integration.test.ts new file mode 100644 index 0000000..ef64394 --- /dev/null +++ b/test/integration.test.ts @@ -0,0 +1,155 @@ +/** + * File Info Plugin Integration Tests + * + * Tests basic file information extraction. + * Uses @metazla/filename-tools library for FileType class. + */ + +import { describe, it, expect, beforeAll } from 'vitest'; +import { FileType } from '@metazla/filename-tools'; +import * as fs from 'fs/promises'; +import * as path from 'path'; +import * as os from 'os'; + +// Dynamic import of plugin module +let manifest: typeof import('../src/plugin.js').manifest; +let processFile: typeof import('../src/plugin.js').process; + +// Mock callback collector +interface CallbackResult { + taskId: string; + status: 'completed' | 'failed' | 'skipped'; + duration: number; + error?: string; +} + +let lastCallback: CallbackResult | null = null; + +const mockSendCallback = async (payload: CallbackResult): Promise => { + lastCallback = payload; +}; + +// Create FileType instance for direct testing +const fileType = new FileType(); + +describe('File Info Plugin Integration Tests', () => { + let testDir: string; + let testVideoFile: string; + let testTextFile: string; + + beforeAll(async () => { + const plugin = await import('../src/plugin.js'); + manifest = plugin.manifest; + processFile = plugin.process; + + // Create temporary test files + testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'file-info-test-')); + testVideoFile = path.join(testDir, 'test-movie.mkv'); + testTextFile = path.join(testDir, 'readme.txt'); + + // Create dummy files + await fs.writeFile(testVideoFile, 'fake video content'); + await fs.writeFile(testTextFile, 'This is a text file'); + }); + + describe('Manifest', () => { + it('has required fields', () => { + expect(manifest.id).toBe('file-info'); + expect(manifest.name).toBeDefined(); + expect(manifest.version).toBeDefined(); + expect(manifest.dependencies).toEqual([]); + expect(manifest.priority).toBe(10); + }); + + it('declares correct schema', () => { + expect(manifest.schema).toHaveProperty('fileType'); + expect(manifest.schema).toHaveProperty('mimeType'); + expect(manifest.schema).toHaveProperty('sizeByte'); + expect(manifest.schema).toHaveProperty('fileName'); + expect(manifest.schema).toHaveProperty('extension'); + }); + }); + + describe('FileType Class', () => { + it('detects video extension', () => { + const result = fileType.getFileTypeFromExtension('/movies/test.mkv'); + expect(result).toBe('video'); + }); + + it('detects audio extension', () => { + const result = fileType.getFileTypeFromExtension('/music/song.mp3'); + expect(result).toBe('audio'); + }); + + it('detects image or document extension', () => { + const result = fileType.getFileTypeFromExtension('/photos/image.jpg'); + // FileType may classify jpg as 'image' or 'document' depending on implementation + expect(['image', 'document']).toContain(result); + }); + + it('detects subtitle extension', () => { + const result = fileType.getFileTypeFromExtension('/subs/movie.srt'); + expect(result).toBe('subtitle'); + }); + + it('detects document extension', () => { + const result = fileType.getFileTypeFromExtension('/docs/readme.txt'); + expect(result).toBe('document'); + }); + + it('handles unknown extension', () => { + const result = fileType.getFileTypeFromExtension('/files/unknown.xyz'); + expect(result).toBeDefined(); + }); + }); + + describe('Extension Parsing', () => { + it('extracts extension from filename', () => { + const ext = path.extname('/movies/Inception.2010.mkv').slice(1).toLowerCase(); + expect(ext).toBe('mkv'); + }); + + it('extracts filename from path', () => { + const fileName = path.basename('/movies/Inception.2010.mkv'); + expect(fileName).toBe('Inception.2010.mkv'); + }); + + it('handles multiple dots in filename', () => { + const fileName = path.basename('/movies/Movie.Name.2010.1080p.mkv'); + const ext = path.extname(fileName).slice(1).toLowerCase(); + expect(fileName).toBe('Movie.Name.2010.1080p.mkv'); + expect(ext).toBe('mkv'); + }); + }); + + describe('Process Function', () => { + it('processes file successfully', async () => { + await processFile({ + taskId: 'test-file-1', + cid: 'test-cid-file', + filePath: testVideoFile, + callbackUrl: 'http://localhost/callback', + metaCoreUrl: 'http://localhost:9000', + existingMeta: {}, + }, mockSendCallback); + + expect(lastCallback).toBeDefined(); + expect(lastCallback?.status).toBe('completed'); + expect(lastCallback?.taskId).toBe('test-file-1'); + }); + + it('processes text file successfully', async () => { + await processFile({ + taskId: 'test-file-2', + cid: 'test-cid-text', + filePath: testTextFile, + callbackUrl: 'http://localhost/callback', + metaCoreUrl: 'http://localhost:9000', + existingMeta: {}, + }, mockSendCallback); + + expect(lastCallback).toBeDefined(); + expect(lastCallback?.status).toBe('completed'); + }); + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..cd3d699 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['test/**/*.test.ts'], + testTimeout: 30000, + }, +});