diff --git a/drd-fs/.vscode/tasks.json b/drd-fs/.vscode/tasks.json index db6baff6..c5da4809 100644 --- a/drd-fs/.vscode/tasks.json +++ b/drd-fs/.vscode/tasks.json @@ -11,8 +11,7 @@ "isDefault": true }, "problemMatcher": [ - "$ts-webpack", - "$tslint-webpack" + "$tsc" ] }, { @@ -21,8 +20,7 @@ "group": "build", "isBackground": true, "problemMatcher": [ - "$ts-webpack-watch", - "$tslint-webpack-watch" + "$tsc-watch" ] } ] diff --git a/drd-fs/package-lock.json b/drd-fs/package-lock.json index 14a7dd19..c81a228a 100644 --- a/drd-fs/package-lock.json +++ b/drd-fs/package-lock.json @@ -11,32 +11,442 @@ "fast-xml-parser": "^5.2.5" }, "devDependencies": { - "@types/assert": "^1.5.11", - "@types/mocha": "^10.0.10", + "@types/node": "^20.0.0", "@types/vscode": "^1.103.0", - "@types/webpack-env": "^1.18.8", "@typescript-eslint/eslint-plugin": "^8.42.0", "@typescript-eslint/parser": "^8.42.0", - "@vscode/test-web": "^0.0.73", - "assert": "^2.1.0", + "esbuild": "^0.24.0", + "esbuild-register": "^3.5.0", "eslint": "^9.34.0", - "mocha": "^11.7.2", - "process": "^0.11.10", - "ts-loader": "^9.5.4", - "typescript": "^5.9.2", - "webpack": "^5.101.3", - "webpack-cli": "^6.0.1" + "typescript": "^5.9.2" }, "engines": { "vscode": "^1.103.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14.17.0" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -224,197 +634,20 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@koa/router": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.1", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "path-to-regexp": "^8.2.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@koa/router/node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@koa/router/node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", "engines": { @@ -433,50 +666,6 @@ "node": ">= 8" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/browser-chromium": { - "version": "1.55.0", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.55.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@types/assert": { - "version": "1.5.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "dev": true, @@ -487,17 +676,14 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { - "version": "24.3.1", + "version": "20.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/vscode": { @@ -505,11 +691,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/webpack-env": { - "version": "1.18.8", - "dev": true, - "license": "MIT" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.42.0", "dev": true, @@ -742,3906 +923,987 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vscode/test-web": { - "version": "0.0.73", + "node_modules/acorn": { + "version": "8.15.0", "dev": true, "license": "MIT", - "dependencies": { - "@koa/cors": "^5.0.0", - "@koa/router": "^14.0.0", - "@playwright/browser-chromium": "^1.55.0", - "gunzip-maybe": "^1.4.2", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "koa": "^3.0.1", - "koa-morgan": "^1.0.1", - "koa-mount": "^4.2.0", - "koa-static": "^5.0.0", - "minimist": "^1.2.8", - "playwright": "^1.55.0", - "tar-fs": "^3.1.0", - "tinyglobby": "0.2.14", - "vscode-uri": "^3.1.0" - }, "bin": { - "vscode-test-web": "out/server/index.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=20" + "node": ">=0.4.0" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", + "node_modules/acorn-jsx": { + "version": "5.3.2", "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", + "node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", + "node_modules/argparse": { + "version": "2.0.1", "dev": true, - "license": "MIT" + "license": "Python-2.0" }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", + "node_modules/balanced-match": { + "version": "1.0.2", "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", + "node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", + "node_modules/braces": { + "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", + "node_modules/callsites": { + "version": "3.1.0", "dev": true, "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "engines": { + "node": ">=6" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", + "node_modules/chalk": { + "version": "4.1.2", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", + "node_modules/color-convert": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", + "node_modules/color-name": { + "version": "1.1.4", "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } + "license": "MIT" }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", + "node_modules/concat-map": { + "version": "0.0.1", "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } + "license": "MIT" }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", + "node_modules/cross-spawn": { + "version": "7.0.6", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", + "node_modules/debug": { + "version": "4.4.1", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=18.12.0" + "node": ">=6.0" }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assert": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.6.1", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.2.3", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.2", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.7.0", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/browserslist": { - "version": "4.25.4", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001737", - "electron-to-chromium": "^1.5.211", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001741", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "12.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookies": { - "version": "0.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "7.0.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.214", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.14.0", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.35.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", - "@eslint/plugin-kit": "^0.3.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fast-xml-parser": { - "version": "5.2.5", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "dev": true, - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-deflate": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-gzip": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/keygrip": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/koa": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^1.3.8", - "content-disposition": "~0.5.4", - "content-type": "^1.0.5", - "cookies": "~0.9.1", - "delegates": "^1.0.0", - "destroy": "^1.2.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.5.0", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/koa-morgan": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "morgan": "^1.6.1" - } - }, - "node_modules/koa-mount": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.1", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa/node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/koa/node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/koa/node_modules/mime-db": { - "version": "1.54.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/mime-types": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/statuses": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mocha": { - "version": "11.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/morgan": { - "version": "1.10.1", - "dev": true, - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, - "node_modules/object-is": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "0.2.9", - "dev": true, - "license": "MIT" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/peek-stream": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.55.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.55.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.55.0", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randombytes/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" } }, - "node_modules/readdirp": { - "version": "4.1.2", + "node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">=10" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rechoir": { - "version": "0.8.0", + "node_modules/eslint": { + "version": "9.35.0", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.35.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/require-from-string": { - "version": "2.0.2", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/resolve": { - "version": "1.22.10", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.4.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "resolve-from": "^5.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/resolve-from": { - "version": "4.0.0", + "node_modules/espree": { + "version": "10.4.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/resolve-path": { - "version": "1.4.0", + "node_modules/esquery": { + "version": "1.6.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">=0.10" } }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", + "node_modules/esrecurse": { + "version": "4.3.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", + "node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/resolve-path/node_modules/inherits": { + "node_modules/esutils": { "version": "2.0.3", "dev": true, - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/fast-deep-equal": { + "version": "3.1.3", "dev": true, "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.1.0", + "node_modules/fast-glob": { + "version": "3.3.3", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6.0" } }, - "node_modules/schema-utils": { - "version": "4.3.2", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 6" } }, - "node_modules/semver": { - "version": "7.7.2", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/serialize-javascript": { - "version": "6.0.2", + "node_modules/fast-levenshtein": { + "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } + "license": "MIT" }, - "node_modules/set-function-length": { - "version": "1.2.2", - "dev": true, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "strnum": "^2.1.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", + "node_modules/fastq": { + "version": "1.19.1", "dev": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } }, - "node_modules/shallow-clone": { - "version": "3.0.1", + "node_modules/file-entry-cache": { + "version": "8.0.0", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/fill-range": { + "version": "7.1.1", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", + "node_modules/find-up": { + "version": "5.0.0", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/source-map": { - "version": "0.7.6", + "node_modules/flat-cache": { + "version": "4.0.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, "engines": { - "node": ">= 12" + "node": ">=16" } }, - "node_modules/source-map-support": { - "version": "0.5.21", + "node_modules/flatted": { + "version": "3.3.3", "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } + "license": "ISC" }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/statuses": { - "version": "1.5.0", + "node_modules/globals": { + "version": "14.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stream-shift": { - "version": "1.0.3", + "node_modules/graphemer": { + "version": "1.4.0", "dev": true, "license": "MIT" }, - "node_modules/streamx": { - "version": "2.22.1", + "node_modules/has-flag": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/ignore": { + "version": "5.3.2", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">= 4" } }, - "node_modules/string-width": { - "version": "4.2.3", + "node_modules/import-fresh": { + "version": "3.3.1", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", + "node_modules/is-number": { + "version": "7.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12.0" } }, - "node_modules/strnum": { - "version": "2.1.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" }, - "node_modules/supports-color": { - "version": "8.1.1", + "node_modules/js-yaml": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", + "node_modules/json-buffer": { + "version": "3.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.3", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } + "license": "MIT" }, - "node_modules/tar-fs": { - "version": "3.1.0", + "node_modules/keyv": { + "version": "4.5.4", "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "json-buffer": "3.0.1" } }, - "node_modules/tar-stream": { - "version": "3.1.7", + "node_modules/levn": { + "version": "0.4.1", "dev": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/terser": { - "version": "5.44.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", + "node_modules/lodash.merge": { + "version": "4.6.2", "dev": true, "license": "MIT" }, - "node_modules/text-decoder": { - "version": "1.2.3", + "node_modules/merge2": { + "version": "1.4.1", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "node_modules/through2": { - "version": "2.0.5", + "node_modules/micromatch": { + "version": "4.0.8", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/tinyglobby": { - "version": "0.2.14", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, "engines": { - "node": ">=12.0.0" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", + "node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-number": "^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8.0" + "node": "*" } }, - "node_modules/toidentifier": { - "version": "1.0.1", + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", "dev": true, "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, "engines": { - "node": ">=0.6" + "node": ">= 0.8.0" } }, - "node_modules/ts-api-utils": { - "version": "2.1.0", + "node_modules/p-limit": { + "version": "3.1.0", "dev": true, "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=18.12" + "node": ">=10" }, - "peerDependencies": { - "typescript": ">=4.8.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ts-loader": { - "version": "9.5.4", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.x" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-check": { - "version": "0.4.0", + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/type-is": { - "version": "2.0.1", + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.1", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8.0" } }, - "node_modules/typescript": { - "version": "5.9.2", + "node_modules/punycode": { + "version": "2.3.1", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=14.17" + "node": ">=6" } }, - "node_modules/undici-types": { - "version": "7.10.0", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", + "node_modules/queue-microtask": { + "version": "1.2.3", "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, "license": "MIT" }, - "node_modules/vary": { - "version": "1.1.2", + "node_modules/resolve-from": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/watchpack": { - "version": "2.4.4", + "node_modules/reusify": { + "version": "1.1.0", "dev": true, "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, "engines": { - "node": ">=10.13.0" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/webpack": { - "version": "5.101.3", + "node_modules/run-parallel": { + "version": "1.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "queue-microtask": "^1.2.2" } }, - "node_modules/webpack-cli": { - "version": "6.0.1", + "node_modules/semver": { + "version": "7.7.2", "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@webpack-cli/configtest": "^3.0.1", - "@webpack-cli/info": "^3.0.1", - "@webpack-cli/serve": "^3.0.1", - "colorette": "^2.0.14", - "commander": "^12.1.0", - "cross-spawn": "^7.0.3", - "envinfo": "^7.14.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^6.0.1" - }, + "license": "ISC", "bin": { - "webpack-cli": "bin/cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.82.0" - }, - "peerDependenciesMeta": { - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "node": ">=10" } }, - "node_modules/webpack-merge": { - "version": "6.0.1", + "node_modules/shebang-command": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/webpack-sources": { - "version": "3.3.3", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", + "node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "dev": true, + "node_modules/strnum": { + "version": "2.1.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT" }, - "node_modules/word-wrap": { - "version": "1.2.5", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/workerpool": { - "version": "9.3.3", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", + "node_modules/ts-api-utils": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", + "node_modules/type-check": { + "version": "0.4.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 0.8.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", + "node_modules/typescript": { + "version": "5.9.2", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=0.4" + "node": ">=14.17" } }, - "node_modules/y18n": { - "version": "5.0.8", + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/yargs": { - "version": "17.7.2", + "node_modules/uri-js": { + "version": "4.4.1", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "punycode": "^2.1.0" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", + "node_modules/which": { + "version": "2.0.2", "dev": true, "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", + "node_modules/word-wrap": { + "version": "1.2.5", "dev": true, "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, "node_modules/yocto-queue": { diff --git a/drd-fs/package.json b/drd-fs/package.json index 8c6f20ae..c2cc508f 100644 --- a/drd-fs/package.json +++ b/drd-fs/package.json @@ -11,10 +11,30 @@ "Other" ], "activationEvents": [ - "*" + "onFileSystem:memfs" ], - "browser": "./dist/web/extension.js", + "browser": "./dist/extension.js", "contributes": { + "commands": [ + { + "command": "extension.setEntrypoint", + "title": "Set Entrypoint" + } + ], + "menus": { + "commandPalette": [ + { + "command": "extension.setEntrypoint", + "when": "editorLangId == javascript" + } + ], + "explorer/context": [ + { + "command": "extension.setEntrypoint", + "group": "1_modification@1" + } + ] + }, "configuration": { "title": "Druid Filesystem", "properties": { @@ -27,31 +47,24 @@ } }, "scripts": { - "test": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=dist/web/test/suite/index.js", - "pretest": "yarn run compile-web", + "check:lint": "eslint src --max-warnings=0", + "check:type": "tsc", + "package-web": "node -r esbuild-register scripts/bundle.ts", + "compile-web": "node -r esbuild-register scripts/bundle.ts", + "watch-web": "node -r esbuild-register scripts/bundle.ts --watch", "vscode:prepublish": "yarn run package-web", - "compile-web": "webpack", - "watch-web": "webpack --watch", - "package-web": "webpack --mode production --devtool hidden-source-map", "lint": "eslint src", "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. ." }, "devDependencies": { - "@types/assert": "^1.5.11", - "@types/mocha": "^10.0.10", + "@types/node": "^20.0.0", "@types/vscode": "^1.103.0", - "@types/webpack-env": "^1.18.8", "@typescript-eslint/eslint-plugin": "^8.42.0", "@typescript-eslint/parser": "^8.42.0", - "@vscode/test-web": "^0.0.73", - "assert": "^2.1.0", + "esbuild": "^0.24.0", + "esbuild-register": "^3.5.0", "eslint": "^9.34.0", - "mocha": "^11.7.2", - "process": "^0.11.10", - "ts-loader": "^9.5.4", - "typescript": "^5.9.2", - "webpack": "^5.101.3", - "webpack-cli": "^6.0.1" + "typescript": "^5.9.2" }, "dependencies": { "fast-xml-parser": "^5.2.5" diff --git a/drd-fs/scripts/bundle.ts b/drd-fs/scripts/bundle.ts new file mode 100644 index 00000000..4b204816 --- /dev/null +++ b/drd-fs/scripts/bundle.ts @@ -0,0 +1,37 @@ +import assert from "assert"; +import { readFile } from "fs/promises"; +import path from "path"; +import * as esbuild from "esbuild"; + +type BuildFlags = { + watch?: boolean; +}; + +async function buildMain(flags: BuildFlags = {}) { + const options: esbuild.BuildOptions = { + entryPoints: ["./src/extension.ts"], + bundle: true, + outfile: "./dist/extension.js", + format: "cjs", + external: ["vscode"], + logLevel: "info", + }; + + if (flags.watch) { + const ctx = await esbuild.context(options); + + // Start watching for changes... + await ctx.watch(); + } else { + await esbuild.build(options); + } +} + +async function run() { + await buildMain({ watch: process.argv.includes("--watch") }); +} + +run().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/drd-fs/src/extension.ts b/drd-fs/src/extension.ts new file mode 100644 index 00000000..8a8a3547 --- /dev/null +++ b/drd-fs/src/extension.ts @@ -0,0 +1,249 @@ +import * as vscode from "vscode"; +import { MemFS } from "./memfs.js"; + +interface WebDavOptions { + webdavUrl: string; + basicAuthApikey?: string; + accessToken?: string; + prefix?: string; +} + +let memfs: MemFS | undefined; + +export function activate(context: vscode.ExtensionContext) { + console.log("Druid FS extension is now active!"); + + if (context.messagePassingProtocol) { + // IPC mode - for web embedding like Cloudflare + activateIPCMode(context); + } else { + // Direct WebDAV mode - for standalone extension usage + activateWebDavMode(context); + } +} + +function activateIPCMode(context: vscode.ExtensionContext) { + // Initialize MemFS for IPC mode + memfs = new MemFS(); + context.subscriptions.push(memfs); + + void vscode.commands.executeCommand("workbench.action.closeAllEditors"); + + // Create setEntrypoint customisation with the right click menu + context.subscriptions.push( + vscode.commands.registerCommand( + "extension.setEntrypoint", + async (event: vscode.Uri) => { + const filePath = + event.path ?? vscode.window.activeTextEditor?.document.fileName; + + if (filePath) { + context.messagePassingProtocol?.postMessage({ + type: "SetEntryPoint", + body: { + path: filePath, + }, + }); + } + } + ) + ); + + // Listen for messages from host + context.messagePassingProtocol?.onDidReceiveMessage(async (data) => { + if (data.type === "WorkerLoaded") { + console.log("WorkerLoaded", data.body); + await memfs?.seed(data.body); + + void vscode.commands.executeCommand( + "vscode.open", + vscode.Uri.parse(`memfs:/${data.body.name}/${data.body.entrypoint}`), + { preview: false } + ); + } + }); + + // Send ready signal + context.messagePassingProtocol?.postMessage({ type: "ready" }); +} + +async function activateWebDavMode(context: vscode.ExtensionContext) { + // Create MemFS instance for WebDAV without IPC + memfs = new MemFS(); + context.subscriptions.push(memfs); + + // Initialize credentials asynchronously + await initializeCredentials(context, memfs); + + async function initializeCredentials( + context: vscode.ExtensionContext, + memFs: MemFS + ) { + try { + // Get stored credentials + let apikey = await context.secrets.get("druidfsprovider.apikey"); + let accessToken = await context.secrets.get( + "druidfsprovider.accessToken" + ); + let webdavUrl = await context.secrets.get("druidfsprovider.webdavUrl"); + let pathPrefix = await context.secrets.get("druidfsprovider.pathPrefix"); + + // If we have credentials, configure the MemFS immediately + if (webdavUrl && (apikey || accessToken)) { + try { + await memFs.configureWebDav({ + webdavUrl, + basicAuthApikey: apikey, + accessToken, + prefix: pathPrefix, + }); + + // Add workspace folder if it's not already added + const existingFolder = vscode.workspace.workspaceFolders?.find( + (folder) => folder.uri.scheme === "memfs" + ); + if (!existingFolder) { + vscode.workspace.updateWorkspaceFolders(0, 0, { + uri: vscode.Uri.parse("memfs:/"), + name: "Druid - Filesystem", + }); + } + + vscode.window.showInformationMessage("Connected to remote server."); + } catch (error) { + console.error("Failed to connect to remote server:", error); + vscode.window.showErrorMessage( + `Failed to connect to remote server: ${error}` + ); + } + } + } catch (error) { + console.error("Failed to initialize credentials:", error); + } + } + + // Handle credential updates via message protocol if available + context.messagePassingProtocol?.onDidReceiveMessage(async (message) => { + console.log("Received message:", message); + if (message.type === "setCredentials") { + try { + vscode.window.showInformationMessage("Connecting to remote server..."); + + // Store credentials for future sessions + await context.secrets.store( + "druidfsprovider.apikey", + message.payload.apikey || "" + ); + await context.secrets.store( + "druidfsprovider.accessToken", + message.payload.accessToken || "" + ); + await context.secrets.store( + "druidfsprovider.webdavUrl", + message.payload.webdavUrl || "" + ); + await context.secrets.store( + "druidfsprovider.pathPrefix", + message.payload.pathPrefix || "" + ); + + // Update MemFS configuration + await memfs?.configureWebDav({ + webdavUrl: message.payload.webdavUrl, + basicAuthApikey: message.payload.apikey, + accessToken: message.payload.accessToken, + prefix: message.payload.pathPrefix, + }); + + // Add workspace folder if it's not already added + const existingFolder = vscode.workspace.workspaceFolders?.find( + (folder) => folder.uri.scheme === "memfs" + ); + if (!existingFolder) { + vscode.workspace.updateWorkspaceFolders(0, 0, { + uri: vscode.Uri.parse("memfs:/"), + name: "Druid - Filesystem", + }); + } + + vscode.window.showInformationMessage("Connected to remote server."); + } catch (error) { + console.error("Failed to connect to remote server:", error); + vscode.window.showErrorMessage( + `Failed to connect to remote server: ${error}` + ); + } + } + }); + + // Register command to set entry point for standalone mode + const setEntrypoint = vscode.commands.registerCommand( + "druidfsprovider.setEntrypoint", + async () => { + const webdavUrl = await vscode.window.showInputBox({ + prompt: "Enter WebDAV URL", + placeHolder: "https://example.com/webdav", + }); + + if (!webdavUrl) { + return; + } + + // Get API key from configuration or prompt user + const config = vscode.workspace.getConfiguration("druidfsprovider"); + let apikey = config.get("apikey"); + + if (!apikey) { + apikey = await vscode.window.showInputBox({ + prompt: "Enter API Key", + password: true, + }); + + if (!apikey) { + return; + } + + // Optionally save to configuration + const saveKey = await vscode.window.showQuickPick(["Yes", "No"], { + placeHolder: "Save API key to settings?", + }); + + if (saveKey === "Yes") { + await config.update( + "apikey", + apikey, + vscode.ConfigurationTarget.Global + ); + } + } + + // Configure WebDAV + const options: WebDavOptions = { + webdavUrl, + basicAuthApikey: apikey, + }; + + try { + await memfs?.configureWebDav(options); + vscode.window.showInformationMessage( + "WebDAV connection configured successfully!" + ); + + // Open the file system + const uri = vscode.Uri.parse("memfs:/"); + await vscode.commands.executeCommand("vscode.openFolder", uri); + } catch (error) { + vscode.window.showErrorMessage(`Failed to configure WebDAV: ${error}`); + } + } + ); + + context.subscriptions.push(setEntrypoint); + + // Signal ready if message protocol is available + context.messagePassingProtocol?.postMessage({ type: "ready" }); +} + +export function deactivate() { + memfs?.dispose(); +} diff --git a/drd-fs/src/memfs.ts b/drd-fs/src/memfs.ts new file mode 100644 index 00000000..7cfa9884 --- /dev/null +++ b/drd-fs/src/memfs.ts @@ -0,0 +1,791 @@ +// Adapted from https://github.com/microsoft/vscode-web-playground/blob/main/src/memfs.ts +// Original license: +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { + Disposable, + EventEmitter, + FileChangeType, + FilePermission, + FileSystemError, + FileType, + Position, + Range, + Uri, + workspace, +} from "vscode"; +import { XMLParser } from "fast-xml-parser"; +import type { + CancellationToken, + Event, + FileChangeEvent, + FileSearchOptions, + FileSearchProvider, + FileSearchQuery, + FileStat, + FileSystemProvider, + Progress, + ProviderResult, + TextSearchComplete, + TextSearchOptions, + TextSearchProvider, + TextSearchQuery, + TextSearchResult, +} from "vscode"; + +export interface WebDavOptions { + webdavUrl: string; + basicAuthApikey?: string; + accessToken?: string; + prefix?: string; +} + +// Type definitions for IPC messages +interface FileData { + path: string; + contents: Uint8Array; +} + +interface WorkerData { + name?: string; + files: FileData[]; + readOnly?: boolean; + entrypoint?: string; +} + +export class File implements FileStat { + type: FileType; + ctime: number; + mtime: number; + size: number; + + name: string; + data?: Uint8Array; + permissions?: FilePermission; + + constructor(public uri: Uri, name: string) { + this.type = FileType.File; + this.ctime = Date.now(); + this.mtime = Date.now(); + this.size = 0; + this.name = name; + } + public setReadOnly() { + this.permissions = FilePermission.Readonly; + } +} + +export class Directory implements FileStat { + type: FileType; + ctime: number; + mtime: number; + size: number; + + name: string; + entries: Map; + + constructor(public uri: Uri, name: string) { + this.type = FileType.Directory; + this.ctime = Date.now(); + this.mtime = Date.now(); + this.size = 0; + this.name = name; + this.entries = new Map(); + } +} + +export type Entry = File | Directory; +const encoder = new TextEncoder(); + +export class MemFS + implements + FileSystemProvider, + FileSearchProvider, + TextSearchProvider, + Disposable +{ + static scheme = "memfs"; + private rootFolder = "memfs:/worker"; + private webdavOptions?: WebDavOptions; + private _isWebDavInitialized = false; + + private readonly disposable: Disposable; + + private readRoot: ((value: [string, FileType][]) => void) | null = null; + + constructor() { + this.disposable = Disposable.from( + workspace.registerFileSystemProvider(MemFS.scheme, this, { + isCaseSensitive: true, + }), + workspace.registerFileSearchProvider(MemFS.scheme, this), + workspace.registerTextSearchProvider(MemFS.scheme, this) + ); + } + + dispose() { + this.disposable?.dispose(); + } + + // IPC Mode: Seed with data from host + async seed(files: WorkerData) { + this.rootFolder = files.name ?? this.rootFolder; + this.createDirectory(Uri.parse(`memfs:/${this.rootFolder}/`)); + + for (const file of files.files) { + this.writeFile( + Uri.parse(`memfs:/${this.rootFolder}${file.path}`), + file.contents, + { + create: true, + overwrite: true, + readOnly: files.readOnly, + suppressChannelUpdate: true, + } + ); + } + + if (this.readRoot) { + this.readRoot( + files.files.map((file: FileData) => [ + file.path.substring(1), // Remove leading slash + FileType.File, + ]) + ); + this.readRoot = null; + } + } + + // WebDAV Mode: Configure WebDAV connection + async configureWebDav(options: WebDavOptions) { + this.webdavOptions = { + ...options, + webdavUrl: options.webdavUrl.replace(/\/$/, ""), // Remove trailing slash + }; + this._isWebDavInitialized = true; + + // Test the connection + await this.readDavDirectory("/"); + + // Fire change events to refresh any open files + this._emitter.fire([ + { + type: FileChangeType.Changed, + uri: Uri.parse("memfs:/"), + }, + ]); + } + + private async waitForWebDavInitialization( + maxWaitMs: number = 10000 + ): Promise { + const startTime = Date.now(); + while (!this._isWebDavInitialized && Date.now() - startTime < maxWaitMs) { + await new Promise((resolve) => setTimeout(resolve, 100)); + } + if (!this._isWebDavInitialized) { + throw FileSystemError.Unavailable( + "WebDAV file system not yet initialized. Please configure credentials first." + ); + } + } + + private getAuthHeader() { + if (this.webdavOptions?.accessToken) { + return "Bearer " + this.webdavOptions.accessToken; + } + if (this.webdavOptions?.basicAuthApikey) { + const username = "apikey"; + const password = this.webdavOptions.basicAuthApikey; + return "Basic " + btoa(username + ":" + password); + } + return undefined; + } + + async davRequest(path: string, options: RequestInit) { + await this.waitForWebDavInitialization(); + + const authHeader = this.getAuthHeader(); + const { prefix = "" } = this.webdavOptions || {}; + const base = this.webdavOptions!.webdavUrl + prefix; + + const req = await fetch(base + path, { + ...options, + headers: new Headers({ + ...(options.headers || {}), + ...(authHeader ? { Authorization: authHeader } : {}), + }), + }); + + if (req.status === 404) { + throw FileSystemError.FileNotFound(); + } + + if (!req.ok) { + throw new Error("Failed to read directory"); + } + return req; + } + + async readDavDirectory(path = "/") { + const req = await this.davRequest(path, { + headers: { + Depth: "1", + }, + method: "PROPFIND", + body: ` + + + + + + +`, + }); + + const text = await req.text(); + const parser = new XMLParser(); + const obj = parser.parse(text); + let list = obj["D:multistatus"]["D:response"]; + + if (!Array.isArray(list)) { + list = [list]; + } + + return list.map((item: any) => { + const href = item["D:href"]; + let propstat = item["D:propstat"]; + + if (!Array.isArray(propstat)) { + propstat = [propstat]; + } + + const isDir = !!propstat.find((ps: any) => { + return ps["D:prop"]?.["D:resourcetype"]?.["D:collection"] !== undefined; + }); + + let size = undefined; + if (!isDir) { + const sizeNode = propstat.find((ps: any) => { + return ps["D:prop"]?.["D:getcontentlength"] !== undefined; + }); + if (sizeNode) { + size = sizeNode["D:prop"]["D:getcontentlength"]; + } else { + size = 0; + } + } + + return { + href: href, + size: size, + isDir: isDir, + }; + }) as any[]; + } + + root = new Directory(Uri.parse("memfs:/"), ""); + + async stat(uri: Uri): Promise { + if (this._isWebDavInitialized) { + // WebDAV mode + const data = await this.readDavDirectory(uri.path); + if (data[0]) { + return { + type: !data[0]?.isDir ? FileType.File : FileType.Directory, + ctime: 0, + mtime: 0, + size: data[0]?.size || 0, + }; + } + throw FileSystemError.FileNotFound(); + } else { + // IPC mode + return this._lookup(uri, false); + } + } + + async readDirectory(uri: Uri): Promise<[string, FileType][]> { + if (this._isWebDavInitialized) { + // WebDAV mode + const list = await this.readDavDirectory(uri.path); + const { prefix = "" } = this.webdavOptions || {}; + const filtered = list + .filter((item) => !prefix || item.href !== prefix) + .filter((item) => !prefix || item.href !== prefix + "/") + .filter((item) => item.href !== prefix + uri.path) + .filter((item) => item.href !== prefix + uri.path + "/"); + + return filtered.map((item) => { + let fullpath = item.href; + if (fullpath.endsWith("/")) { + fullpath = fullpath.slice(0, -1); + } + return [ + fullpath.split("/").pop(), + !item.isDir ? FileType.File : FileType.Directory, + ] as [string, FileType]; + }); + } else { + // IPC mode + const entry = this._lookup(uri, false); + if (entry instanceof Directory) { + const result: [string, FileType][] = []; + for (const [name, child] of entry.entries) { + result.push([name, child.type]); + } + return result; + } + + // Handle special case for root when not yet seeded + if (uri.path === "/" && this.readRoot === null) { + return new Promise((resolve) => { + this.readRoot = resolve; + }); + } + + throw FileSystemError.FileNotADirectory(uri); + } + } + + async readFile(uri: Uri): Promise { + if (this._isWebDavInitialized) { + // WebDAV mode + const res = await this.davRequest(uri.path, { + method: "GET", + body: undefined, + }); + const arrayBuffer = await res.arrayBuffer(); + return new Uint8Array(arrayBuffer); + } else { + // IPC mode + const data = this._lookup(uri, false); + if (data instanceof File) { + return data.data ?? new Uint8Array(); + } + throw FileSystemError.FileIsADirectory(uri); + } + } + + writeFile( + uri: Uri, + content: Uint8Array, + options: { + create: boolean; + overwrite: boolean; + readOnly?: boolean; + suppressChannelUpdate?: boolean; + } + ): void { + if (this._isWebDavInitialized) { + // WebDAV mode - async operation + this.writeFileWebDav(uri, content, options); + } else { + // IPC mode - sync operation + this.writeFileIPC(uri, content, options); + } + } + + private async writeFileWebDav( + uri: Uri, + content: Uint8Array, + options: { create: boolean; overwrite: boolean } + ) { + await this.davRequest(uri.path, { + method: "PUT", + body: content as any, + }); + this._fireSoon({ type: FileChangeType.Changed, uri }); + } + + private writeFileIPC( + uri: Uri, + content: Uint8Array, + options: { + create: boolean; + overwrite: boolean; + readOnly?: boolean; + suppressChannelUpdate?: boolean; + } + ): void { + const basename = this._basename(uri.path); + const parent = this._lookupParentDirectory(uri); + let entry = parent.entries.get(basename); + if (entry instanceof Directory) { + throw FileSystemError.FileIsADirectory(uri); + } + if (!entry && !options.create) { + throw FileSystemError.FileNotFound(uri); + } + if (entry && options.create && !options.overwrite) { + throw FileSystemError.FileExists(uri); + } + if (!entry) { + entry = new File(uri, basename); + parent.entries.set(basename, entry); + this._fireSoon({ type: FileChangeType.Created, uri }); + } + entry.mtime = Date.now(); + entry.size = content.byteLength; + entry.data = content; + + if (options.readOnly) { + entry.setReadOnly(); + } + + this._fireSoon({ type: FileChangeType.Changed, uri }); + + // Note: IPC updates are handled by the extension context, not here + } + + rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): void { + if (this._isWebDavInitialized) { + // WebDAV mode + this.renameWebDav(oldUri, newUri, options); + } else { + // IPC mode + this.renameIPC(oldUri, newUri, options); + } + } + + private async renameWebDav( + oldUri: Uri, + newUri: Uri, + options: { overwrite: boolean } + ) { + const { prefix = "" } = this.webdavOptions || {}; + await this.davRequest(oldUri.path, { + method: "MOVE", + headers: { + Destination: prefix + newUri.path, + }, + }); + this._fireSoon( + { type: FileChangeType.Deleted, uri: oldUri }, + { type: FileChangeType.Created, uri: newUri } + ); + } + + private renameIPC( + oldUri: Uri, + newUri: Uri, + options: { overwrite: boolean } + ): void { + if (!options.overwrite && this._lookup(newUri, true)) { + throw FileSystemError.FileExists(newUri); + } + + const entry = this._lookup(oldUri, false); + const oldParent = this._lookupParentDirectory(oldUri); + + const newParent = this._lookupParentDirectory(newUri); + const newName = this._basename(newUri.path); + + oldParent.entries.delete(entry.name); + entry.name = newName; + newParent.entries.set(newName, entry); + + this._fireSoon( + { type: FileChangeType.Deleted, uri: oldUri }, + { type: FileChangeType.Created, uri: newUri } + ); + } + + delete(uri: Uri): void { + if (this._isWebDavInitialized) { + // WebDAV mode + this.deleteWebDav(uri); + } else { + // IPC mode + this.deleteIPC(uri); + } + } + + private async deleteWebDav(uri: Uri) { + await this.davRequest(uri.path, { + method: "DELETE", + }); + this._fireSoon({ type: FileChangeType.Deleted, uri }); + } + + private deleteIPC(uri: Uri): void { + const dirname = uri.with({ path: this._dirname(uri.path) }); + const basename = this._basename(uri.path); + const parent = this._lookupAsDirectory(dirname, false); + if (!parent.entries.has(basename)) { + throw FileSystemError.FileNotFound(uri); + } + parent.entries.delete(basename); + parent.mtime = Date.now(); + parent.size -= 1; + this._fireSoon( + { type: FileChangeType.Changed, uri: dirname }, + { type: FileChangeType.Deleted, uri } + ); + + // Note: IPC delete updates are handled by the extension context, not here + } + + createDirectory(uri: Uri): void { + if (this._isWebDavInitialized) { + // WebDAV mode + this.createDirectoryWebDav(uri); + } else { + // IPC mode + this.createDirectoryIPC(uri); + } + } + + private async createDirectoryWebDav(uri: Uri) { + await this.davRequest(uri.path, { + method: "MKCOL", + }); + this._fireSoon({ type: FileChangeType.Created, uri }); + } + + private createDirectoryIPC(uri: Uri): void { + const basename = this._basename(uri.path); + const dirname = uri.with({ path: this._dirname(uri.path) }); + const parent = this._lookupAsDirectory(dirname, false); + + const entry = new Directory(uri, basename); + parent.entries.set(entry.name, entry); + parent.mtime = Date.now(); + parent.size += 1; + this._fireSoon( + { type: FileChangeType.Changed, uri: dirname }, + { type: FileChangeType.Created, uri } + ); + } + + // --- lookup (IPC mode only) + + private _lookup(uri: Uri, silent: false): Entry; + private _lookup(uri: Uri, silent: boolean): Entry | undefined; + private _lookup(uri: Uri, silent: boolean): Entry | undefined { + const parts = uri.path.split("/"); + let entry: Entry = this.root; + for (const part of parts) { + if (!part) { + continue; + } + let child: Entry | undefined; + if (entry instanceof Directory) { + child = entry.entries.get(part); + } + if (!child) { + if (!silent) { + throw FileSystemError.FileNotFound(uri); + } else { + return undefined; + } + } + entry = child; + } + return entry; + } + + private _lookupAsDirectory(uri: Uri, silent: boolean): Directory { + const entry = this._lookup(uri, silent); + if (entry instanceof Directory) { + return entry; + } + throw FileSystemError.FileNotADirectory(uri); + } + + private _lookupAsFile(uri: Uri, silent: boolean): File { + const entry = this._lookup(uri, silent); + if (entry instanceof File) { + return entry; + } + throw FileSystemError.FileIsADirectory(uri); + } + + private _lookupParentDirectory(uri: Uri): Directory { + const dirname = uri.with({ path: this._dirname(uri.path) }); + return this._lookupAsDirectory(dirname, false); + } + + // --- manage file events + + private _emitter = new EventEmitter(); + private _bufferedEvents: FileChangeEvent[] = []; + private _fireSoonHandle?: unknown; + + readonly onDidChangeFile: Event = this._emitter.event; + + watch(_resource: Uri): Disposable { + // ignore, fires for all changes... + return new Disposable(() => {}); + } + + private _fireSoon(...events: FileChangeEvent[]): void { + this._bufferedEvents.push(...events); + + if (this._fireSoonHandle) { + clearTimeout(this._fireSoonHandle as number); + } + + this._fireSoonHandle = setTimeout(() => { + this._emitter.fire(this._bufferedEvents); + this._bufferedEvents.length = 0; + }, 5); + } + + private _basename(path: string): string { + path = this._rtrim(path, "/"); + if (!path) { + return ""; + } + + return path.substr(path.lastIndexOf("/") + 1); + } + + private _dirname(path: string): string { + path = this._rtrim(path, "/"); + if (!path) { + return "/"; + } + + return path.substr(0, path.lastIndexOf("/")); + } + + private _rtrim(haystack: string, needle: string): string { + if (!haystack || !needle) { + return haystack; + } + + const needleLen = needle.length, + haystackLen = haystack.length; + + if (needleLen === 0 || haystackLen === 0) { + return haystack; + } + + let offset = haystackLen, + idx = -1; + + while (true) { + idx = haystack.lastIndexOf(needle, offset - 1); + if (idx === -1 || idx + needleLen !== offset) { + break; + } + if (idx === 0) { + return ""; + } + offset = idx; + } + + return haystack.substring(0, offset); + } + + private _getFiles(): Set { + const files = new Set(); + + this._doGetFiles(this.root, files); + + return files; + } + + private _doGetFiles(dir: Directory, files: Set): void { + dir.entries.forEach((entry) => { + if (entry instanceof File) { + files.add(entry); + } else { + this._doGetFiles(entry, files); + } + }); + } + + private _convertSimple2RegExpPattern(pattern: string): string { + return pattern + .replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, "\\$&") + .replace(/[\*]/g, ".*"); + } + + // --- search provider + + provideFileSearchResults( + query: FileSearchQuery, + _options: FileSearchOptions, + _token: CancellationToken + ): ProviderResult { + return this._findFiles(query.pattern, []); + } + + private _findFiles(query: string | undefined, excludes: string[]): Uri[] { + const files = this._getFiles(); + + const result: Uri[] = []; + + const pattern = query + ? new RegExp(this._convertSimple2RegExpPattern(query)) + : null; + + for (const file of files) { + if (!pattern || pattern.exec(file.name)) { + let include = true; + for (const exclude of excludes) { + const excludePattern = new RegExp( + this._convertSimple2RegExpPattern(exclude) + ); + if (excludePattern.exec(file.name)) { + include = false; + break; + } + } + + if (include) { + result.push(file.uri); + } + } + } + + return result; + } + + private _textDecoder = new TextDecoder(); + + async provideTextSearchResults( + query: TextSearchQuery, + options: TextSearchOptions, + progress: Progress, + _token: CancellationToken + ) { + const results: TextSearchComplete = { limitHit: false }; + + const files = this._findFiles(options.includes[0], options.excludes); + if (files) { + for (const file of files) { + const content = this._textDecoder.decode(await this.readFile(file)); + + const lines = content.split("\n"); + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const index = line.indexOf(query.pattern); + if (index !== -1) { + progress.report({ + uri: file, + ranges: new Range( + new Position(i, index), + new Position(i, index + query.pattern.length) + ), + preview: { + text: line, + matches: new Range( + new Position(0, index), + new Position(0, index + query.pattern.length) + ), + }, + }); + } + } + } + } + + return results; + } +} diff --git a/drd-fs/src/web/extension.ts b/drd-fs/src/web/extension.ts deleted file mode 100644 index 0db0ac5d..00000000 --- a/drd-fs/src/web/extension.ts +++ /dev/null @@ -1,130 +0,0 @@ -// The module 'vscode' contains the VS Code extensibility API -// Import the module and reference it with the alias vscode in your code below -import * as vscode from "vscode"; -import { MemFS, WebDavOptions } from "./memfs"; - -export async function activate(context: vscode.ExtensionContext) { - console.log("Druid FS extension is now active!"); - // Create MemFS instance without auto-registration - const memFs = new MemFS("", {}); // Start with empty URL and credentials - - // Register the file system provider immediately - const fsRegistration = vscode.workspace.registerFileSystemProvider( - "memfs", - memFs, - { - isCaseSensitive: true, - } - ); - context.subscriptions.push(fsRegistration); - context.subscriptions.push(memFs); - - // Initialize credentials asynchronously and allow file operations to wait - initializeCredentials(); - - async function initializeCredentials() { - try { - // Get stored credentials - let apikey = await context.secrets.get("druidfsprovider.apikey"); - let accessToken = await context.secrets.get( - "druidfsprovider.accessToken" - ); - let webdavUrl = await context.secrets.get("druidfsprovider.webdavUrl"); - let pathPrefix = await context.secrets.get("druidfsprovider.pathPrefix"); - - // If we have credentials, configure the MemFS immediately - if (webdavUrl && (apikey || accessToken)) { - try { - memFs.webdavUrl = webdavUrl; - await memFs.updateCredentials({ - basicAuthApikey: apikey, - accessToken, - prefix: pathPrefix, - }); - await memFs.readDavDirectory("/"); - - // Add workspace folder if it's not already added - const existingFolder = vscode.workspace.workspaceFolders?.find( - (folder) => folder.uri.scheme === "memfs" - ); - if (!existingFolder) { - vscode.workspace.updateWorkspaceFolders(0, 0, { - uri: vscode.Uri.parse("memfs:/"), - name: "Druid - Filesystem", - }); - } - - vscode.window.showInformationMessage("Connected to remote server."); - } catch (error) { - console.error("Failed to connect to remote server:", error); - vscode.window.showErrorMessage( - `Failed to connect to remote server: ${error}` - ); - } - } - } catch (error) { - console.error("Failed to initialize credentials:", error); - } - } - - context.messagePassingProtocol?.postMessage({ type: "ready" }); - - context.messagePassingProtocol?.onDidReceiveMessage(async (message) => { - console.log("Received message:", message); - if (message.type === "setCredentials") { - try { - vscode.window.showInformationMessage("Connecting to remote server..."); - - // Store credentials for future sessions - await context.secrets.store( - "druidfsprovider.apikey", - message.payload.apikey || "" - ); - await context.secrets.store( - "druidfsprovider.accessToken", - message.payload.accessToken || "" - ); - await context.secrets.store( - "druidfsprovider.webdavUrl", - message.payload.webdavUrl || "" - ); - await context.secrets.store( - "druidfsprovider.pathPrefix", - message.payload.pathPrefix || "" - ); - - // Update credentials and URL - memFs.webdavUrl = message.payload.webdavUrl as string; - await memFs.updateCredentials({ - basicAuthApikey: message.payload.apikey, - accessToken: message.payload.accessToken, - prefix: message.payload.pathPrefix, - }); - - // Test the connection - await memFs.readDavDirectory("/"); - - // Add workspace folder if it's not already added - const existingFolder = vscode.workspace.workspaceFolders?.find( - (folder) => folder.uri.scheme === "memfs" - ); - if (!existingFolder) { - vscode.workspace.updateWorkspaceFolders(0, 0, { - uri: vscode.Uri.parse("memfs:/"), - name: "Druid - Filesystem", - }); - } - - vscode.window.showInformationMessage("Connected to remote server."); - } catch (error) { - console.error("Failed to connect to remote server:", error); - vscode.window.showErrorMessage( - `Failed to connect to remote server: ${error}` - ); - } - } - }); -} - -// This method is called when your extension is deactivated -export function deactivate() {} diff --git a/drd-fs/src/web/memfs.ts b/drd-fs/src/web/memfs.ts deleted file mode 100644 index 3913a558..00000000 --- a/drd-fs/src/web/memfs.ts +++ /dev/null @@ -1,334 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { - Disposable, - EventEmitter, - FileChangeEvent, - FileChangeType, - FileStat, - FileSystemError, - FileSystemProvider, - FileType, - Uri, -} from "vscode"; - -import { XMLParser } from "fast-xml-parser"; - -export interface WebDavOptions { - basicAuthApikey?: string; - accessToken?: string; - prefix?: string; -} - -export class File implements FileStat { - type: FileType; - ctime: number; - mtime: number; - size: number; - - name: string; - data?: Uint8Array; - - constructor(public uri: Uri, name: string) { - this.type = FileType.File; - this.ctime = Date.now(); - this.mtime = Date.now(); - this.size = 0; - this.name = name; - } -} - -export class Directory implements FileStat { - type: FileType; - ctime: number; - mtime: number; - size: number; - - name: string; - entries: Map; - - constructor(public uri: Uri, name: string) { - this.type = FileType.Directory; - this.ctime = Date.now(); - this.mtime = Date.now(); - this.size = 0; - this.name = name; - this.entries = new Map(); - } -} - -export type Entry = File | Directory; - -export class MemFS implements FileSystemProvider, Disposable { - static scheme = "memfs"; - private wedavUrl: string; - private _isInitialized = false; - private _emitter = new EventEmitter(); - private readonly disposables: Disposable[] = []; - - get webdavUrl(): string { - return this.wedavUrl; - } - - set webdavUrl(value: string) { - this.wedavUrl = value.replace(/\/$/, ""); - } - - constructor(wedavUrl: string, private webdavOptions?: WebDavOptions) { - //set the webdav url but strip the trailing slash, if any - this.wedavUrl = wedavUrl.replace(/\/$/, ""); - this.disposables.push(this._emitter); - - // Mark as initialized if we have both URL and credentials - this._isInitialized = !!( - wedavUrl && - (webdavOptions?.basicAuthApikey || webdavOptions?.accessToken) - ); - } - - dispose() { - this.disposables.forEach((d) => d.dispose()); - } - - private async waitForInitialization( - maxWaitMs: number = 10000 - ): Promise { - const startTime = Date.now(); - while (!this._isInitialized && Date.now() - startTime < maxWaitMs) { - await new Promise((resolve) => setTimeout(resolve, 100)); - } - if (!this._isInitialized) { - throw FileSystemError.Unavailable( - "File system not yet initialized. Please configure credentials first." - ); - } - } - - private getAuthHeader() { - if (this.webdavOptions?.accessToken) { - return "Bearer " + this.webdavOptions.accessToken; - } - if (this.webdavOptions?.basicAuthApikey) { - const username = "apikey"; - const password = this.webdavOptions.basicAuthApikey; - return "Basic " + btoa(username + ":" + password); - } - return undefined; - } - - async davRequest(path: string, options: RequestInit) { - const authHeader = this.getAuthHeader(); - - const { prefix = "" } = this.webdavOptions || {}; - - const base = this.wedavUrl + prefix; - - const req = await fetch(base + path, { - ...options, - headers: new Headers({ - ...(options.headers || {}), - ...(authHeader ? { Authorization: authHeader } : {}), - }), - }); - - if (req.status === 404) { - throw FileSystemError.FileNotFound(); - } - - if (!req.ok) { - throw new Error("Failed to read directory"); - } - return req; - } - - async readDavDirectory(path = "/") { - const req = await this.davRequest(path, { - headers: { - Depth: "1", - }, - method: "PROPFIND", - body: ` - - - - - - -`, - }); - - const text = await req.text(); - const parser = new XMLParser(); - //xmt to js object - const obj = parser.parse(text); - //console.log(obj); - //debugger; - let list = obj["D:multistatus"]["D:response"]; - - if (!Array.isArray(list)) { - list = [list]; - } - - //console.log(list); - return list.map((item: any) => { - const href = item["D:href"]; - let propstat = item["D:propstat"]; - - if (!Array.isArray(propstat)) { - propstat = [propstat]; - } - - const isDir = !!propstat.find((ps: any) => { - return ps["D:prop"]?.["D:resourcetype"]?.["D:collection"] !== undefined; - }); - - let size = undefined; - if (!isDir) { - const sizeNode = propstat.find((ps: any) => { - return ps["D:prop"]?.["D:getcontentlength"] !== undefined; - }); - if (sizeNode) { - size = sizeNode["D:prop"]["D:getcontentlength"]; - } else { - size = 0; - } - } - - return { - href: href, - size: size, - isDir: isDir, - }; - }) as any[]; - } - - root = new Directory(Uri.parse("memfs:/"), ""); - - async stat(uri: Uri): Promise { - await this.waitForInitialization(); - const data = await this.readDavDirectory(uri.path); - - if (data[0]) { - return { - type: !data[0]?.isDir ? FileType.File : FileType.Directory, - ctime: 0, - mtime: 0, - size: data[0]?.size || 0, - }; - } - throw FileSystemError.FileNotFound(); - } - - async readDirectory(uri: Uri): Promise<[string, FileType][]> { - await this.waitForInitialization(); - const list = await this.readDavDirectory(uri.path); - - const { prefix = "" } = this.webdavOptions || {}; - const filtered = list - .filter((item) => !prefix || item.href !== prefix) - .filter((item) => !prefix || item.href !== prefix + "/") - .filter((item) => item.href !== prefix + uri.path) - .filter((item) => item.href !== prefix + uri.path + "/"); - - return filtered.map((item) => { - let fullpath = item.href; - - if (fullpath.endsWith("/")) { - fullpath = fullpath.slice(0, -1); - } - - return [ - fullpath.split("/").pop(), - !item.isDir ? FileType.File : FileType.Directory, - ] as [string, FileType]; - }); - } - - // --- manage file contents - - async readFile(uri: Uri): Promise { - await this.waitForInitialization(); - const res = await this.davRequest(uri.path, { - method: "GET", - body: undefined, - }); - - const arrayBuffer = await res.arrayBuffer(); - return new Uint8Array(arrayBuffer); - } - - async writeFile( - uri: Uri, - content: Uint8Array, - options: { create: boolean; overwrite: boolean } - ) { - await this.waitForInitialization(); - await this.davRequest(uri.path, { - method: "PUT", - body: content as any, - }); - } - - // --- manage files/folders - - async rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }) { - await this.waitForInitialization(); - const { prefix = "" } = this.webdavOptions || {}; - - await this.davRequest(oldUri.path, { - method: "MOVE", - headers: { - Destination: prefix + newUri.path, - }, - }); - } - - async delete(uri: Uri) { - await this.waitForInitialization(); - await this.davRequest(uri.path, { - method: "DELETE", - }); - } - - async createDirectory(uri: Uri) { - await this.waitForInitialization(); - await this.davRequest(uri.path, { - method: "MKCOL", - }); - } - - async updateCredentials(options: WebDavOptions) { - this.webdavOptions = options; - this._isInitialized = !!( - this.wedavUrl && - (options.basicAuthApikey || options.accessToken) - ); - - if (this._isInitialized) { - // Fire change events to refresh any open files - this._emitter.fire([ - { - type: FileChangeType.Changed, - uri: Uri.parse("memfs:/"), - }, - ]); - } - } - - get onDidChangeFile() { - return this._emitter.event; - } - - watch( - uri: Uri, - options: { - readonly recursive: boolean; - readonly excludes: readonly string[]; - } - ): Disposable { - return new Disposable(() => {}); - } -} diff --git a/drd-fs/src/web/test/suite/extension.test.ts b/drd-fs/src/web/test/suite/extension.test.ts deleted file mode 100644 index 7e022bc4..00000000 --- a/drd-fs/src/web/test/suite/extension.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as assert from 'assert'; - -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -import * as vscode from 'vscode'; -// import * as myExtension from '../../extension'; - -suite('Web Extension Test Suite', () => { - vscode.window.showInformationMessage('Start all tests.'); - - test('Sample test', () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)); - assert.strictEqual(-1, [1, 2, 3].indexOf(0)); - }); -}); diff --git a/drd-fs/src/web/test/suite/index.ts b/drd-fs/src/web/test/suite/index.ts deleted file mode 100644 index 16881309..00000000 --- a/drd-fs/src/web/test/suite/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Imports mocha for the browser, defining the `mocha` global. -require('mocha/mocha'); - -export function run(): Promise { - - return new Promise((c, e) => { - mocha.setup({ - ui: 'tdd', - reporter: undefined - }); - - // Bundles all files in the current directory matching `*.test` - const importAll = (r: __WebpackModuleApi.RequireContext) => r.keys().forEach(r); - importAll(require.context('.', true, /\.test$/)); - - try { - // Run the mocha test - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } - }); -} diff --git a/drd-fs/vscode.proposed.fileSearchProvider.d.ts b/drd-fs/vscode.proposed.fileSearchProvider.d.ts new file mode 100644 index 00000000..a5925cce --- /dev/null +++ b/drd-fs/vscode.proposed.fileSearchProvider.d.ts @@ -0,0 +1,88 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // https://github.com/microsoft/vscode/issues/73524 + + /** + * The parameters of a query for file search. + */ + export interface FileSearchQuery { + /** + * The search pattern to match against file paths. + * To be correctly interpreted by Quick Open, this is interpreted in a relaxed way. The picker will apply its own highlighting and scoring on the results. + * + * Tips for matching in Quick Open: + * With the pattern, the picker will use the file name and file paths to score each entry. The score will determine the ordering and filtering. + * The scoring prioritizes prefix and substring matching. Then, it checks and it checks whether the pattern's letters appear in the same order as in the target (file name and path). + * If a file does not match at all using our criteria, it will be omitted from Quick Open. + */ + pattern: string; + } + + /** + * Options that apply to file search. + */ + export interface FileSearchOptions { + /** + * The root folder to search within. + */ + folder: Uri; + + /** + * Files that match an `includes` glob pattern should be included in the search. + */ + includes: string[]; + + /** + * Files that match an `excludes` glob pattern should be excluded from the search. + */ + excludes: string[]; + + /** + * The maximum number of results to be returned. + */ + maxResults?: number; + + /** + * A CancellationToken that represents the session for this search query. If the provider chooses to, this object can be used to check for cancellation and respond accordingly. + * When the token is cancelled, the search is expected to stop and not report any further results to the provider. + */ + session?: CancellationToken; + } + + /** + * A FileSearchProvider provides search results for files in the given folder that match a query string. It can be invoked by quickopen or other extensions. + * + * A FileSearchProvider is the more powerful of two ways to implement file search in the editor. Use a FileSearchProvider if you wish to search within a folder for + * all files that match the user's query. + * + * The FileSearchProvider will be invoked on every keypress in quickopen. When `workspace.findFiles` is called, it will be invoked with an empty query string, + * and in that case, every file in the folder should be returned. + */ + export interface FileSearchProvider { + /** + * Provide the set of files that match a certain file path pattern. + * @param query The parameters for this query. + * @param options A set of options to consider while searching files. + * @param token A cancellation token. + */ + provideFileSearchResults(query: FileSearchQuery, options: FileSearchOptions, token: CancellationToken): ProviderResult; + } + + export namespace workspace { + /** + * Register a search provider. + * + * Only one provider can be registered per scheme. + * + * @param scheme The provider will be invoked for workspace folders that have this file scheme. + * @param provider The provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerFileSearchProvider(scheme: string, provider: FileSearchProvider): Disposable; + } +} \ No newline at end of file diff --git a/drd-fs/vscode.proposed.textSearchProvider.d.ts b/drd-fs/vscode.proposed.textSearchProvider.d.ts new file mode 100644 index 00000000..e992087a --- /dev/null +++ b/drd-fs/vscode.proposed.textSearchProvider.d.ts @@ -0,0 +1,252 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module "vscode" { + // https://github.com/microsoft/vscode/issues/59921 + + /** + * The parameters of a query for text search. + */ + export interface TextSearchQuery { + /** + * The text pattern to search for. + */ + pattern: string; + + /** + * Whether or not `pattern` should match multiple lines of text. + */ + isMultiline?: boolean; + + /** + * Whether or not the search should be case-sensitive. + */ + isCaseSensitive?: boolean; + + /** + * Whether or not to search for whole word matches only. + */ + isWordMatch?: boolean; + + /** + * Whether or not the search should use regular expressions. + */ + isRegExp?: boolean; + } + + /** + * A file glob pattern to match file paths against. + * TODO@roblourens merge this with the GlobPattern docs/definition in vscode.d.ts. + * @see {@link GlobPattern} + */ + export type GlobString = string; + + /** + * Options common to file and text search + */ + export interface SearchOptions { + /** + * The root folder to search within. + */ + folder: Uri; + + /** + * Files that match an `includes` glob pattern should be included in the search. + */ + includes: GlobString[]; + + /** + * Files that match an `excludes` glob pattern should be excluded from the search. + */ + excludes: GlobString[]; + + /** + * Whether external files that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useIgnoreFiles"`. + */ + useIgnoreFiles: boolean; + + /** + * Whether symlinks should be followed while searching. + * See the vscode setting `"search.followSymlinks"`. + */ + followSymlinks: boolean; + + /** + * Whether global files that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useGlobalIgnoreFiles"`. + */ + useGlobalIgnoreFiles: boolean; + + /** + * Whether files in parent directories that exclude files, like .gitignore, should be respected. + * See the vscode setting `"search.useParentIgnoreFiles"`. + */ + useParentIgnoreFiles: boolean; + } + + /** + * Options to specify the size of the result text preview. + * These options don't affect the size of the match itself, just the amount of preview text. + */ + export interface TextSearchPreviewOptions { + /** + * The maximum number of lines in the preview. + * Only search providers that support multiline search will ever see `maxLines > 1`. + */ + maxLines: number; + + /** + * The maximum number of characters included per line. + */ + charsPerLine: number; + } + + /** + * Options that apply to text search. + */ + export interface TextSearchOptions extends SearchOptions { + /** + * The maximum number of results to be returned. + */ + maxResults: number; + + /** + * Options to specify the size of the result text preview. + */ + previewOptions?: TextSearchPreviewOptions; + + /** + * Exclude files larger than `maxFileSize` in bytes. + */ + maxFileSize?: number; + + /** + * Interpret files using this encoding. + * See the vscode setting `"files.encoding"` + */ + encoding?: string; + + /** + * Number of lines of context to include before each match. + */ + beforeContext?: number; + + /** + * Number of lines of context to include after each match. + */ + afterContext?: number; + } + + /** + * Information collected when text search is complete. + */ + export interface TextSearchComplete { + /** + * Whether the search hit the limit on the maximum number of search results. + * `maxResults` on {@linkcode TextSearchOptions`} specifies the max number of results. + * - If exactly that number of matches exist, this should be false. + * - If `maxResults` or more matches exist, this should be true. + * - If less than `maxResults` matches exist, this should be false. + * + * The same applies to file search providers. + */ + limitHit?: boolean; + } + + /** + * A preview of the text result. + */ + export interface TextSearchResultPreview { + /** + * The matching lines of text, or a portion of the matching line that contains the match. + */ + text: string; + + /** + * The Range within `text` corresponding to the text of the match. + * The number of matches must match the TextSearchMatch's range property. + */ + matches: Range | Range[]; + } + + /** + * A match from a text search + */ + export interface TextSearchMatch { + /** + * The uri for the matching document. + */ + uri: Uri; + + /** + * The range of the match within the document, or multiple ranges for multiple matches. + */ + ranges: Range | Range[]; + + /** + * A preview of the text match. + */ + preview: TextSearchResultPreview; + } + + /** + * A line of context surrounding a TextSearchMatch. + */ + export interface TextSearchContext { + /** + * The uri for the matching document. + */ + uri: Uri; + + /** + * One line of text. + * previewOptions.charsPerLine applies to this + */ + text: string; + + /** + * The line number of this line of context. + */ + lineNumber: number; + } + + export type TextSearchResult = TextSearchMatch | TextSearchContext; + + /** + * A TextSearchProvider provides search results for text results inside files in the workspace. + */ + export interface TextSearchProvider { + /** + * Provide results that match the given text pattern. + * @param query The parameters for this query. + * @param options A set of options to consider while searching. + * @param progress A progress callback that must be invoked for all results. + * @param token A cancellation token. + */ + provideTextSearchResults( + query: TextSearchQuery, + options: TextSearchOptions, + progress: Progress, + token: CancellationToken + ): ProviderResult; + } + + export namespace workspace { + /** + * Register a text search provider. + * + * Only one provider can be registered per scheme. + * + * @param scheme The provider will be invoked for workspace folders that have this file scheme. + * @param provider The provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerTextSearchProvider( + scheme: string, + provider: TextSearchProvider + ): Disposable; + } +} diff --git a/drd-fs/webpack.config.js b/drd-fs/webpack.config.js index 33363e7d..aab933c2 100644 --- a/drd-fs/webpack.config.js +++ b/drd-fs/webpack.config.js @@ -4,68 +4,71 @@ *--------------------------------------------------------------------------------------------*/ //@ts-check -'use strict'; +"use strict"; //@ts-check /** @typedef {import('webpack').Configuration} WebpackConfig **/ -const path = require('path'); -const webpack = require('webpack'); +const path = require("path"); +const webpack = require("webpack"); /** @type WebpackConfig */ const webExtensionConfig = { - mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') - target: 'webworker', // extensions run in a webworker context - entry: { - 'extension': './src/web/extension.ts', - 'test/suite/index': './src/web/test/suite/index.ts' - }, - output: { - filename: '[name].js', - path: path.join(__dirname, './dist/web'), - libraryTarget: 'commonjs', - devtoolModuleFilenameTemplate: '../../[resource-path]' - }, - resolve: { - mainFields: ['browser', 'module', 'main'], // look for `browser` entry point in imported node modules - extensions: ['.ts', '.js'], // support ts-files and js-files - alias: { - // provides alternate implementation for node module and source files - }, - fallback: { - // Webpack 5 no longer polyfills Node.js core modules automatically. - // see https://webpack.js.org/configuration/resolve/#resolvefallback - // for the list of Node.js core module polyfills. - 'assert': require.resolve('assert') - } - }, - module: { - rules: [{ - test: /\.ts$/, - exclude: /node_modules/, - use: [{ - loader: 'ts-loader' - }] - }] - }, - plugins: [ - new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 1 // disable chunks by default since web extensions must be a single bundle - }), - new webpack.ProvidePlugin({ - process: 'process/browser', // provide a shim for the global `process` variable - }), - ], - externals: { - 'vscode': 'commonjs vscode', // ignored because it doesn't exist - }, - performance: { - hints: false - }, - devtool: 'nosources-source-map', // create a source map that points to the original source file - infrastructureLogging: { - level: "log", // enables logging required for problem matchers - }, + mode: "none", // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + target: "webworker", // extensions run in a webworker context + entry: { + extension: "./src/extension.ts", + }, + output: { + filename: "[name].js", + path: path.join(__dirname, "./dist"), + libraryTarget: "commonjs", + devtoolModuleFilenameTemplate: "../../[resource-path]", + }, + resolve: { + mainFields: ["browser", "module", "main"], // look for `browser` entry point in imported node modules + extensions: [".ts", ".js"], // support ts-files and js-files + alias: { + // provides alternate implementation for node module and source files + }, + fallback: { + // Webpack 5 no longer polyfills Node.js core modules automatically. + // see https://webpack.js.org/configuration/resolve/#resolvefallback + // for the list of Node.js core module polyfills. + assert: require.resolve("assert"), + }, + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: "ts-loader", + }, + ], + }, + ], + }, + plugins: [ + new webpack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, // disable chunks by default since web extensions must be a single bundle + }), + new webpack.ProvidePlugin({ + process: "process/browser", // provide a shim for the global `process` variable + }), + ], + externals: { + vscode: "commonjs vscode", // ignored because it doesn't exist + }, + performance: { + hints: false, + }, + devtool: "nosources-source-map", // create a source map that points to the original source file + infrastructureLogging: { + level: "log", // enables logging required for problem matchers + }, }; -module.exports = [ webExtensionConfig ]; \ No newline at end of file +module.exports = [webExtensionConfig]; diff --git a/index.html b/index.html index 92f442b6..b70f1215 100644 --- a/index.html +++ b/index.html @@ -107,7 +107,7 @@ { scheme: window.location.protocol === "http:" ? "http" : "https", authority: window.location.host, - path: "/extensions/webdav-fsprovider", + path: "/drd-fs", }, ], messagePorts, diff --git a/prepare-drd-vscode.js b/prepare-drd-vscode.js index 8b149d0c..174989ae 100644 --- a/prepare-drd-vscode.js +++ b/prepare-drd-vscode.js @@ -1,6 +1,6 @@ const child_process = require("child_process"); -const webPlaygroundPath = "./vscode-web/extensions/webdav-fsprovider"; +const webPlaygroundPath = "./vscode-web/drd-fs"; child_process.execSync(`bash -c 'cd drd-fs && npm run compile-web'`, { stdio: "inherit",