From aba68a3c0af1d0215665cc93d4c749deda216601 Mon Sep 17 00:00:00 2001 From: Warky Date: Tue, 3 Dec 2024 22:52:21 +0200 Subject: [PATCH] Initial commit --- .changeset/config.json | 11 + .eslintignore | 2 + README.md | 37 +- eslint.config.js | 20 + package.json | 67 + pnpm-lock.yaml | 3203 ++++++++++ src/base64/Base64ToBlob.ts | 16 + src/base64/BlobToBase64.ts | 19 + src/base64/BlobToString.ts | 14 + src/base64/FileToBase64.ts | 18 + src/base64/FileToBlob.ts | 17 + src/base64/base64-decode-unicode.ts | 20 + src/base64/base64-encode-unicode.ts | 17 + src/base64/index.ts | 6 + src/dataqueue/buffer.ts | 164 + src/dataqueue/examples.ts | 150 + src/dataqueue/hooks.ts | 84 + src/dataqueue/index.ts | 9 + src/dataqueue/persistence.ts | 99 + src/dataqueue/queue.ts | 285 + src/dataqueue/types.ts | 73 + src/dataqueue/utils.ts | 117 + src/i18n/examples.ts | 24 + src/i18n/index.ts | 356 ++ src/index.ts | 8 + src/logger/examples.ts | 43 + src/logger/index.ts | 102 + src/mime/index.ts | 80 + src/mime/mime.ts | 8878 +++++++++++++++++++++++++++ src/object/compare.ts | 38 + src/object/index.ts | 3 + src/object/nested.ts | 46 + src/object/util.ts | 49 + src/promise/index.ts | 84 + src/strings/caseConversion.ts | 83 + src/strings/fileSize.ts | 36 + src/strings/index.ts | 6 + src/strings/legacy.ts | 278 + src/strings/locale.ts | 175 + src/strings/replace.ts | 72 + src/strings/trim.ts | 53 + tsconfig.json | 10 + vite.config.js | 34 + 43 files changed, 14905 insertions(+), 1 deletion(-) create mode 100644 .changeset/config.json create mode 100644 .eslintignore create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/base64/Base64ToBlob.ts create mode 100644 src/base64/BlobToBase64.ts create mode 100644 src/base64/BlobToString.ts create mode 100644 src/base64/FileToBase64.ts create mode 100644 src/base64/FileToBlob.ts create mode 100644 src/base64/base64-decode-unicode.ts create mode 100644 src/base64/base64-encode-unicode.ts create mode 100644 src/base64/index.ts create mode 100644 src/dataqueue/buffer.ts create mode 100644 src/dataqueue/examples.ts create mode 100644 src/dataqueue/hooks.ts create mode 100644 src/dataqueue/index.ts create mode 100644 src/dataqueue/persistence.ts create mode 100644 src/dataqueue/queue.ts create mode 100644 src/dataqueue/types.ts create mode 100644 src/dataqueue/utils.ts create mode 100644 src/i18n/examples.ts create mode 100644 src/i18n/index.ts create mode 100644 src/index.ts create mode 100644 src/logger/examples.ts create mode 100644 src/logger/index.ts create mode 100644 src/mime/index.ts create mode 100644 src/mime/mime.ts create mode 100644 src/object/compare.ts create mode 100644 src/object/index.ts create mode 100644 src/object/nested.ts create mode 100644 src/object/util.ts create mode 100644 src/promise/index.ts create mode 100644 src/strings/caseConversion.ts create mode 100644 src/strings/fileSize.ts create mode 100644 src/strings/index.ts create mode 100644 src/strings/legacy.ts create mode 100644 src/strings/locale.ts create mode 100644 src/strings/replace.ts create mode 100644 src/strings/trim.ts create mode 100644 tsconfig.json create mode 100644 vite.config.js diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..2eada15 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.4/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..04c01ba --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ \ No newline at end of file diff --git a/README.md b/README.md index e0276bd..ccabe4d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,37 @@ # artemis-kit -Artemis Kit is a libary for various utilities and functions in javascript/typescript. + +A comprehensive TypeScript/JavaScript utility library focused on precision and efficiency. + +## Features + +### String Tools +- Advanced string manipulation +- Pattern matching and validation +- Text transformation utilities +- Unicode handling + +### Blob Tools +- Blob creation and modification +- Binary data handling +- Stream processing +- MIME type management + +### File Conversion Tools +- Format conversions +- File type transformations +- Encoding/decoding utilities +- Batch processing capabilities + +## Installation + +```bash +pnpm install @warkypublic/artemis-kit +``` + +## Contributing + +Contributions are welcome! Please read our contributing guidelines before submitting PRs. + +## License + +MIT \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..91b4449 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,20 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + { files: ["**/*.{js,mjs,cjs,ts}"] }, + { languageOptions: { globals: globals.browser } }, + + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + { + rules: { + eqeqeq: "warn", + "no-unused-vars": "off", + "@typescript-eslint/no-explicit-any": "off", + + }, + }, +]; diff --git a/package.json b/package.json new file mode 100644 index 0000000..2fa6def --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "@warkypublic/artemis-kit", + "version": "1.0.0", + "description": "A comprehensive TypeScript/JavaScript utility library focused on precision and efficiency.", + "type": "module", + "main": "./src/index.ts", + "module": "./src/index.ts", + "types": "./src/index.ts", + "publishConfig": { + "access": "public", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "files": [ + "dist", + "bin", + "README.md" + ], + "scripts": { + "build": "vite build", + "clean": "rm -rf dist", + "prepublishOnly": "npm run build", + "test": "vitest run", + "lint": "eslint src" + }, + "keywords": [ + "string", + "blob", + "dependencies", + "workspace", + "package", + "cli", + "tools", + "npm", + "yarn", + "pnpm" + ], + "author": "Hein (Warkanum) Puth", + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "devDependencies": { + "@changesets/cli": "^2.27.10", + "@eslint/js": "^9.16.0", + "eslint": "^9.16.0", + "globals": "^15.13.0", + "typescript": "^5.7.2", + "typescript-eslint": "^8.17.0", + "vite": "^6.0.2", + "vite-plugin-dts": "^4.3.0", + "vitest": "^2.1.8" + }, + "engines": { + "node": ">=14.16" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Warky-Devs/artemis-kit" + }, + "bugs": { + "url": "https://github.com/Warky-Devs/artemis-kit/issues" + }, + "homepage": "https://github.com/Warky-Devs/artemis-kit#readme", + "packageManager": "pnpm@9.6.0+sha512.38dc6fba8dba35b39340b9700112c2fe1e12f10b17134715a4aa98ccf7bb035e76fd981cf0bb384dfa98f8d6af5481c2bef2f4266a24bfa20c34eb7147ce0b5e" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..d80611d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3203 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + semver: + specifier: ^7.6.3 + version: 7.6.3 + devDependencies: + '@changesets/cli': + specifier: ^2.27.10 + version: 2.27.10 + '@eslint/js': + specifier: ^9.16.0 + version: 9.16.0 + eslint: + specifier: ^9.16.0 + version: 9.16.0 + globals: + specifier: ^15.13.0 + version: 15.13.0 + typescript: + specifier: ^5.7.2 + version: 5.7.2 + typescript-eslint: + specifier: ^8.17.0 + version: 8.17.0(eslint@9.16.0)(typescript@5.7.2) + vite: + specifier: ^6.0.2 + version: 6.0.2 + vite-plugin-dts: + specifier: ^4.3.0 + version: 4.3.0(rollup@4.28.0)(typescript@5.7.2)(vite@6.0.2) + vitest: + specifier: ^2.1.8 + version: 2.1.8 + +packages: + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.6': + resolution: {integrity: sha512-TKhVLtiwtQOgMAC0fCJfmv93faiViKSDqr8oMEqrnNs99gtSC1sZh/aEMS9a+dseU1ESZRCK+ofLgGY7o0fw/Q==} + + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.10': + resolution: {integrity: sha512-PfeXjvs9OfQJV8QSFFHjwHX3QnUL9elPEQ47SgkiwzLgtKGyuikWjrdM+lO9MXzOE22FO9jEGkcs4b+B6D6X0Q==} + hasBin: true + + '@changesets/config@3.0.4': + resolution: {integrity: sha512-+DiIwtEBpvvv1z30f8bbOsUQGuccnZl9KRKMM/LxUHuDu5oEjmN+bJQ1RIBKNJjfYMQn8RZzoPiX0UgPaLQyXw==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.5': + resolution: {integrity: sha512-E6wW7JoSMcctdVakut0UB76FrrN3KIeJSXvB+DHMFo99CnC3ZVnNYDCVNClMlqAhYGmLmAj77QfApaI3ca4Fkw==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.16.0': + resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@microsoft/api-extractor-model@7.30.0': + resolution: {integrity: sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug==} + + '@microsoft/api-extractor@7.48.0': + resolution: {integrity: sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.28.0': + resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.28.0': + resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.28.0': + resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.28.0': + resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.28.0': + resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.28.0': + resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.28.0': + resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.28.0': + resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.28.0': + resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.28.0': + resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.28.0': + resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.28.0': + resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.28.0': + resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.28.0': + resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.28.0': + resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.28.0': + resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.10.0': + resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.14.3': + resolution: {integrity: sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.23.1': + resolution: {integrity: sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@typescript-eslint/eslint-plugin@8.17.0': + resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.17.0': + resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.17.0': + resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.17.0': + resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.17.0': + resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.17.0': + resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.17.0': + resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@8.17.0': + resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + + '@volar/language-core@2.4.10': + resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==} + + '@volar/source-map@2.4.10': + resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==} + + '@volar/typescript@2.4.10': + resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.1.6': + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.16.0: + resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.6: + resolution: {integrity: sha512-9vPH3qooBlYRJdmdYP00nvjZOulm40r5dhtal8st18ctf+6S1k7pi5yIHLvI4w5D70x0Y+xdVD9qITH0QO/A8A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.28.0: + resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.17.0: + resolution: {integrity: sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-dts@4.3.0: + resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + 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 + + vite@6.0.2: + resolution: {integrity: sha512-XdQ+VsY2tJpBsKGs0wf3U/+azx8BBpYRHFAyKm5VeEZNOJZRB63q7Sc8Iup3k0TrN3KO6QgyzFf+opSbfY1y0g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 + 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 + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@changesets/apply-release-plan@7.0.6': + dependencies: + '@changesets/config': 3.0.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.3 + + '@changesets/assemble-release-plan@6.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.3 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.10': + dependencies: + '@changesets/apply-release-plan': 7.0.6 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.5 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.6 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.6.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.6.3 + + '@changesets/get-release-plan@4.0.5': + dependencies: + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.4 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.2': + dependencies: + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.24.0': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.24.0': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.24.0': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.24.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.24.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.24.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.24.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.24.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.24.0': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.24.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.24.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.24.0': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.24.0': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.24.0': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.24.0': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.24.0': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.24.0': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.24.0': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.24.0': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.24.0': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.24.0': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.24.0': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0)': + dependencies: + eslint: 9.16.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.0': {} + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.16.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.3': + dependencies: + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.26.0 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.26.0 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@microsoft/api-extractor-model@7.30.0': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.10.0 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.48.0': + dependencies: + '@microsoft/api-extractor-model': 7.30.0 + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.10.0 + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.3 + '@rushstack/ts-command-line': 4.23.1 + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + + '@microsoft/tsdoc@0.15.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@rollup/pluginutils@5.1.3(rollup@4.28.0)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.28.0 + + '@rollup/rollup-android-arm-eabi@4.28.0': + optional: true + + '@rollup/rollup-android-arm64@4.28.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.28.0': + optional: true + + '@rollup/rollup-darwin-x64@4.28.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.28.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.28.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.28.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.28.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.28.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.28.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.28.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.28.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.28.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.28.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.28.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.28.0': + optional: true + + '@rushstack/node-core-library@5.10.0': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.14.3': + dependencies: + '@rushstack/node-core-library': 5.10.0 + supports-color: 8.1.1 + + '@rushstack/ts-command-line@4.23.1': + dependencies: + '@rushstack/terminal': 0.14.3 + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@types/argparse@1.0.38': {} + + '@types/estree@1.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@12.20.55': {} + + '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.17.0 + eslint: 9.16.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.17.0 + debug: 4.3.7 + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.17.0': + dependencies: + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 + + '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + debug: 4.3.7 + eslint: 9.16.0 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.17.0': {} + + '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 + debug: 4.3.7 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.17.0(eslint@9.16.0)(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.17.0': + dependencies: + '@typescript-eslint/types': 8.17.0 + eslint-visitor-keys: 4.2.0 + + '@vitest/expect@2.1.8': + dependencies: + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.8(vite@5.4.11)': + dependencies: + '@vitest/spy': 2.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.14 + optionalDependencies: + vite: 5.4.11 + + '@vitest/pretty-format@2.1.8': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.8': + dependencies: + '@vitest/utils': 2.1.8 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.14 + pathe: 1.1.2 + + '@vitest/spy@2.1.8': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.8': + dependencies: + '@vitest/pretty-format': 2.1.8 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + + '@volar/language-core@2.4.10': + dependencies: + '@volar/source-map': 2.4.10 + + '@volar/source-map@2.4.10': {} + + '@volar/typescript@2.4.10': + dependencies: + '@volar/language-core': 2.4.10 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.2 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.1.6(typescript@5.7.2)': + dependencies: + '@volar/language-core': 2.4.10 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.7.2 + + '@vue/shared@3.5.13': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + chai@5.1.2: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chardet@0.7.0: {} + + check-error@2.1.1: {} + + ci-info@3.9.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + compare-versions@6.1.1: {} + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + de-indent@1.0.2: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + es-module-lexer@1.5.4: {} + + esbuild@0.21.5: + 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 + + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + + escape-string-regexp@4.0.0: {} + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.16.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.16.0 + '@eslint/plugin-kit': 0.2.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + expect-type@1.1.0: {} + + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globals@15.13.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + human-id@1.0.2: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + jju@1.4.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kolorist@1.8.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.3 + pkg-types: 1.2.1 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + loupe@3.1.2: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.14: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + + mri@1.2.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.6: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@2.8.8: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + regenerator-runtime@0.14.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rollup@4.28.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.28.0 + '@rollup/rollup-android-arm64': 4.28.0 + '@rollup/rollup-darwin-arm64': 4.28.0 + '@rollup/rollup-darwin-x64': 4.28.0 + '@rollup/rollup-freebsd-arm64': 4.28.0 + '@rollup/rollup-freebsd-x64': 4.28.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 + '@rollup/rollup-linux-arm-musleabihf': 4.28.0 + '@rollup/rollup-linux-arm64-gnu': 4.28.0 + '@rollup/rollup-linux-arm64-musl': 4.28.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 + '@rollup/rollup-linux-riscv64-gnu': 4.28.0 + '@rollup/rollup-linux-s390x-gnu': 4.28.0 + '@rollup/rollup-linux-x64-gnu': 4.28.0 + '@rollup/rollup-linux-x64-musl': 4.28.0 + '@rollup/rollup-win32-arm64-msvc': 4.28.0 + '@rollup/rollup-win32-ia32-msvc': 4.28.0 + '@rollup/rollup-win32-x64-msvc': 4.28.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.8.0: {} + + string-argv@0.3.2: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + term-size@2.2.1: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.1: {} + + tinypool@1.0.2: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@1.4.3(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.17.0(eslint@9.16.0)(typescript@5.7.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0)(typescript@5.7.2))(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0)(typescript@5.7.2) + eslint: 9.16.0 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + typescript@5.4.2: {} + + typescript@5.7.2: {} + + ufo@1.5.4: {} + + universalify@0.1.2: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite-node@2.1.8: + dependencies: + cac: 6.7.14 + debug: 4.3.7 + es-module-lexer: 1.5.4 + pathe: 1.1.2 + vite: 5.4.11 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-dts@4.3.0(rollup@4.28.0)(typescript@5.7.2)(vite@6.0.2): + dependencies: + '@microsoft/api-extractor': 7.48.0 + '@rollup/pluginutils': 5.1.3(rollup@4.28.0) + '@volar/typescript': 2.4.10 + '@vue/language-core': 2.1.6(typescript@5.7.2) + compare-versions: 6.1.1 + debug: 4.3.7 + kolorist: 1.8.0 + local-pkg: 0.5.1 + magic-string: 0.30.14 + typescript: 5.7.2 + optionalDependencies: + vite: 6.0.2 + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@5.4.11: + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.28.0 + optionalDependencies: + fsevents: 2.3.3 + + vite@6.0.2: + dependencies: + esbuild: 0.24.0 + postcss: 8.4.49 + rollup: 4.28.0 + optionalDependencies: + fsevents: 2.3.3 + + vitest@2.1.8: + dependencies: + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(vite@5.4.11) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 + chai: 5.1.2 + debug: 4.3.7 + expect-type: 1.1.0 + magic-string: 0.30.14 + pathe: 1.1.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 5.4.11 + vite-node: 2.1.8 + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vscode-uri@3.0.8: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + yallist@4.0.0: {} + + yocto-queue@0.1.0: {} diff --git a/src/base64/Base64ToBlob.ts b/src/base64/Base64ToBlob.ts new file mode 100644 index 0000000..c3d35ce --- /dev/null +++ b/src/base64/Base64ToBlob.ts @@ -0,0 +1,16 @@ +/** + * Converts a base64 string to a Blob object. + * @param base64 - The base64 encoded string to convert + * @returns A Blob containing the decoded binary data + */ +export function base64ToBlob(base64: string): Blob { + const byteString = atob(base64) + const arrayBuffer = new ArrayBuffer(byteString.length) + const uint8Array = new Uint8Array(arrayBuffer) + + for (let i = 0; i < byteString.length; i++) { + uint8Array[i] = byteString.charCodeAt(i) + } + + return new Blob([arrayBuffer]) +} diff --git a/src/base64/BlobToBase64.ts b/src/base64/BlobToBase64.ts new file mode 100644 index 0000000..62059bf --- /dev/null +++ b/src/base64/BlobToBase64.ts @@ -0,0 +1,19 @@ +/** + * Converts a Blob object to a base64 encoded string. + * @param blob - The Blob object to convert + * @returns Promise that resolves with the base64 encoded string + */ +function blobToBase64(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => { + const dataUrl = (reader.result ?? '') as string + const base64 = dataUrl?.split?.(',')?.[1] + resolve(base64) + } + reader.onerror = reject + reader.readAsDataURL(blob) + }) +} + +export { blobToBase64 } diff --git a/src/base64/BlobToString.ts b/src/base64/BlobToString.ts new file mode 100644 index 0000000..33a10d2 --- /dev/null +++ b/src/base64/BlobToString.ts @@ -0,0 +1,14 @@ +/** + * Converts a Blob object to a string. Defaults to a blank string if the Blob is null. + * @param blob - The Blob object to convert + * @returns Promise that resolves with the text + */ +async function blobToString(blob: Blob | string): Promise { + if (!blob) return '' + if (typeof blob === 'string') { + return blob + } + return await blob.text() +} + +export { blobToString } diff --git a/src/base64/FileToBase64.ts b/src/base64/FileToBase64.ts new file mode 100644 index 0000000..c71e67d --- /dev/null +++ b/src/base64/FileToBase64.ts @@ -0,0 +1,18 @@ +/** + * Converts a File object to a base64 encoded string. + * @param file - The File object to convert + * @returns Promise that resolves with the base64 encoded string + */ +function FileToBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => { + const d = reader.result?.toString() + resolve(btoa(d ?? '')) + } + reader.onerror = reject + reader.readAsArrayBuffer(file) + }) +} + +export { FileToBase64 } diff --git a/src/base64/FileToBlob.ts b/src/base64/FileToBlob.ts new file mode 100644 index 0000000..58cef33 --- /dev/null +++ b/src/base64/FileToBlob.ts @@ -0,0 +1,17 @@ +/** + * Converts a File object to a Blob object. + * @param file - The File object to convert + * @returns Promise that resolves with the Blob + */ +function FileToBlob(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => { + resolve(new Blob([reader.result as ArrayBuffer])) + } + reader.onerror = reject + reader.readAsArrayBuffer(file) + }) +} + +export { FileToBlob } diff --git a/src/base64/base64-decode-unicode.ts b/src/base64/base64-decode-unicode.ts new file mode 100644 index 0000000..4c47b4f --- /dev/null +++ b/src/base64/base64-decode-unicode.ts @@ -0,0 +1,20 @@ +/** + * Decodes a base64 string that contains Unicode characters. + * This function handles Unicode characters correctly by: + * 1. Converting base64 to binary + * 2. Converting each byte to a hex representation + * 3. Converting hex-encoded UTF-8 sequences back to Unicode characters + * + * @param str - The base64 encoded string to decode + * @returns The decoded Unicode string + */ +export function b64DecodeUnicode(str: string): any { + return decodeURIComponent( + Array.prototype.map + .call( + atob(str), + (c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}` + ) + .join('') + ) +} diff --git a/src/base64/base64-encode-unicode.ts b/src/base64/base64-encode-unicode.ts new file mode 100644 index 0000000..f8fde43 --- /dev/null +++ b/src/base64/base64-encode-unicode.ts @@ -0,0 +1,17 @@ +/** + * Encodes a Unicode string to base64. + * This function handles Unicode characters correctly by: + * 1. Converting Unicode to UTF-8 percent-encoding + * 2. Converting percent-encoded bytes to binary + * 3. Converting binary to base64 + * + * @param str - The Unicode string to encode + * @returns The base64 encoded string + */ +export function b64EncodeUnicode(str: any): string { + return btoa( + encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_match, p1) => + String.fromCharCode(Number.parseInt(p1, 16)) + ) + ) +} diff --git a/src/base64/index.ts b/src/base64/index.ts new file mode 100644 index 0000000..e41c3ee --- /dev/null +++ b/src/base64/index.ts @@ -0,0 +1,6 @@ +export { base64ToBlob } from './Base64ToBlob' +export { blobToBase64 } from './BlobToBase64' +export { FileToBase64 } from './FileToBase64' +export { FileToBlob } from './FileToBlob' +export { b64DecodeUnicode } from './base64-decode-unicode' +export { b64EncodeUnicode } from './base64-encode-unicode' diff --git a/src/dataqueue/buffer.ts b/src/dataqueue/buffer.ts new file mode 100644 index 0000000..546bf6c --- /dev/null +++ b/src/dataqueue/buffer.ts @@ -0,0 +1,164 @@ +// buffer.ts +import { ActiveRecord, BufferOptions } from './types'; +import { NestedQueue } from './queue'; + +export class ActiveRecordBuffer { + private buffer: Map>; + private queue: NestedQueue; + private autoSaveTimer?: any; + private options: Required; + + constructor(queue: NestedQueue, options: BufferOptions = {}) { + this.queue = queue; + this.buffer = new Map(); + this.options = { + autoSave: options.autoSave ?? true, + bufferSize: options.bufferSize ?? 100, + flushInterval: options.flushInterval ?? 5000 + }; + + if (this.options.autoSave) { + this.startAutoSave(); + } + } + + private startAutoSave() { + this.autoSaveTimer = setInterval(() => { + this.flush(); + }, this.options.flushInterval); + } + + private stopAutoSave() { + if (this.autoSaveTimer) { + clearInterval(this.autoSaveTimer); + } + } + + private getRecordId(record: T): string | number { + if ('id' in record) return record['id'] as string | number; + if ('key' in record) return record['key'] as string; + throw new Error('Record must have an id or key property'); + } + + async load(record: T): Promise> { + const id = this.getRecordId(record); + + if (this.buffer.has(id)) { + return this.buffer.get(id)!; + } + + const activeRecord: ActiveRecord = { + data: { ...record }, + id, + isDirty: false, + isNew: false, + changes: {}, + originalData: { ...record } + }; + + this.buffer.set(id, activeRecord); + + if (this.buffer.size > this.options.bufferSize) { + await this.flush(); + } + + return activeRecord; + } + + create(data: T): ActiveRecord { + const id = this.getRecordId(data); + + const activeRecord: ActiveRecord = { + data: { ...data } as any, + id, + isDirty: true, + isNew: true, + changes: { ...data } as any, + originalData: { } + } as ActiveRecord; + + this.buffer.set(id, activeRecord); + return activeRecord; + } + + update(id: string | number, changes: Partial): ActiveRecord { + const record = this.buffer.get(id); + if (!record) { + throw new Error(`Record with id ${id} not found in buffer`); + } + + record.isDirty = true; + record.data = { ...record.data, ...changes }; + record.changes = { ...record.changes, ...changes }; + + return record; + } + + async delete(id: string | number) { + const record = this.buffer.get(id); + if (record) { + await this.queue.remove(String(id)); + this.buffer.delete(id); + } + } + + get(id: string | number): ActiveRecord | undefined { + return this.buffer.get(id); + } + + hasChanges(id: string | number): boolean { + const record = this.buffer.get(id); + return record ? record.isDirty : false; + } + + getDirtyRecords(): ActiveRecord[] { + return Array.from(this.buffer.values()).filter(record => record.isDirty); + } + + getAll(): ActiveRecord[] { + return Array.from(this.buffer.values()); + } + + async flush(): Promise { + const dirtyRecords = this.getDirtyRecords(); + + for (const record of dirtyRecords) { + if (record.isNew) { + await this.queue.add(record.data); + } else { + await this.queue.update(String(record.id), record.changes); + } + + record.isDirty = false; + record.isNew = false; + record.changes = {}; + record.originalData = { ...record.data }; + } + + this.buffer.clear(); + } + + rollback(id: string | number) { + const record = this.buffer.get(id); + if (record) { + record.data = { ...record.originalData }; + record.isDirty = false; + record.changes = {}; + } + } + + rollbackAll() { + for (const [id] of this.buffer) { + this.rollback(id); + } + } + + clear() { + this.buffer.clear(); + } + + dispose() { + this.stopAutoSave(); + this.clear(); + } +} \ No newline at end of file diff --git a/src/dataqueue/examples.ts b/src/dataqueue/examples.ts new file mode 100644 index 0000000..cb162b1 --- /dev/null +++ b/src/dataqueue/examples.ts @@ -0,0 +1,150 @@ +// // examples.ts +// import { EnhancedNestedQueue } from './queue'; +// import { LocalStoragePersistence } from './persistence'; +// import { useQueue, useActiveRecord } from './hooks'; + +// // Example 1: Basic Queue Usage +// interface TodoItem { +// id: number; +// title: string; +// completed: boolean; +// subTasks?: TodoItem[]; +// } + +// const todoQueue = new EnhancedNestedQueue([], { +// persistence: new LocalStoragePersistence('todos'), +// middleware: [ +// { +// beforeAction: (action) => { +// console.log('Action:', action); +// return action; +// }, +// afterAction: (action, state) => { +// console.log('New State:', state); +// } +// } +// ] +// }); + +// // Example 2: React Component with Queue +// function TodoList() { +// const { data, queue, buffer } = useQueue([], { +// persistence: new LocalStoragePersistence('todos') +// }); + +// const addTodo = (title: string) => { +// const newTodo = buffer.create({ +// id: Date.now(), +// title, +// completed: false +// }); +// }; + +// const toggleTodo = (id: number) => { +// const todo = data.find(t => t.id === id); +// if (todo) { +// buffer.update(id, { completed: !todo.completed }); +// } +// }; + +// return ( +//
+// +// {data.map(todo => ( +//
+// toggleTodo(todo.id)} +// /> +// {todo.title} +//
+// ))} +//
+// ); +// } + +// // Example 3: Active Record Pattern +// function TodoEditor({ todoId }: { todoId: number }) { +// const { data, queue } = useQueue([]); +// const todo = data.find(t => t.id === todoId); + +// const { +// record, +// update, +// save, +// rollback, +// isDirty +// } = useActiveRecord(queue, todo!); + +// if (!record) return null; + +// return ( +//
+// update({ title: e.target.value })} +// /> +// +// +//
+// ); +// } + +// // Example 4: Complex Nested Data +// interface Department { +// id: number; +// name: string; +// employees: Employee[]; +// } + +// interface Employee { +// id: number; +// name: string; +// roles: string[]; +// } + +// const departmentQueue = new EnhancedNestedQueue(); + +// // Adding nested data +// departmentQueue.add({ +// id: 1, +// name: 'Engineering', +// employees: [ +// { id: 1, name: 'John', roles: ['dev'] } +// ] +// }, ''); + +// // Updating nested employee +// departmentQueue.update('0.employees.0', { +// roles: ['dev', 'lead'] +// }); + +// // Sorting employees by name +// departmentQueue.sort('name', { +// path: '0.employees', +// direction: 'asc' +// }); + +// // Example 5: Batch Operations +// async function batchUpdate() { +// const buffer = departmentQueue.getBuffer(); + +// // Load multiple records +// const records = await Promise.all([ +// buffer.load({ id: 1, name: 'Dept 1', employees: [] }), +// buffer.load({ id: 2, name: 'Dept 2', employees: [] }) +// ]); + +// // Update multiple records +// records.forEach(record => { +// buffer.update(record.id, { name: `Updated ${record.data.name}` }); +// }); + +// // Flush all changes at once +// await buffer.flush(); +// } \ No newline at end of file diff --git a/src/dataqueue/hooks.ts b/src/dataqueue/hooks.ts new file mode 100644 index 0000000..157eac5 --- /dev/null +++ b/src/dataqueue/hooks.ts @@ -0,0 +1,84 @@ +// // hooks.ts +// import { useState, useEffect, useRef } from 'react'; +// import { EnhancedNestedQueue } from './queue'; +// import { QueueOptions, BufferOptions, ActiveRecord } from './types'; + +// export function useQueue( +// initialData: T[], +// options: QueueOptions = {}, +// bufferOptions: BufferOptions = {} +// ) { +// const [data, setData] = useState(initialData); +// const queueRef = useRef>(); + +// useEffect(() => { +// if (!queueRef.current) { +// queueRef.current = new EnhancedNestedQueue( +// initialData, +// options, +// bufferOptions +// ); +// } + +// const unsubscribe = queueRef.current.subscribe((newData) => { +// setData(newData); +// }); + +// return () => { +// unsubscribe(); +// queueRef.current?.getBuffer().dispose(); +// }; +// }, []); + +// return { +// data, +// queue: queueRef.current!, +// buffer: queueRef.current?.getBuffer() +// }; +// } + +// export function useActiveRecord( +// queue: EnhancedNestedQueue, +// record: T +// ) { +// const [activeRecord, setActiveRecord] = useState>(); +// const buffer = queue.getBuffer(); + +// useEffect(() => { +// buffer.load(record).then(setActiveRecord); + +// return () => { +// if (activeRecord?.isDirty) { +// buffer.flush(); +// } +// }; +// }, [record]); + +// const updateRecord = (changes: Partial) => { +// if (activeRecord) { +// const updated = buffer.update(activeRecord.id, changes); +// setActiveRecord(updated); +// } +// }; + +// const saveRecord = async () => { +// if (activeRecord?.isDirty) { +// await buffer.flush(); +// } +// }; + +// const rollbackRecord = () => { +// if (activeRecord) { +// buffer.rollback(activeRecord.id); +// setActiveRecord(buffer.get(activeRecord.id)); +// } +// }; + +// return { +// record: activeRecord, +// update: updateRecord, +// save: saveRecord, +// rollback: rollbackRecord, +// isDirty: activeRecord?.isDirty ?? false +// }; +// } \ No newline at end of file diff --git a/src/dataqueue/index.ts b/src/dataqueue/index.ts new file mode 100644 index 0000000..b8817a2 --- /dev/null +++ b/src/dataqueue/index.ts @@ -0,0 +1,9 @@ +export {NestedQueue,EnhancedNestedQueue} from './queue' + +import {InMemoryPersistence,IndexedDBPersistence,LocalStoragePersistence} from './persistence' +const NestedQueuePersistence = { + InMemoryPersistence, + IndexedDBPersistence, + LocalStoragePersistence +} +export {NestedQueuePersistence} \ No newline at end of file diff --git a/src/dataqueue/persistence.ts b/src/dataqueue/persistence.ts new file mode 100644 index 0000000..4a6f3e9 --- /dev/null +++ b/src/dataqueue/persistence.ts @@ -0,0 +1,99 @@ + +import type { PersistenceAdapter, QueueData } from './types'; + +export class LocalStoragePersistence implements PersistenceAdapter { + constructor(private key: string) { + this.key = key; + } + + async save(data: QueueData): Promise { + localStorage.setItem(this.key, JSON.stringify(data)); + } + + async load(): Promise | null> { + const data = localStorage.getItem(this.key); + return data ? JSON.parse(data) : null; + } + + async clear(): Promise { + localStorage.removeItem(this.key); + } +} + +export class IndexedDBPersistence implements PersistenceAdapter { + private dbName: string; + private storeName: string; + + constructor(dbName: string, storeName: string) { + this.dbName = dbName; + this.storeName = storeName; + } + + private openDB(): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, 1); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + + request.onupgradeneeded = () => { + const db = request.result; + if (!db.objectStoreNames.contains(this.storeName)) { + db.createObjectStore(this.storeName); + } + }; + }); + } + + async save(data: QueueData): Promise { + const db = await this.openDB(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readwrite'); + const store = transaction.objectStore(this.storeName); + const request = store.put(data, 'queueData'); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + }); + } + + async load(): Promise | null> { + const db = await this.openDB(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readonly'); + const store = transaction.objectStore(this.storeName); + const request = store.get('queueData'); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result || null); + }); + } + + async clear(): Promise { + const db = await this.openDB(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readwrite'); + const store = transaction.objectStore(this.storeName); + const request = store.clear(); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + }); + } +} + +export class InMemoryPersistence implements PersistenceAdapter { + private data: QueueData | null = null; + + async save(data: QueueData): Promise { + this.data = [...data]; + } + + async load(): Promise | null> { + return this.data ? [...this.data] : null; + } + + async clear(): Promise { + this.data = null; + } +} \ No newline at end of file diff --git a/src/dataqueue/queue.ts b/src/dataqueue/queue.ts new file mode 100644 index 0000000..c1e5886 --- /dev/null +++ b/src/dataqueue/queue.ts @@ -0,0 +1,285 @@ +// queue.ts +import { + QueueData, + QueueOptions, + QueueAction, + + SortOptions, + BufferOptions, + Middleware, + PersistenceAdapter, +} from "./types"; +import { ActiveRecordBuffer } from "./buffer"; +import { QueueUtils } from "./utils"; + +export class NestedQueue { + protected data: QueueData; + private listeners: Set<(data: QueueData) => void>; + private middleware: Middleware[]; + private persistence?: PersistenceAdapter; + private initialized: Promise; + + constructor(initialData: QueueData = [], options: QueueOptions = {}) { + this.data = [...initialData]; + this.listeners = new Set(); + this.middleware = options.middleware || []; + this.persistence = options.persistence; + + this.initialized = + options.autoload && this.persistence + ? this.loadFromPersistence() + : Promise.resolve(); + } + + subscribe(callback: () => void) { + this.listeners.add(callback); + + return () => this.listeners.delete(callback); + } + + private notify() { + this.listeners.forEach((callback) => callback(this.data)); + } + + private getNestedValue(obj: any, path: string | string[]) { + const keys = Array.isArray(path) ? path : path.split("."); + return keys.reduce((current, key) => current?.[key], obj); + } + + private setNestedValue(obj: any, path: string, value: any) { + const keys = path.split("."); + const lastKey = keys.pop()!; + const target = keys.reduce((current, key) => { + current[key] = current[key] || {}; + return current[key]; + }, obj); + target[lastKey] = value; + return obj; + } + + private async executeAction(action: QueueAction): Promise { + // Run through beforeAction middleware + let currentAction = action; + for (const m of this.middleware) { + if (m.beforeAction) { + currentAction = m.beforeAction(currentAction) || currentAction; + if (!currentAction) return; // Action cancelled by middleware + } + } + + // Execute the action + switch (currentAction.type) { + case "add": + this.executeAdd(currentAction.payload, currentAction.path); + break; + case "remove": + this.executeRemove(currentAction.path!); + break; + case "update": + this.executeUpdate(currentAction.path!, currentAction.payload); + break; + case "sort": + this.executeSort( + currentAction.payload.key, + currentAction.payload.options + ); + break; + case "clear": + this.executeClear(); + break; + } + + // Run through afterAction middleware + for (const m of this.middleware) { + if (m.afterAction) { + m.afterAction(currentAction, this.data); + } + } + + // Persist changes if enabled + if (this.persistence) { + await this.persistence.save(this.data); + } + + // Notify listeners + this.notify(); + } + + private executeAdd(item: T, path: string = "") { + this.data = [...this.data]; + + if (!path) { + this.data.push(item); + return; + } + + const target = this.getNestedValue(this.data, path); + if (Array.isArray(target)) { + target.push(item); + } + } + + private executeRemove(path: string) { + const pathParts = path.split("."); + const index = pathParts.pop()!; + const parentPath = pathParts.join("."); + + this.data = [...this.data]; + const target = parentPath + ? this.getNestedValue(this.data, parentPath) + : this.data; + + if (Array.isArray(target)) { + target.splice(Number(index), 1); + } + } + + private executeUpdate(path: string, value: Partial) { + this.data = [...this.data]; + const existing = this.getNestedValue(this.data, path); + + if (existing) { + this.setNestedValue(this.data, path, { ...existing, ...value }); + } + } + + private executeSort(key: keyof T | string[], options: SortOptions = {}) { + const { + deep = true, + maxDepth = Infinity, + path = "", + direction = "asc", + sortFn, + } = options; + + const sortArray = (array: any[], depth: number = 0): void => { + if (sortFn) { + array.sort((a, b) => sortFn(a, b)); + } else { + array.sort((a, b) => { + const aValue = Array.isArray(key) + ? this.getNestedValue(a, key) + : a[key]; + const bValue = Array.isArray(key) + ? this.getNestedValue(b, key) + : b[key]; + + return QueueUtils.compareValues(aValue, bValue, direction); + }); + } + + if (deep && depth < maxDepth) { + array.forEach((item) => { + Object.values(item).forEach((value) => { + if (Array.isArray(value)) { + sortArray(value, depth + 1); + } + }); + }); + } + }; + + this.data = [...this.data]; + + if (path) { + const target = this.getNestedValue(this.data, path); + if (Array.isArray(target)) { + sortArray(target); + } + } else { + sortArray(this.data); + } + } + + private executeClear() { + this.data = []; + } + + // ... Core action execution methods ... + // (Previously defined methods: executeAction, executeAdd, executeRemove, etc.) + + // Public API methods + async add(item: T, path: string = "") { + await this.initialized; + return this.executeAction({ + type: "add", + payload: item, + path, + }); + } + + async remove(path: string) { + await this.initialized; + return this.executeAction({ + type: "remove", + path, + }); + } + + async update(path: string, value: Partial) { + await this.initialized; + return this.executeAction({ + type: "update", + payload: value, + path, + }); + } + + get(path: string) { + return this.getNestedValue(this.data, path); + } + + getAll() { + return this.data; + } + + // ... Search and filter methods ... + // (Previously defined methods: search, filter, findOne, sort) + + async clear() { + await this.initialized; + return this.executeAction({ + type: "clear", + }); + } + + private async loadFromPersistence(): Promise { + if (!this.persistence) return; + + try { + const persistedData = await this.persistence.load(); + if (persistedData) { + this.data = persistedData; + this.notify(); + } + } catch (error) { + console.error("Failed to load persisted data:", error); + } + } + + async clearPersistence(): Promise { + if (this.persistence) { + await this.persistence.clear(); + } + } +} + +// Enhanced queue with buffer support +export class EnhancedNestedQueue extends NestedQueue { + private activeRecordBuffer: ActiveRecordBuffer; + + constructor( + initialData: T[] = [], + options: QueueOptions = {}, + bufferOptions: BufferOptions = {} + ) { + super(initialData, options); + this.activeRecordBuffer = new ActiveRecordBuffer(this, bufferOptions); + } + + getBuffer(): ActiveRecordBuffer { + return this.activeRecordBuffer; + } +} + +export default EnhancedNestedQueue; diff --git a/src/dataqueue/types.ts b/src/dataqueue/types.ts new file mode 100644 index 0000000..d268375 --- /dev/null +++ b/src/dataqueue/types.ts @@ -0,0 +1,73 @@ + +export type QueueData = T[]; + +export interface SearchOptions { + exact?: boolean; + caseSensitive?: boolean; + deep?: boolean; + paths?: string[]; +} + +export interface FilterOptions { + deep?: boolean; + maxDepth?: number; +} + +export interface SortOptions { + deep?: boolean; + maxDepth?: number; + path?: string; + direction?: 'asc' | 'desc'; + sortFn?: (a: T, b: T) => number; +} + +export type QueueAction = { + type: 'add' | 'remove' | 'update' | 'sort' | 'clear'; + payload?: T | any; + path?: string; +}; + +export interface Middleware { + beforeAction?: (action: QueueAction) => QueueAction | null; + afterAction?: (action: QueueAction, state: QueueData) => void; +} + +export interface PersistenceAdapter { + save: (data: QueueData) => Promise; + load: () => Promise | null>; + clear: () => Promise; +} + +export interface QueueOptions { + persistence?: PersistenceAdapter; + middleware?: Middleware[]; + autoload?: boolean; +} + +export interface BufferOptions { + autoSave?: boolean; + bufferSize?: number; + flushInterval?: number; +} + +export interface ActiveRecord { + data: T; + id: string | number; + isDirty: boolean; + isNew: boolean; + changes: Partial; + originalData: T; +} + +export interface QueueOperations { + add: (item: T, path?: string) => Promise; + remove: (path: string) => Promise; + update: (path: string, value: Partial) => Promise; + get: (path: string) => any; + getAll: () => T[]; + search: (query: string | object, options?: SearchOptions) => T[]; + filter: (predicate: (item: T) => boolean, options?: FilterOptions) => T[]; + findOne: (predicate: (item: T) => boolean) => T | undefined; + sort: (key: keyof T | string[], options?: SortOptions) => Promise; + clear: () => Promise; +} \ No newline at end of file diff --git a/src/dataqueue/utils.ts b/src/dataqueue/utils.ts new file mode 100644 index 0000000..62ebfd1 --- /dev/null +++ b/src/dataqueue/utils.ts @@ -0,0 +1,117 @@ +// utils.ts +export class QueueUtils { + static deepClone(obj: T): T { + if (obj === null || typeof obj !== 'object') { + return obj; + } + + if (Array.isArray(obj)) { + return obj.map(item => QueueUtils.deepClone(item)) as unknown as T; + } + + return Object.keys(obj).reduce((acc, key) => { + acc[key] = QueueUtils.deepClone(obj[key]); + return acc; + }, {} as T); + } + + static createPath(parts: (string | number)[]): string { + return parts.join('.'); + } + + static parsePath(path: string): string[] { + return path.split('.'); + } + + static getValueAtPath(obj: T, path: string): any { + return path.split('.').reduce((current, key) => current?.[key], obj); + } + + static setValueAtPath(obj: T, path: string, value: any): T { + const clone = QueueUtils.deepClone(obj); + const keys = path.split('.'); + const lastKey = keys.pop()!; + const target = keys.reduce((current:any, key) => { + if (!(key in current)) { + current[key] = {}; + } + return current[key]; + }, clone); + target[lastKey] = value; + return clone; + } + + static compareValues(a: any, b: any, direction: 'asc' | 'desc' = 'asc'): number { + if (a === b) return 0; + if (a === null) return direction === 'asc' ? -1 : 1; + if (b === null) return direction === 'asc' ? 1 : -1; + + const typeA = typeof a; + const typeB = typeof b; + + if (typeA !== typeB) { + a = String(a); + b = String(b); + } + + if (typeA === 'string') { + return direction === 'asc' ? a.localeCompare(b) : b.localeCompare(a); + } + + return direction === 'asc' ? a - b : b - a; + } + + static debounce any>( + func: T, + wait: number + ): (...args: Parameters) => void { + let timeout: any; + return (...args: Parameters) => { + clearTimeout(timeout); + timeout = setTimeout(() => func(...args), wait); + }; + } + + static throttle any>( + func: T, + limit: number + ): (...args: Parameters) => void { + let inThrottle: boolean; + return (...args: Parameters) => { + if (!inThrottle) { + func(...args); + inThrottle = true; + setTimeout(() => (inThrottle = false), limit); + } + }; + } + + static batch(callback: () => void): void { + Promise.resolve().then(callback); + } + } + + // Decorators for method enhancement + export function debounce(wait: number) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor + ) { + const original = descriptor.value; + descriptor.value = QueueUtils.debounce(original, wait); + return descriptor; + }; + } + + export function throttle(limit: number) { + return function ( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor + ) { + const original = descriptor.value; + descriptor.value = QueueUtils.throttle(original, limit); + return descriptor; + }; + } \ No newline at end of file diff --git a/src/i18n/examples.ts b/src/i18n/examples.ts new file mode 100644 index 0000000..7812159 --- /dev/null +++ b/src/i18n/examples.ts @@ -0,0 +1,24 @@ + +/** + * Example usage: + * ```typescript + * import { i18n, t, tt } from './i18n'; + * + * // Configure once at app startup + * i18n.configure({ + * apiUrl: 'https://api.example.com/translations' + * }); + * + * // Sync usage + * const message = t('welcome_message', 'Welcome'); + * + * // Async usage + * const asyncMessage = await tt('welcome_message', 'Welcome'); + * + * // Listen for updates + * window.addEventListener('i18n-updated', (event) => { + * const { id, value } = event.detail; + * // Update UI with new translation + * }); + * ``` + */ \ No newline at end of file diff --git a/src/i18n/index.ts b/src/i18n/index.ts new file mode 100644 index 0000000..5269676 --- /dev/null +++ b/src/i18n/index.ts @@ -0,0 +1,356 @@ +/** + * @fileoverview Internationalization module with IndexedDB caching and server synchronization + * @version 1.0.0 + */ + +/** + * Configuration options for the I18n manager + */ +type I18nConfig = { + /** Base URL for the translations API */ + apiUrl?: string; +}; + +/** + * Translation entry structure as stored in the cache + */ +type CacheEntry = { + /** The translated string value */ + value: string; + /** Version number of the translation */ + version: number; +}; + +/** + * Translation string registration format + */ +type TranslationString = { + /** Unique identifier for the translation */ + id: string; + /** The translated text */ + value: string; +}; + +/** + * Server response format for translation requests + */ +type TranslationResponse = { + /** The translated text */ + value: string; + /** Version number of the translation */ + version: number; +}; + +/** + * Event payload for translation updates + */ +type I18nUpdateEvent = CustomEvent<{ + /** Identifier of the updated translation */ + id: string; + /** New translated value */ + value: string; +}>; + +/** + * Core I18n manager interface + */ +interface I18nManager { + configure(options?: I18nConfig): void; + registerStrings(strings: TranslationString[], version: number): Promise; + getString(componentId: string, defaultValue?: string): Promise; + getStringSync(componentId: string, defaultValue?: string): string; + clearCache(): Promise; + getApiUrl(): string; +} + +const createI18nManager = (): I18nManager => { + /** Database name for IndexedDB storage */ + const DB_NAME = 'i18n-cache'; + /** Store name for translations within IndexedDB */ + const STORE_NAME = 'translations'; + /** Current version of the translations schema */ + const CURRENT_VERSION = 1; + /** Default API endpoint if none provided */ + const DEFAULT_API_URL = '/api/translations'; + + let db: IDBDatabase | null = null; + let serverUrl: string = DEFAULT_API_URL; + const cache = new Map(); + const pendingUpdates = new Set(); + let initPromise: Promise | null = null; + let isInitialized = false; + + /** + * Initializes the IndexedDB database and sets up the object store + * @returns Promise that resolves when the database is ready + */ + const initDatabase = async (): Promise => { + if (isInitialized) return; + + return new Promise((resolve, reject) => { + const request = indexedDB.open(DB_NAME, CURRENT_VERSION); + + request.onerror = () => reject(new Error('Failed to open database')); + + request.onupgradeneeded = (event) => { + const database = (event.target as IDBOpenDBRequest).result; + if (!database.objectStoreNames.contains(STORE_NAME)) { + const store = database.createObjectStore(STORE_NAME, { keyPath: 'id' }); + store.createIndex('version', 'version', { unique: false }); + } + }; + + request.onsuccess = async (event) => { + db = (event.target as IDBOpenDBRequest).result; + await loadCacheFromDb(); + isInitialized = true; + resolve(); + }; + }); + }; + + /** + * Loads all translations from IndexedDB into memory cache + */ + const loadCacheFromDb = async (): Promise => { + if (!db) throw new Error('Database not initialized'); + + return new Promise((resolve, reject) => { + if (!db) throw new Error('Database not initialized'); + const transaction = db.transaction([STORE_NAME], 'readonly'); + const store = transaction.objectStore(STORE_NAME); + const request = store.getAll(); + + request.onsuccess = (event) => { + const entries = (event.target as IDBRequest).result; + entries.forEach(entry => { + cache.set(entry.id, { + value: entry.value, + version: entry.version + }); + }); + resolve(); + }; + + request.onerror = () => reject(new Error('Failed to load cache')); + }); + }; + + /** + * Registers new translations in both IndexedDB and memory cache + * @param strings - Array of translation strings to register + * @param version - Version number for these translations + */ + const registerStrings = async (strings: TranslationString[], version: number): Promise => { + if (!initPromise) configure(); + await initPromise; + if (!db) throw new Error('Database not initialized'); + + return new Promise((resolve, reject) => { + if (!db) throw new Error('Database not initialized'); + const transaction = db.transaction([STORE_NAME], 'readwrite'); + const store = transaction.objectStore(STORE_NAME); + + strings.forEach(string => { + const entry = { + id: string.id, + value: string.value, + version: version + }; + store.put(entry); + cache.set(string.id, { + value: string.value, + version: version + }); + }); + + transaction.oncomplete = () => resolve(); + transaction.onerror = () => reject(new Error('Failed to register strings')); + }); + }; + + /** + * Fetches a translation from the server + * @param componentId - Identifier for the translation to fetch + * @returns The translated string or null if fetch fails + */ + const fetchFromServer = async (componentId: string): Promise => { + try { + const response = await fetch(`${serverUrl}/${componentId}`); + if (!response.ok) { + throw new Error('Failed to fetch translation'); + } + const data: TranslationResponse = await response.json(); + + await registerStrings([{ + id: componentId, + value: data.value + }], data.version); + + return data.value; + } catch (error) { + console.error('Error fetching translation:', error); + return null; + } finally { + pendingUpdates.delete(componentId); + } + }; + + /** + * Emits a custom event when translations are updated + * @param id - Identifier of the updated translation + * @param value - New translated value + */ + const emitUpdateEvent = (id: string, value: string): void => { + const event = new CustomEvent('i18n-updated', { + detail: { id, value } + }) as I18nUpdateEvent; + window.dispatchEvent(event); + }; + + /** + * Synchronously retrieves a translation with background update check + * @param componentId - Identifier for the translation + * @param defaultValue - Fallback value if translation not found + * @returns The translated string or default value + */ + const getStringSync = (componentId: string, defaultValue = ''): string => { + if (!isInitialized) { + console.warn('I18nManager not initialized. Call configure() first or await initialization.'); + return defaultValue; + } + + const cached = cache.get(componentId); + if (cached) { + if (cached.version !== CURRENT_VERSION && !pendingUpdates.has(componentId)) { + pendingUpdates.add(componentId); + fetchFromServer(componentId).then(newValue => { + if (newValue) { + emitUpdateEvent(componentId, newValue); + } + }); + } + return cached.value; + } + + if (!pendingUpdates.has(componentId)) { + pendingUpdates.add(componentId); + fetchFromServer(componentId).then(newValue => { + if (newValue) { + emitUpdateEvent(componentId, newValue); + } + }); + } + return defaultValue; + }; + + /** + * Asynchronously retrieves a translation + * @param componentId - Identifier for the translation + * @param defaultValue - Fallback value if translation not found + * @returns Promise resolving to the translated string + */ + const getString = async (componentId: string, defaultValue = ''): Promise => { + if (!initPromise) configure(); + await initPromise; + if (!db) throw new Error('Database not initialized'); + + return new Promise( (resolve) => { + if (!db) throw new Error('Database not initialized'); + const transaction = db.transaction([STORE_NAME], 'readonly'); + const store = transaction.objectStore(STORE_NAME); + const request = store.get(componentId); + + request.onsuccess = async (event) => { + const result = (event.target as IDBRequest).result; + + if (result && result.version === CURRENT_VERSION) { + resolve(result.value); + return; + } + + const serverValue = await fetchFromServer(componentId); + resolve(serverValue || defaultValue); + }; + + request.onerror = () => { + console.error('Error reading from cache'); + resolve(defaultValue); + }; + }); + }; + + /** + * Clears all cached translations + */ + const clearCache = async (): Promise => { + if (!initPromise) configure(); + await initPromise; + if (!db) throw new Error('Database not initialized'); + + return new Promise((resolve, reject) => { + if (!db) throw new Error('Database not initialized'); + const transaction = db.transaction([STORE_NAME], 'readwrite'); + const store = transaction.objectStore(STORE_NAME); + const request = store.clear(); + + request.onsuccess = () => { + cache.clear(); + resolve(); + }; + request.onerror = () => reject(new Error('Failed to clear cache')); + }); + }; + + /** + * Configures the I18n manager + * @param options - Configuration options + */ + const configure = (options: I18nConfig = {}): void => { + if (!isInitialized) { + serverUrl = options.apiUrl || DEFAULT_API_URL; + initPromise = initDatabase(); + return; + } + + if (options.apiUrl) { + serverUrl = options.apiUrl; + pendingUpdates.clear(); + } + }; + + /** + * Returns the current API URL + */ + const getApiUrl = (): string => serverUrl; + + return { + configure, + registerStrings, + getString, + getStringSync, + clearCache, + getApiUrl + }; +}; + +// Create the singleton instance +const i18nManager = createI18nManager(); + +// Export the main manager +export const i18n = i18nManager; + +// Export shortcut functions +export const _t = i18nManager.getStringSync; +export const _tt = i18nManager.getString; + +// Export everything as a namespace +export default { + ...i18nManager, + _t, + _tt +}; + +// Type declarations for the shortcut functions +export type GetStringSync = typeof i18nManager.getStringSync; +export type GetString = typeof i18nManager.getString; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..2e4cd26 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,8 @@ + +export * from './base64' +export * from './strings' +export * from './mime' +export * from './promise' +export * from './i18n' +export * from './dataqueue' +//export * from './logger' \ No newline at end of file diff --git a/src/logger/examples.ts b/src/logger/examples.ts new file mode 100644 index 0000000..6364a6b --- /dev/null +++ b/src/logger/examples.ts @@ -0,0 +1,43 @@ + +// // Example server reporting plugin +// const createServerReportingPlugin = (endpoint: string): LoggerPlugin => ({ +// name: 'ServerReportingPlugin', +// onLog: async (entry: LogEntry): Promise => { +// // Only send errors and warnings to the server +// if (entry.level === 'ERROR' || entry.level === 'WARN') { +// try { +// const response = await fetch(endpoint, { +// method: 'POST', +// headers: { +// 'Content-Type': 'application/json', +// }, +// body: JSON.stringify(entry) +// }); + +// if (!response.ok) { +// throw new Error(`HTTP error! status: ${response.status}`); +// } +// } catch (error) { +// console.error('Failed to send log to server:', error); +// } +// } +// } +// }); + +// // Example local storage plugin +// const createLocalStoragePlugin = (maxEntries: number = 100): LoggerPlugin => { +// const STORAGE_KEY = 'app_logs'; + +// return { +// name: 'LocalStoragePlugin', +// onLog: async (entry: LogEntry): Promise => { +// try { +// const storedLogs = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]'); +// const updatedLogs = [entry, ...storedLogs].slice(0, maxEntries); +// localStorage.setItem(STORAGE_KEY, JSON.stringify(updatedLogs)); +// } catch (error) { +// console.error('Failed to store log in localStorage:', error); +// } +// } +// }; +// }; \ No newline at end of file diff --git a/src/logger/index.ts b/src/logger/index.ts new file mode 100644 index 0000000..be0ecba --- /dev/null +++ b/src/logger/index.ts @@ -0,0 +1,102 @@ +// Types +type LogLevel = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG'; + +type LogEntry = { + timestamp: Date; + level: LogLevel; + message: string; + data?: unknown; +}; + +type LoggerPlugin = { + name: string; + onLog: (entry: LogEntry) => Promise; +}; + +type Logger = { + error: (message: string, data?: unknown) => Promise; + warn: (message: string, data?: unknown) => Promise; + info: (message: string, data?: unknown) => Promise; + debug: (message: string, data?: unknown) => Promise; + registerPlugin: (plugin: LoggerPlugin) => void; +}; + +// Create logger instance +const createLogger = (): Logger => { + const plugins: LoggerPlugin[] = []; + + const getLogLevelEmoji = (level: LogLevel): string => { + switch (level) { + case 'ERROR': + return '🔥'; // Fire for errors + case 'WARN': + return '⚠️'; // Warning sign for warnings + case 'INFO': + return '💡'; // Light bulb for info + case 'DEBUG': + return '🔍'; // Magnifying glass for debug + } + }; + + const formatMessage = (entry: LogEntry): string => { + const timestamp = entry.timestamp.toISOString(); + const emoji = getLogLevelEmoji(entry.level); + let message = `${emoji} [${timestamp}] ${entry.level}: ${entry.message}`; + if (entry.data) { + message += `\nData: ${JSON.stringify(entry.data, null, 2)}`; + } + return message; + }; + + const notifyPlugins = async (entry: LogEntry): Promise => { + const pluginPromises = plugins.map(plugin => + plugin.onLog(entry).catch(error => { + console.error(`Plugin "${plugin.name}" failed:`, error); + }) + ); + await Promise.all(pluginPromises); + }; + + const log = async (level: LogLevel, message: string, data?: unknown): Promise => { + const entry: LogEntry = { + timestamp: new Date(), + level, + message, + data + }; + + const formattedMessage = formatMessage(entry); + + // Console output with color coding + switch (level) { + case 'ERROR': + console.error(formattedMessage); + break; + case 'WARN': + console.warn(formattedMessage); + break; + case 'INFO': + console.info(formattedMessage); + break; + case 'DEBUG': + console.debug(formattedMessage); + break; + } + + await notifyPlugins(entry); + }; + + return { + error: (message: string, data?: unknown) => log('ERROR', message, data), + warn: (message: string, data?: unknown) => log('WARN', message, data), + info: (message: string, data?: unknown) => log('INFO', message, data), + debug: (message: string, data?: unknown) => log('DEBUG', message, data), + registerPlugin: (plugin: LoggerPlugin) => { + plugins.push(plugin); + console.log(`🔌 Plugin "${plugin.name}" registered`); + } + }; +}; + +export {createLogger} +export type {LogEntry,LogLevel,LoggerPlugin,Logger} \ No newline at end of file diff --git a/src/mime/index.ts b/src/mime/index.ts new file mode 100644 index 0000000..612cec5 --- /dev/null +++ b/src/mime/index.ts @@ -0,0 +1,80 @@ +import { MimeTypeList } from "./mime"; + +/** + * Gets file extension from MIME type, with substring matching + * @param pMime - MIME type string (e.g. "image/jpeg") + * @returns First matching extension or empty string if not found + */ +export const getExtFromMime = (pMime?: string): string => { + if (!pMime) return ""; + const mime = pMime.toLowerCase().trim(); + + // Try exact match first + const exactMatch = MimeTypeList[mime]?.extensions?.[0]; + if (exactMatch) return exactMatch; + + // Try substring match + const keys = Object.keys(MimeTypeList); + for (const key of keys) { + if (key.includes(mime) || mime.includes(key)) { + return MimeTypeList[key]?.extensions?.[0] ?? ""; + } + } + + return ""; +}; + +/** + * Gets the file extension from a filename + * @param pFilename - Name of file including extension + * @returns Extension without dot or empty string if no extension + */ +export const getExtFromFilename = (pFilename: string): string => { + if (!pFilename) return ""; + const parts = pFilename.trim().split("."); + return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : ""; +}; + +/** + * Gets the MIME type for a file extension + * @param pExt - File extension with or without dot + * @returns MIME type string or empty string if not found + */ +export const getMimeFromExt = (pExt: string): string => { + if (!pExt) return ""; + pExt = pExt.replace(".", ""); + const keys = Object.keys(MimeTypeList); + for (let i = 0; i < keys.length; i += 1) { + const mime = MimeTypeList[keys[i]]?.extensions?.find( + (v: string) => v.toLowerCase() === pExt.toLowerCase() + ); + if (mime && mime !== "") { + return keys[i]; + } + } + return ""; +}; + +/** + * Checks if a file extension is valid for a given MIME type + * @param pMime - MIME type string + * @param pExt - File extension to check + * @returns boolean indicating if extension matches MIME type + */ +export const isValidExtForMime = (pMime: string, pExt: string): boolean => { + if (!pMime || !pExt) return false; + const mime = pMime.toLowerCase().trim(); + const ext = pExt.replace(".", "").toLowerCase().trim(); + return MimeTypeList[mime]?.extensions?.includes(ext) ?? false; +}; + +/** + * Gets all valid extensions for a MIME type + * @param pMime - MIME type string + * @returns Array of valid extensions or empty array if none found + */ +export const getAllExtensionsForMime = (pMime: string): string[] => { + if (!pMime) return []; + const mime = pMime.toLowerCase().trim(); + return MimeTypeList[mime]?.extensions ?? []; +}; diff --git a/src/mime/mime.ts b/src/mime/mime.ts new file mode 100644 index 0000000..ee9968e --- /dev/null +++ b/src/mime/mime.ts @@ -0,0 +1,8878 @@ +/** + * Types for MIME and extension related functions + */ +export type MimeType = { + source?: string; + charset?: string; + compressible?: boolean; + extensions?: string[]; +}; + +export type MimeTypes = { + [key: string]: MimeType; +}; + + +export const MimeTypeList :MimeTypes = { + 'application/1d-interleaved-parityfec': { + source: 'iana', + }, + 'application/3gpdash-qoe-report+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/3gpp-ims+xml': { + source: 'iana', + compressible: true, + }, + 'application/3gpphal+json': { + source: 'iana', + compressible: true, + }, + 'application/3gpphalforms+json': { + source: 'iana', + compressible: true, + }, + 'application/a2l': { + source: 'iana', + }, + 'application/ace+cbor': { + source: 'iana', + }, + 'application/ace+json': { + source: 'iana', + compressible: true, + }, + 'application/activemessage': { + source: 'iana', + }, + 'application/activity+json': { + source: 'iana', + compressible: true, + }, + 'application/aif+cbor': { + source: 'iana', + }, + 'application/aif+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-cdni+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-cdnifilter+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-costmap+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-costmapfilter+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-directory+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-endpointcost+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-endpointcostparams+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-endpointprop+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-endpointpropparams+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-error+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-networkmap+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-networkmapfilter+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-propmap+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-propmapparams+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-updatestreamcontrol+json': { + source: 'iana', + compressible: true, + }, + 'application/alto-updatestreamparams+json': { + source: 'iana', + compressible: true, + }, + 'application/aml': { + source: 'iana', + }, + 'application/andrew-inset': { + source: 'iana', + extensions: ['ez'], + }, + 'application/appinstaller': { + compressible: false, + extensions: ['appinstaller'], + }, + 'application/applefile': { + source: 'iana', + }, + 'application/applixware': { + source: 'apache', + extensions: ['aw'], + }, + 'application/appx': { + compressible: false, + extensions: ['appx'], + }, + 'application/appxbundle': { + compressible: false, + extensions: ['appxbundle'], + }, + 'application/at+jwt': { + source: 'iana', + }, + 'application/atf': { + source: 'iana', + }, + 'application/atfx': { + source: 'iana', + }, + 'application/atom+xml': { + source: 'iana', + compressible: true, + extensions: ['atom'], + }, + 'application/atomcat+xml': { + source: 'iana', + compressible: true, + extensions: ['atomcat'], + }, + 'application/atomdeleted+xml': { + source: 'iana', + compressible: true, + extensions: ['atomdeleted'], + }, + 'application/atomicmail': { + source: 'iana', + }, + 'application/atomsvc+xml': { + source: 'iana', + compressible: true, + extensions: ['atomsvc'], + }, + 'application/atsc-dwd+xml': { + source: 'iana', + compressible: true, + extensions: ['dwd'], + }, + 'application/atsc-dynamic-event-message': { + source: 'iana', + }, + 'application/atsc-held+xml': { + source: 'iana', + compressible: true, + extensions: ['held'], + }, + 'application/atsc-rdt+json': { + source: 'iana', + compressible: true, + }, + 'application/atsc-rsat+xml': { + source: 'iana', + compressible: true, + extensions: ['rsat'], + }, + 'application/atxml': { + source: 'iana', + }, + 'application/auth-policy+xml': { + source: 'iana', + compressible: true, + }, + 'application/automationml-aml+xml': { + source: 'iana', + compressible: true, + extensions: ['aml'], + }, + 'application/automationml-amlx+zip': { + source: 'iana', + compressible: false, + extensions: ['amlx'], + }, + 'application/bacnet-xdd+zip': { + source: 'iana', + compressible: false, + }, + 'application/batch-smtp': { + source: 'iana', + }, + 'application/bdoc': { + compressible: false, + extensions: ['bdoc'], + }, + 'application/beep+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/calendar+json': { + source: 'iana', + compressible: true, + }, + 'application/calendar+xml': { + source: 'iana', + compressible: true, + extensions: ['xcs'], + }, + 'application/call-completion': { + source: 'iana', + }, + 'application/cals-1840': { + source: 'iana', + }, + 'application/captive+json': { + source: 'iana', + compressible: true, + }, + 'application/cbor': { + source: 'iana', + }, + 'application/cbor-seq': { + source: 'iana', + }, + 'application/cccex': { + source: 'iana', + }, + 'application/ccmp+xml': { + source: 'iana', + compressible: true, + }, + 'application/ccxml+xml': { + source: 'iana', + compressible: true, + extensions: ['ccxml'], + }, + 'application/cda+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/cdfx+xml': { + source: 'iana', + compressible: true, + extensions: ['cdfx'], + }, + 'application/cdmi-capability': { + source: 'iana', + extensions: ['cdmia'], + }, + 'application/cdmi-container': { + source: 'iana', + extensions: ['cdmic'], + }, + 'application/cdmi-domain': { + source: 'iana', + extensions: ['cdmid'], + }, + 'application/cdmi-object': { + source: 'iana', + extensions: ['cdmio'], + }, + 'application/cdmi-queue': { + source: 'iana', + extensions: ['cdmiq'], + }, + 'application/cdni': { + source: 'iana', + }, + 'application/cea': { + source: 'iana', + }, + 'application/cea-2018+xml': { + source: 'iana', + compressible: true, + }, + 'application/cellml+xml': { + source: 'iana', + compressible: true, + }, + 'application/cfw': { + source: 'iana', + }, + 'application/city+json': { + source: 'iana', + compressible: true, + }, + 'application/clr': { + source: 'iana', + }, + 'application/clue+xml': { + source: 'iana', + compressible: true, + }, + 'application/clue_info+xml': { + source: 'iana', + compressible: true, + }, + 'application/cms': { + source: 'iana', + }, + 'application/cnrp+xml': { + source: 'iana', + compressible: true, + }, + 'application/coap-group+json': { + source: 'iana', + compressible: true, + }, + 'application/coap-payload': { + source: 'iana', + }, + 'application/commonground': { + source: 'iana', + }, + 'application/concise-problem-details+cbor': { + source: 'iana', + }, + 'application/conference-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/cose': { + source: 'iana', + }, + 'application/cose-key': { + source: 'iana', + }, + 'application/cose-key-set': { + source: 'iana', + }, + 'application/cose-x509': { + source: 'iana', + }, + 'application/cpl+xml': { + source: 'iana', + compressible: true, + extensions: ['cpl'], + }, + 'application/csrattrs': { + source: 'iana', + }, + 'application/csta+xml': { + source: 'iana', + compressible: true, + }, + 'application/cstadata+xml': { + source: 'iana', + compressible: true, + }, + 'application/csvm+json': { + source: 'iana', + compressible: true, + }, + 'application/cu-seeme': { + source: 'apache', + extensions: ['cu'], + }, + 'application/cwl': { + source: 'iana', + extensions: ['cwl'], + }, + 'application/cwl+json': { + source: 'iana', + compressible: true, + }, + 'application/cwt': { + source: 'iana', + }, + 'application/cybercash': { + source: 'iana', + }, + 'application/dart': { + compressible: true, + }, + 'application/dash+xml': { + source: 'iana', + compressible: true, + extensions: ['mpd'], + }, + 'application/dash-patch+xml': { + source: 'iana', + compressible: true, + extensions: ['mpp'], + }, + 'application/dashdelta': { + source: 'iana', + }, + 'application/davmount+xml': { + source: 'iana', + compressible: true, + extensions: ['davmount'], + }, + 'application/dca-rft': { + source: 'iana', + }, + 'application/dcd': { + source: 'iana', + }, + 'application/dec-dx': { + source: 'iana', + }, + 'application/dialog-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/dicom': { + source: 'iana', + }, + 'application/dicom+json': { + source: 'iana', + compressible: true, + }, + 'application/dicom+xml': { + source: 'iana', + compressible: true, + }, + 'application/dii': { + source: 'iana', + }, + 'application/dit': { + source: 'iana', + }, + 'application/dns': { + source: 'iana', + }, + 'application/dns+json': { + source: 'iana', + compressible: true, + }, + 'application/dns-message': { + source: 'iana', + }, + 'application/docbook+xml': { + source: 'apache', + compressible: true, + extensions: ['dbk'], + }, + 'application/dots+cbor': { + source: 'iana', + }, + 'application/dskpp+xml': { + source: 'iana', + compressible: true, + }, + 'application/dssc+der': { + source: 'iana', + extensions: ['dssc'], + }, + 'application/dssc+xml': { + source: 'iana', + compressible: true, + extensions: ['xdssc'], + }, + 'application/dvcs': { + source: 'iana', + }, + 'application/ecmascript': { + source: 'apache', + compressible: true, + extensions: ['ecma'], + }, + 'application/edi-consent': { + source: 'iana', + }, + 'application/edi-x12': { + source: 'iana', + compressible: false, + }, + 'application/edifact': { + source: 'iana', + compressible: false, + }, + 'application/efi': { + source: 'iana', + }, + 'application/elm+json': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/elm+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.cap+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/emergencycalldata.comment+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.control+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.deviceinfo+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.ecall.msd': { + source: 'iana', + }, + 'application/emergencycalldata.legacyesn+json': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.providerinfo+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.serviceinfo+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.subscriberinfo+xml': { + source: 'iana', + compressible: true, + }, + 'application/emergencycalldata.veds+xml': { + source: 'iana', + compressible: true, + }, + 'application/emma+xml': { + source: 'iana', + compressible: true, + extensions: ['emma'], + }, + 'application/emotionml+xml': { + source: 'iana', + compressible: true, + extensions: ['emotionml'], + }, + 'application/encaprtp': { + source: 'iana', + }, + 'application/epp+xml': { + source: 'iana', + compressible: true, + }, + 'application/epub+zip': { + source: 'iana', + compressible: false, + extensions: ['epub'], + }, + 'application/eshop': { + source: 'iana', + }, + 'application/exi': { + source: 'iana', + extensions: ['exi'], + }, + 'application/expect-ct-report+json': { + source: 'iana', + compressible: true, + }, + 'application/express': { + source: 'iana', + extensions: ['exp'], + }, + 'application/fastinfoset': { + source: 'iana', + }, + 'application/fastsoap': { + source: 'iana', + }, + 'application/fdf': { + source: 'iana', + extensions: ['fdf'], + }, + 'application/fdt+xml': { + source: 'iana', + compressible: true, + extensions: ['fdt'], + }, + 'application/fhir+json': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/fhir+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/fido.trusted-apps+json': { + compressible: true, + }, + 'application/fits': { + source: 'iana', + }, + 'application/flexfec': { + source: 'iana', + }, + 'application/font-sfnt': { + source: 'iana', + }, + 'application/font-tdpfr': { + source: 'iana', + extensions: ['pfr'], + }, + 'application/font-woff': { + source: 'iana', + compressible: false, + }, + 'application/framework-attributes+xml': { + source: 'iana', + compressible: true, + }, + 'application/geo+json': { + source: 'iana', + compressible: true, + extensions: ['geojson'], + }, + 'application/geo+json-seq': { + source: 'iana', + }, + 'application/geopackage+sqlite3': { + source: 'iana', + }, + 'application/geoxacml+xml': { + source: 'iana', + compressible: true, + }, + 'application/gltf-buffer': { + source: 'iana', + }, + 'application/gml+xml': { + source: 'iana', + compressible: true, + extensions: ['gml'], + }, + 'application/gpx+xml': { + source: 'apache', + compressible: true, + extensions: ['gpx'], + }, + 'application/gxf': { + source: 'apache', + extensions: ['gxf'], + }, + 'application/gzip': { + source: 'iana', + compressible: false, + extensions: ['gz'], + }, + 'application/h224': { + source: 'iana', + }, + 'application/held+xml': { + source: 'iana', + compressible: true, + }, + 'application/hjson': { + extensions: ['hjson'], + }, + 'application/hl7v2+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/http': { + source: 'iana', + }, + 'application/hyperstudio': { + source: 'iana', + extensions: ['stk'], + }, + 'application/ibe-key-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/ibe-pkg-reply+xml': { + source: 'iana', + compressible: true, + }, + 'application/ibe-pp-data': { + source: 'iana', + }, + 'application/iges': { + source: 'iana', + }, + 'application/im-iscomposing+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/index': { + source: 'iana', + }, + 'application/index.cmd': { + source: 'iana', + }, + 'application/index.obj': { + source: 'iana', + }, + 'application/index.response': { + source: 'iana', + }, + 'application/index.vnd': { + source: 'iana', + }, + 'application/inkml+xml': { + source: 'iana', + compressible: true, + extensions: ['ink', 'inkml'], + }, + 'application/iotp': { + source: 'iana', + }, + 'application/ipfix': { + source: 'iana', + extensions: ['ipfix'], + }, + 'application/ipp': { + source: 'iana', + }, + 'application/isup': { + source: 'iana', + }, + 'application/its+xml': { + source: 'iana', + compressible: true, + extensions: ['its'], + }, + 'application/java-archive': { + source: 'apache', + compressible: false, + extensions: ['jar', 'war', 'ear'], + }, + 'application/java-serialized-object': { + source: 'apache', + compressible: false, + extensions: ['ser'], + }, + 'application/java-vm': { + source: 'apache', + compressible: false, + extensions: ['class'], + }, + 'application/javascript': { + source: 'apache', + charset: 'UTF-8', + compressible: true, + extensions: ['js','mjs','cjs'], + }, + 'application/jf2feed+json': { + source: 'iana', + compressible: true, + }, + 'application/jose': { + source: 'iana', + }, + 'application/jose+json': { + source: 'iana', + compressible: true, + }, + 'application/jrd+json': { + source: 'iana', + compressible: true, + }, + 'application/jscalendar+json': { + source: 'iana', + compressible: true, + }, + 'application/json': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['json', 'map'], + }, + 'application/json-patch+json': { + source: 'iana', + compressible: true, + }, + 'application/json-seq': { + source: 'iana', + }, + 'application/json5': { + extensions: ['json5'], + }, + 'application/jsonml+json': { + source: 'apache', + compressible: true, + extensions: ['jsonml'], + }, + 'application/jwk+json': { + source: 'iana', + compressible: true, + }, + 'application/jwk-set+json': { + source: 'iana', + compressible: true, + }, + 'application/jwt': { + source: 'iana', + }, + 'application/kpml-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/kpml-response+xml': { + source: 'iana', + compressible: true, + }, + 'application/ld+json': { + source: 'iana', + compressible: true, + extensions: ['jsonld'], + }, + 'application/lgr+xml': { + source: 'iana', + compressible: true, + extensions: ['lgr'], + }, + 'application/link-format': { + source: 'iana', + }, + 'application/linkset': { + source: 'iana', + }, + 'application/linkset+json': { + source: 'iana', + compressible: true, + }, + 'application/load-control+xml': { + source: 'iana', + compressible: true, + }, + 'application/logout+jwt': { + source: 'iana', + }, + 'application/lost+xml': { + source: 'iana', + compressible: true, + extensions: ['lostxml'], + }, + 'application/lostsync+xml': { + source: 'iana', + compressible: true, + }, + 'application/lpf+zip': { + source: 'iana', + compressible: false, + }, + 'application/lxf': { + source: 'iana', + }, + 'application/mac-binhex40': { + source: 'iana', + extensions: ['hqx'], + }, + 'application/mac-compactpro': { + source: 'apache', + extensions: ['cpt'], + }, + 'application/macwriteii': { + source: 'iana', + }, + 'application/mads+xml': { + source: 'iana', + compressible: true, + extensions: ['mads'], + }, + 'application/manifest+json': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['webmanifest'], + }, + 'application/marc': { + source: 'iana', + extensions: ['mrc'], + }, + 'application/marcxml+xml': { + source: 'iana', + compressible: true, + extensions: ['mrcx'], + }, + 'application/mathematica': { + source: 'iana', + extensions: ['ma', 'nb', 'mb'], + }, + 'application/mathml+xml': { + source: 'iana', + compressible: true, + extensions: ['mathml'], + }, + 'application/mathml-content+xml': { + source: 'iana', + compressible: true, + }, + 'application/mathml-presentation+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-associated-procedure-description+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-deregister+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-envelope+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-msk+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-msk-response+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-protection-description+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-reception-report+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-register+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-register-response+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-schedule+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbms-user-service-description+xml': { + source: 'iana', + compressible: true, + }, + 'application/mbox': { + source: 'iana', + extensions: ['mbox'], + }, + 'application/media-policy-dataset+xml': { + source: 'iana', + compressible: true, + extensions: ['mpf'], + }, + 'application/media_control+xml': { + source: 'iana', + compressible: true, + }, + 'application/mediaservercontrol+xml': { + source: 'iana', + compressible: true, + extensions: ['mscml'], + }, + 'application/merge-patch+json': { + source: 'iana', + compressible: true, + }, + 'application/metalink+xml': { + source: 'apache', + compressible: true, + extensions: ['metalink'], + }, + 'application/metalink4+xml': { + source: 'iana', + compressible: true, + extensions: ['meta4'], + }, + 'application/mets+xml': { + source: 'iana', + compressible: true, + extensions: ['mets'], + }, + 'application/mf4': { + source: 'iana', + }, + 'application/mikey': { + source: 'iana', + }, + 'application/mipc': { + source: 'iana', + }, + 'application/missing-blocks+cbor-seq': { + source: 'iana', + }, + 'application/mmt-aei+xml': { + source: 'iana', + compressible: true, + extensions: ['maei'], + }, + 'application/mmt-usd+xml': { + source: 'iana', + compressible: true, + extensions: ['musd'], + }, + 'application/mods+xml': { + source: 'iana', + compressible: true, + extensions: ['mods'], + }, + 'application/moss-keys': { + source: 'iana', + }, + 'application/moss-signature': { + source: 'iana', + }, + 'application/mosskey-data': { + source: 'iana', + }, + 'application/mosskey-request': { + source: 'iana', + }, + 'application/mp21': { + source: 'iana', + extensions: ['m21', 'mp21'], + }, + 'application/mp4': { + source: 'iana', + extensions: ['mp4', 'mpg4', 'mp4s', 'm4p'], + }, + 'application/mpeg4-generic': { + source: 'iana', + }, + 'application/mpeg4-iod': { + source: 'iana', + }, + 'application/mpeg4-iod-xmt': { + source: 'iana', + }, + 'application/mrb-consumer+xml': { + source: 'iana', + compressible: true, + }, + 'application/mrb-publish+xml': { + source: 'iana', + compressible: true, + }, + 'application/msc-ivr+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/msc-mixer+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/msix': { + compressible: false, + extensions: ['msix'], + }, + 'application/msixbundle': { + compressible: false, + extensions: ['msixbundle'], + }, + 'application/msword': { + source: 'iana', + compressible: false, + extensions: ['doc', 'dot'], + }, + 'application/mud+json': { + source: 'iana', + compressible: true, + }, + 'application/multipart-core': { + source: 'iana', + }, + 'application/mxf': { + source: 'iana', + extensions: ['mxf'], + }, + 'application/n-quads': { + source: 'iana', + extensions: ['nq'], + }, + 'application/n-triples': { + source: 'iana', + extensions: ['nt'], + }, + 'application/nasdata': { + source: 'iana', + }, + 'application/news-checkgroups': { + source: 'iana', + charset: 'US-ASCII', + }, + 'application/news-groupinfo': { + source: 'iana', + charset: 'US-ASCII', + }, + 'application/news-transmission': { + source: 'iana', + }, + 'application/nlsml+xml': { + source: 'iana', + compressible: true, + }, + 'application/node': { + source: 'iana', + extensions: ['cjs'], + }, + 'application/nss': { + source: 'iana', + }, + 'application/oauth-authz-req+jwt': { + source: 'iana', + }, + 'application/oblivious-dns-message': { + source: 'iana', + }, + 'application/ocsp-request': { + source: 'iana', + }, + 'application/ocsp-response': { + source: 'iana', + }, + 'application/octet-stream': { + source: 'iana', + compressible: false, + extensions: [ + 'bin', + 'dms', + 'lrf', + 'mar', + 'so', + 'dist', + 'distz', + 'pkg', + 'bpk', + 'dump', + 'elc', + 'deploy', + 'exe', + 'dll', + 'deb', + 'dmg', + 'iso', + 'img', + 'msi', + 'msp', + 'msm', + 'buffer', + ], + }, + 'application/oda': { + source: 'iana', + extensions: ['oda'], + }, + 'application/odm+xml': { + source: 'iana', + compressible: true, + }, + 'application/odx': { + source: 'iana', + }, + 'application/oebps-package+xml': { + source: 'iana', + compressible: true, + extensions: ['opf'], + }, + 'application/ogg': { + source: 'iana', + compressible: false, + extensions: ['ogx'], + }, + 'application/omdoc+xml': { + source: 'apache', + compressible: true, + extensions: ['omdoc'], + }, + 'application/onenote': { + source: 'apache', + extensions: ['onetoc', 'onetoc2', 'onetmp', 'onepkg'], + }, + 'application/opc-nodeset+xml': { + source: 'iana', + compressible: true, + }, + 'application/oscore': { + source: 'iana', + }, + 'application/oxps': { + source: 'iana', + extensions: ['oxps'], + }, + 'application/p21': { + source: 'iana', + }, + 'application/p21+zip': { + source: 'iana', + compressible: false, + }, + 'application/p2p-overlay+xml': { + source: 'iana', + compressible: true, + extensions: ['relo'], + }, + 'application/parityfec': { + source: 'iana', + }, + 'application/passport': { + source: 'iana', + }, + 'application/patch-ops-error+xml': { + source: 'iana', + compressible: true, + extensions: ['xer'], + }, + 'application/pdf': { + source: 'iana', + compressible: false, + extensions: ['pdf'], + }, + 'application/pdx': { + source: 'iana', + }, + 'application/pem-certificate-chain': { + source: 'iana', + }, + 'application/pgp-encrypted': { + source: 'iana', + compressible: false, + extensions: ['pgp'], + }, + 'application/pgp-keys': { + source: 'iana', + extensions: ['asc'], + }, + 'application/pgp-signature': { + source: 'iana', + extensions: ['sig', 'asc'], + }, + 'application/pics-rules': { + source: 'apache', + extensions: ['prf'], + }, + 'application/pidf+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/pidf-diff+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/pkcs10': { + source: 'iana', + extensions: ['p10'], + }, + 'application/pkcs12': { + source: 'iana', + }, + 'application/pkcs7-mime': { + source: 'iana', + extensions: ['p7m', 'p7c'], + }, + 'application/pkcs7-signature': { + source: 'iana', + extensions: ['p7s'], + }, + 'application/pkcs8': { + source: 'iana', + extensions: ['p8'], + }, + 'application/pkcs8-encrypted': { + source: 'iana', + }, + 'application/pkix-attr-cert': { + source: 'iana', + extensions: ['ac'], + }, + 'application/pkix-cert': { + source: 'iana', + extensions: ['cer'], + }, + 'application/pkix-crl': { + source: 'iana', + extensions: ['crl'], + }, + 'application/pkix-pkipath': { + source: 'iana', + extensions: ['pkipath'], + }, + 'application/pkixcmp': { + source: 'iana', + extensions: ['pki'], + }, + 'application/pls+xml': { + source: 'iana', + compressible: true, + extensions: ['pls'], + }, + 'application/poc-settings+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/postscript': { + source: 'iana', + compressible: true, + extensions: ['ai', 'eps', 'ps'], + }, + 'application/ppsp-tracker+json': { + source: 'iana', + compressible: true, + }, + 'application/problem+json': { + source: 'iana', + compressible: true, + }, + 'application/problem+xml': { + source: 'iana', + compressible: true, + }, + 'application/provenance+xml': { + source: 'iana', + compressible: true, + extensions: ['provx'], + }, + 'application/prs.alvestrand.titrax-sheet': { + source: 'iana', + }, + 'application/prs.cww': { + source: 'iana', + extensions: ['cww'], + }, + 'application/prs.cyn': { + source: 'iana', + charset: '7-BIT', + }, + 'application/prs.hpub+zip': { + source: 'iana', + compressible: false, + }, + 'application/prs.nprend': { + source: 'iana', + }, + 'application/prs.plucker': { + source: 'iana', + }, + 'application/prs.rdf-xml-crypt': { + source: 'iana', + }, + 'application/prs.xsf+xml': { + source: 'iana', + compressible: true, + extensions: ['xsf'], + }, + 'application/pskc+xml': { + source: 'iana', + compressible: true, + extensions: ['pskcxml'], + }, + 'application/pvd+json': { + source: 'iana', + compressible: true, + }, + 'application/qsig': { + source: 'iana', + }, + 'application/raml+yaml': { + compressible: true, + extensions: ['raml'], + }, + 'application/raptorfec': { + source: 'iana', + }, + 'application/rdap+json': { + source: 'iana', + compressible: true, + }, + 'application/rdf+xml': { + source: 'iana', + compressible: true, + extensions: ['rdf', 'owl'], + }, + 'application/reginfo+xml': { + source: 'iana', + compressible: true, + extensions: ['rif'], + }, + 'application/relax-ng-compact-syntax': { + source: 'iana', + extensions: ['rnc'], + }, + 'application/remote-printing': { + source: 'apache', + }, + 'application/reputon+json': { + source: 'iana', + compressible: true, + }, + 'application/resource-lists+xml': { + source: 'iana', + compressible: true, + extensions: ['rl'], + }, + 'application/resource-lists-diff+xml': { + source: 'iana', + compressible: true, + extensions: ['rld'], + }, + 'application/rfc+xml': { + source: 'iana', + compressible: true, + }, + 'application/riscos': { + source: 'iana', + }, + 'application/rlmi+xml': { + source: 'iana', + compressible: true, + }, + 'application/rls-services+xml': { + source: 'iana', + compressible: true, + extensions: ['rs'], + }, + 'application/route-apd+xml': { + source: 'iana', + compressible: true, + extensions: ['rapd'], + }, + 'application/route-s-tsid+xml': { + source: 'iana', + compressible: true, + extensions: ['sls'], + }, + 'application/route-usd+xml': { + source: 'iana', + compressible: true, + extensions: ['rusd'], + }, + 'application/rpki-checklist': { + source: 'iana', + }, + 'application/rpki-ghostbusters': { + source: 'iana', + extensions: ['gbr'], + }, + 'application/rpki-manifest': { + source: 'iana', + extensions: ['mft'], + }, + 'application/rpki-publication': { + source: 'iana', + }, + 'application/rpki-roa': { + source: 'iana', + extensions: ['roa'], + }, + 'application/rpki-updown': { + source: 'iana', + }, + 'application/rsd+xml': { + source: 'apache', + compressible: true, + extensions: ['rsd'], + }, + 'application/rss+xml': { + source: 'apache', + compressible: true, + extensions: ['rss'], + }, + 'application/rtf': { + source: 'iana', + compressible: true, + extensions: ['rtf'], + }, + 'application/rtploopback': { + source: 'iana', + }, + 'application/rtx': { + source: 'iana', + }, + 'application/samlassertion+xml': { + source: 'iana', + compressible: true, + }, + 'application/samlmetadata+xml': { + source: 'iana', + compressible: true, + }, + 'application/sarif+json': { + source: 'iana', + compressible: true, + }, + 'application/sarif-external-properties+json': { + source: 'iana', + compressible: true, + }, + 'application/sbe': { + source: 'iana', + }, + 'application/sbml+xml': { + source: 'iana', + compressible: true, + extensions: ['sbml'], + }, + 'application/scaip+xml': { + source: 'iana', + compressible: true, + }, + 'application/scim+json': { + source: 'iana', + compressible: true, + }, + 'application/scvp-cv-request': { + source: 'iana', + extensions: ['scq'], + }, + 'application/scvp-cv-response': { + source: 'iana', + extensions: ['scs'], + }, + 'application/scvp-vp-request': { + source: 'iana', + extensions: ['spq'], + }, + 'application/scvp-vp-response': { + source: 'iana', + extensions: ['spp'], + }, + 'application/sdp': { + source: 'iana', + extensions: ['sdp'], + }, + 'application/secevent+jwt': { + source: 'iana', + }, + 'application/senml+cbor': { + source: 'iana', + }, + 'application/senml+json': { + source: 'iana', + compressible: true, + }, + 'application/senml+xml': { + source: 'iana', + compressible: true, + extensions: ['senmlx'], + }, + 'application/senml-etch+cbor': { + source: 'iana', + }, + 'application/senml-etch+json': { + source: 'iana', + compressible: true, + }, + 'application/senml-exi': { + source: 'iana', + }, + 'application/sensml+cbor': { + source: 'iana', + }, + 'application/sensml+json': { + source: 'iana', + compressible: true, + }, + 'application/sensml+xml': { + source: 'iana', + compressible: true, + extensions: ['sensmlx'], + }, + 'application/sensml-exi': { + source: 'iana', + }, + 'application/sep+xml': { + source: 'iana', + compressible: true, + }, + 'application/sep-exi': { + source: 'iana', + }, + 'application/session-info': { + source: 'iana', + }, + 'application/set-payment': { + source: 'iana', + }, + 'application/set-payment-initiation': { + source: 'iana', + extensions: ['setpay'], + }, + 'application/set-registration': { + source: 'iana', + }, + 'application/set-registration-initiation': { + source: 'iana', + extensions: ['setreg'], + }, + 'application/sgml': { + source: 'iana', + }, + 'application/sgml-open-catalog': { + source: 'iana', + }, + 'application/shf+xml': { + source: 'iana', + compressible: true, + extensions: ['shf'], + }, + 'application/sieve': { + source: 'iana', + extensions: ['siv', 'sieve'], + }, + 'application/simple-filter+xml': { + source: 'iana', + compressible: true, + }, + 'application/simple-message-summary': { + source: 'iana', + }, + 'application/simplesymbolcontainer': { + source: 'iana', + }, + 'application/sipc': { + source: 'iana', + }, + 'application/slate': { + source: 'iana', + }, + 'application/smil': { + source: 'apache', + }, + 'application/smil+xml': { + source: 'iana', + compressible: true, + extensions: ['smi', 'smil'], + }, + 'application/smpte336m': { + source: 'iana', + }, + 'application/soap+fastinfoset': { + source: 'iana', + }, + 'application/soap+xml': { + source: 'iana', + compressible: true, + }, + 'application/sparql-query': { + source: 'iana', + extensions: ['rq'], + }, + 'application/sparql-results+xml': { + source: 'iana', + compressible: true, + extensions: ['srx'], + }, + 'application/spdx+json': { + source: 'iana', + compressible: true, + }, + 'application/spirits-event+xml': { + source: 'iana', + compressible: true, + }, + 'application/sql': { + source: 'iana', + extensions: ['sql'], + }, + 'application/srgs': { + source: 'iana', + extensions: ['gram'], + }, + 'application/srgs+xml': { + source: 'iana', + compressible: true, + extensions: ['grxml'], + }, + 'application/sru+xml': { + source: 'iana', + compressible: true, + extensions: ['sru'], + }, + 'application/ssdl+xml': { + source: 'apache', + compressible: true, + extensions: ['ssdl'], + }, + 'application/ssml+xml': { + source: 'iana', + compressible: true, + extensions: ['ssml'], + }, + 'application/stix+json': { + source: 'iana', + compressible: true, + }, + 'application/swid+cbor': { + source: 'iana', + }, + 'application/swid+xml': { + source: 'iana', + compressible: true, + extensions: ['swidtag'], + }, + 'application/tamp-apex-update': { + source: 'iana', + }, + 'application/tamp-apex-update-confirm': { + source: 'iana', + }, + 'application/tamp-community-update': { + source: 'iana', + }, + 'application/tamp-community-update-confirm': { + source: 'iana', + }, + 'application/tamp-error': { + source: 'iana', + }, + 'application/tamp-sequence-adjust': { + source: 'iana', + }, + 'application/tamp-sequence-adjust-confirm': { + source: 'iana', + }, + 'application/tamp-status-query': { + source: 'iana', + }, + 'application/tamp-status-response': { + source: 'iana', + }, + 'application/tamp-update': { + source: 'iana', + }, + 'application/tamp-update-confirm': { + source: 'iana', + }, + 'application/tar': { + compressible: true, + }, + 'application/taxii+json': { + source: 'iana', + compressible: true, + }, + 'application/td+json': { + source: 'iana', + compressible: true, + }, + 'application/tei+xml': { + source: 'iana', + compressible: true, + extensions: ['tei', 'teicorpus'], + }, + 'application/tetra_isi': { + source: 'iana', + }, + 'application/thraud+xml': { + source: 'iana', + compressible: true, + extensions: ['tfi'], + }, + 'application/timestamp-query': { + source: 'iana', + }, + 'application/timestamp-reply': { + source: 'iana', + }, + 'application/timestamped-data': { + source: 'iana', + extensions: ['tsd'], + }, + 'application/tlsrpt+gzip': { + source: 'iana', + }, + 'application/tlsrpt+json': { + source: 'iana', + compressible: true, + }, + 'application/tm+json': { + source: 'iana', + compressible: true, + }, + 'application/tnauthlist': { + source: 'iana', + }, + 'application/token-introspection+jwt': { + source: 'iana', + }, + 'application/toml': { + compressible: true, + extensions: ['toml'], + }, + 'application/trickle-ice-sdpfrag': { + source: 'iana', + }, + 'application/trig': { + source: 'iana', + extensions: ['trig'], + }, + 'application/ttml+xml': { + source: 'iana', + compressible: true, + extensions: ['ttml'], + }, + 'application/tve-trigger': { + source: 'iana', + }, + 'application/tzif': { + source: 'iana', + }, + 'application/tzif-leap': { + source: 'iana', + }, + 'application/ubjson': { + compressible: false, + extensions: ['ubj'], + }, + 'application/ulpfec': { + source: 'iana', + }, + 'application/urc-grpsheet+xml': { + source: 'iana', + compressible: true, + }, + 'application/urc-ressheet+xml': { + source: 'iana', + compressible: true, + extensions: ['rsheet'], + }, + 'application/urc-targetdesc+xml': { + source: 'iana', + compressible: true, + extensions: ['td'], + }, + 'application/urc-uisocketdesc+xml': { + source: 'iana', + compressible: true, + }, + 'application/vcard+json': { + source: 'iana', + compressible: true, + }, + 'application/vcard+xml': { + source: 'iana', + compressible: true, + }, + 'application/vemmi': { + source: 'iana', + }, + 'application/vividence.scriptfile': { + source: 'apache', + }, + 'application/vnd.1000minds.decision-model+xml': { + source: 'iana', + compressible: true, + extensions: ['1km'], + }, + 'application/vnd.3gpp-prose+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp-prose-pc3a+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp-prose-pc3ach+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp-prose-pc3ch+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp-prose-pc8+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp-v2x-local-service-information': { + source: 'iana', + }, + 'application/vnd.3gpp.5gnas': { + source: 'iana', + }, + 'application/vnd.3gpp.access-transfer-events+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.bsf+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.gmop+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.gtpc': { + source: 'iana', + }, + 'application/vnd.3gpp.interworking-data': { + source: 'iana', + }, + 'application/vnd.3gpp.lpp': { + source: 'iana', + }, + 'application/vnd.3gpp.mc-signalling-ear': { + source: 'iana', + }, + 'application/vnd.3gpp.mcdata-affiliation-command+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcdata-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcdata-payload': { + source: 'iana', + }, + 'application/vnd.3gpp.mcdata-regroup+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcdata-service-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcdata-signalling': { + source: 'iana', + }, + 'application/vnd.3gpp.mcdata-ue-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcdata-user-profile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-affiliation-command+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-floor-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-location-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-mbms-usage-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-service-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-signed+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-ue-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-ue-init-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcptt-user-profile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-affiliation-command+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-location-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-mbms-usage-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-service-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-transmission-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-ue-config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mcvideo-user-profile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.mid-call+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.ngap': { + source: 'iana', + }, + 'application/vnd.3gpp.pfcp': { + source: 'iana', + }, + 'application/vnd.3gpp.pic-bw-large': { + source: 'iana', + extensions: ['plb'], + }, + 'application/vnd.3gpp.pic-bw-small': { + source: 'iana', + extensions: ['psb'], + }, + 'application/vnd.3gpp.pic-bw-var': { + source: 'iana', + extensions: ['pvb'], + }, + 'application/vnd.3gpp.s1ap': { + source: 'iana', + }, + 'application/vnd.3gpp.seal-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.seal-location-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.sms': { + source: 'iana', + }, + 'application/vnd.3gpp.sms+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.srvcc-ext+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.srvcc-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.state-and-event-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.ussd+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp.vae-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp2.bcmcsinfo+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.3gpp2.sms': { + source: 'iana', + }, + 'application/vnd.3gpp2.tcap': { + source: 'iana', + extensions: ['tcap'], + }, + 'application/vnd.3lightssoftware.imagescal': { + source: 'iana', + }, + 'application/vnd.3m.post-it-notes': { + source: 'iana', + extensions: ['pwn'], + }, + 'application/vnd.accpac.simply.aso': { + source: 'iana', + extensions: ['aso'], + }, + 'application/vnd.accpac.simply.imp': { + source: 'iana', + extensions: ['imp'], + }, + 'application/vnd.acucobol': { + source: 'iana', + extensions: ['acu'], + }, + 'application/vnd.acucorp': { + source: 'iana', + extensions: ['atc', 'acutc'], + }, + 'application/vnd.adobe.air-application-installer-package+zip': { + source: 'apache', + compressible: false, + extensions: ['air'], + }, + 'application/vnd.adobe.flash.movie': { + source: 'iana', + }, + 'application/vnd.adobe.formscentral.fcdt': { + source: 'iana', + extensions: ['fcdt'], + }, + 'application/vnd.adobe.fxp': { + source: 'iana', + extensions: ['fxp', 'fxpl'], + }, + 'application/vnd.adobe.partial-upload': { + source: 'iana', + }, + 'application/vnd.adobe.xdp+xml': { + source: 'iana', + compressible: true, + extensions: ['xdp'], + }, + 'application/vnd.adobe.xfdf': { + source: 'apache', + extensions: ['xfdf'], + }, + 'application/vnd.aether.imp': { + source: 'iana', + }, + 'application/vnd.afpc.afplinedata': { + source: 'iana', + }, + 'application/vnd.afpc.afplinedata-pagedef': { + source: 'iana', + }, + 'application/vnd.afpc.cmoca-cmresource': { + source: 'iana', + }, + 'application/vnd.afpc.foca-charset': { + source: 'iana', + }, + 'application/vnd.afpc.foca-codedfont': { + source: 'iana', + }, + 'application/vnd.afpc.foca-codepage': { + source: 'iana', + }, + 'application/vnd.afpc.modca': { + source: 'iana', + }, + 'application/vnd.afpc.modca-cmtable': { + source: 'iana', + }, + 'application/vnd.afpc.modca-formdef': { + source: 'iana', + }, + 'application/vnd.afpc.modca-mediummap': { + source: 'iana', + }, + 'application/vnd.afpc.modca-objectcontainer': { + source: 'iana', + }, + 'application/vnd.afpc.modca-overlay': { + source: 'iana', + }, + 'application/vnd.afpc.modca-pagesegment': { + source: 'iana', + }, + 'application/vnd.age': { + source: 'iana', + extensions: ['age'], + }, + 'application/vnd.ah-barcode': { + source: 'apache', + }, + 'application/vnd.ahead.space': { + source: 'iana', + extensions: ['ahead'], + }, + 'application/vnd.airzip.filesecure.azf': { + source: 'iana', + extensions: ['azf'], + }, + 'application/vnd.airzip.filesecure.azs': { + source: 'iana', + extensions: ['azs'], + }, + 'application/vnd.amadeus+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.amazon.ebook': { + source: 'apache', + extensions: ['azw'], + }, + 'application/vnd.amazon.mobi8-ebook': { + source: 'iana', + }, + 'application/vnd.americandynamics.acc': { + source: 'iana', + extensions: ['acc'], + }, + 'application/vnd.amiga.ami': { + source: 'iana', + extensions: ['ami'], + }, + 'application/vnd.amundsen.maze+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.android.ota': { + source: 'iana', + }, + 'application/vnd.android.package-archive': { + source: 'apache', + compressible: false, + extensions: ['apk'], + }, + 'application/vnd.anki': { + source: 'iana', + }, + 'application/vnd.anser-web-certificate-issue-initiation': { + source: 'iana', + extensions: ['cii'], + }, + 'application/vnd.anser-web-funds-transfer-initiation': { + source: 'apache', + extensions: ['fti'], + }, + 'application/vnd.antix.game-component': { + source: 'iana', + extensions: ['atx'], + }, + 'application/vnd.apache.arrow.file': { + source: 'iana', + }, + 'application/vnd.apache.arrow.stream': { + source: 'iana', + }, + 'application/vnd.apache.thrift.binary': { + source: 'iana', + }, + 'application/vnd.apache.thrift.compact': { + source: 'iana', + }, + 'application/vnd.apache.thrift.json': { + source: 'iana', + }, + 'application/vnd.apexlang': { + source: 'iana', + }, + 'application/vnd.api+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.aplextor.warrp+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.apothekende.reservation+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.apple.installer+xml': { + source: 'iana', + compressible: true, + extensions: ['mpkg'], + }, + 'application/vnd.apple.keynote': { + source: 'iana', + extensions: ['key'], + }, + 'application/vnd.apple.mpegurl': { + source: 'iana', + extensions: ['m3u8'], + }, + 'application/vnd.apple.numbers': { + source: 'iana', + extensions: ['numbers'], + }, + 'application/vnd.apple.pages': { + source: 'iana', + extensions: ['pages'], + }, + 'application/vnd.apple.pkpass': { + compressible: false, + extensions: ['pkpass'], + }, + 'application/vnd.arastra.swi': { + source: 'apache', + }, + 'application/vnd.aristanetworks.swi': { + source: 'iana', + extensions: ['swi'], + }, + 'application/vnd.artisan+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.artsquare': { + source: 'iana', + }, + 'application/vnd.astraea-software.iota': { + source: 'iana', + extensions: ['iota'], + }, + 'application/vnd.audiograph': { + source: 'iana', + extensions: ['aep'], + }, + 'application/vnd.autopackage': { + source: 'iana', + }, + 'application/vnd.avalon+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.avistar+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.balsamiq.bmml+xml': { + source: 'iana', + compressible: true, + extensions: ['bmml'], + }, + 'application/vnd.balsamiq.bmpr': { + source: 'iana', + }, + 'application/vnd.banana-accounting': { + source: 'iana', + }, + 'application/vnd.bbf.usp.error': { + source: 'iana', + }, + 'application/vnd.bbf.usp.msg': { + source: 'iana', + }, + 'application/vnd.bbf.usp.msg+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.bekitzur-stech+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.belightsoft.lhzd+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.belightsoft.lhzl+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.bint.med-content': { + source: 'iana', + }, + 'application/vnd.biopax.rdf+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.blink-idb-value-wrapper': { + source: 'iana', + }, + 'application/vnd.blueice.multipass': { + source: 'iana', + extensions: ['mpm'], + }, + 'application/vnd.bluetooth.ep.oob': { + source: 'iana', + }, + 'application/vnd.bluetooth.le.oob': { + source: 'iana', + }, + 'application/vnd.bmi': { + source: 'iana', + extensions: ['bmi'], + }, + 'application/vnd.bpf': { + source: 'iana', + }, + 'application/vnd.bpf3': { + source: 'iana', + }, + 'application/vnd.businessobjects': { + source: 'iana', + extensions: ['rep'], + }, + 'application/vnd.byu.uapi+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.cab-jscript': { + source: 'iana', + }, + 'application/vnd.canon-cpdl': { + source: 'iana', + }, + 'application/vnd.canon-lips': { + source: 'iana', + }, + 'application/vnd.capasystems-pg+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.cendio.thinlinc.clientconf': { + source: 'iana', + }, + 'application/vnd.century-systems.tcp_stream': { + source: 'iana', + }, + 'application/vnd.chemdraw+xml': { + source: 'iana', + compressible: true, + extensions: ['cdxml'], + }, + 'application/vnd.chess-pgn': { + source: 'iana', + }, + 'application/vnd.chipnuts.karaoke-mmd': { + source: 'iana', + extensions: ['mmd'], + }, + 'application/vnd.ciedi': { + source: 'iana', + }, + 'application/vnd.cinderella': { + source: 'iana', + extensions: ['cdy'], + }, + 'application/vnd.cirpack.isdn-ext': { + source: 'iana', + }, + 'application/vnd.citationstyles.style+xml': { + source: 'iana', + compressible: true, + extensions: ['csl'], + }, + 'application/vnd.claymore': { + source: 'iana', + extensions: ['cla'], + }, + 'application/vnd.cloanto.rp9': { + source: 'iana', + extensions: ['rp9'], + }, + 'application/vnd.clonk.c4group': { + source: 'iana', + extensions: ['c4g', 'c4d', 'c4f', 'c4p', 'c4u'], + }, + 'application/vnd.cluetrust.cartomobile-config': { + source: 'iana', + extensions: ['c11amc'], + }, + 'application/vnd.cluetrust.cartomobile-config-pkg': { + source: 'iana', + extensions: ['c11amz'], + }, + 'application/vnd.cncf.helm.chart.content.v1.tar+gzip': { + source: 'iana', + }, + 'application/vnd.cncf.helm.chart.provenance.v1.prov': { + source: 'iana', + }, + 'application/vnd.coffeescript': { + source: 'iana', + }, + 'application/vnd.collabio.xodocuments.document': { + source: 'iana', + }, + 'application/vnd.collabio.xodocuments.document-template': { + source: 'iana', + }, + 'application/vnd.collabio.xodocuments.presentation': { + source: 'iana', + }, + 'application/vnd.collabio.xodocuments.presentation-template': { + source: 'iana', + }, + 'application/vnd.collabio.xodocuments.spreadsheet': { + source: 'iana', + }, + 'application/vnd.collabio.xodocuments.spreadsheet-template': { + source: 'iana', + }, + 'application/vnd.collection+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.collection.doc+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.collection.next+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.comicbook+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.comicbook-rar': { + source: 'iana', + }, + 'application/vnd.commerce-battelle': { + source: 'iana', + }, + 'application/vnd.commonspace': { + source: 'iana', + extensions: ['csp'], + }, + 'application/vnd.contact.cmsg': { + source: 'iana', + extensions: ['cdbcmsg'], + }, + 'application/vnd.coreos.ignition+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.cosmocaller': { + source: 'iana', + extensions: ['cmc'], + }, + 'application/vnd.crick.clicker': { + source: 'iana', + extensions: ['clkx'], + }, + 'application/vnd.crick.clicker.keyboard': { + source: 'iana', + extensions: ['clkk'], + }, + 'application/vnd.crick.clicker.palette': { + source: 'iana', + extensions: ['clkp'], + }, + 'application/vnd.crick.clicker.template': { + source: 'iana', + extensions: ['clkt'], + }, + 'application/vnd.crick.clicker.wordbank': { + source: 'iana', + extensions: ['clkw'], + }, + 'application/vnd.criticaltools.wbs+xml': { + source: 'iana', + compressible: true, + extensions: ['wbs'], + }, + 'application/vnd.cryptii.pipe+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.crypto-shade-file': { + source: 'iana', + }, + 'application/vnd.cryptomator.encrypted': { + source: 'iana', + }, + 'application/vnd.cryptomator.vault': { + source: 'iana', + }, + 'application/vnd.ctc-posml': { + source: 'iana', + extensions: ['pml'], + }, + 'application/vnd.ctct.ws+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.cups-pdf': { + source: 'iana', + }, + 'application/vnd.cups-postscript': { + source: 'iana', + }, + 'application/vnd.cups-ppd': { + source: 'iana', + extensions: ['ppd'], + }, + 'application/vnd.cups-raster': { + source: 'iana', + }, + 'application/vnd.cups-raw': { + source: 'iana', + }, + 'application/vnd.curl': { + source: 'iana', + }, + 'application/vnd.curl.car': { + source: 'apache', + extensions: ['car'], + }, + 'application/vnd.curl.pcurl': { + source: 'apache', + extensions: ['pcurl'], + }, + 'application/vnd.cyan.dean.root+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.cybank': { + source: 'iana', + }, + 'application/vnd.cyclonedx+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.cyclonedx+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.d2l.coursepackage1p0+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.d3m-dataset': { + source: 'iana', + }, + 'application/vnd.d3m-problem': { + source: 'iana', + }, + 'application/vnd.dart': { + source: 'iana', + compressible: true, + extensions: ['dart'], + }, + 'application/vnd.data-vision.rdz': { + source: 'iana', + extensions: ['rdz'], + }, + 'application/vnd.datalog': { + source: 'iana', + }, + 'application/vnd.datapackage+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dataresource+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dbf': { + source: 'iana', + extensions: ['dbf'], + }, + 'application/vnd.debian.binary-package': { + source: 'iana', + }, + 'application/vnd.dece.data': { + source: 'iana', + extensions: ['uvf', 'uvvf', 'uvd', 'uvvd'], + }, + 'application/vnd.dece.ttml+xml': { + source: 'iana', + compressible: true, + extensions: ['uvt', 'uvvt'], + }, + 'application/vnd.dece.unspecified': { + source: 'iana', + extensions: ['uvx', 'uvvx'], + }, + 'application/vnd.dece.zip': { + source: 'iana', + extensions: ['uvz', 'uvvz'], + }, + 'application/vnd.denovo.fcselayout-link': { + source: 'iana', + extensions: ['fe_launch'], + }, + 'application/vnd.desmume.movie': { + source: 'iana', + }, + 'application/vnd.dir-bi.plate-dl-nosuffix': { + source: 'iana', + }, + 'application/vnd.dm.delegation+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dna': { + source: 'iana', + extensions: ['dna'], + }, + 'application/vnd.document+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dolby.mlp': { + source: 'apache', + extensions: ['mlp'], + }, + 'application/vnd.dolby.mobile.1': { + source: 'iana', + }, + 'application/vnd.dolby.mobile.2': { + source: 'iana', + }, + 'application/vnd.doremir.scorecloud-binary-document': { + source: 'iana', + }, + 'application/vnd.dpgraph': { + source: 'iana', + extensions: ['dpg'], + }, + 'application/vnd.dreamfactory': { + source: 'iana', + extensions: ['dfac'], + }, + 'application/vnd.drive+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ds-keypoint': { + source: 'apache', + extensions: ['kpxx'], + }, + 'application/vnd.dtg.local': { + source: 'iana', + }, + 'application/vnd.dtg.local.flash': { + source: 'iana', + }, + 'application/vnd.dtg.local.html': { + source: 'iana', + }, + 'application/vnd.dvb.ait': { + source: 'iana', + extensions: ['ait'], + }, + 'application/vnd.dvb.dvbisl+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.dvbj': { + source: 'iana', + }, + 'application/vnd.dvb.esgcontainer': { + source: 'iana', + }, + 'application/vnd.dvb.ipdcdftnotifaccess': { + source: 'iana', + }, + 'application/vnd.dvb.ipdcesgaccess': { + source: 'iana', + }, + 'application/vnd.dvb.ipdcesgaccess2': { + source: 'iana', + }, + 'application/vnd.dvb.ipdcesgpdd': { + source: 'iana', + }, + 'application/vnd.dvb.ipdcroaming': { + source: 'iana', + }, + 'application/vnd.dvb.iptv.alfec-base': { + source: 'iana', + }, + 'application/vnd.dvb.iptv.alfec-enhancement': { + source: 'iana', + }, + 'application/vnd.dvb.notif-aggregate-root+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.notif-container+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.notif-generic+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.notif-ia-msglist+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.notif-ia-registration-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.notif-ia-registration-response+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.notif-init+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.dvb.pfr': { + source: 'iana', + }, + 'application/vnd.dvb.service': { + source: 'iana', + extensions: ['svc'], + }, + 'application/vnd.dxr': { + source: 'iana', + }, + 'application/vnd.dynageo': { + source: 'iana', + extensions: ['geo'], + }, + 'application/vnd.dzr': { + source: 'iana', + }, + 'application/vnd.easykaraoke.cdgdownload': { + source: 'iana', + }, + 'application/vnd.ecdis-update': { + source: 'iana', + }, + 'application/vnd.ecip.rlp': { + source: 'iana', + }, + 'application/vnd.eclipse.ditto+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ecowin.chart': { + source: 'iana', + extensions: ['mag'], + }, + 'application/vnd.ecowin.filerequest': { + source: 'iana', + }, + 'application/vnd.ecowin.fileupdate': { + source: 'iana', + }, + 'application/vnd.ecowin.series': { + source: 'iana', + }, + 'application/vnd.ecowin.seriesrequest': { + source: 'iana', + }, + 'application/vnd.ecowin.seriesupdate': { + source: 'iana', + }, + 'application/vnd.efi.img': { + source: 'iana', + }, + 'application/vnd.efi.iso': { + source: 'iana', + }, + 'application/vnd.eln+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.emclient.accessrequest+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.enliven': { + source: 'iana', + extensions: ['nml'], + }, + 'application/vnd.enphase.envoy': { + source: 'iana', + }, + 'application/vnd.eprints.data+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.epson.esf': { + source: 'iana', + extensions: ['esf'], + }, + 'application/vnd.epson.msf': { + source: 'iana', + extensions: ['msf'], + }, + 'application/vnd.epson.quickanime': { + source: 'iana', + extensions: ['qam'], + }, + 'application/vnd.epson.salt': { + source: 'iana', + extensions: ['slt'], + }, + 'application/vnd.epson.ssf': { + source: 'iana', + extensions: ['ssf'], + }, + 'application/vnd.ericsson.quickcall': { + source: 'iana', + }, + 'application/vnd.espass-espass+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.eszigno3+xml': { + source: 'iana', + compressible: true, + extensions: ['es3', 'et3'], + }, + 'application/vnd.etsi.aoc+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.asic-e+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.etsi.asic-s+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.etsi.cug+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvcommand+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvdiscovery+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvprofile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvsad-bc+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvsad-cod+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvsad-npvr+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvservice+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvsync+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.iptvueprofile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.mcid+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.mheg5': { + source: 'iana', + }, + 'application/vnd.etsi.overload-control-policy-dataset+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.pstn+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.sci+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.simservs+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.timestamp-token': { + source: 'iana', + }, + 'application/vnd.etsi.tsl+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.etsi.tsl.der': { + source: 'iana', + }, + 'application/vnd.eu.kasparian.car+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.eudora.data': { + source: 'iana', + }, + 'application/vnd.evolv.ecig.profile': { + source: 'iana', + }, + 'application/vnd.evolv.ecig.settings': { + source: 'iana', + }, + 'application/vnd.evolv.ecig.theme': { + source: 'iana', + }, + 'application/vnd.exstream-empower+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.exstream-package': { + source: 'iana', + }, + 'application/vnd.ezpix-album': { + source: 'iana', + extensions: ['ez2'], + }, + 'application/vnd.ezpix-package': { + source: 'iana', + extensions: ['ez3'], + }, + 'application/vnd.f-secure.mobile': { + source: 'iana', + }, + 'application/vnd.familysearch.gedcom+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.fastcopy-disk-image': { + source: 'iana', + }, + 'application/vnd.fdf': { + source: 'apache', + extensions: ['fdf'], + }, + 'application/vnd.fdsn.mseed': { + source: 'iana', + extensions: ['mseed'], + }, + 'application/vnd.fdsn.seed': { + source: 'iana', + extensions: ['seed', 'dataless'], + }, + 'application/vnd.ffsns': { + source: 'iana', + }, + 'application/vnd.ficlab.flb+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.filmit.zfc': { + source: 'iana', + }, + 'application/vnd.fints': { + source: 'iana', + }, + 'application/vnd.firemonkeys.cloudcell': { + source: 'iana', + }, + 'application/vnd.flographit': { + source: 'iana', + extensions: ['gph'], + }, + 'application/vnd.fluxtime.clip': { + source: 'iana', + extensions: ['ftc'], + }, + 'application/vnd.font-fontforge-sfd': { + source: 'iana', + }, + 'application/vnd.framemaker': { + source: 'iana', + extensions: ['fm', 'frame', 'maker', 'book'], + }, + 'application/vnd.frogans.fnc': { + source: 'apache', + extensions: ['fnc'], + }, + 'application/vnd.frogans.ltf': { + source: 'apache', + extensions: ['ltf'], + }, + 'application/vnd.fsc.weblaunch': { + source: 'iana', + extensions: ['fsc'], + }, + 'application/vnd.fujifilm.fb.docuworks': { + source: 'iana', + }, + 'application/vnd.fujifilm.fb.docuworks.binder': { + source: 'iana', + }, + 'application/vnd.fujifilm.fb.docuworks.container': { + source: 'iana', + }, + 'application/vnd.fujifilm.fb.jfi+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.fujitsu.oasys': { + source: 'iana', + extensions: ['oas'], + }, + 'application/vnd.fujitsu.oasys2': { + source: 'iana', + extensions: ['oa2'], + }, + 'application/vnd.fujitsu.oasys3': { + source: 'iana', + extensions: ['oa3'], + }, + 'application/vnd.fujitsu.oasysgp': { + source: 'iana', + extensions: ['fg5'], + }, + 'application/vnd.fujitsu.oasysprs': { + source: 'iana', + extensions: ['bh2'], + }, + 'application/vnd.fujixerox.art-ex': { + source: 'iana', + }, + 'application/vnd.fujixerox.art4': { + source: 'iana', + }, + 'application/vnd.fujixerox.ddd': { + source: 'iana', + extensions: ['ddd'], + }, + 'application/vnd.fujixerox.docuworks': { + source: 'iana', + extensions: ['xdw'], + }, + 'application/vnd.fujixerox.docuworks.binder': { + source: 'iana', + extensions: ['xbd'], + }, + 'application/vnd.fujixerox.docuworks.container': { + source: 'iana', + }, + 'application/vnd.fujixerox.hbpl': { + source: 'iana', + }, + 'application/vnd.fut-misnet': { + source: 'iana', + }, + 'application/vnd.futoin+cbor': { + source: 'iana', + }, + 'application/vnd.futoin+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.fuzzysheet': { + source: 'iana', + extensions: ['fzs'], + }, + 'application/vnd.genomatix.tuxedo': { + source: 'iana', + extensions: ['txd'], + }, + 'application/vnd.genozip': { + source: 'iana', + }, + 'application/vnd.gentics.grd+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.gentoo.catmetadata+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.gentoo.ebuild': { + source: 'iana', + }, + 'application/vnd.gentoo.eclass': { + source: 'iana', + }, + 'application/vnd.gentoo.gpkg': { + source: 'iana', + }, + 'application/vnd.gentoo.manifest': { + source: 'iana', + }, + 'application/vnd.gentoo.pkgmetadata+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.gentoo.xpak': { + source: 'iana', + }, + 'application/vnd.geo+json': { + source: 'apache', + compressible: true, + }, + 'application/vnd.geocube+xml': { + source: 'apache', + compressible: true, + }, + 'application/vnd.geogebra.file': { + source: 'iana', + extensions: ['ggb'], + }, + 'application/vnd.geogebra.slides': { + source: 'iana', + }, + 'application/vnd.geogebra.tool': { + source: 'iana', + extensions: ['ggt'], + }, + 'application/vnd.geometry-explorer': { + source: 'iana', + extensions: ['gex', 'gre'], + }, + 'application/vnd.geonext': { + source: 'iana', + extensions: ['gxt'], + }, + 'application/vnd.geoplan': { + source: 'iana', + extensions: ['g2w'], + }, + 'application/vnd.geospace': { + source: 'iana', + extensions: ['g3w'], + }, + 'application/vnd.gerber': { + source: 'iana', + }, + 'application/vnd.globalplatform.card-content-mgt': { + source: 'iana', + }, + 'application/vnd.globalplatform.card-content-mgt-response': { + source: 'iana', + }, + 'application/vnd.gmx': { + source: 'iana', + extensions: ['gmx'], + }, + 'application/vnd.gnu.taler.exchange+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.gnu.taler.merchant+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.google-apps.document': { + compressible: false, + extensions: ['gdoc'], + }, + 'application/vnd.google-apps.presentation': { + compressible: false, + extensions: ['gslides'], + }, + 'application/vnd.google-apps.spreadsheet': { + compressible: false, + extensions: ['gsheet'], + }, + 'application/vnd.google-earth.kml+xml': { + source: 'iana', + compressible: true, + extensions: ['kml'], + }, + 'application/vnd.google-earth.kmz': { + source: 'iana', + compressible: false, + extensions: ['kmz'], + }, + 'application/vnd.gov.sk.e-form+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.gov.sk.e-form+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.gov.sk.xmldatacontainer+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.gpxsee.map+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.grafeq': { + source: 'iana', + extensions: ['gqf', 'gqs'], + }, + 'application/vnd.gridmp': { + source: 'iana', + }, + 'application/vnd.groove-account': { + source: 'iana', + extensions: ['gac'], + }, + 'application/vnd.groove-help': { + source: 'iana', + extensions: ['ghf'], + }, + 'application/vnd.groove-identity-message': { + source: 'iana', + extensions: ['gim'], + }, + 'application/vnd.groove-injector': { + source: 'iana', + extensions: ['grv'], + }, + 'application/vnd.groove-tool-message': { + source: 'iana', + extensions: ['gtm'], + }, + 'application/vnd.groove-tool-template': { + source: 'iana', + extensions: ['tpl'], + }, + 'application/vnd.groove-vcard': { + source: 'iana', + extensions: ['vcg'], + }, + 'application/vnd.hal+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.hal+xml': { + source: 'iana', + compressible: true, + extensions: ['hal'], + }, + 'application/vnd.handheld-entertainment+xml': { + source: 'iana', + compressible: true, + extensions: ['zmm'], + }, + 'application/vnd.hbci': { + source: 'iana', + extensions: ['hbci'], + }, + 'application/vnd.hc+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.hcl-bireports': { + source: 'iana', + }, + 'application/vnd.hdt': { + source: 'iana', + }, + 'application/vnd.heroku+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.hhe.lesson-player': { + source: 'iana', + extensions: ['les'], + }, + 'application/vnd.hp-hpgl': { + source: 'iana', + extensions: ['hpgl'], + }, + 'application/vnd.hp-hpid': { + source: 'iana', + extensions: ['hpid'], + }, + 'application/vnd.hp-hps': { + source: 'iana', + extensions: ['hps'], + }, + 'application/vnd.hp-jlyt': { + source: 'iana', + extensions: ['jlt'], + }, + 'application/vnd.hp-pcl': { + source: 'iana', + extensions: ['pcl'], + }, + 'application/vnd.hp-pclxl': { + source: 'iana', + extensions: ['pclxl'], + }, + 'application/vnd.hsl': { + source: 'iana', + }, + 'application/vnd.httphone': { + source: 'iana', + }, + 'application/vnd.hydrostatix.sof-data': { + source: 'iana', + extensions: ['sfd-hdstx'], + }, + 'application/vnd.hyper+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.hyper-item+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.hyperdrive+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.hzn-3d-crossword': { + source: 'iana', + }, + 'application/vnd.ibm.afplinedata': { + source: 'apache', + }, + 'application/vnd.ibm.electronic-media': { + source: 'iana', + }, + 'application/vnd.ibm.minipay': { + source: 'iana', + extensions: ['mpy'], + }, + 'application/vnd.ibm.modcap': { + source: 'apache', + extensions: ['afp', 'listafp', 'list3820'], + }, + 'application/vnd.ibm.rights-management': { + source: 'iana', + extensions: ['irm'], + }, + 'application/vnd.ibm.secure-container': { + source: 'iana', + extensions: ['sc'], + }, + 'application/vnd.iccprofile': { + source: 'iana', + extensions: ['icc', 'icm'], + }, + 'application/vnd.ieee.1905': { + source: 'iana', + }, + 'application/vnd.igloader': { + source: 'iana', + extensions: ['igl'], + }, + 'application/vnd.imagemeter.folder+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.imagemeter.image+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.immervision-ivp': { + source: 'iana', + extensions: ['ivp'], + }, + 'application/vnd.immervision-ivu': { + source: 'iana', + extensions: ['ivu'], + }, + 'application/vnd.ims.imsccv1p1': { + source: 'iana', + }, + 'application/vnd.ims.imsccv1p2': { + source: 'iana', + }, + 'application/vnd.ims.imsccv1p3': { + source: 'iana', + }, + 'application/vnd.ims.lis.v2.result+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ims.lti.v2.toolconsumerprofile+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ims.lti.v2.toolproxy+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ims.lti.v2.toolproxy.id+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ims.lti.v2.toolsettings+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ims.lti.v2.toolsettings.simple+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.informedcontrol.rms+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.informix-visionary': { + source: 'apache', + }, + 'application/vnd.infotech.project': { + source: 'iana', + }, + 'application/vnd.infotech.project+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.innopath.wamp.notification': { + source: 'iana', + }, + 'application/vnd.insors.igm': { + source: 'iana', + extensions: ['igm'], + }, + 'application/vnd.intercon.formnet': { + source: 'iana', + extensions: ['xpw', 'xpx'], + }, + 'application/vnd.intergeo': { + source: 'iana', + extensions: ['i2g'], + }, + 'application/vnd.intertrust.digibox': { + source: 'iana', + }, + 'application/vnd.intertrust.nncp': { + source: 'iana', + }, + 'application/vnd.intu.qbo': { + source: 'iana', + extensions: ['qbo'], + }, + 'application/vnd.intu.qfx': { + source: 'iana', + extensions: ['qfx'], + }, + 'application/vnd.ipld.car': { + source: 'iana', + }, + 'application/vnd.ipld.dag-cbor': { + source: 'iana', + }, + 'application/vnd.ipld.dag-json': { + source: 'iana', + }, + 'application/vnd.ipld.raw': { + source: 'iana', + }, + 'application/vnd.iptc.g2.catalogitem+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.iptc.g2.conceptitem+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.iptc.g2.knowledgeitem+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.iptc.g2.newsitem+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.iptc.g2.newsmessage+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.iptc.g2.packageitem+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.iptc.g2.planningitem+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ipunplugged.rcprofile': { + source: 'iana', + extensions: ['rcprofile'], + }, + 'application/vnd.irepository.package+xml': { + source: 'iana', + compressible: true, + extensions: ['irp'], + }, + 'application/vnd.is-xpr': { + source: 'iana', + extensions: ['xpr'], + }, + 'application/vnd.isac.fcs': { + source: 'iana', + extensions: ['fcs'], + }, + 'application/vnd.iso11783-10+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.jam': { + source: 'iana', + extensions: ['jam'], + }, + 'application/vnd.japannet-directory-service': { + source: 'iana', + }, + 'application/vnd.japannet-jpnstore-wakeup': { + source: 'iana', + }, + 'application/vnd.japannet-payment-wakeup': { + source: 'iana', + }, + 'application/vnd.japannet-registration': { + source: 'iana', + }, + 'application/vnd.japannet-registration-wakeup': { + source: 'iana', + }, + 'application/vnd.japannet-setstore-wakeup': { + source: 'iana', + }, + 'application/vnd.japannet-verification': { + source: 'iana', + }, + 'application/vnd.japannet-verification-wakeup': { + source: 'iana', + }, + 'application/vnd.jcp.javame.midlet-rms': { + source: 'iana', + extensions: ['rms'], + }, + 'application/vnd.jisp': { + source: 'iana', + extensions: ['jisp'], + }, + 'application/vnd.joost.joda-archive': { + source: 'iana', + extensions: ['joda'], + }, + 'application/vnd.jsk.isdn-ngn': { + source: 'iana', + }, + 'application/vnd.kahootz': { + source: 'iana', + extensions: ['ktz', 'ktr'], + }, + 'application/vnd.kde.karbon': { + source: 'iana', + extensions: ['karbon'], + }, + 'application/vnd.kde.kchart': { + source: 'iana', + extensions: ['chrt'], + }, + 'application/vnd.kde.kformula': { + source: 'iana', + extensions: ['kfo'], + }, + 'application/vnd.kde.kivio': { + source: 'iana', + extensions: ['flw'], + }, + 'application/vnd.kde.kontour': { + source: 'iana', + extensions: ['kon'], + }, + 'application/vnd.kde.kpresenter': { + source: 'iana', + extensions: ['kpr', 'kpt'], + }, + 'application/vnd.kde.kspread': { + source: 'iana', + extensions: ['ksp'], + }, + 'application/vnd.kde.kword': { + source: 'iana', + extensions: ['kwd', 'kwt'], + }, + 'application/vnd.kenameaapp': { + source: 'iana', + extensions: ['htke'], + }, + 'application/vnd.kidspiration': { + source: 'iana', + extensions: ['kia'], + }, + 'application/vnd.kinar': { + source: 'iana', + extensions: ['kne', 'knp'], + }, + 'application/vnd.koan': { + source: 'iana', + extensions: ['skp', 'skd', 'skt', 'skm'], + }, + 'application/vnd.kodak-descriptor': { + source: 'iana', + extensions: ['sse'], + }, + 'application/vnd.las': { + source: 'iana', + }, + 'application/vnd.las.las+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.las.las+xml': { + source: 'iana', + compressible: true, + extensions: ['lasxml'], + }, + 'application/vnd.laszip': { + source: 'iana', + }, + 'application/vnd.leap+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.liberty-request+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.llamagraphics.life-balance.desktop': { + source: 'iana', + extensions: ['lbd'], + }, + 'application/vnd.llamagraphics.life-balance.exchange+xml': { + source: 'iana', + compressible: true, + extensions: ['lbe'], + }, + 'application/vnd.logipipe.circuit+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.loom': { + source: 'iana', + }, + 'application/vnd.lotus-1-2-3': { + source: 'iana', + extensions: ['123'], + }, + 'application/vnd.lotus-approach': { + source: 'iana', + extensions: ['apr'], + }, + 'application/vnd.lotus-freelance': { + source: 'iana', + extensions: ['pre'], + }, + 'application/vnd.lotus-notes': { + source: 'iana', + extensions: ['nsf'], + }, + 'application/vnd.lotus-organizer': { + source: 'iana', + extensions: ['org'], + }, + 'application/vnd.lotus-screencam': { + source: 'iana', + extensions: ['scm'], + }, + 'application/vnd.lotus-wordpro': { + source: 'iana', + extensions: ['lwp'], + }, + 'application/vnd.macports.portpkg': { + source: 'iana', + extensions: ['portpkg'], + }, + 'application/vnd.mapbox-vector-tile': { + source: 'iana', + extensions: ['mvt'], + }, + 'application/vnd.marlin.drm.actiontoken+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.marlin.drm.conftoken+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.marlin.drm.license+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.marlin.drm.mdcf': { + source: 'iana', + }, + 'application/vnd.mason+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.maxar.archive.3tz+zip': { + source: 'iana', + compressible: false, + }, + 'application/vnd.maxmind.maxmind-db': { + source: 'iana', + }, + 'application/vnd.mcd': { + source: 'iana', + extensions: ['mcd'], + }, + 'application/vnd.medcalcdata': { + source: 'iana', + extensions: ['mc1'], + }, + 'application/vnd.mediastation.cdkey': { + source: 'iana', + extensions: ['cdkey'], + }, + 'application/vnd.medicalholodeck.recordxr': { + source: 'iana', + }, + 'application/vnd.meridian-slingshot': { + source: 'iana', + }, + 'application/vnd.mfer': { + source: 'iana', + extensions: ['mwf'], + }, + 'application/vnd.mfmp': { + source: 'iana', + extensions: ['mfm'], + }, + 'application/vnd.micro+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.micrografx.flo': { + source: 'iana', + extensions: ['flo'], + }, + 'application/vnd.micrografx.igx': { + source: 'iana', + extensions: ['igx'], + }, + 'application/vnd.microsoft.portable-executable': { + source: 'iana', + }, + 'application/vnd.microsoft.windows.thumbnail-cache': { + source: 'iana', + }, + 'application/vnd.miele+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.mif': { + source: 'iana', + extensions: ['mif'], + }, + 'application/vnd.minisoft-hp3000-save': { + source: 'iana', + }, + 'application/vnd.mitsubishi.misty-guard.trustweb': { + source: 'iana', + }, + 'application/vnd.mobius.daf': { + source: 'iana', + extensions: ['daf'], + }, + 'application/vnd.mobius.dis': { + source: 'iana', + extensions: ['dis'], + }, + 'application/vnd.mobius.mbk': { + source: 'iana', + extensions: ['mbk'], + }, + 'application/vnd.mobius.mqy': { + source: 'iana', + extensions: ['mqy'], + }, + 'application/vnd.mobius.msl': { + source: 'iana', + extensions: ['msl'], + }, + 'application/vnd.mobius.plc': { + source: 'iana', + extensions: ['plc'], + }, + 'application/vnd.mobius.txf': { + source: 'iana', + extensions: ['txf'], + }, + 'application/vnd.mophun.application': { + source: 'iana', + extensions: ['mpn'], + }, + 'application/vnd.mophun.certificate': { + source: 'iana', + extensions: ['mpc'], + }, + 'application/vnd.motorola.flexsuite': { + source: 'iana', + }, + 'application/vnd.motorola.flexsuite.adsi': { + source: 'iana', + }, + 'application/vnd.motorola.flexsuite.fis': { + source: 'iana', + }, + 'application/vnd.motorola.flexsuite.gotap': { + source: 'iana', + }, + 'application/vnd.motorola.flexsuite.kmr': { + source: 'iana', + }, + 'application/vnd.motorola.flexsuite.ttc': { + source: 'iana', + }, + 'application/vnd.motorola.flexsuite.wem': { + source: 'iana', + }, + 'application/vnd.motorola.iprm': { + source: 'iana', + }, + 'application/vnd.mozilla.xul+xml': { + source: 'iana', + compressible: true, + extensions: ['xul'], + }, + 'application/vnd.ms-3mfdocument': { + source: 'iana', + }, + 'application/vnd.ms-artgalry': { + source: 'iana', + extensions: ['cil'], + }, + 'application/vnd.ms-asf': { + source: 'iana', + }, + 'application/vnd.ms-cab-compressed': { + source: 'iana', + extensions: ['cab'], + }, + 'application/vnd.ms-color.iccprofile': { + source: 'apache', + }, + 'application/vnd.ms-excel': { + source: 'iana', + compressible: false, + extensions: ['xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'], + }, + 'application/vnd.ms-excel.addin.macroenabled.12': { + source: 'iana', + extensions: ['xlam'], + }, + 'application/vnd.ms-excel.sheet.binary.macroenabled.12': { + source: 'iana', + extensions: ['xlsb'], + }, + 'application/vnd.ms-excel.sheet.macroenabled.12': { + source: 'iana', + extensions: ['xlsm'], + }, + 'application/vnd.ms-excel.template.macroenabled.12': { + source: 'iana', + extensions: ['xltm'], + }, + 'application/vnd.ms-fontobject': { + source: 'iana', + compressible: true, + extensions: ['eot'], + }, + 'application/vnd.ms-htmlhelp': { + source: 'iana', + extensions: ['chm'], + }, + 'application/vnd.ms-ims': { + source: 'iana', + extensions: ['ims'], + }, + 'application/vnd.ms-lrm': { + source: 'iana', + extensions: ['lrm'], + }, + 'application/vnd.ms-office.activex+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ms-officetheme': { + source: 'iana', + extensions: ['thmx'], + }, + 'application/vnd.ms-opentype': { + source: 'apache', + compressible: true, + }, + 'application/vnd.ms-outlook': { + compressible: false, + extensions: ['msg'], + }, + 'application/vnd.ms-package.obfuscated-opentype': { + source: 'apache', + }, + 'application/vnd.ms-pki.seccat': { + source: 'apache', + extensions: ['cat'], + }, + 'application/vnd.ms-pki.stl': { + source: 'apache', + extensions: ['stl'], + }, + 'application/vnd.ms-playready.initiator+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ms-powerpoint': { + source: 'iana', + compressible: false, + extensions: ['ppt', 'pps', 'pot'], + }, + 'application/vnd.ms-powerpoint.addin.macroenabled.12': { + source: 'iana', + extensions: ['ppam'], + }, + 'application/vnd.ms-powerpoint.presentation.macroenabled.12': { + source: 'iana', + extensions: ['pptm'], + }, + 'application/vnd.ms-powerpoint.slide.macroenabled.12': { + source: 'iana', + extensions: ['sldm'], + }, + 'application/vnd.ms-powerpoint.slideshow.macroenabled.12': { + source: 'iana', + extensions: ['ppsm'], + }, + 'application/vnd.ms-powerpoint.template.macroenabled.12': { + source: 'iana', + extensions: ['potm'], + }, + 'application/vnd.ms-printdevicecapabilities+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ms-printing.printticket+xml': { + source: 'apache', + compressible: true, + }, + 'application/vnd.ms-printschematicket+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ms-project': { + source: 'iana', + extensions: ['mpp', 'mpt'], + }, + 'application/vnd.ms-tnef': { + source: 'iana', + }, + 'application/vnd.ms-windows.devicepairing': { + source: 'iana', + }, + 'application/vnd.ms-windows.nwprinting.oob': { + source: 'iana', + }, + 'application/vnd.ms-windows.printerpairing': { + source: 'iana', + }, + 'application/vnd.ms-windows.wsd.oob': { + source: 'iana', + }, + 'application/vnd.ms-wmdrm.lic-chlg-req': { + source: 'iana', + }, + 'application/vnd.ms-wmdrm.lic-resp': { + source: 'iana', + }, + 'application/vnd.ms-wmdrm.meter-chlg-req': { + source: 'iana', + }, + 'application/vnd.ms-wmdrm.meter-resp': { + source: 'iana', + }, + 'application/vnd.ms-word.document.macroenabled.12': { + source: 'iana', + extensions: ['docm'], + }, + 'application/vnd.ms-word.template.macroenabled.12': { + source: 'iana', + extensions: ['dotm'], + }, + 'application/vnd.ms-works': { + source: 'iana', + extensions: ['wps', 'wks', 'wcm', 'wdb'], + }, + 'application/vnd.ms-wpl': { + source: 'iana', + extensions: ['wpl'], + }, + 'application/vnd.ms-xpsdocument': { + source: 'iana', + compressible: false, + extensions: ['xps'], + }, + 'application/vnd.msa-disk-image': { + source: 'iana', + }, + 'application/vnd.mseq': { + source: 'iana', + extensions: ['mseq'], + }, + 'application/vnd.msign': { + source: 'iana', + }, + 'application/vnd.multiad.creator': { + source: 'iana', + }, + 'application/vnd.multiad.creator.cif': { + source: 'iana', + }, + 'application/vnd.music-niff': { + source: 'iana', + }, + 'application/vnd.musician': { + source: 'iana', + extensions: ['mus'], + }, + 'application/vnd.muvee.style': { + source: 'iana', + extensions: ['msty'], + }, + 'application/vnd.mynfc': { + source: 'iana', + extensions: ['taglet'], + }, + 'application/vnd.nacamar.ybrid+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.ncd.control': { + source: 'iana', + }, + 'application/vnd.ncd.reference': { + source: 'iana', + }, + 'application/vnd.nearst.inv+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.nebumind.line': { + source: 'iana', + }, + 'application/vnd.nervana': { + source: 'iana', + }, + 'application/vnd.netfpx': { + source: 'iana', + }, + 'application/vnd.neurolanguage.nlu': { + source: 'iana', + extensions: ['nlu'], + }, + 'application/vnd.nimn': { + source: 'iana', + }, + 'application/vnd.nintendo.nitro.rom': { + source: 'iana', + }, + 'application/vnd.nintendo.snes.rom': { + source: 'iana', + }, + 'application/vnd.nitf': { + source: 'iana', + extensions: ['ntf', 'nitf'], + }, + 'application/vnd.noblenet-directory': { + source: 'iana', + extensions: ['nnd'], + }, + 'application/vnd.noblenet-sealer': { + source: 'iana', + extensions: ['nns'], + }, + 'application/vnd.noblenet-web': { + source: 'iana', + extensions: ['nnw'], + }, + 'application/vnd.nokia.catalogs': { + source: 'iana', + }, + 'application/vnd.nokia.conml+wbxml': { + source: 'iana', + }, + 'application/vnd.nokia.conml+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.nokia.iptv.config+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.nokia.isds-radio-presets': { + source: 'iana', + }, + 'application/vnd.nokia.landmark+wbxml': { + source: 'iana', + }, + 'application/vnd.nokia.landmark+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.nokia.landmarkcollection+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.nokia.n-gage.ac+xml': { + source: 'iana', + compressible: true, + extensions: ['ac'], + }, + 'application/vnd.nokia.n-gage.data': { + source: 'iana', + extensions: ['ngdat'], + }, + 'application/vnd.nokia.n-gage.symbian.install': { + source: 'apache', + extensions: ['n-gage'], + }, + 'application/vnd.nokia.ncd': { + source: 'iana', + }, + 'application/vnd.nokia.pcd+wbxml': { + source: 'iana', + }, + 'application/vnd.nokia.pcd+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.nokia.radio-preset': { + source: 'iana', + extensions: ['rpst'], + }, + 'application/vnd.nokia.radio-presets': { + source: 'iana', + extensions: ['rpss'], + }, + 'application/vnd.novadigm.edm': { + source: 'iana', + extensions: ['edm'], + }, + 'application/vnd.novadigm.edx': { + source: 'iana', + extensions: ['edx'], + }, + 'application/vnd.novadigm.ext': { + source: 'iana', + extensions: ['ext'], + }, + 'application/vnd.ntt-local.content-share': { + source: 'iana', + }, + 'application/vnd.ntt-local.file-transfer': { + source: 'iana', + }, + 'application/vnd.ntt-local.ogw_remote-access': { + source: 'iana', + }, + 'application/vnd.ntt-local.sip-ta_remote': { + source: 'iana', + }, + 'application/vnd.ntt-local.sip-ta_tcp_stream': { + source: 'iana', + }, + 'application/vnd.oasis.opendocument.base': { + source: 'iana', + }, + 'application/vnd.oasis.opendocument.chart': { + source: 'iana', + extensions: ['odc'], + }, + 'application/vnd.oasis.opendocument.chart-template': { + source: 'iana', + extensions: ['otc'], + }, + 'application/vnd.oasis.opendocument.database': { + source: 'apache', + extensions: ['odb'], + }, + 'application/vnd.oasis.opendocument.formula': { + source: 'iana', + extensions: ['odf'], + }, + 'application/vnd.oasis.opendocument.formula-template': { + source: 'iana', + extensions: ['odft'], + }, + 'application/vnd.oasis.opendocument.graphics': { + source: 'iana', + compressible: false, + extensions: ['odg'], + }, + 'application/vnd.oasis.opendocument.graphics-template': { + source: 'iana', + extensions: ['otg'], + }, + 'application/vnd.oasis.opendocument.image': { + source: 'iana', + extensions: ['odi'], + }, + 'application/vnd.oasis.opendocument.image-template': { + source: 'iana', + extensions: ['oti'], + }, + 'application/vnd.oasis.opendocument.presentation': { + source: 'iana', + compressible: false, + extensions: ['odp'], + }, + 'application/vnd.oasis.opendocument.presentation-template': { + source: 'iana', + extensions: ['otp'], + }, + 'application/vnd.oasis.opendocument.spreadsheet': { + source: 'iana', + compressible: false, + extensions: ['ods'], + }, + 'application/vnd.oasis.opendocument.spreadsheet-template': { + source: 'iana', + extensions: ['ots'], + }, + 'application/vnd.oasis.opendocument.text': { + source: 'iana', + compressible: false, + extensions: ['odt'], + }, + 'application/vnd.oasis.opendocument.text-master': { + source: 'iana', + extensions: ['odm'], + }, + 'application/vnd.oasis.opendocument.text-template': { + source: 'iana', + extensions: ['ott'], + }, + 'application/vnd.oasis.opendocument.text-web': { + source: 'iana', + extensions: ['oth'], + }, + 'application/vnd.obn': { + source: 'iana', + }, + 'application/vnd.ocf+cbor': { + source: 'iana', + }, + 'application/vnd.oci.image.manifest.v1+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oftn.l10n+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.contentaccessdownload+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.contentaccessstreaming+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.cspg-hexbinary': { + source: 'iana', + }, + 'application/vnd.oipf.dae.svg+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.dae.xhtml+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.mippvcontrolmessage+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.pae.gem': { + source: 'iana', + }, + 'application/vnd.oipf.spdiscovery+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.spdlist+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.ueprofile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oipf.userprofile+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.olpc-sugar': { + source: 'iana', + extensions: ['xo'], + }, + 'application/vnd.oma-scws-config': { + source: 'iana', + }, + 'application/vnd.oma-scws-http-request': { + source: 'iana', + }, + 'application/vnd.oma-scws-http-response': { + source: 'iana', + }, + 'application/vnd.oma.bcast.associated-procedure-parameter+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.bcast.drm-trigger+xml': { + source: 'apache', + compressible: true, + }, + 'application/vnd.oma.bcast.imd+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.bcast.ltkm': { + source: 'iana', + }, + 'application/vnd.oma.bcast.notification+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.bcast.provisioningtrigger': { + source: 'iana', + }, + 'application/vnd.oma.bcast.sgboot': { + source: 'iana', + }, + 'application/vnd.oma.bcast.sgdd+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.bcast.sgdu': { + source: 'iana', + }, + 'application/vnd.oma.bcast.simple-symbol-container': { + source: 'iana', + }, + 'application/vnd.oma.bcast.smartcard-trigger+xml': { + source: 'apache', + compressible: true, + }, + 'application/vnd.oma.bcast.sprov+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.bcast.stkm': { + source: 'iana', + }, + 'application/vnd.oma.cab-address-book+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.cab-feature-handler+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.cab-pcc+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.cab-subs-invite+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.cab-user-prefs+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.dcd': { + source: 'iana', + }, + 'application/vnd.oma.dcdc': { + source: 'iana', + }, + 'application/vnd.oma.dd2+xml': { + source: 'iana', + compressible: true, + extensions: ['dd2'], + }, + 'application/vnd.oma.drm.risd+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.group-usage-list+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.lwm2m+cbor': { + source: 'iana', + }, + 'application/vnd.oma.lwm2m+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.lwm2m+tlv': { + source: 'iana', + }, + 'application/vnd.oma.pal+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.poc.detailed-progress-report+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.poc.final-report+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.poc.groups+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.poc.invocation-descriptor+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.poc.optimized-progress-report+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.push': { + source: 'iana', + }, + 'application/vnd.oma.scidm.messages+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oma.xcap-directory+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.omads-email+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/vnd.omads-file+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/vnd.omads-folder+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/vnd.omaloc-supl-init': { + source: 'iana', + }, + 'application/vnd.onepager': { + source: 'iana', + }, + 'application/vnd.onepagertamp': { + source: 'iana', + }, + 'application/vnd.onepagertamx': { + source: 'iana', + }, + 'application/vnd.onepagertat': { + source: 'iana', + }, + 'application/vnd.onepagertatp': { + source: 'iana', + }, + 'application/vnd.onepagertatx': { + source: 'iana', + }, + 'application/vnd.onvif.metadata': { + source: 'iana', + }, + 'application/vnd.openblox.game+xml': { + source: 'iana', + compressible: true, + extensions: ['obgx'], + }, + 'application/vnd.openblox.game-binary': { + source: 'iana', + }, + 'application/vnd.openeye.oeb': { + source: 'iana', + }, + 'application/vnd.openofficeorg.extension': { + source: 'apache', + extensions: ['oxt'], + }, + 'application/vnd.openstreetmap.data+xml': { + source: 'iana', + compressible: true, + extensions: ['osm'], + }, + 'application/vnd.opentimestamps.ots': { + source: 'iana', + }, + 'application/vnd.openxmlformats-officedocument.custom-properties+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.customxmlproperties+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawing+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.extended-properties+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.comments+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.presentation': { + source: 'iana', + compressible: false, + extensions: ['pptx'], + }, + 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.presprops+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slide': { + source: 'iana', + extensions: ['sldx'], + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': { + source: 'iana', + extensions: ['ppsx'], + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.tags+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.template': { + source: 'iana', + extensions: ['potx'], + }, + 'application/vnd.openxmlformats-officedocument.presentationml.template.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': { + source: 'iana', + compressible: false, + extensions: ['xlsx'], + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': { + source: 'iana', + extensions: ['xltx'], + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.theme+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.themeoverride+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.vmldrawing': { + source: 'iana', + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': { + source: 'iana', + compressible: false, + extensions: ['docx'], + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': { + source: 'iana', + extensions: ['dotx'], + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml': + { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-package.core-properties+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.openxmlformats-package.relationships+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oracle.resource+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.orange.indata': { + source: 'iana', + }, + 'application/vnd.osa.netdeploy': { + source: 'iana', + }, + 'application/vnd.osgeo.mapguide.package': { + source: 'iana', + extensions: ['mgp'], + }, + 'application/vnd.osgi.bundle': { + source: 'iana', + }, + 'application/vnd.osgi.dp': { + source: 'iana', + extensions: ['dp'], + }, + 'application/vnd.osgi.subsystem': { + source: 'iana', + extensions: ['esa'], + }, + 'application/vnd.otps.ct-kip+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.oxli.countgraph': { + source: 'iana', + }, + 'application/vnd.pagerduty+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.palm': { + source: 'iana', + extensions: ['pdb', 'pqa', 'oprc'], + }, + 'application/vnd.panoply': { + source: 'iana', + }, + 'application/vnd.paos.xml': { + source: 'iana', + }, + 'application/vnd.patentdive': { + source: 'iana', + }, + 'application/vnd.patientecommsdoc': { + source: 'iana', + }, + 'application/vnd.pawaafile': { + source: 'iana', + extensions: ['paw'], + }, + 'application/vnd.pcos': { + source: 'iana', + }, + 'application/vnd.pg.format': { + source: 'iana', + extensions: ['str'], + }, + 'application/vnd.pg.osasli': { + source: 'iana', + extensions: ['ei6'], + }, + 'application/vnd.piaccess.application-licence': { + source: 'iana', + }, + 'application/vnd.picsel': { + source: 'iana', + extensions: ['efif'], + }, + 'application/vnd.pmi.widget': { + source: 'iana', + extensions: ['wg'], + }, + 'application/vnd.poc.group-advertisement+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.pocketlearn': { + source: 'iana', + extensions: ['plf'], + }, + 'application/vnd.powerbuilder6': { + source: 'iana', + extensions: ['pbd'], + }, + 'application/vnd.powerbuilder6-s': { + source: 'iana', + }, + 'application/vnd.powerbuilder7': { + source: 'iana', + }, + 'application/vnd.powerbuilder7-s': { + source: 'iana', + }, + 'application/vnd.powerbuilder75': { + source: 'iana', + }, + 'application/vnd.powerbuilder75-s': { + source: 'iana', + }, + 'application/vnd.preminet': { + source: 'iana', + }, + 'application/vnd.previewsystems.box': { + source: 'iana', + extensions: ['box'], + }, + 'application/vnd.proteus.magazine': { + source: 'iana', + extensions: ['mgz'], + }, + 'application/vnd.psfs': { + source: 'iana', + }, + 'application/vnd.publishare-delta-tree': { + source: 'iana', + extensions: ['qps'], + }, + 'application/vnd.pvi.ptid1': { + source: 'iana', + extensions: ['ptid'], + }, + 'application/vnd.pwg-multiplexed': { + source: 'iana', + }, + 'application/vnd.pwg-xhtml-print+xml': { + source: 'iana', + compressible: true, + extensions: ['xhtm'], + }, + 'application/vnd.qualcomm.brew-app-res': { + source: 'iana', + }, + 'application/vnd.quarantainenet': { + source: 'iana', + }, + 'application/vnd.quark.quarkxpress': { + source: 'iana', + extensions: ['qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb'], + }, + 'application/vnd.quobject-quoxdocument': { + source: 'iana', + }, + 'application/vnd.radisys.moml+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-audit+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-audit-conf+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-audit-conn+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-audit-dialog+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-audit-stream+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-conf+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog-base+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog-fax-detect+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog-fax-sendrecv+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog-group+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog-speech+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.radisys.msml-dialog-transform+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.rainstor.data': { + source: 'iana', + }, + 'application/vnd.rapid': { + source: 'iana', + }, + 'application/vnd.rar': { + source: 'iana', + extensions: ['rar'], + }, + 'application/vnd.realvnc.bed': { + source: 'iana', + extensions: ['bed'], + }, + 'application/vnd.recordare.musicxml': { + source: 'iana', + extensions: ['mxl'], + }, + 'application/vnd.recordare.musicxml+xml': { + source: 'iana', + compressible: true, + extensions: ['musicxml'], + }, + 'application/vnd.renlearn.rlprint': { + source: 'iana', + }, + 'application/vnd.resilient.logic': { + source: 'iana', + }, + 'application/vnd.restful+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.rig.cryptonote': { + source: 'iana', + extensions: ['cryptonote'], + }, + 'application/vnd.rim.cod': { + source: 'apache', + extensions: ['cod'], + }, + 'application/vnd.rn-realmedia': { + source: 'apache', + extensions: ['rm'], + }, + 'application/vnd.rn-realmedia-vbr': { + source: 'apache', + extensions: ['rmvb'], + }, + 'application/vnd.route66.link66+xml': { + source: 'iana', + compressible: true, + extensions: ['link66'], + }, + 'application/vnd.rs-274x': { + source: 'iana', + }, + 'application/vnd.ruckus.download': { + source: 'iana', + }, + 'application/vnd.s3sms': { + source: 'iana', + }, + 'application/vnd.sailingtracker.track': { + source: 'iana', + extensions: ['st'], + }, + 'application/vnd.sar': { + source: 'iana', + }, + 'application/vnd.sbm.cid': { + source: 'iana', + }, + 'application/vnd.sbm.mid2': { + source: 'iana', + }, + 'application/vnd.scribus': { + source: 'iana', + }, + 'application/vnd.sealed.3df': { + source: 'iana', + }, + 'application/vnd.sealed.csf': { + source: 'iana', + }, + 'application/vnd.sealed.doc': { + source: 'iana', + }, + 'application/vnd.sealed.eml': { + source: 'iana', + }, + 'application/vnd.sealed.mht': { + source: 'iana', + }, + 'application/vnd.sealed.net': { + source: 'iana', + }, + 'application/vnd.sealed.ppt': { + source: 'iana', + }, + 'application/vnd.sealed.tiff': { + source: 'iana', + }, + 'application/vnd.sealed.xls': { + source: 'iana', + }, + 'application/vnd.sealedmedia.softseal.html': { + source: 'iana', + }, + 'application/vnd.sealedmedia.softseal.pdf': { + source: 'iana', + }, + 'application/vnd.seemail': { + source: 'iana', + extensions: ['see'], + }, + 'application/vnd.seis+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.sema': { + source: 'iana', + extensions: ['sema'], + }, + 'application/vnd.semd': { + source: 'iana', + extensions: ['semd'], + }, + 'application/vnd.semf': { + source: 'iana', + extensions: ['semf'], + }, + 'application/vnd.shade-save-file': { + source: 'iana', + }, + 'application/vnd.shana.informed.formdata': { + source: 'iana', + extensions: ['ifm'], + }, + 'application/vnd.shana.informed.formtemplate': { + source: 'iana', + extensions: ['itp'], + }, + 'application/vnd.shana.informed.interchange': { + source: 'iana', + extensions: ['iif'], + }, + 'application/vnd.shana.informed.package': { + source: 'iana', + extensions: ['ipk'], + }, + 'application/vnd.shootproof+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.shopkick+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.shp': { + source: 'iana', + }, + 'application/vnd.shx': { + source: 'iana', + }, + 'application/vnd.sigrok.session': { + source: 'iana', + }, + 'application/vnd.simtech-mindmapper': { + source: 'iana', + extensions: ['twd', 'twds'], + }, + 'application/vnd.siren+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.smaf': { + source: 'iana', + extensions: ['mmf'], + }, + 'application/vnd.smart.notebook': { + source: 'iana', + }, + 'application/vnd.smart.teacher': { + source: 'iana', + extensions: ['teacher'], + }, + 'application/vnd.smintio.portals.archive': { + source: 'iana', + }, + 'application/vnd.snesdev-page-table': { + source: 'iana', + }, + 'application/vnd.software602.filler.form+xml': { + source: 'iana', + compressible: true, + extensions: ['fo'], + }, + 'application/vnd.software602.filler.form-xml-zip': { + source: 'iana', + }, + 'application/vnd.solent.sdkm+xml': { + source: 'iana', + compressible: true, + extensions: ['sdkm', 'sdkd'], + }, + 'application/vnd.spotfire.dxp': { + source: 'iana', + extensions: ['dxp'], + }, + 'application/vnd.spotfire.sfs': { + source: 'iana', + extensions: ['sfs'], + }, + 'application/vnd.sqlite3': { + source: 'iana', + }, + 'application/vnd.sss-cod': { + source: 'iana', + }, + 'application/vnd.sss-dtf': { + source: 'iana', + }, + 'application/vnd.sss-ntf': { + source: 'iana', + }, + 'application/vnd.stardivision.calc': { + source: 'apache', + extensions: ['sdc'], + }, + 'application/vnd.stardivision.draw': { + source: 'apache', + extensions: ['sda'], + }, + 'application/vnd.stardivision.impress': { + source: 'apache', + extensions: ['sdd'], + }, + 'application/vnd.stardivision.math': { + source: 'apache', + extensions: ['smf'], + }, + 'application/vnd.stardivision.writer': { + source: 'apache', + extensions: ['sdw', 'vor'], + }, + 'application/vnd.stardivision.writer-global': { + source: 'apache', + extensions: ['sgl'], + }, + 'application/vnd.stepmania.package': { + source: 'iana', + extensions: ['smzip'], + }, + 'application/vnd.stepmania.stepchart': { + source: 'iana', + extensions: ['sm'], + }, + 'application/vnd.street-stream': { + source: 'iana', + }, + 'application/vnd.sun.wadl+xml': { + source: 'iana', + compressible: true, + extensions: ['wadl'], + }, + 'application/vnd.sun.xml.calc': { + source: 'apache', + extensions: ['sxc'], + }, + 'application/vnd.sun.xml.calc.template': { + source: 'apache', + extensions: ['stc'], + }, + 'application/vnd.sun.xml.draw': { + source: 'apache', + extensions: ['sxd'], + }, + 'application/vnd.sun.xml.draw.template': { + source: 'apache', + extensions: ['std'], + }, + 'application/vnd.sun.xml.impress': { + source: 'apache', + extensions: ['sxi'], + }, + 'application/vnd.sun.xml.impress.template': { + source: 'apache', + extensions: ['sti'], + }, + 'application/vnd.sun.xml.math': { + source: 'apache', + extensions: ['sxm'], + }, + 'application/vnd.sun.xml.writer': { + source: 'apache', + extensions: ['sxw'], + }, + 'application/vnd.sun.xml.writer.global': { + source: 'apache', + extensions: ['sxg'], + }, + 'application/vnd.sun.xml.writer.template': { + source: 'apache', + extensions: ['stw'], + }, + 'application/vnd.sus-calendar': { + source: 'iana', + extensions: ['sus', 'susp'], + }, + 'application/vnd.svd': { + source: 'iana', + extensions: ['svd'], + }, + 'application/vnd.swiftview-ics': { + source: 'iana', + }, + 'application/vnd.sybyl.mol2': { + source: 'iana', + }, + 'application/vnd.sycle+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.syft+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.symbian.install': { + source: 'apache', + extensions: ['sis', 'sisx'], + }, + 'application/vnd.syncml+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['xsm'], + }, + 'application/vnd.syncml.dm+wbxml': { + source: 'iana', + charset: 'UTF-8', + extensions: ['bdm'], + }, + 'application/vnd.syncml.dm+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['xdm'], + }, + 'application/vnd.syncml.dm.notification': { + source: 'iana', + }, + 'application/vnd.syncml.dmddf+wbxml': { + source: 'iana', + }, + 'application/vnd.syncml.dmddf+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['ddf'], + }, + 'application/vnd.syncml.dmtnds+wbxml': { + source: 'iana', + }, + 'application/vnd.syncml.dmtnds+xml': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + }, + 'application/vnd.syncml.ds.notification': { + source: 'iana', + }, + 'application/vnd.tableschema+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.tao.intent-module-archive': { + source: 'iana', + extensions: ['tao'], + }, + 'application/vnd.tcpdump.pcap': { + source: 'iana', + extensions: ['pcap', 'cap', 'dmp'], + }, + 'application/vnd.think-cell.ppttc+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.tmd.mediaflex.api+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.tml': { + source: 'iana', + }, + 'application/vnd.tmobile-livetv': { + source: 'iana', + extensions: ['tmo'], + }, + 'application/vnd.tri.onesource': { + source: 'iana', + }, + 'application/vnd.trid.tpt': { + source: 'iana', + extensions: ['tpt'], + }, + 'application/vnd.triscape.mxs': { + source: 'iana', + extensions: ['mxs'], + }, + 'application/vnd.trueapp': { + source: 'iana', + extensions: ['tra'], + }, + 'application/vnd.truedoc': { + source: 'iana', + }, + 'application/vnd.ubisoft.webplayer': { + source: 'iana', + }, + 'application/vnd.ufdl': { + source: 'iana', + extensions: ['ufd', 'ufdl'], + }, + 'application/vnd.uiq.theme': { + source: 'iana', + extensions: ['utz'], + }, + 'application/vnd.umajin': { + source: 'iana', + extensions: ['umj'], + }, + 'application/vnd.unity': { + source: 'iana', + extensions: ['unityweb'], + }, + 'application/vnd.uoml+xml': { + source: 'iana', + compressible: true, + extensions: ['uoml', 'uo'], + }, + 'application/vnd.uplanet.alert': { + source: 'iana', + }, + 'application/vnd.uplanet.alert-wbxml': { + source: 'iana', + }, + 'application/vnd.uplanet.bearer-choice': { + source: 'iana', + }, + 'application/vnd.uplanet.bearer-choice-wbxml': { + source: 'iana', + }, + 'application/vnd.uplanet.cacheop': { + source: 'iana', + }, + 'application/vnd.uplanet.cacheop-wbxml': { + source: 'iana', + }, + 'application/vnd.uplanet.channel': { + source: 'iana', + }, + 'application/vnd.uplanet.channel-wbxml': { + source: 'iana', + }, + 'application/vnd.uplanet.list': { + source: 'iana', + }, + 'application/vnd.uplanet.list-wbxml': { + source: 'iana', + }, + 'application/vnd.uplanet.listcmd': { + source: 'iana', + }, + 'application/vnd.uplanet.listcmd-wbxml': { + source: 'iana', + }, + 'application/vnd.uplanet.signal': { + source: 'iana', + }, + 'application/vnd.uri-map': { + source: 'iana', + }, + 'application/vnd.valve.source.material': { + source: 'iana', + }, + 'application/vnd.vcx': { + source: 'iana', + extensions: ['vcx'], + }, + 'application/vnd.vd-study': { + source: 'iana', + }, + 'application/vnd.vectorworks': { + source: 'iana', + }, + 'application/vnd.vel+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.verimatrix.vcas': { + source: 'iana', + }, + 'application/vnd.veritone.aion+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.veryant.thin': { + source: 'iana', + }, + 'application/vnd.ves.encrypted': { + source: 'iana', + }, + 'application/vnd.vidsoft.vidconference': { + source: 'iana', + }, + 'application/vnd.visio': { + source: 'iana', + extensions: ['vsd', 'vst', 'vss', 'vsw'], + }, + 'application/vnd.visionary': { + source: 'iana', + extensions: ['vis'], + }, + 'application/vnd.vividence.scriptfile': { + source: 'iana', + }, + 'application/vnd.vsf': { + source: 'iana', + extensions: ['vsf'], + }, + 'application/vnd.wap.sic': { + source: 'iana', + }, + 'application/vnd.wap.slc': { + source: 'iana', + }, + 'application/vnd.wap.wbxml': { + source: 'iana', + charset: 'UTF-8', + extensions: ['wbxml'], + }, + 'application/vnd.wap.wmlc': { + source: 'iana', + extensions: ['wmlc'], + }, + 'application/vnd.wap.wmlscriptc': { + source: 'iana', + extensions: ['wmlsc'], + }, + 'application/vnd.wasmflow.wafl': { + source: 'iana', + }, + 'application/vnd.webturbo': { + source: 'iana', + extensions: ['wtb'], + }, + 'application/vnd.wfa.dpp': { + source: 'iana', + }, + 'application/vnd.wfa.p2p': { + source: 'iana', + }, + 'application/vnd.wfa.wsc': { + source: 'iana', + }, + 'application/vnd.windows.devicepairing': { + source: 'iana', + }, + 'application/vnd.wmc': { + source: 'iana', + }, + 'application/vnd.wmf.bootstrap': { + source: 'iana', + }, + 'application/vnd.wolfram.mathematica': { + source: 'iana', + }, + 'application/vnd.wolfram.mathematica.package': { + source: 'iana', + }, + 'application/vnd.wolfram.player': { + source: 'iana', + extensions: ['nbp'], + }, + 'application/vnd.wordlift': { + source: 'iana', + }, + 'application/vnd.wordperfect': { + source: 'iana', + extensions: ['wpd'], + }, + 'application/vnd.wqd': { + source: 'iana', + extensions: ['wqd'], + }, + 'application/vnd.wrq-hp3000-labelled': { + source: 'iana', + }, + 'application/vnd.wt.stf': { + source: 'iana', + extensions: ['stf'], + }, + 'application/vnd.wv.csp+wbxml': { + source: 'iana', + }, + 'application/vnd.wv.csp+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.wv.ssp+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.xacml+json': { + source: 'iana', + compressible: true, + }, + 'application/vnd.xara': { + source: 'iana', + extensions: ['xar'], + }, + 'application/vnd.xfdl': { + source: 'iana', + extensions: ['xfdl'], + }, + 'application/vnd.xfdl.webform': { + source: 'iana', + }, + 'application/vnd.xmi+xml': { + source: 'iana', + compressible: true, + }, + 'application/vnd.xmpie.cpkg': { + source: 'iana', + }, + 'application/vnd.xmpie.dpkg': { + source: 'iana', + }, + 'application/vnd.xmpie.plan': { + source: 'iana', + }, + 'application/vnd.xmpie.ppkg': { + source: 'iana', + }, + 'application/vnd.xmpie.xlim': { + source: 'iana', + }, + 'application/vnd.yamaha.hv-dic': { + source: 'iana', + extensions: ['hvd'], + }, + 'application/vnd.yamaha.hv-script': { + source: 'iana', + extensions: ['hvs'], + }, + 'application/vnd.yamaha.hv-voice': { + source: 'iana', + extensions: ['hvp'], + }, + 'application/vnd.yamaha.openscoreformat': { + source: 'iana', + extensions: ['osf'], + }, + 'application/vnd.yamaha.openscoreformat.osfpvg+xml': { + source: 'iana', + compressible: true, + extensions: ['osfpvg'], + }, + 'application/vnd.yamaha.remote-setup': { + source: 'iana', + }, + 'application/vnd.yamaha.smaf-audio': { + source: 'iana', + extensions: ['saf'], + }, + 'application/vnd.yamaha.smaf-phrase': { + source: 'iana', + extensions: ['spf'], + }, + 'application/vnd.yamaha.through-ngn': { + source: 'iana', + }, + 'application/vnd.yamaha.tunnel-udpencap': { + source: 'iana', + }, + 'application/vnd.yaoweme': { + source: 'iana', + }, + 'application/vnd.yellowriver-custom-menu': { + source: 'iana', + extensions: ['cmp'], + }, + 'application/vnd.zul': { + source: 'iana', + extensions: ['zir', 'zirz'], + }, + 'application/vnd.zzazz.deck+xml': { + source: 'iana', + compressible: true, + extensions: ['zaz'], + }, + 'application/voicexml+xml': { + source: 'iana', + compressible: true, + extensions: ['vxml'], + }, + 'application/voucher-cms+json': { + source: 'iana', + compressible: true, + }, + 'application/vq-rtcpxr': { + source: 'iana', + }, + 'application/wasm': { + source: 'iana', + compressible: true, + extensions: ['wasm'], + }, + 'application/watcherinfo+xml': { + source: 'iana', + compressible: true, + extensions: ['wif'], + }, + 'application/webpush-options+json': { + source: 'iana', + compressible: true, + }, + 'application/whoispp-query': { + source: 'iana', + }, + 'application/whoispp-response': { + source: 'iana', + }, + 'application/widget': { + source: 'iana', + extensions: ['wgt'], + }, + 'application/winhlp': { + source: 'apache', + extensions: ['hlp'], + }, + 'application/wita': { + source: 'iana', + }, + 'application/wordperfect5.1': { + source: 'iana', + }, + 'application/wsdl+xml': { + source: 'iana', + compressible: true, + extensions: ['wsdl'], + }, + 'application/wspolicy+xml': { + source: 'iana', + compressible: true, + extensions: ['wspolicy'], + }, + 'application/x-7z-compressed': { + source: 'apache', + compressible: false, + extensions: ['7z'], + }, + 'application/x-abiword': { + source: 'apache', + extensions: ['abw'], + }, + 'application/x-ace-compressed': { + source: 'apache', + extensions: ['ace'], + }, + 'application/x-amf': { + source: 'apache', + }, + 'application/x-apple-diskimage': { + source: 'apache', + extensions: ['dmg'], + }, + 'application/x-arj': { + compressible: false, + extensions: ['arj'], + }, + 'application/x-authorware-bin': { + source: 'apache', + extensions: ['aab', 'x32', 'u32', 'vox'], + }, + 'application/x-authorware-map': { + source: 'apache', + extensions: ['aam'], + }, + 'application/x-authorware-seg': { + source: 'apache', + extensions: ['aas'], + }, + 'application/x-bcpio': { + source: 'apache', + extensions: ['bcpio'], + }, + 'application/x-bdoc': { + compressible: false, + extensions: ['bdoc'], + }, + 'application/x-bittorrent': { + source: 'apache', + extensions: ['torrent'], + }, + 'application/x-blorb': { + source: 'apache', + extensions: ['blb', 'blorb'], + }, + 'application/x-bzip': { + source: 'apache', + compressible: false, + extensions: ['bz'], + }, + 'application/x-bzip2': { + source: 'apache', + compressible: false, + extensions: ['bz2', 'boz'], + }, + 'application/x-cbr': { + source: 'apache', + extensions: ['cbr', 'cba', 'cbt', 'cbz', 'cb7'], + }, + 'application/x-cdlink': { + source: 'apache', + extensions: ['vcd'], + }, + 'application/x-cfs-compressed': { + source: 'apache', + extensions: ['cfs'], + }, + 'application/x-chat': { + source: 'apache', + extensions: ['chat'], + }, + 'application/x-chess-pgn': { + source: 'apache', + extensions: ['pgn'], + }, + 'application/x-chrome-extension': { + extensions: ['crx'], + }, + 'application/x-cocoa': { + source: 'nginx', + extensions: ['cco'], + }, + 'application/x-compress': { + source: 'apache', + }, + 'application/x-conference': { + source: 'apache', + extensions: ['nsc'], + }, + 'application/x-cpio': { + source: 'apache', + extensions: ['cpio'], + }, + 'application/x-csh': { + source: 'apache', + extensions: ['csh'], + }, + 'application/x-deb': { + compressible: false, + }, + 'application/x-debian-package': { + source: 'apache', + extensions: ['deb', 'udeb'], + }, + 'application/x-dgc-compressed': { + source: 'apache', + extensions: ['dgc'], + }, + 'application/x-director': { + source: 'apache', + extensions: ['dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa'], + }, + 'application/x-doom': { + source: 'apache', + extensions: ['wad'], + }, + 'application/x-dtbncx+xml': { + source: 'apache', + compressible: true, + extensions: ['ncx'], + }, + 'application/x-dtbook+xml': { + source: 'apache', + compressible: true, + extensions: ['dtb'], + }, + 'application/x-dtbresource+xml': { + source: 'apache', + compressible: true, + extensions: ['res'], + }, + 'application/x-dvi': { + source: 'apache', + compressible: false, + extensions: ['dvi'], + }, + 'application/x-envoy': { + source: 'apache', + extensions: ['evy'], + }, + 'application/x-eva': { + source: 'apache', + extensions: ['eva'], + }, + 'application/x-font-bdf': { + source: 'apache', + extensions: ['bdf'], + }, + 'application/x-font-dos': { + source: 'apache', + }, + 'application/x-font-framemaker': { + source: 'apache', + }, + 'application/x-font-ghostscript': { + source: 'apache', + extensions: ['gsf'], + }, + 'application/x-font-libgrx': { + source: 'apache', + }, + 'application/x-font-linux-psf': { + source: 'apache', + extensions: ['psf'], + }, + 'application/x-font-pcf': { + source: 'apache', + extensions: ['pcf'], + }, + 'application/x-font-snf': { + source: 'apache', + extensions: ['snf'], + }, + 'application/x-font-speedo': { + source: 'apache', + }, + 'application/x-font-sunos-news': { + source: 'apache', + }, + 'application/x-font-type1': { + source: 'apache', + extensions: ['pfa', 'pfb', 'pfm', 'afm'], + }, + 'application/x-font-vfont': { + source: 'apache', + }, + 'application/x-freearc': { + source: 'apache', + extensions: ['arc'], + }, + 'application/x-futuresplash': { + source: 'apache', + extensions: ['spl'], + }, + 'application/x-gca-compressed': { + source: 'apache', + extensions: ['gca'], + }, + 'application/x-glulx': { + source: 'apache', + extensions: ['ulx'], + }, + 'application/x-gnumeric': { + source: 'apache', + extensions: ['gnumeric'], + }, + 'application/x-gramps-xml': { + source: 'apache', + extensions: ['gramps'], + }, + 'application/x-gtar': { + source: 'apache', + extensions: ['gtar'], + }, + 'application/x-gzip': { + source: 'apache', + }, + 'application/x-hdf': { + source: 'apache', + extensions: ['hdf'], + }, + 'application/x-httpd-php': { + compressible: true, + extensions: ['php'], + }, + 'application/x-install-instructions': { + source: 'apache', + extensions: ['install'], + }, + 'application/x-iso9660-image': { + source: 'apache', + extensions: ['iso'], + }, + 'application/x-iwork-keynote-sffkey': { + extensions: ['key'], + }, + 'application/x-iwork-numbers-sffnumbers': { + extensions: ['numbers'], + }, + 'application/x-iwork-pages-sffpages': { + extensions: ['pages'], + }, + 'application/x-java-archive-diff': { + source: 'nginx', + extensions: ['jardiff'], + }, + 'application/x-java-jnlp-file': { + source: 'apache', + compressible: false, + extensions: ['jnlp'], + }, + 'application/x-javascript': { + compressible: true, + }, + 'application/x-keepass2': { + extensions: ['kdbx'], + }, + 'application/x-latex': { + source: 'apache', + compressible: false, + extensions: ['latex'], + }, + 'application/x-lua-bytecode': { + extensions: ['luac'], + }, + 'application/x-lzh-compressed': { + source: 'apache', + extensions: ['lzh', 'lha'], + }, + 'application/x-makeself': { + source: 'nginx', + extensions: ['run'], + }, + 'application/x-mie': { + source: 'apache', + extensions: ['mie'], + }, + 'application/x-mobipocket-ebook': { + source: 'apache', + extensions: ['prc', 'mobi'], + }, + 'application/x-mpegurl': { + compressible: false, + }, + 'application/x-ms-application': { + source: 'apache', + extensions: ['application'], + }, + 'application/x-ms-shortcut': { + source: 'apache', + extensions: ['lnk'], + }, + 'application/x-ms-wmd': { + source: 'apache', + extensions: ['wmd'], + }, + 'application/x-ms-wmz': { + source: 'apache', + extensions: ['wmz'], + }, + 'application/x-ms-xbap': { + source: 'apache', + extensions: ['xbap'], + }, + 'application/x-msaccess': { + source: 'apache', + extensions: ['mdb'], + }, + 'application/x-msbinder': { + source: 'apache', + extensions: ['obd'], + }, + 'application/x-mscardfile': { + source: 'apache', + extensions: ['crd'], + }, + 'application/x-msclip': { + source: 'apache', + extensions: ['clp'], + }, + 'application/x-msdos-program': { + extensions: ['exe'], + }, + 'application/x-msdownload': { + source: 'apache', + extensions: ['exe', 'dll', 'com', 'bat', 'msi'], + }, + 'application/x-msmediaview': { + source: 'apache', + extensions: ['mvb', 'm13', 'm14'], + }, + 'application/x-msmetafile': { + source: 'apache', + extensions: ['wmf', 'wmz', 'emf', 'emz'], + }, + 'application/x-msmoney': { + source: 'apache', + extensions: ['mny'], + }, + 'application/x-mspublisher': { + source: 'apache', + extensions: ['pub'], + }, + 'application/x-msschedule': { + source: 'apache', + extensions: ['scd'], + }, + 'application/x-msterminal': { + source: 'apache', + extensions: ['trm'], + }, + 'application/x-mswrite': { + source: 'apache', + extensions: ['wri'], + }, + 'application/x-netcdf': { + source: 'apache', + extensions: ['nc', 'cdf'], + }, + 'application/x-ns-proxy-autoconfig': { + compressible: true, + extensions: ['pac'], + }, + 'application/x-nzb': { + source: 'apache', + extensions: ['nzb'], + }, + 'application/x-perl': { + source: 'nginx', + extensions: ['pl', 'pm'], + }, + 'application/x-pilot': { + source: 'nginx', + extensions: ['prc', 'pdb'], + }, + 'application/x-pkcs12': { + source: 'apache', + compressible: false, + extensions: ['p12', 'pfx'], + }, + 'application/x-pkcs7-certificates': { + source: 'apache', + extensions: ['p7b', 'spc'], + }, + 'application/x-pkcs7-certreqresp': { + source: 'apache', + extensions: ['p7r'], + }, + 'application/x-pki-message': { + source: 'iana', + }, + 'application/x-rar-compressed': { + source: 'apache', + compressible: false, + extensions: ['rar'], + }, + 'application/x-redhat-package-manager': { + source: 'nginx', + extensions: ['rpm'], + }, + 'application/x-research-info-systems': { + source: 'apache', + extensions: ['ris'], + }, + 'application/x-sea': { + source: 'nginx', + extensions: ['sea'], + }, + 'application/x-sh': { + source: 'apache', + compressible: true, + extensions: ['sh'], + }, + 'application/x-shar': { + source: 'apache', + extensions: ['shar'], + }, + 'application/x-shockwave-flash': { + source: 'apache', + compressible: false, + extensions: ['swf'], + }, + 'application/x-silverlight-app': { + source: 'apache', + extensions: ['xap'], + }, + 'application/x-sql': { + source: 'apache', + extensions: ['sql'], + }, + 'application/x-stuffit': { + source: 'apache', + compressible: false, + extensions: ['sit'], + }, + 'application/x-stuffitx': { + source: 'apache', + extensions: ['sitx'], + }, + 'application/x-subrip': { + source: 'apache', + extensions: ['srt'], + }, + 'application/x-sv4cpio': { + source: 'apache', + extensions: ['sv4cpio'], + }, + 'application/x-sv4crc': { + source: 'apache', + extensions: ['sv4crc'], + }, + 'application/x-t3vm-image': { + source: 'apache', + extensions: ['t3'], + }, + 'application/x-tads': { + source: 'apache', + extensions: ['gam'], + }, + 'application/x-tar': { + source: 'apache', + compressible: true, + extensions: ['tar'], + }, + 'application/x-tcl': { + source: 'apache', + extensions: ['tcl', 'tk'], + }, + 'application/x-tex': { + source: 'apache', + extensions: ['tex'], + }, + 'application/x-tex-tfm': { + source: 'apache', + extensions: ['tfm'], + }, + 'application/x-texinfo': { + source: 'apache', + extensions: ['texinfo', 'texi'], + }, + 'application/x-tgif': { + source: 'apache', + extensions: ['obj'], + }, + 'application/x-ustar': { + source: 'apache', + extensions: ['ustar'], + }, + 'application/x-virtualbox-hdd': { + compressible: true, + extensions: ['hdd'], + }, + 'application/x-virtualbox-ova': { + compressible: true, + extensions: ['ova'], + }, + 'application/x-virtualbox-ovf': { + compressible: true, + extensions: ['ovf'], + }, + 'application/x-virtualbox-vbox': { + compressible: true, + extensions: ['vbox'], + }, + 'application/x-virtualbox-vbox-extpack': { + compressible: false, + extensions: ['vbox-extpack'], + }, + 'application/x-virtualbox-vdi': { + compressible: true, + extensions: ['vdi'], + }, + 'application/x-virtualbox-vhd': { + compressible: true, + extensions: ['vhd'], + }, + 'application/x-virtualbox-vmdk': { + compressible: true, + extensions: ['vmdk'], + }, + 'application/x-wais-source': { + source: 'apache', + extensions: ['src'], + }, + 'application/x-web-app-manifest+json': { + compressible: true, + extensions: ['webapp'], + }, + 'application/x-www-form-urlencoded': { + source: 'iana', + compressible: true, + }, + 'application/x-x509-ca-cert': { + source: 'iana', + extensions: ['der', 'crt', 'pem'], + }, + 'application/x-x509-ca-ra-cert': { + source: 'iana', + }, + 'application/x-x509-next-ca-cert': { + source: 'iana', + }, + 'application/x-xfig': { + source: 'apache', + extensions: ['fig'], + }, + 'application/x-xliff+xml': { + source: 'apache', + compressible: true, + extensions: ['xlf'], + }, + 'application/x-xpinstall': { + source: 'apache', + compressible: false, + extensions: ['xpi'], + }, + 'application/x-xz': { + source: 'apache', + extensions: ['xz'], + }, + 'application/x-zmachine': { + source: 'apache', + extensions: ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'], + }, + 'application/x400-bp': { + source: 'iana', + }, + 'application/xacml+xml': { + source: 'iana', + compressible: true, + }, + 'application/xaml+xml': { + source: 'apache', + compressible: true, + extensions: ['xaml'], + }, + 'application/xcap-att+xml': { + source: 'iana', + compressible: true, + extensions: ['xav'], + }, + 'application/xcap-caps+xml': { + source: 'iana', + compressible: true, + extensions: ['xca'], + }, + 'application/xcap-diff+xml': { + source: 'iana', + compressible: true, + extensions: ['xdf'], + }, + 'application/xcap-el+xml': { + source: 'iana', + compressible: true, + extensions: ['xel'], + }, + 'application/xcap-error+xml': { + source: 'iana', + compressible: true, + }, + 'application/xcap-ns+xml': { + source: 'iana', + compressible: true, + extensions: ['xns'], + }, + 'application/xcon-conference-info+xml': { + source: 'iana', + compressible: true, + }, + 'application/xcon-conference-info-diff+xml': { + source: 'iana', + compressible: true, + }, + 'application/xenc+xml': { + source: 'iana', + compressible: true, + extensions: ['xenc'], + }, + 'application/xfdf': { + source: 'iana', + extensions: ['xfdf'], + }, + 'application/xhtml+xml': { + source: 'iana', + compressible: true, + extensions: ['xhtml', 'xht'], + }, + 'application/xhtml-voice+xml': { + source: 'apache', + compressible: true, + }, + 'application/xliff+xml': { + source: 'iana', + compressible: true, + extensions: ['xlf'], + }, + 'application/xml': { + source: 'iana', + compressible: true, + extensions: ['xml', 'xsl', 'xsd', 'rng'], + }, + 'application/xml-dtd': { + source: 'iana', + compressible: true, + extensions: ['dtd'], + }, + 'application/xml-external-parsed-entity': { + source: 'iana', + }, + 'application/xml-patch+xml': { + source: 'iana', + compressible: true, + }, + 'application/xmpp+xml': { + source: 'iana', + compressible: true, + }, + 'application/xop+xml': { + source: 'iana', + compressible: true, + extensions: ['xop'], + }, + 'application/xproc+xml': { + source: 'apache', + compressible: true, + extensions: ['xpl'], + }, + 'application/xslt+xml': { + source: 'iana', + compressible: true, + extensions: ['xsl', 'xslt'], + }, + 'application/xspf+xml': { + source: 'apache', + compressible: true, + extensions: ['xspf'], + }, + 'application/xv+xml': { + source: 'iana', + compressible: true, + extensions: ['mxml', 'xhvml', 'xvml', 'xvm'], + }, + 'application/yang': { + source: 'iana', + extensions: ['yang'], + }, + 'application/yang-data+cbor': { + source: 'iana', + }, + 'application/yang-data+json': { + source: 'iana', + compressible: true, + }, + 'application/yang-data+xml': { + source: 'iana', + compressible: true, + }, + 'application/yang-patch+json': { + source: 'iana', + compressible: true, + }, + 'application/yang-patch+xml': { + source: 'iana', + compressible: true, + }, + 'application/yin+xml': { + source: 'iana', + compressible: true, + extensions: ['yin'], + }, + 'application/zip': { + source: 'iana', + compressible: false, + extensions: ['zip'], + }, + 'application/zlib': { + source: 'iana', + }, + 'application/zstd': { + source: 'iana', + }, + 'audio/1d-interleaved-parityfec': { + source: 'iana', + }, + 'audio/32kadpcm': { + source: 'iana', + }, + 'audio/3gpp': { + source: 'iana', + compressible: false, + extensions: ['3gpp'], + }, + 'audio/3gpp2': { + source: 'iana', + }, + 'audio/aac': { + source: 'iana', + extensions: ['adts', 'aac'], + }, + 'audio/ac3': { + source: 'iana', + }, + 'audio/adpcm': { + source: 'apache', + extensions: ['adp'], + }, + 'audio/amr': { + source: 'iana', + extensions: ['amr'], + }, + 'audio/amr-wb': { + source: 'iana', + }, + 'audio/amr-wb+': { + source: 'iana', + }, + 'audio/aptx': { + source: 'iana', + }, + 'audio/asc': { + source: 'iana', + }, + 'audio/atrac-advanced-lossless': { + source: 'iana', + }, + 'audio/atrac-x': { + source: 'iana', + }, + 'audio/atrac3': { + source: 'iana', + }, + 'audio/basic': { + source: 'iana', + compressible: false, + extensions: ['au', 'snd'], + }, + 'audio/bv16': { + source: 'iana', + }, + 'audio/bv32': { + source: 'iana', + }, + 'audio/clearmode': { + source: 'iana', + }, + 'audio/cn': { + source: 'iana', + }, + 'audio/dat12': { + source: 'iana', + }, + 'audio/dls': { + source: 'iana', + }, + 'audio/dsr-es201108': { + source: 'iana', + }, + 'audio/dsr-es202050': { + source: 'iana', + }, + 'audio/dsr-es202211': { + source: 'iana', + }, + 'audio/dsr-es202212': { + source: 'iana', + }, + 'audio/dv': { + source: 'iana', + }, + 'audio/dvi4': { + source: 'iana', + }, + 'audio/eac3': { + source: 'iana', + }, + 'audio/encaprtp': { + source: 'iana', + }, + 'audio/evrc': { + source: 'iana', + }, + 'audio/evrc-qcp': { + source: 'iana', + }, + 'audio/evrc0': { + source: 'iana', + }, + 'audio/evrc1': { + source: 'iana', + }, + 'audio/evrcb': { + source: 'iana', + }, + 'audio/evrcb0': { + source: 'iana', + }, + 'audio/evrcb1': { + source: 'iana', + }, + 'audio/evrcnw': { + source: 'iana', + }, + 'audio/evrcnw0': { + source: 'iana', + }, + 'audio/evrcnw1': { + source: 'iana', + }, + 'audio/evrcwb': { + source: 'iana', + }, + 'audio/evrcwb0': { + source: 'iana', + }, + 'audio/evrcwb1': { + source: 'iana', + }, + 'audio/evs': { + source: 'iana', + }, + 'audio/flexfec': { + source: 'iana', + }, + 'audio/fwdred': { + source: 'iana', + }, + 'audio/g711-0': { + source: 'iana', + }, + 'audio/g719': { + source: 'iana', + }, + 'audio/g722': { + source: 'iana', + }, + 'audio/g7221': { + source: 'iana', + }, + 'audio/g723': { + source: 'iana', + }, + 'audio/g726-16': { + source: 'iana', + }, + 'audio/g726-24': { + source: 'iana', + }, + 'audio/g726-32': { + source: 'iana', + }, + 'audio/g726-40': { + source: 'iana', + }, + 'audio/g728': { + source: 'iana', + }, + 'audio/g729': { + source: 'iana', + }, + 'audio/g7291': { + source: 'iana', + }, + 'audio/g729d': { + source: 'iana', + }, + 'audio/g729e': { + source: 'iana', + }, + 'audio/gsm': { + source: 'iana', + }, + 'audio/gsm-efr': { + source: 'iana', + }, + 'audio/gsm-hr-08': { + source: 'iana', + }, + 'audio/ilbc': { + source: 'iana', + }, + 'audio/ip-mr_v2.5': { + source: 'iana', + }, + 'audio/isac': { + source: 'apache', + }, + 'audio/l16': { + source: 'iana', + }, + 'audio/l20': { + source: 'iana', + }, + 'audio/l24': { + source: 'iana', + compressible: false, + }, + 'audio/l8': { + source: 'iana', + }, + 'audio/lpc': { + source: 'iana', + }, + 'audio/melp': { + source: 'iana', + }, + 'audio/melp1200': { + source: 'iana', + }, + 'audio/melp2400': { + source: 'iana', + }, + 'audio/melp600': { + source: 'iana', + }, + 'audio/mhas': { + source: 'iana', + }, + 'audio/midi': { + source: 'apache', + extensions: ['mid', 'midi', 'kar', 'rmi'], + }, + 'audio/mobile-xmf': { + source: 'iana', + extensions: ['mxmf'], + }, + 'audio/mp3': { + compressible: false, + extensions: ['mp3'], + }, + 'audio/mp4': { + source: 'iana', + compressible: false, + extensions: ['m4a', 'mp4a'], + }, + 'audio/mp4a-latm': { + source: 'iana', + }, + 'audio/mpa': { + source: 'iana', + }, + 'audio/mpa-robust': { + source: 'iana', + }, + 'audio/mpeg': { + source: 'iana', + compressible: false, + extensions: ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'], + }, + 'audio/mpeg4-generic': { + source: 'iana', + }, + 'audio/musepack': { + source: 'apache', + }, + 'audio/ogg': { + source: 'iana', + compressible: false, + extensions: ['oga', 'ogg', 'spx', 'opus'], + }, + 'audio/opus': { + source: 'iana', + }, + 'audio/parityfec': { + source: 'iana', + }, + 'audio/pcma': { + source: 'iana', + }, + 'audio/pcma-wb': { + source: 'iana', + }, + 'audio/pcmu': { + source: 'iana', + }, + 'audio/pcmu-wb': { + source: 'iana', + }, + 'audio/prs.sid': { + source: 'iana', + }, + 'audio/qcelp': { + source: 'iana', + }, + 'audio/raptorfec': { + source: 'iana', + }, + 'audio/red': { + source: 'iana', + }, + 'audio/rtp-enc-aescm128': { + source: 'iana', + }, + 'audio/rtp-midi': { + source: 'iana', + }, + 'audio/rtploopback': { + source: 'iana', + }, + 'audio/rtx': { + source: 'iana', + }, + 'audio/s3m': { + source: 'apache', + extensions: ['s3m'], + }, + 'audio/scip': { + source: 'iana', + }, + 'audio/silk': { + source: 'apache', + extensions: ['sil'], + }, + 'audio/smv': { + source: 'iana', + }, + 'audio/smv-qcp': { + source: 'iana', + }, + 'audio/smv0': { + source: 'iana', + }, + 'audio/sofa': { + source: 'iana', + }, + 'audio/sp-midi': { + source: 'iana', + }, + 'audio/speex': { + source: 'iana', + }, + 'audio/t140c': { + source: 'iana', + }, + 'audio/t38': { + source: 'iana', + }, + 'audio/telephone-event': { + source: 'iana', + }, + 'audio/tetra_acelp': { + source: 'iana', + }, + 'audio/tetra_acelp_bb': { + source: 'iana', + }, + 'audio/tone': { + source: 'iana', + }, + 'audio/tsvcis': { + source: 'iana', + }, + 'audio/uemclip': { + source: 'iana', + }, + 'audio/ulpfec': { + source: 'iana', + }, + 'audio/usac': { + source: 'iana', + }, + 'audio/vdvi': { + source: 'iana', + }, + 'audio/vmr-wb': { + source: 'iana', + }, + 'audio/vnd.3gpp.iufp': { + source: 'iana', + }, + 'audio/vnd.4sb': { + source: 'iana', + }, + 'audio/vnd.audiokoz': { + source: 'iana', + }, + 'audio/vnd.celp': { + source: 'iana', + }, + 'audio/vnd.cisco.nse': { + source: 'iana', + }, + 'audio/vnd.cmles.radio-events': { + source: 'iana', + }, + 'audio/vnd.cns.anp1': { + source: 'iana', + }, + 'audio/vnd.cns.inf1': { + source: 'iana', + }, + 'audio/vnd.dece.audio': { + source: 'iana', + extensions: ['uva', 'uvva'], + }, + 'audio/vnd.digital-winds': { + source: 'iana', + extensions: ['eol'], + }, + 'audio/vnd.dlna.adts': { + source: 'iana', + }, + 'audio/vnd.dolby.heaac.1': { + source: 'iana', + }, + 'audio/vnd.dolby.heaac.2': { + source: 'iana', + }, + 'audio/vnd.dolby.mlp': { + source: 'iana', + }, + 'audio/vnd.dolby.mps': { + source: 'iana', + }, + 'audio/vnd.dolby.pl2': { + source: 'iana', + }, + 'audio/vnd.dolby.pl2x': { + source: 'iana', + }, + 'audio/vnd.dolby.pl2z': { + source: 'iana', + }, + 'audio/vnd.dolby.pulse.1': { + source: 'iana', + }, + 'audio/vnd.dra': { + source: 'iana', + extensions: ['dra'], + }, + 'audio/vnd.dts': { + source: 'iana', + extensions: ['dts'], + }, + 'audio/vnd.dts.hd': { + source: 'iana', + extensions: ['dtshd'], + }, + 'audio/vnd.dts.uhd': { + source: 'iana', + }, + 'audio/vnd.dvb.file': { + source: 'iana', + }, + 'audio/vnd.everad.plj': { + source: 'iana', + }, + 'audio/vnd.hns.audio': { + source: 'iana', + }, + 'audio/vnd.lucent.voice': { + source: 'iana', + extensions: ['lvp'], + }, + 'audio/vnd.ms-playready.media.pya': { + source: 'iana', + extensions: ['pya'], + }, + 'audio/vnd.nokia.mobile-xmf': { + source: 'iana', + }, + 'audio/vnd.nortel.vbk': { + source: 'iana', + }, + 'audio/vnd.nuera.ecelp4800': { + source: 'iana', + extensions: ['ecelp4800'], + }, + 'audio/vnd.nuera.ecelp7470': { + source: 'iana', + extensions: ['ecelp7470'], + }, + 'audio/vnd.nuera.ecelp9600': { + source: 'iana', + extensions: ['ecelp9600'], + }, + 'audio/vnd.octel.sbc': { + source: 'iana', + }, + 'audio/vnd.presonus.multitrack': { + source: 'iana', + }, + 'audio/vnd.qcelp': { + source: 'apache', + }, + 'audio/vnd.rhetorex.32kadpcm': { + source: 'iana', + }, + 'audio/vnd.rip': { + source: 'iana', + extensions: ['rip'], + }, + 'audio/vnd.rn-realaudio': { + compressible: false, + }, + 'audio/vnd.sealedmedia.softseal.mpeg': { + source: 'iana', + }, + 'audio/vnd.vmx.cvsd': { + source: 'iana', + }, + 'audio/vnd.wave': { + compressible: false, + }, + 'audio/vorbis': { + source: 'iana', + compressible: false, + }, + 'audio/vorbis-config': { + source: 'iana', + }, + 'audio/wav': { + compressible: false, + extensions: ['wav'], + }, + 'audio/wave': { + compressible: false, + extensions: ['wav'], + }, + 'audio/webm': { + source: 'apache', + compressible: false, + extensions: ['weba'], + }, + 'audio/x-aac': { + source: 'apache', + compressible: false, + extensions: ['aac'], + }, + 'audio/x-aiff': { + source: 'apache', + extensions: ['aif', 'aiff', 'aifc'], + }, + 'audio/x-caf': { + source: 'apache', + compressible: false, + extensions: ['caf'], + }, + 'audio/x-flac': { + source: 'apache', + extensions: ['flac'], + }, + 'audio/x-m4a': { + source: 'nginx', + extensions: ['m4a'], + }, + 'audio/x-matroska': { + source: 'apache', + extensions: ['mka'], + }, + 'audio/x-mpegurl': { + source: 'apache', + extensions: ['m3u'], + }, + 'audio/x-ms-wax': { + source: 'apache', + extensions: ['wax'], + }, + 'audio/x-ms-wma': { + source: 'apache', + extensions: ['wma'], + }, + 'audio/x-pn-realaudio': { + source: 'apache', + extensions: ['ram', 'ra'], + }, + 'audio/x-pn-realaudio-plugin': { + source: 'apache', + extensions: ['rmp'], + }, + 'audio/x-realaudio': { + source: 'nginx', + extensions: ['ra'], + }, + 'audio/x-tta': { + source: 'apache', + }, + 'audio/x-wav': { + source: 'apache', + extensions: ['wav'], + }, + 'audio/xm': { + source: 'apache', + extensions: ['xm'], + }, + 'chemical/x-cdx': { + source: 'apache', + extensions: ['cdx'], + }, + 'chemical/x-cif': { + source: 'apache', + extensions: ['cif'], + }, + 'chemical/x-cmdf': { + source: 'apache', + extensions: ['cmdf'], + }, + 'chemical/x-cml': { + source: 'apache', + extensions: ['cml'], + }, + 'chemical/x-csml': { + source: 'apache', + extensions: ['csml'], + }, + 'chemical/x-pdb': { + source: 'apache', + }, + 'chemical/x-xyz': { + source: 'apache', + extensions: ['xyz'], + }, + 'font/collection': { + source: 'iana', + extensions: ['ttc'], + }, + 'font/otf': { + source: 'iana', + compressible: true, + extensions: ['otf'], + }, + 'font/sfnt': { + source: 'iana', + }, + 'font/ttf': { + source: 'iana', + compressible: true, + extensions: ['ttf'], + }, + 'font/woff': { + source: 'iana', + extensions: ['woff'], + }, + 'font/woff2': { + source: 'iana', + extensions: ['woff2'], + }, + 'image/aces': { + source: 'iana', + extensions: ['exr'], + }, + 'image/apng': { + source: 'iana', + compressible: false, + extensions: ['apng'], + }, + 'image/avci': { + source: 'iana', + extensions: ['avci'], + }, + 'image/avcs': { + source: 'iana', + extensions: ['avcs'], + }, + 'image/avif': { + source: 'iana', + compressible: false, + extensions: ['avif'], + }, + 'image/bmp': { + source: 'iana', + compressible: true, + extensions: ['bmp', 'dib'], + }, + 'image/cgm': { + source: 'iana', + extensions: ['cgm'], + }, + 'image/dicom-rle': { + source: 'iana', + extensions: ['drle'], + }, + 'image/dpx': { + source: 'iana', + extensions: ['dpx'], + }, + 'image/emf': { + source: 'iana', + extensions: ['emf'], + }, + 'image/fits': { + source: 'iana', + extensions: ['fits'], + }, + 'image/g3fax': { + source: 'iana', + extensions: ['g3'], + }, + 'image/gif': { + source: 'iana', + compressible: false, + extensions: ['gif'], + }, + 'image/heic': { + source: 'iana', + extensions: ['heic'], + }, + 'image/heic-sequence': { + source: 'iana', + extensions: ['heics'], + }, + 'image/heif': { + source: 'iana', + extensions: ['heif'], + }, + 'image/heif-sequence': { + source: 'iana', + extensions: ['heifs'], + }, + 'image/hej2k': { + source: 'iana', + extensions: ['hej2'], + }, + 'image/hsj2': { + source: 'iana', + extensions: ['hsj2'], + }, + 'image/ief': { + source: 'iana', + extensions: ['ief'], + }, + 'image/jls': { + source: 'iana', + extensions: ['jls'], + }, + 'image/jp2': { + source: 'iana', + compressible: false, + extensions: ['jp2', 'jpg2'], + }, + 'image/jpeg': { + source: 'iana', + compressible: false, + extensions: ['jpeg', 'jpg', 'jpe', 'jfif'], + }, + 'image/jph': { + source: 'iana', + extensions: ['jph'], + }, + 'image/jphc': { + source: 'iana', + extensions: ['jhc'], + }, + 'image/jpm': { + source: 'iana', + compressible: false, + extensions: ['jpm', 'jpgm'], + }, + 'image/jpx': { + source: 'iana', + compressible: false, + extensions: ['jpx', 'jpf'], + }, + 'image/jxr': { + source: 'iana', + extensions: ['jxr'], + }, + 'image/jxra': { + source: 'iana', + extensions: ['jxra'], + }, + 'image/jxrs': { + source: 'iana', + extensions: ['jxrs'], + }, + 'image/jxs': { + source: 'iana', + extensions: ['jxs'], + }, + 'image/jxsc': { + source: 'iana', + extensions: ['jxsc'], + }, + 'image/jxsi': { + source: 'iana', + extensions: ['jxsi'], + }, + 'image/jxss': { + source: 'iana', + extensions: ['jxss'], + }, + 'image/ktx': { + source: 'iana', + extensions: ['ktx'], + }, + 'image/ktx2': { + source: 'iana', + extensions: ['ktx2'], + }, + 'image/naplps': { + source: 'iana', + }, + 'image/pjpeg': { + compressible: false, + }, + 'image/png': { + source: 'iana', + compressible: false, + extensions: ['png'], + }, + 'image/prs.btif': { + source: 'iana', + extensions: ['btif', 'btf'], + }, + 'image/prs.pti': { + source: 'iana', + extensions: ['pti'], + }, + 'image/pwg-raster': { + source: 'iana', + }, + 'image/sgi': { + source: 'apache', + extensions: ['sgi'], + }, + 'image/svg+xml': { + source: 'iana', + compressible: true, + extensions: ['svg', 'svgz'], + }, + 'image/t38': { + source: 'iana', + extensions: ['t38'], + }, + 'image/tiff': { + source: 'iana', + compressible: false, + extensions: ['tif', 'tiff'], + }, + 'image/tiff-fx': { + source: 'iana', + extensions: ['tfx'], + }, + 'image/vnd.adobe.photoshop': { + source: 'iana', + compressible: true, + extensions: ['psd'], + }, + 'image/vnd.airzip.accelerator.azv': { + source: 'iana', + extensions: ['azv'], + }, + 'image/vnd.cns.inf2': { + source: 'iana', + }, + 'image/vnd.dece.graphic': { + source: 'iana', + extensions: ['uvi', 'uvvi', 'uvg', 'uvvg'], + }, + 'image/vnd.djvu': { + source: 'iana', + extensions: ['djvu', 'djv'], + }, + 'image/vnd.dvb.subtitle': { + source: 'iana', + extensions: ['sub'], + }, + 'image/vnd.dwg': { + source: 'iana', + extensions: ['dwg'], + }, + 'image/vnd.dxf': { + source: 'iana', + extensions: ['dxf'], + }, + 'image/vnd.fastbidsheet': { + source: 'iana', + extensions: ['fbs'], + }, + 'image/vnd.fpx': { + source: 'iana', + extensions: ['fpx'], + }, + 'image/vnd.fst': { + source: 'iana', + extensions: ['fst'], + }, + 'image/vnd.fujixerox.edmics-mmr': { + source: 'iana', + extensions: ['mmr'], + }, + 'image/vnd.fujixerox.edmics-rlc': { + source: 'iana', + extensions: ['rlc'], + }, + 'image/vnd.globalgraphics.pgb': { + source: 'iana', + }, + 'image/vnd.microsoft.icon': { + source: 'iana', + compressible: true, + extensions: ['ico'], + }, + 'image/vnd.mix': { + source: 'iana', + }, + 'image/vnd.mozilla.apng': { + source: 'iana', + }, + 'image/vnd.ms-dds': { + compressible: true, + extensions: ['dds'], + }, + 'image/vnd.ms-modi': { + source: 'iana', + extensions: ['mdi'], + }, + 'image/vnd.ms-photo': { + source: 'apache', + extensions: ['wdp'], + }, + 'image/vnd.net-fpx': { + source: 'iana', + extensions: ['npx'], + }, + 'image/vnd.pco.b16': { + source: 'iana', + extensions: ['b16'], + }, + 'image/vnd.radiance': { + source: 'iana', + }, + 'image/vnd.sealed.png': { + source: 'iana', + }, + 'image/vnd.sealedmedia.softseal.gif': { + source: 'iana', + }, + 'image/vnd.sealedmedia.softseal.jpg': { + source: 'iana', + }, + 'image/vnd.svf': { + source: 'iana', + }, + 'image/vnd.tencent.tap': { + source: 'iana', + extensions: ['tap'], + }, + 'image/vnd.valve.source.texture': { + source: 'iana', + extensions: ['vtf'], + }, + 'image/vnd.wap.wbmp': { + source: 'iana', + extensions: ['wbmp'], + }, + 'image/vnd.xiff': { + source: 'iana', + extensions: ['xif'], + }, + 'image/vnd.zbrush.pcx': { + source: 'iana', + extensions: ['pcx'], + }, + 'image/webp': { + source: 'iana', + extensions: ['webp'], + }, + 'image/wmf': { + source: 'iana', + extensions: ['wmf'], + }, + 'image/x-3ds': { + source: 'apache', + extensions: ['3ds'], + }, + 'image/x-cmu-raster': { + source: 'apache', + extensions: ['ras'], + }, + 'image/x-cmx': { + source: 'apache', + extensions: ['cmx'], + }, + 'image/x-freehand': { + source: 'apache', + extensions: ['fh', 'fhc', 'fh4', 'fh5', 'fh7'], + }, + 'image/x-icon': { + source: 'apache', + compressible: true, + extensions: ['ico'], + }, + 'image/x-jng': { + source: 'nginx', + extensions: ['jng'], + }, + 'image/x-mrsid-image': { + source: 'apache', + extensions: ['sid'], + }, + 'image/x-ms-bmp': { + source: 'nginx', + compressible: true, + extensions: ['bmp'], + }, + 'image/x-pcx': { + source: 'apache', + extensions: ['pcx'], + }, + 'image/x-pict': { + source: 'apache', + extensions: ['pic', 'pct'], + }, + 'image/x-portable-anymap': { + source: 'apache', + extensions: ['pnm'], + }, + 'image/x-portable-bitmap': { + source: 'apache', + extensions: ['pbm'], + }, + 'image/x-portable-graymap': { + source: 'apache', + extensions: ['pgm'], + }, + 'image/x-portable-pixmap': { + source: 'apache', + extensions: ['ppm'], + }, + 'image/x-rgb': { + source: 'apache', + extensions: ['rgb'], + }, + 'image/x-tga': { + source: 'apache', + extensions: ['tga'], + }, + 'image/x-xbitmap': { + source: 'apache', + extensions: ['xbm'], + }, + 'image/x-xcf': { + compressible: false, + }, + 'image/x-xpixmap': { + source: 'apache', + extensions: ['xpm'], + }, + 'image/x-xwindowdump': { + source: 'apache', + extensions: ['xwd'], + }, + 'message/bhttp': { + source: 'iana', + }, + 'message/cpim': { + source: 'iana', + }, + 'message/delivery-status': { + source: 'iana', + }, + 'message/disposition-notification': { + source: 'iana', + extensions: ['disposition-notification'], + }, + 'message/external-body': { + source: 'iana', + }, + 'message/feedback-report': { + source: 'iana', + }, + 'message/global': { + source: 'iana', + extensions: ['u8msg'], + }, + 'message/global-delivery-status': { + source: 'iana', + extensions: ['u8dsn'], + }, + 'message/global-disposition-notification': { + source: 'iana', + extensions: ['u8mdn'], + }, + 'message/global-headers': { + source: 'iana', + extensions: ['u8hdr'], + }, + 'message/http': { + source: 'iana', + compressible: false, + }, + 'message/imdn+xml': { + source: 'iana', + compressible: true, + }, + 'message/news': { + source: 'apache', + }, + 'message/partial': { + source: 'iana', + compressible: false, + }, + 'message/rfc822': { + source: 'iana', + compressible: true, + extensions: ['eml', 'mime'], + }, + 'message/s-http': { + source: 'apache', + }, + 'message/sip': { + source: 'iana', + }, + 'message/sipfrag': { + source: 'iana', + }, + 'message/tracking-status': { + source: 'iana', + }, + 'message/vnd.si.simp': { + source: 'apache', + }, + 'message/vnd.wfa.wsc': { + source: 'iana', + extensions: ['wsc'], + }, + 'model/3mf': { + source: 'iana', + extensions: ['3mf'], + }, + 'model/e57': { + source: 'iana', + }, + 'model/gltf+json': { + source: 'iana', + compressible: true, + extensions: ['gltf'], + }, + 'model/gltf-binary': { + source: 'iana', + compressible: true, + extensions: ['glb'], + }, + 'model/iges': { + source: 'iana', + compressible: false, + extensions: ['igs', 'iges'], + }, + 'model/jt': { + source: 'iana', + extensions: ['jt'], + }, + 'model/mesh': { + source: 'iana', + compressible: false, + extensions: ['msh', 'mesh', 'silo'], + }, + 'model/mtl': { + source: 'iana', + extensions: ['mtl'], + }, + 'model/obj': { + source: 'iana', + extensions: ['obj'], + }, + 'model/prc': { + source: 'iana', + extensions: ['prc'], + }, + 'model/step': { + source: 'iana', + }, + 'model/step+xml': { + source: 'iana', + compressible: true, + extensions: ['stpx'], + }, + 'model/step+zip': { + source: 'iana', + compressible: false, + extensions: ['stpz'], + }, + 'model/step-xml+zip': { + source: 'iana', + compressible: false, + extensions: ['stpxz'], + }, + 'model/stl': { + source: 'iana', + extensions: ['stl'], + }, + 'model/u3d': { + source: 'iana', + extensions: ['u3d'], + }, + 'model/vnd.cld': { + source: 'iana', + extensions: ['cld'], + }, + 'model/vnd.collada+xml': { + source: 'iana', + compressible: true, + extensions: ['dae'], + }, + 'model/vnd.dwf': { + source: 'iana', + extensions: ['dwf'], + }, + 'model/vnd.flatland.3dml': { + source: 'iana', + }, + 'model/vnd.gdl': { + source: 'iana', + extensions: ['gdl'], + }, + 'model/vnd.gs-gdl': { + source: 'apache', + }, + 'model/vnd.gs.gdl': { + source: 'iana', + }, + 'model/vnd.gtw': { + source: 'iana', + extensions: ['gtw'], + }, + 'model/vnd.moml+xml': { + source: 'iana', + compressible: true, + }, + 'model/vnd.mts': { + source: 'iana', + extensions: ['mts'], + }, + 'model/vnd.opengex': { + source: 'iana', + extensions: ['ogex'], + }, + 'model/vnd.parasolid.transmit.binary': { + source: 'iana', + extensions: ['x_b'], + }, + 'model/vnd.parasolid.transmit.text': { + source: 'iana', + extensions: ['x_t'], + }, + 'model/vnd.pytha.pyox': { + source: 'iana', + extensions: ['pyo', 'pyox'], + }, + 'model/vnd.rosette.annotated-data-model': { + source: 'iana', + }, + 'model/vnd.sap.vds': { + source: 'iana', + extensions: ['vds'], + }, + 'model/vnd.usda': { + source: 'iana', + extensions: ['usda'], + }, + 'model/vnd.usdz+zip': { + source: 'iana', + compressible: false, + extensions: ['usdz'], + }, + 'model/vnd.valve.source.compiled-map': { + source: 'iana', + extensions: ['bsp'], + }, + 'model/vnd.vtu': { + source: 'iana', + extensions: ['vtu'], + }, + 'model/vrml': { + source: 'iana', + compressible: false, + extensions: ['wrl', 'vrml'], + }, + 'model/x3d+binary': { + source: 'apache', + compressible: false, + extensions: ['x3db', 'x3dbz'], + }, + 'model/x3d+fastinfoset': { + source: 'iana', + extensions: ['x3db'], + }, + 'model/x3d+vrml': { + source: 'apache', + compressible: false, + extensions: ['x3dv', 'x3dvz'], + }, + 'model/x3d+xml': { + source: 'iana', + compressible: true, + extensions: ['x3d', 'x3dz'], + }, + 'model/x3d-vrml': { + source: 'iana', + extensions: ['x3dv'], + }, + 'multipart/alternative': { + source: 'iana', + compressible: false, + }, + 'multipart/appledouble': { + source: 'iana', + }, + 'multipart/byteranges': { + source: 'iana', + }, + 'multipart/digest': { + source: 'iana', + }, + 'multipart/encrypted': { + source: 'iana', + compressible: false, + }, + 'multipart/form-data': { + source: 'iana', + compressible: false, + }, + 'multipart/header-set': { + source: 'iana', + }, + 'multipart/mixed': { + source: 'iana', + }, + 'multipart/multilingual': { + source: 'iana', + }, + 'multipart/parallel': { + source: 'iana', + }, + 'multipart/related': { + source: 'iana', + compressible: false, + }, + 'multipart/report': { + source: 'iana', + }, + 'multipart/signed': { + source: 'iana', + compressible: false, + }, + 'multipart/vnd.bint.med-plus': { + source: 'iana', + }, + 'multipart/voice-message': { + source: 'iana', + }, + 'multipart/x-mixed-replace': { + source: 'iana', + }, + 'text/1d-interleaved-parityfec': { + source: 'iana', + }, + 'text/cache-manifest': { + source: 'iana', + compressible: true, + extensions: ['appcache', 'manifest'], + }, + 'text/calendar': { + source: 'iana', + extensions: ['ics', 'ifb'], + }, + 'text/calender': { + compressible: true, + }, + 'text/cmd': { + compressible: true, + }, + 'text/coffeescript': { + extensions: ['coffee', 'litcoffee'], + }, + 'text/cql': { + source: 'iana', + }, + 'text/cql-expression': { + source: 'iana', + }, + 'text/cql-identifier': { + source: 'iana', + }, + 'text/css': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['css'], + }, + 'text/csv': { + source: 'iana', + compressible: true, + extensions: ['csv'], + }, + 'text/csv-schema': { + source: 'iana', + }, + 'text/directory': { + source: 'iana', + }, + 'text/dns': { + source: 'iana', + }, + 'text/ecmascript': { + source: 'apache', + }, + 'text/encaprtp': { + source: 'iana', + }, + 'text/enriched': { + source: 'iana', + }, + 'text/fhirpath': { + source: 'iana', + }, + 'text/flexfec': { + source: 'iana', + }, + 'text/fwdred': { + source: 'iana', + }, + 'text/gff3': { + source: 'iana', + }, + 'text/grammar-ref-list': { + source: 'iana', + }, + 'text/hl7v2': { + source: 'iana', + }, + 'text/html': { + source: 'iana', + compressible: true, + extensions: ['html', 'htm', 'shtml'], + }, + 'text/jade': { + extensions: ['jade'], + }, + 'text/javascript': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['js', 'mjs','cjs','ts'], + }, + 'text/jcr-cnd': { + source: 'iana', + }, + 'text/jsx': { + compressible: true, + extensions: ['jsx'], + }, + 'text/less': { + compressible: true, + extensions: ['less'], + }, + 'text/markdown': { + source: 'iana', + compressible: true, + extensions: ['md', 'markdown'], + }, + 'text/mathml': { + source: 'nginx', + extensions: ['mml'], + }, + 'text/mdx': { + compressible: true, + extensions: ['mdx'], + }, + 'text/mizar': { + source: 'iana', + }, + 'text/n3': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['n3'], + }, + 'text/parameters': { + source: 'iana', + charset: 'UTF-8', + }, + 'text/parityfec': { + source: 'iana', + }, + 'text/plain': { + source: 'iana', + compressible: true, + extensions: ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini'], + }, + 'text/provenance-notation': { + source: 'iana', + charset: 'UTF-8', + }, + 'text/prs.fallenstein.rst': { + source: 'iana', + }, + 'text/prs.lines.tag': { + source: 'iana', + extensions: ['dsc'], + }, + 'text/prs.prop.logic': { + source: 'iana', + }, + 'text/raptorfec': { + source: 'iana', + }, + 'text/red': { + source: 'iana', + }, + 'text/rfc822-headers': { + source: 'iana', + }, + 'text/richtext': { + source: 'iana', + compressible: true, + extensions: ['rtx'], + }, + 'text/rtf': { + source: 'iana', + compressible: true, + extensions: ['rtf'], + }, + 'text/rtp-enc-aescm128': { + source: 'iana', + }, + 'text/rtploopback': { + source: 'iana', + }, + 'text/rtx': { + source: 'iana', + }, + 'text/sgml': { + source: 'iana', + extensions: ['sgml', 'sgm'], + }, + 'text/shaclc': { + source: 'iana', + }, + 'text/shex': { + source: 'iana', + extensions: ['shex'], + }, + 'text/slim': { + extensions: ['slim', 'slm'], + }, + 'text/spdx': { + source: 'iana', + extensions: ['spdx'], + }, + 'text/strings': { + source: 'iana', + }, + 'text/stylus': { + extensions: ['stylus', 'styl'], + }, + 'text/t140': { + source: 'iana', + }, + 'text/tab-separated-values': { + source: 'iana', + compressible: true, + extensions: ['tsv'], + }, + 'text/troff': { + source: 'iana', + extensions: ['t', 'tr', 'roff', 'man', 'me', 'ms'], + }, + 'text/turtle': { + source: 'iana', + charset: 'UTF-8', + extensions: ['ttl'], + }, + 'text/ulpfec': { + source: 'iana', + }, + 'text/uri-list': { + source: 'iana', + compressible: true, + extensions: ['uri', 'uris', 'urls'], + }, + 'text/vcard': { + source: 'iana', + compressible: true, + extensions: ['vcard'], + }, + 'text/vnd.a': { + source: 'iana', + }, + 'text/vnd.abc': { + source: 'iana', + }, + 'text/vnd.ascii-art': { + source: 'iana', + }, + 'text/vnd.curl': { + source: 'iana', + extensions: ['curl'], + }, + 'text/vnd.curl.dcurl': { + source: 'apache', + extensions: ['dcurl'], + }, + 'text/vnd.curl.mcurl': { + source: 'apache', + extensions: ['mcurl'], + }, + 'text/vnd.curl.scurl': { + source: 'apache', + extensions: ['scurl'], + }, + 'text/vnd.debian.copyright': { + source: 'iana', + charset: 'UTF-8', + }, + 'text/vnd.dmclientscript': { + source: 'iana', + }, + 'text/vnd.dvb.subtitle': { + source: 'iana', + extensions: ['sub'], + }, + 'text/vnd.esmertec.theme-descriptor': { + source: 'iana', + charset: 'UTF-8', + }, + 'text/vnd.exchangeable': { + source: 'iana', + }, + 'text/vnd.familysearch.gedcom': { + source: 'iana', + extensions: ['ged'], + }, + 'text/vnd.ficlab.flt': { + source: 'iana', + }, + 'text/vnd.fly': { + source: 'iana', + extensions: ['fly'], + }, + 'text/vnd.fmi.flexstor': { + source: 'iana', + extensions: ['flx'], + }, + 'text/vnd.gml': { + source: 'iana', + }, + 'text/vnd.graphviz': { + source: 'iana', + extensions: ['gv'], + }, + 'text/vnd.hans': { + source: 'iana', + }, + 'text/vnd.hgl': { + source: 'iana', + }, + 'text/vnd.in3d.3dml': { + source: 'iana', + extensions: ['3dml'], + }, + 'text/vnd.in3d.spot': { + source: 'iana', + extensions: ['spot'], + }, + 'text/vnd.iptc.newsml': { + source: 'iana', + }, + 'text/vnd.iptc.nitf': { + source: 'iana', + }, + 'text/vnd.latex-z': { + source: 'iana', + }, + 'text/vnd.motorola.reflex': { + source: 'iana', + }, + 'text/vnd.ms-mediapackage': { + source: 'iana', + }, + 'text/vnd.net2phone.commcenter.command': { + source: 'iana', + }, + 'text/vnd.radisys.msml-basic-layout': { + source: 'iana', + }, + 'text/vnd.senx.warpscript': { + source: 'iana', + }, + 'text/vnd.si.uricatalogue': { + source: 'apache', + }, + 'text/vnd.sosi': { + source: 'iana', + }, + 'text/vnd.sun.j2me.app-descriptor': { + source: 'iana', + charset: 'UTF-8', + extensions: ['jad'], + }, + 'text/vnd.trolltech.linguist': { + source: 'iana', + charset: 'UTF-8', + }, + 'text/vnd.wap.si': { + source: 'iana', + }, + 'text/vnd.wap.sl': { + source: 'iana', + }, + 'text/vnd.wap.wml': { + source: 'iana', + extensions: ['wml'], + }, + 'text/vnd.wap.wmlscript': { + source: 'iana', + extensions: ['wmls'], + }, + 'text/vtt': { + source: 'iana', + charset: 'UTF-8', + compressible: true, + extensions: ['vtt'], + }, + 'text/wgsl': { + source: 'iana', + extensions: ['wgsl'], + }, + 'text/x-asm': { + source: 'apache', + extensions: ['s', 'asm'], + }, + 'text/x-c': { + source: 'apache', + extensions: ['c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'], + }, + 'text/x-component': { + source: 'nginx', + extensions: ['htc'], + }, + 'text/x-fortran': { + source: 'apache', + extensions: ['f', 'for', 'f77', 'f90'], + }, + 'text/x-gwt-rpc': { + compressible: true, + }, + 'text/x-handlebars-template': { + extensions: ['hbs'], + }, + 'text/x-java-source': { + source: 'apache', + extensions: ['java'], + }, + 'text/x-jquery-tmpl': { + compressible: true, + }, + 'text/x-lua': { + extensions: ['lua'], + }, + 'text/x-markdown': { + compressible: true, + extensions: ['mkd'], + }, + 'text/x-nfo': { + source: 'apache', + extensions: ['nfo'], + }, + 'text/x-opml': { + source: 'apache', + extensions: ['opml'], + }, + 'text/x-org': { + compressible: true, + extensions: ['org'], + }, + 'text/x-pascal': { + source: 'apache', + extensions: ['p', 'pas'], + }, + 'text/x-processing': { + compressible: true, + extensions: ['pde'], + }, + 'text/x-sass': { + extensions: ['sass'], + }, + 'text/x-scss': { + extensions: ['scss'], + }, + 'text/x-setext': { + source: 'apache', + extensions: ['etx'], + }, + 'text/x-sfv': { + source: 'apache', + extensions: ['sfv'], + }, + 'text/x-suse-ymp': { + compressible: true, + extensions: ['ymp'], + }, + 'text/x-uuencode': { + source: 'apache', + extensions: ['uu'], + }, + 'text/x-vcalendar': { + source: 'apache', + extensions: ['vcs'], + }, + 'text/x-vcard': { + source: 'apache', + extensions: ['vcf'], + }, + 'text/xml': { + source: 'iana', + compressible: true, + extensions: ['xml'], + }, + 'text/xml-external-parsed-entity': { + source: 'iana', + }, + 'text/yaml': { + compressible: true, + extensions: ['yaml', 'yml'], + }, + 'video/1d-interleaved-parityfec': { + source: 'iana', + }, + 'video/3gpp': { + source: 'iana', + extensions: ['3gp', '3gpp'], + }, + 'video/3gpp-tt': { + source: 'iana', + }, + 'video/3gpp2': { + source: 'iana', + extensions: ['3g2'], + }, + 'video/av1': { + source: 'iana', + }, + 'video/bmpeg': { + source: 'iana', + }, + 'video/bt656': { + source: 'iana', + }, + 'video/celb': { + source: 'iana', + }, + 'video/dv': { + source: 'iana', + }, + 'video/encaprtp': { + source: 'iana', + }, + 'video/ffv1': { + source: 'iana', + }, + 'video/flexfec': { + source: 'iana', + }, + 'video/h261': { + source: 'iana', + extensions: ['h261'], + }, + 'video/h263': { + source: 'iana', + extensions: ['h263'], + }, + 'video/h263-1998': { + source: 'iana', + }, + 'video/h263-2000': { + source: 'iana', + }, + 'video/h264': { + source: 'iana', + extensions: ['h264'], + }, + 'video/h264-rcdo': { + source: 'iana', + }, + 'video/h264-svc': { + source: 'iana', + }, + 'video/h265': { + source: 'iana', + }, + 'video/h266': { + source: 'iana', + }, + 'video/iso.segment': { + source: 'iana', + extensions: ['m4s'], + }, + 'video/jpeg': { + source: 'iana', + extensions: ['jpgv'], + }, + 'video/jpeg2000': { + source: 'iana', + }, + 'video/jpm': { + source: 'apache', + extensions: ['jpm', 'jpgm'], + }, + 'video/jxsv': { + source: 'iana', + }, + 'video/mj2': { + source: 'iana', + extensions: ['mj2', 'mjp2'], + }, + 'video/mp1s': { + source: 'iana', + }, + 'video/mp2p': { + source: 'iana', + }, + 'video/mp2t': { + source: 'iana', + extensions: ['ts'], + }, + 'video/mp4': { + source: 'iana', + compressible: false, + extensions: ['mp4', 'mp4v', 'mpg4'], + }, + 'video/mp4v-es': { + source: 'iana', + }, + 'video/mpeg': { + source: 'iana', + compressible: false, + extensions: ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'], + }, + 'video/mpeg4-generic': { + source: 'iana', + }, + 'video/mpv': { + source: 'iana', + }, + 'video/nv': { + source: 'iana', + }, + 'video/ogg': { + source: 'iana', + compressible: false, + extensions: ['ogv'], + }, + 'video/parityfec': { + source: 'iana', + }, + 'video/pointer': { + source: 'iana', + }, + 'video/quicktime': { + source: 'iana', + compressible: false, + extensions: ['qt', 'mov'], + }, + 'video/raptorfec': { + source: 'iana', + }, + 'video/raw': { + source: 'iana', + }, + 'video/rtp-enc-aescm128': { + source: 'iana', + }, + 'video/rtploopback': { + source: 'iana', + }, + 'video/rtx': { + source: 'iana', + }, + 'video/scip': { + source: 'iana', + }, + 'video/smpte291': { + source: 'iana', + }, + 'video/smpte292m': { + source: 'iana', + }, + 'video/ulpfec': { + source: 'iana', + }, + 'video/vc1': { + source: 'iana', + }, + 'video/vc2': { + source: 'iana', + }, + 'video/vnd.cctv': { + source: 'iana', + }, + 'video/vnd.dece.hd': { + source: 'iana', + extensions: ['uvh', 'uvvh'], + }, + 'video/vnd.dece.mobile': { + source: 'iana', + extensions: ['uvm', 'uvvm'], + }, + 'video/vnd.dece.mp4': { + source: 'iana', + }, + 'video/vnd.dece.pd': { + source: 'iana', + extensions: ['uvp', 'uvvp'], + }, + 'video/vnd.dece.sd': { + source: 'iana', + extensions: ['uvs', 'uvvs'], + }, + 'video/vnd.dece.video': { + source: 'iana', + extensions: ['uvv', 'uvvv'], + }, + 'video/vnd.directv.mpeg': { + source: 'iana', + }, + 'video/vnd.directv.mpeg-tts': { + source: 'iana', + }, + 'video/vnd.dlna.mpeg-tts': { + source: 'iana', + }, + 'video/vnd.dvb.file': { + source: 'iana', + extensions: ['dvb'], + }, + 'video/vnd.fvt': { + source: 'iana', + extensions: ['fvt'], + }, + 'video/vnd.hns.video': { + source: 'iana', + }, + 'video/vnd.iptvforum.1dparityfec-1010': { + source: 'iana', + }, + 'video/vnd.iptvforum.1dparityfec-2005': { + source: 'iana', + }, + 'video/vnd.iptvforum.2dparityfec-1010': { + source: 'iana', + }, + 'video/vnd.iptvforum.2dparityfec-2005': { + source: 'iana', + }, + 'video/vnd.iptvforum.ttsavc': { + source: 'iana', + }, + 'video/vnd.iptvforum.ttsmpeg2': { + source: 'iana', + }, + 'video/vnd.motorola.video': { + source: 'iana', + }, + 'video/vnd.motorola.videop': { + source: 'iana', + }, + 'video/vnd.mpegurl': { + source: 'iana', + extensions: ['mxu', 'm4u'], + }, + 'video/vnd.ms-playready.media.pyv': { + source: 'iana', + extensions: ['pyv'], + }, + 'video/vnd.nokia.interleaved-multimedia': { + source: 'iana', + }, + 'video/vnd.nokia.mp4vr': { + source: 'iana', + }, + 'video/vnd.nokia.videovoip': { + source: 'iana', + }, + 'video/vnd.objectvideo': { + source: 'iana', + }, + 'video/vnd.radgamettools.bink': { + source: 'iana', + }, + 'video/vnd.radgamettools.smacker': { + source: 'apache', + }, + 'video/vnd.sealed.mpeg1': { + source: 'iana', + }, + 'video/vnd.sealed.mpeg4': { + source: 'iana', + }, + 'video/vnd.sealed.swf': { + source: 'iana', + }, + 'video/vnd.sealedmedia.softseal.mov': { + source: 'iana', + }, + 'video/vnd.uvvu.mp4': { + source: 'iana', + extensions: ['uvu', 'uvvu'], + }, + 'video/vnd.vivo': { + source: 'iana', + extensions: ['viv'], + }, + 'video/vnd.youtube.yt': { + source: 'iana', + }, + 'video/vp8': { + source: 'iana', + }, + 'video/vp9': { + source: 'iana', + }, + 'video/webm': { + source: 'apache', + compressible: false, + extensions: ['webm'], + }, + 'video/x-f4v': { + source: 'apache', + extensions: ['f4v'], + }, + 'video/x-fli': { + source: 'apache', + extensions: ['fli'], + }, + 'video/x-flv': { + source: 'apache', + compressible: false, + extensions: ['flv'], + }, + 'video/x-m4v': { + source: 'apache', + extensions: ['m4v'], + }, + 'video/x-matroska': { + source: 'apache', + compressible: false, + extensions: ['mkv', 'mk3d', 'mks'], + }, + 'video/x-mng': { + source: 'apache', + extensions: ['mng'], + }, + 'video/x-ms-asf': { + source: 'apache', + extensions: ['asf', 'asx'], + }, + 'video/x-ms-vob': { + source: 'apache', + extensions: ['vob'], + }, + 'video/x-ms-wm': { + source: 'apache', + extensions: ['wm'], + }, + 'video/x-ms-wmv': { + source: 'apache', + compressible: false, + extensions: ['wmv'], + }, + 'video/x-ms-wmx': { + source: 'apache', + extensions: ['wmx'], + }, + 'video/x-ms-wvx': { + source: 'apache', + extensions: ['wvx'], + }, + 'video/x-msvideo': { + source: 'apache', + extensions: ['avi'], + }, + 'video/x-sgi-movie': { + source: 'apache', + extensions: ['movie'], + }, + 'video/x-smv': { + source: 'apache', + extensions: ['smv'], + }, + 'x-conference/x-cooltalk': { + source: 'apache', + extensions: ['ice'], + }, + 'x-shader/x-fragment': { + compressible: true, + }, + 'x-shader/x-vertex': { + compressible: true, + }, + + +'text/jscript': { + extensions: ['jscript'] +}, + + +} diff --git a/src/object/compare.ts b/src/object/compare.ts new file mode 100644 index 0000000..6277268 --- /dev/null +++ b/src/object/compare.ts @@ -0,0 +1,38 @@ +/** + * Performs object comparison with optional deep comparison + * @param obj First object to compare + * @param objToCompare Second object to compare + * @param deep Enable deep comparison for nested objects/arrays + */ +export function objectCompare>( + obj: T, + objToCompare: T, + deep = false + ): boolean { + if (!obj || !objToCompare) return false; + + return Object.keys(obj).length === Object.keys(objToCompare).length && + Object.keys(obj).every((key) => { + if (!Object.prototype.hasOwnProperty.call(objToCompare, key)) return false; + + const val1 = obj[key]; + const val2 = objToCompare[key]; + + if (!deep) return val1 === val2; + + if (Array.isArray(val1) && Array.isArray(val2)) { + return val1.length === val2.length && + val1.every((item, i) => + typeof item === 'object' && item !== null + ? objectCompare(item as Record, val2[i] as Record, true) + : item === val2[i] + ); + } + + if (typeof val1 === 'object' && typeof val2 === 'object' && val1 !== null && val2 !== null) { + return objectCompare(val1 as Record, val2 as Record, true); + } + + return val1 === val2; + }); + } \ No newline at end of file diff --git a/src/object/index.ts b/src/object/index.ts new file mode 100644 index 0000000..f9ac6c7 --- /dev/null +++ b/src/object/index.ts @@ -0,0 +1,3 @@ +export {getNestedValue,setNestedValue} from './nested' +export {objectCompare} from './compare' +export {createSelectOptions} from './util' \ No newline at end of file diff --git a/src/object/nested.ts b/src/object/nested.ts new file mode 100644 index 0000000..dc1245a --- /dev/null +++ b/src/object/nested.ts @@ -0,0 +1,46 @@ +/** + * Gets a nested value from an object using a path string + * @param path - Dot notation path (e.g. 'user.contacts[0].email') + * @param obj - Source object to extract value from + * @returns Value at path or undefined if path invalid + */ +export function getNestedValue(path: string, obj: Record): any { + return path + .replace(/\[(\w+)\]/g, ".$1") // Convert brackets to dot notation + .split(".") // Split path into parts + .reduce((prev, curr) => prev?.[curr], obj); // Traverse object +} + + + +/** +* Sets a nested value in an object using a path string +* @param path - Dot notation path (e.g. 'user.contacts[0].email') +* @param value - Value to set at path +* @param obj - Target object to modify +* @returns Modified object +*/ +/** + * Sets a nested value, creating objects and arrays if needed + */ +export function setNestedValue(path: string, value: any, obj: Record): Record { + const parts = path.replace(/\[(\w+)\]/g, ".$1").split("."); + const lastKey = parts.pop()!; + + const target = parts.reduce((prev, curr) => { + // Handle array indices + if (/^\d+$/.test(curr)) { + if (!Array.isArray(prev[curr])) { + prev[curr] = []; + } + } + // Create missing objects + else if (!prev[curr]) { + prev[curr] = {}; + } + return prev[curr]; + }, obj); + + target[lastKey] = value; + return obj; +} \ No newline at end of file diff --git a/src/object/util.ts b/src/object/util.ts new file mode 100644 index 0000000..d70c575 --- /dev/null +++ b/src/object/util.ts @@ -0,0 +1,49 @@ +/** + * Converts an object or array into an array of key-value pairs with customizable property names. + * Commonly used for transforming data into a format suitable for select/dropdown components. + * + * @param obj - The input object or array to be transformed + * @param options - Configuration options for the transformation + * @param options.labelKey - The key name to use for the label property (default: 'label') + * @param options.valueKey - The key name to use for the value property (default: 'value') + * @returns An array of objects with the specified label and value properties, or an empty array if input is invalid + * + * @example + * // Basic usage + * createSelectOptions({ key1: "Label 1", key2: "Label 2" }) + * // Returns: [{ label: "Label 1", value: "key1" }, { label: "Label 2", value: "key2" }] + * + * // Custom key names + * createSelectOptions( + * { key1: "Label 1", key2: "Label 2" }, + * { labelKey: 'text', valueKey: 'id' } + * ) + * // Returns: [{ text: "Label 1", id: "key1" }, { text: "Label 2", id: "key2" }] + */ +export function createSelectOptions( + obj: Record | T[] | null | undefined, + options: { + labelKey?: string; + valueKey?: string; + } = {} +): Array> { + const { + labelKey = 'label', + valueKey = 'value' + } = options; + + // Return empty array for null or undefined input + if (!obj) return []; + + // Return the original array if input is already an array + if (Array.isArray(obj)) return obj as Array>; + + // Return empty array for non-object inputs (like numbers or strings) + if (typeof obj !== 'object') return []; + + // Transform object into array of key-value pairs with custom property names + return Object.keys(obj).map((key) => ({ + [labelKey]: obj[key], + [valueKey]: key + })); +} \ No newline at end of file diff --git a/src/promise/index.ts b/src/promise/index.ts new file mode 100644 index 0000000..85f4660 --- /dev/null +++ b/src/promise/index.ts @@ -0,0 +1,84 @@ +/** + * Configuration options for the WaitUntil function + */ +interface WaitUntilOptions { + /** Maximum time to wait in milliseconds before timing out (default: 5000ms) */ + timeout?: number; + /** Interval between condition checks in milliseconds (default: 100ms) */ + interval?: number; +} + +/** + * Asynchronously waits until a condition is met or times out + * @param condition - Function that returns true when the wait condition is satisfied + * @param options - Configuration options for timeout and check interval + * @throws {Error} When the timeout period is exceeded + * @returns Promise that resolves when the condition is met + * @example + * await WaitUntil(() => someElement.isVisible(), { timeout: 10000 }); + */ +export const WaitUntil = async ( + condition: () => boolean, + options?: WaitUntilOptions +): Promise => + new Promise((resolve, reject) => { + const interval = setInterval(() => { + if (!condition()) { + return; + } + clearInterval(interval); + resolve(); + }, options?.interval ?? 100); + + setTimeout(() => { + clearInterval(interval); + reject(new Error("Wait Timeout")); + }, options?.timeout ?? 5000); + }); + +/** + * Creates a debounced version of a function that delays its execution + * until after the specified wait time has elapsed since the last call + */ +export const debounce = any>( + func: T, + wait: number +): ((...args: Parameters) => void) => { + let timeoutId: ReturnType; + + return (...args: Parameters) => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => func(...args), wait); + }; +}; + +/** + * Creates a throttled version of a function that executes at most once + * during the specified interval + */ +export const throttle = any>( + func: T, + limit: number +): ((...args: Parameters) => void) => { + let inThrottle = false; + + return (...args: Parameters) => { + if (!inThrottle) { + func(...args); + inThrottle = true; + setTimeout(() => (inThrottle = false), limit); + } + }; +}; + +/** + * Measures the execution time of an async function + */ +export const measureTime = async ( + fn: () => Promise +): Promise<{ result: T; duration: number }> => { + const start = performance.now(); + const result = await fn(); + const duration = performance.now() - start; + return { result, duration }; +}; diff --git a/src/strings/caseConversion.ts b/src/strings/caseConversion.ts new file mode 100644 index 0000000..bb5f0a5 --- /dev/null +++ b/src/strings/caseConversion.ts @@ -0,0 +1,83 @@ + +/** + * Capitalizes the first letter of each word in a sentence + * @param sentence - Input string to transform + * @returns Transformed string with initial capitals + */ +export const initCaps = (sentence: string): string => { + if (!sentence) return sentence; + return sentence.replace(/(^\w{1})|(\s+\w{1})/g, letter => letter.toUpperCase()); +}; + +/** + * Converts text to title case, following standard title capitalization rules + * Keeps articles, conjunctions, and prepositions in lowercase unless they start the title + * @param sentence - Input string to transform + * @returns Transformed string in title case + */ +export const titleCase = (sentence: string): string => { + if (!sentence) return sentence; + const smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|vs?\.?|via)$/i; + + return sentence.toLowerCase().replace(/[A-Za-z0-9\u00C0-\u00FF]+[^\s-]*/g, (word, index, title) => { + if (index > 0 && index + word.length !== title.length && + word.search(smallWords) > -1 && title.charAt(index - 2) !== ":" && + (title.charAt(index + word.length) !== '-' || title.charAt(index - 1) === '-') && + title.charAt(index - 1).search(/[^\s-]/) < 0) { + return word.toLowerCase(); + } + return word.charAt(0).toUpperCase() + word.substr(1); + }); +}; + +/** + * Converts text to camelCase format + * @param sentence - Input string to transform + * @returns Transformed string in camelCase + */ +export const camelCase = (sentence: string): string => { + if (!sentence) return sentence; + return sentence + .replace(/(?:^\w|[A-Z]|\b\w)/g, (letter, index) => + index === 0 ? letter.toLowerCase() : letter.toUpperCase()) + .replace(/\s+/g, ''); +}; + +/** + * Converts text to snake_case format + * @param sentence - Input string to transform + * @returns Transformed string in snake_case + */ +export const snakeCase = (sentence: string): string => { + if (!sentence) return sentence; + return sentence + .replace(/\s+/g, '_') + .replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`) + .replace(/^_/, '') + .toLowerCase(); +}; + +/** + * Converts snake_case to camelCase + * @param sentence - Input string in snake_case + * @returns Transformed string in camelCase + */ +export const reverseSnakeCase = (sentence: string): string => { + if (!sentence) return sentence; + return sentence + .toLowerCase() + .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()); +}; + +/** + * Splits camelCase text into space-separated words + * @param sentence - Input string in camelCase + * @returns Space-separated string + */ +export const splitCamelCase = (sentence: string): string => { + if (!sentence) return sentence; + return sentence + .replace(/([a-z])([A-Z])/g, '$1 $2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2') + .trim(); +}; \ No newline at end of file diff --git a/src/strings/fileSize.ts b/src/strings/fileSize.ts new file mode 100644 index 0000000..e53b8ae --- /dev/null +++ b/src/strings/fileSize.ts @@ -0,0 +1,36 @@ +/** + * Converts bytes to human readable file size string with units + * @param bytes - Number of bytes to format + * @param si - Use SI units (1000) instead of binary units (1024) + * @param dp - Decimal places to display + * @returns Formatted string with appropriate unit suffix + */ +export function humanFileSize(bytes: number, si: boolean = false, dp: number = 1): string { + // Define base unit (1000 for SI, 1024 for binary) + const thresh: number = si ? 1000 : 1024; + + // Return bytes if below threshold + if (Math.abs(bytes) < thresh) { + return `${bytes} B`; + } + + // Define unit suffixes based on SI/binary preference + const units: string[] = si + ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] + : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; + + let u: number = -1; + const r: number = 10 ** dp; + + // Divide by threshold until result is less than threshold or we run out of units + do { + bytes /= thresh; + ++u; + } while ( + Math.round(Math.abs(bytes) * r) / r >= thresh && + u < units.length - 1 + ); + + // Format with specified decimal places and appropriate unit + return `${bytes.toFixed(dp)} ${units[u]}`; +} \ No newline at end of file diff --git a/src/strings/index.ts b/src/strings/index.ts new file mode 100644 index 0000000..4731f52 --- /dev/null +++ b/src/strings/index.ts @@ -0,0 +1,6 @@ +export * from './trim' +export * from './replace' +export * from './caseConversion' +export * from './locale' +export * from './fileSize' +export * from './legacy' \ No newline at end of file diff --git a/src/strings/legacy.ts b/src/strings/legacy.ts new file mode 100644 index 0000000..6232208 --- /dev/null +++ b/src/strings/legacy.ts @@ -0,0 +1,278 @@ + +/** + * Checks if a value exists in an array or matches a single value + * @param args - First argument is the source (array/value), followed by values to check + * @returns True if any subsequent argument matches source or exists in source array + */ +export function inop(...args: unknown[]): boolean { + if (args.length < 2) return false; + + const [source, ...searchValues] = args; + + // Handle array-like objects + if (source !== null && 'length' in (source as { length?: number })) { + const arr = Array.from(source as ArrayLike); + return searchValues.some(val => arr.includes(val)); + } + + // Handle single value comparison + return searchValues.some(val => source === val); + } + + /** + * Case-insensitive version of inop() for string comparisons + * @param args - First argument is source (string/array), followed by values to check + * @returns True if any subsequent argument matches source with case-insensitive comparison + */ + export function iinop(...args: unknown[]): boolean { + if (args.length < 2) return false; + + const [source, ...searchValues] = args; + + // Handle array-like objects + if (source !== null && 'length' in (source as { length?: number })) { + const arr = Array.from(source as ArrayLike); + return searchValues.some(val => { + return arr.some(item => { + if (typeof item === 'string' && typeof val === 'string') { + return item.toLowerCase() === val.toLowerCase(); + } + return item === val; + }); + }); + } + + // Handle single value comparison + if (typeof source === 'string') { + return searchValues.some(val => { + if (typeof val === 'string') { + return source.toLowerCase() === val.toLowerCase(); + } + return source === val; + }); + } + + return searchValues.some(val => source === val); + } + +/** + * Base date for Clarion date calculations (December 28, 1800) + */ +const CLARION_EPOCH = new Date(1800, 11, 28); + + /** + * Converts a Clarion integer time value to a formatted time string + * @param val - Clarion time value (HHMMSS.CC format where CC is centiseconds) + * @param detail - If true, includes centiseconds in output + * @returns Formatted time string (HH:MM:SS or HH:MM:SS.CC) + */ +export function clarionIntToTime(val: number, detail?: boolean): string { + // Ensure non-negative value + if (val < 0) { + val = 0; + } + + // Convert to seconds + const sec_num = val / 100; + + // Extract time components + const hours: number = Math.floor(val / 360000); + const minutes: number = Math.floor((sec_num - hours * 3600) / 60); + const seconds: number = Math.floor( + sec_num - hours * 3600 - minutes * 60 + ); + const ms: number = Math.floor( + val - hours * 360000 - minutes * 6000 - seconds * 100 + ); + + // Format time components with leading zeros + const paddedHours = hours.toString().padStart(2, '0'); + const paddedMinutes = minutes.toString().padStart(2, '0'); + const paddedSeconds = seconds.toString().padStart(2, '0'); + + // Handle centiseconds formatting + let msString: string; + if (ms < 10) { + msString = ms.toString() + '00'; + } else if (ms < 100) { + msString = ms.toString() + '0'; + } else { + msString = ms.toString(); + } + + // Return formatted time string + return detail + ? `${paddedHours}:${paddedMinutes}:${paddedSeconds}.${msString}` + : `${paddedHours}:${paddedMinutes}:${paddedSeconds}`; +} + +/** + * Converts a time string to a Clarion integer time value + * @param timeStr - Time string in format "HH:MM:SS" or "HH:MM:SS.CC" + * @returns Clarion time value (HHMMSS.CC format where CC is centiseconds) + * @throws Error if the time string format is invalid + */ +export function clarionTimeToInt(timeStr: string): number { + // Regular expressions to match both formats + const basicTimeRegex = /^(\d{2}):(\d{2}):(\d{2})$/; + const detailedTimeRegex = /^(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})$/; + + let hours: number; + let minutes: number; + let seconds: number; + let centiseconds: number = 0; + + // Try matching both formats + const basicMatch = timeStr.match(basicTimeRegex); + const detailedMatch = timeStr.match(detailedTimeRegex); + + if (detailedMatch) { + // Parse detailed time format (HH:MM:SS.CC) + [, hours, minutes, seconds, centiseconds] = detailedMatch.map(Number); + + // Handle different centisecond precision + if (centiseconds < 10) { + centiseconds *= 100; + } else if (centiseconds < 100) { + centiseconds *= 10; + } + } else if (basicMatch) { + // Parse basic time format (HH:MM:SS) + [, hours, minutes, seconds] = basicMatch.map(Number); + } else { + throw new Error('Invalid time format. Expected HH:MM:SS or HH:MM:SS.CC'); + } + + // Validate time components + if (hours >= 24 || minutes >= 60 || seconds >= 60 || centiseconds >= 1000) { + throw new Error('Invalid time values'); + } + + // Convert to Clarion integer format + return hours * 360000 + minutes * 6000 + seconds * 100 + centiseconds; +} + +/** + * Gets the current Clarion clock value (centiseconds since midnight) + * @returns Number of centiseconds since midnight + */ +export function clarionClock(): number { + // Get current date and midnight + const today = new Date(); + const midnight = new Date( + today.getFullYear(), + today.getMonth(), + today.getDate(), + 0, + 0, + 0, + 0 + ); + + // Calculate milliseconds since midnight + const millisecondsPassed = today.getTime() - midnight.getTime(); + + // Convert to centiseconds and add 1 (Clarion offset) + // Division by 10 converts milliseconds to centiseconds + return Math.floor(millisecondsPassed / 10 + 1); +} + + +/** + * Converts a JavaScript Date object to a Clarion date integer + * @param date - JavaScript Date object + * @returns Number of days since December 28, 1800 (Clarion date format) + */ +export function clarionDateToInt(date: Date): number { + // Clone the input date to avoid modifying it + const inputDate = new Date(date); + + // Set time to noon to avoid daylight saving time issues + inputDate.setHours(12, 0, 0, 0); + CLARION_EPOCH.setHours(12, 0, 0, 0); + + // Calculate days difference + const diffTime = inputDate.getTime() - CLARION_EPOCH.getTime(); + const diffDays = Math.round(diffTime / (1000 * 60 * 60 * 24)); + + return diffDays; +} + +/** + * Converts a Clarion date integer to a JavaScript Date object + * @param days - Number of days since December 28, 1800 (Clarion date format) + * @returns JavaScript Date object + */ +export function clarionIntToDate(days: number): Date { + // Create new date to avoid modifying the epoch constant + const resultDate = new Date(CLARION_EPOCH); + + // Set to noon to avoid daylight saving time issues + resultDate.setHours(12, 0, 0, 0); + + // Add the days + resultDate.setDate(CLARION_EPOCH.getDate() + days); + + return resultDate; +} + +/** + * Converts a date string to a Clarion date integer + * @param dateStr - Date string in format "YYYY-MM-DD" or "MM/DD/YYYY" + * @returns Number of days since December 28, 1800 (Clarion date format) + * @throws Error if the date string format is invalid + */ +export function clarionDateStringToInt(dateStr: string): number { + // Regular expressions for supported date formats + const isoFormatRegex = /^(\d{4})-(\d{2})-(\d{2})$/; // YYYY-MM-DD + const usFormatRegex = /^(\d{2})\/(\d{2})\/(\d{4})$/; // MM/DD/YYYY + + let year: number; + let month: number; + let day: number; + + const isoMatch = dateStr.match(isoFormatRegex); + const usMatch = dateStr.match(usFormatRegex); + + if (isoMatch) { + [, year, month, day] = isoMatch.map(Number); + month--; // JavaScript months are 0-based + } else if (usMatch) { + [, month, day, year] = usMatch.map(Number); + month--; // JavaScript months are 0-based + } else { + throw new Error('Invalid date format. Expected YYYY-MM-DD or MM/DD/YYYY'); + } + + // Validate date components + if (month < 0 || month > 11 || day < 1 || day > 31 || year < 1800) { + throw new Error('Invalid date values'); + } + + const date = new Date(year, month, day); + + // Check if the date is valid + if (date.getMonth() !== month || date.getDate() !== day) { + throw new Error('Invalid date'); + } + + return clarionDateToInt(date); +} + +/** + * Converts a Clarion date integer to a formatted date string + * @param days - Number of days since December 28, 1800 (Clarion date format) + * @param format - Output format ('iso' for YYYY-MM-DD or 'us' for MM/DD/YYYY) + * @returns Formatted date string + */ +export function clarionIntToDateString(days: number, format: 'iso' | 'us' = 'iso'): string { + const date = clarionIntToDate(days); + + const year = date.getFullYear(); + const month = (date.getMonth() + 1).toString().padStart(2, '0'); + const day = date.getDate().toString().padStart(2, '0'); + + return format === 'iso' + ? `${year}-${month}-${day}` + : `${month}/${day}/${year}`; +} diff --git a/src/strings/locale.ts b/src/strings/locale.ts new file mode 100644 index 0000000..a473eb5 --- /dev/null +++ b/src/strings/locale.ts @@ -0,0 +1,175 @@ +/** + * Comprehensive localization utilities for handling text, numbers, dates, and currencies + */ + +// type LocaleConfig = { +// dateFormat: string; +// numberFormat: { +// decimal: string; +// thousands: string; +// precision: number; +// }; +// currency: { +// symbol: string; +// position: 'prefix' | 'suffix'; +// }; +// pluralRules?: Intl.PluralRules; +// }; + + // const defaultConfig: LocaleConfig = { + // dateFormat: 'YYYY-MM-DD', + // numberFormat: { + // decimal: '.', + // thousands: ',', + // precision: 2 + // }, + // currency: { + // symbol: '$', + // position: 'prefix' + // } + // }; + + /** + * Formats a number according to locale settings + */ + export const formatNumber = ( + value: number, + locale: string, + options?: Intl.NumberFormatOptions + ): string => { + return new Intl.NumberFormat(locale, options).format(value); + }; + + /** + * Formats currency according to locale settings + */ + export const formatCurrency = ( + value: number, + locale: string, + currency: string + ): string => { + return new Intl.NumberFormat(locale, { + style: 'currency', + currency: currency + }).format(value); + }; + + /** + * Formats a date according to locale settings + */ + export const formatDate = ( + date: Date, + locale: string, + options?: Intl.DateTimeFormatOptions + ): string => { + return new Intl.DateTimeFormat(locale, options).format(date); + }; + + /** + * Formats relative time (e.g., "2 days ago") + */ + export const formatRelativeTime = ( + value: number, + unit: Intl.RelativeTimeFormatUnit, + locale: string + ): string => { + const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }); + return rtf.format(value, unit); + }; + + /** + * Handles plural forms based on locale rules + */ + export const getPlural = ( + count: number, + locale: string, + forms: { [key: string]: string } + ): string => { + const pluralRules = new Intl.PluralRules(locale); + const rule = pluralRules.select(count); + return forms[rule] || forms['other']; + }; + + /** + * Formats lists according to locale conventions + */ + export const formatList = ( + items: string[], + locale: string, + type: 'conjunction' | 'disjunction' = 'conjunction' + ): string => { + return new Intl.ListFormat(locale, { type }).format(items); + }; + + /** + * Compares strings according to locale rules + */ + export const compareStrings = ( + str1: string, + str2: string, + locale: string + ): number => { + return new Intl.Collator(locale).compare(str1, str2); + }; + + /** + * Formats percentages according to locale + */ + export const formatPercent = ( + value: number, + locale: string, + decimals: number = 0 + ): string => { + return new Intl.NumberFormat(locale, { + style: 'percent', + minimumFractionDigits: decimals, + maximumFractionDigits: decimals + }).format(value); + }; + + /** + * Formats units according to locale + */ + export const formatUnit = ( + value: number, + unit: string, + locale: string + ): string => { + return new Intl.NumberFormat(locale, { + style: 'unit', + unit: unit + }).format(value); + }; + + /** + * Converts number words to digits based on locale + */ + export const parseNumberWords = ( + text: string, + locale: string + ): number | null => { + const numberWords: { [key: string]: number } = { + zero: 0, one: 1, two: 2, three: 3, four: 4, + five: 5, six: 6, seven: 7, eight: 8, nine: 9 + }; + + const localizedWords = Object.keys(numberWords).map(word => + new Intl.NumberFormat(locale).format(numberWords[word]) + ); + + const normalized = text.toLowerCase(); + for (let i = 0; i < localizedWords.length; i++) { + if (normalized.includes(localizedWords[i].toLowerCase())) { + return i; + } + } + return null; + }; + + /** + * Handles bi-directional text + */ + export const handleBiDi = (text: string): string => { + // Add Unicode control characters for bi-directional text + return `\u202A${text}\u202C`; + }; \ No newline at end of file diff --git a/src/strings/replace.ts b/src/strings/replace.ts new file mode 100644 index 0000000..13a956e --- /dev/null +++ b/src/strings/replace.ts @@ -0,0 +1,72 @@ +// biome-rule-off + +// biome-disable lint/style/noInferrableTypes +/** + * Replaces a specific occurrence of a substring in a string + * @param {string} str - The input string + * @param {string} search - The string to search for + * @param {string} replacement - The string to replace with + * @param {number} [occurrence=1] - Which occurrence to replace (1-based). Defaults to first occurrence + * @returns {string} The string with the specified occurrence replaced + */ +export function replaceStr( + str: string, + search: string, + replacement: string, + // biome-ignore lint: Stupid biome Rule + occurrence: number = 1 +): string { + if (!str || !search || occurrence < 1) return str + + let currentIndex = 0 + let currentOccurrence = 0 + + while (currentIndex < str.length) { + const index = str.indexOf(search, currentIndex) + if (index === -1) break + + currentOccurrence++ + if (currentOccurrence === occurrence) { + return ( + str.slice(0, index) + replacement + str.slice(index + search.length) + ) + } + + currentIndex = index + 1 + } + + return str +} + +/** + * Replaces multiple occurrences of a substring in a string + * @param {string} str - The input string + * @param {string} search - The string to search for + * @param {string} replacement - The string to replace with + * @param {number} [times=Infinity] - Maximum number of replacements to make. Defaults to all occurrences + * @returns {string} The string with the specified number of occurrences replaced + */ +export function replaceStrAll( + str: string, + search: string, + replacement: string, + times: number = Number.POSITIVE_INFINITY +): string { + if (!str || !search || times < 1) return str + + let result = str + let currentIndex = 0 + let count = 0 + + while (currentIndex < result.length && count < times) { + const index = result.indexOf(search, currentIndex) + if (index === -1) break + + result = + result.slice(0, index) + replacement + result.slice(index + search.length) + currentIndex = index + replacement.length + count++ + } + + return result +} diff --git a/src/strings/trim.ts b/src/strings/trim.ts new file mode 100644 index 0000000..53c0083 --- /dev/null +++ b/src/strings/trim.ts @@ -0,0 +1,53 @@ +/** + * Trims specified characters from the left side of a string a specified number of times. + * @param {string} str - The input string to trim + * @param {string} [chars=' '] - The characters to trim (if multiple, any of them will be trimmed) + * @param {number} [times=Infinity] - Number of times to trim. Defaults to all occurrences + * @returns {string} The trimmed string + */ +export function trimLeft( + str: string, + // biome-ignore lint: Stupid biome Rule + chars: string = ' ', + times: number = Number.POSITIVE_INFINITY +): string { + if (!str) return str + + let count = 0 + let startIdx = 0 + const charSet = new Set(chars) + + while (startIdx < str.length && charSet.has(str[startIdx]) && count < times) { + startIdx++ + count++ + } + + return str.slice(startIdx) +} + +/** + * Trims specified characters from the right side of a string a specified number of times. + * @param {string} str - The input string to trim + * @param {string} [chars=' '] - The characters to trim (if multiple, any of them will be trimmed) + * @param {number} [times=Infinity] - Number of times to trim. Defaults to all occurrences + * @returns {string} The trimmed string + */ +export function trimRight( + str: string, + // biome-ignore lint: Stupid biome Rule + chars: string = ' ', + times: number = Number.POSITIVE_INFINITY +): string { + if (!str) return str + + let count = 0 + let endIdx = str.length - 1 + const charSet = new Set(chars) + + while (endIdx >= 0 && charSet.has(str[endIdx]) && count < times) { + endIdx-- + count++ + } + + return str.slice(0, endIdx + 1) +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..cddb272 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "declaration": true, + "target": "ES6", + "declarationDir": "./dist", + "moduleResolution": "node", + "lib": ["ES6", "DOM","ESNext"], + "emitDeclarationOnly": false + } +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..134694a --- /dev/null +++ b/vite.config.js @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import { resolve } from 'path'; +import dts from 'vite-plugin-dts'; // You'll need to install this + + +export default defineConfig({ + build: { + lib: { + entry: resolve(__dirname, 'src/index.ts'), + formats: ['es'], + fileName: 'index' + }, + rollupOptions: { + external: [ + 'fs', + 'path', + 'url', + 'chalk', + 'semver', + 'yargs', + 'yargs/helpers' + ] + }, + target: 'node16', + outDir: 'dist', + emptyOutDir: true, + sourcemap: true + }, plugins: [ + dts({ + insertTypesEntry: true, + outDir: 'dist' + }) + ] +}); \ No newline at end of file