diff --git a/.vscode/launch.json b/.vscode/launch.json index 8b86ce87..c9020028 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,7 @@ "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceFolder}/vscode-wpilib"], "outFiles": ["${workspaceFolder}/vscode-wpilib/out/**/*.js"], - "preLaunchTask": "vscode-web-watch" + "preLaunchTask": "npm: build:dev" }, { "name": "Extension Tests", @@ -24,7 +24,7 @@ "--extensionTestsPath=${workspaceFolder}/vscode-wpilib/out/test" ], "outFiles": ["${workspaceFolder}/vscode-wpilib/out/test/**/*.js"], - "preLaunchTask": "vscode-web-watch" + "preLaunchTask": "npm: build:dev" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 8bf11a27..1f4dec9f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,18 +4,30 @@ "version": "2.0.0", "tasks": [ { + "label": "npm: build:dev", "type": "npm", - "identifier": "vscode-web-watch", - "script": "webpack-watch", + "script": "build:dev", "path": "vscode-wpilib/", - "isBackground": true, - "presentation": { - "reveal": "never" - }, "group": { "kind": "build", "isDefault": true }, + "presentation": { + "reveal": "never" + } + }, + { + "label": "wpilib: watch", + "type": "npm", + "script": "watch", + "path": "vscode-wpilib/", + "isBackground": true, + "runOptions": { + "runOn": "folderOpen" + }, + "presentation": { + "reveal": "never" + }, "problemMatcher": [] } ] diff --git a/vscode-wpilib/package-lock.json b/vscode-wpilib/package-lock.json index c1982aee..43a34091 100644 --- a/vscode-wpilib/package-lock.json +++ b/vscode-wpilib/package-lock.json @@ -25,6 +25,10 @@ "xml2js": "^0.6.2" }, "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.8", + "@rollup/plugin-html": "^1.0.3", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-typescript": "^11.1.6", "@types/glob": "^7.1.3", "@types/micromatch": "^4.0.1", "@types/mkdirp": "^1.0.1", @@ -49,9 +53,14 @@ "gulp-typescript": "^5.0.1", "gulp-yaml": "^2.0.4", "mocha": "^10.8.2", + "npm-run-all": "^4.1.5", "prettier": "3.5.3", "rmdir-cli": "^2.0.6", + "rollup": "^4.22.4", + "rollup-plugin-svelte": "^7.2.3", "run-sequence": "^2.2.1", + "svelte": "^5.0.0", + "svelte-preprocess": "^5.1.4", "terser-webpack-plugin": "^5.3.14", "ts-loader": "^9.5.4", "ts-node": "^9.1.1", @@ -619,6 +628,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -729,6 +749,480 @@ "node": ">=10" } }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.8", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-html": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-html/-/plugin-html-1.1.0.tgz", + "integrity": "sha512-MTJDgMp83fB0kFRU95wAUqboUTcl1O1oXg7KLZNjNXfgPKTV0crek1k2vBUgM6Nmuvl/koqea7OrnUzzQdWT7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@so-ric/colorspace": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", @@ -739,6 +1233,16 @@ "text-hex": "1.0.x" } }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz", + "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, "node_modules/@types/braces": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.5.tgz", @@ -855,6 +1359,20 @@ "form-data": "^4.0.4" } }, + "node_modules/@types/pug": { + "version": "2.0.10", + "resolved": "https://registry.npmmirror.com/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", @@ -1855,6 +2373,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -1911,6 +2439,23 @@ "node": ">=0.10.0" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-differ": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", @@ -2023,6 +2568,28 @@ "node": ">=0.10.0" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", @@ -2085,6 +2652,16 @@ ], "license": "MIT" }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", @@ -2118,6 +2695,32 @@ "node": ">= 4.5.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "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/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/azure-devops-node-api": { "version": "12.5.0", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", @@ -2848,6 +3451,16 @@ "readable-stream": "^2.3.5" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cockatiel": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", @@ -3192,6 +3805,60 @@ "node": ">=0.12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3286,6 +3953,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", @@ -3444,6 +4121,16 @@ "node": ">=0.10.0" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -3719,6 +4406,75 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3775,6 +4531,24 @@ "node": ">= 0.4" } }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -3804,6 +4578,13 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true, + "license": "MIT" + }, "node_modules/es6-symbol": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", @@ -4090,6 +4871,13 @@ "node": ">=8" } }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, "node_modules/esniff": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", @@ -4164,6 +4952,16 @@ "node": ">=0.10" } }, + "node_modules/esrap": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/esrap/-/esrap-2.1.2.tgz", + "integrity": "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -4187,6 +4985,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -4776,6 +5581,22 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "license": "MIT" }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4907,6 +5728,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -4968,6 +5830,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -5172,6 +6052,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5495,6 +6392,19 @@ "node": ">=0.10.0" } }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5512,7 +6422,23 @@ "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5832,6 +6758,21 @@ "dev": true, "license": "ISC" }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -5889,6 +6830,24 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -5896,6 +6855,42 @@ "dev": true, "license": "MIT" }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "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-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -5909,6 +6904,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5916,6 +6928,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -5945,6 +6970,41 @@ "node": ">= 0.4" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "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-descriptor": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", @@ -5995,6 +7055,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -6008,6 +7084,26 @@ "node": ">=0.10.0" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "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", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6040,6 +7136,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -6050,6 +7166,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -6063,6 +7192,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -6096,56 +7242,165 @@ "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "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-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "is-unc-path": "^1.0.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-unc-path": { @@ -6191,6 +7446,52 @@ "node": ">=0.10.0" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6302,6 +7603,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -6600,6 +7908,13 @@ "node": ">=8.9.0" } }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6805,6 +8120,16 @@ "es5-ext": "~0.10.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -7103,6 +8428,15 @@ "node": ">=0.12" } }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7228,6 +8562,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -7250,7 +8594,6 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", - "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8023,6 +9366,13 @@ "dev": true, "license": "ISC" }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-abi": { "version": "3.80.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.80.0.tgz", @@ -8102,27 +9452,228 @@ "semver": "bin/semver" } }, - "node_modules/normalize-path": { + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm-run-all/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "once": "^1.3.2" + "isexe": "^2.0.0" }, - "engines": { - "node": ">= 0.10" + "bin": { + "which": "bin/which" } }, "node_modules/nth-check": { @@ -8378,6 +9929,24 @@ "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8694,6 +10263,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -8862,6 +10444,16 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -9305,6 +10897,29 @@ "node": ">= 0.10" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -9359,6 +10974,27 @@ "node": ">=0.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -9556,6 +11192,16 @@ "dev": true, "license": "MIT" }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -9610,6 +11256,95 @@ "node": ">=0.4.0" } }, + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-svelte": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/rollup-plugin-svelte/-/rollup-plugin-svelte-7.2.3.tgz", + "integrity": "sha512-LlniP+h00DfM+E4eav/Kk8uGjgPUjGIBfrAS/IxQvsuFdqSM0Y2sXf31AdxuIGSW9GsmocDqOfaxR5QNno/Tgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^4.1.0", + "resolve.exports": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "rollup": ">=2.0.0", + "svelte": ">=3.5.0" + } + }, + "node_modules/rollup-plugin-svelte/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -9773,6 +11508,33 @@ "node": ">=0.8.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9794,6 +11556,30 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -9804,6 +11590,24 @@ "ret": "~0.1.10" } }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", @@ -9820,6 +11624,46 @@ "dev": true, "license": "MIT" }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -9906,6 +11750,37 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -9981,6 +11856,19 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -10226,9 +12114,35 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sorcery": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/sorcery/-/sorcery-0.11.1.tgz", + "integrity": "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^1.0.0", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/sorcery/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, "node_modules/source-list-map": { @@ -10437,6 +12351,20 @@ "node": ">=0.10.0" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-combiner": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", @@ -10520,6 +12448,84 @@ "node": ">=0.10.0" } }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -10556,6 +12562,19 @@ "node": ">=0.10.0" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10595,6 +12614,105 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svelte": { + "version": "5.43.4", + "resolved": "https://registry.npmmirror.com/svelte/-/svelte-5.43.4.tgz", + "integrity": "sha512-tPNp21nDWB0PSHE+VrTvEy9cFtDp2Q+ATxQoFomISEVdikZ1QZ69UqBPz/LlT+Oc8/LYS/COYwDQZrmZEUr+JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^2.1.0", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.1.4", + "resolved": "https://registry.npmmirror.com/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz", + "integrity": "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.30.5", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, "node_modules/sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", @@ -11275,6 +13393,84 @@ "node": ">= 0.8.0" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-rest-client": { "version": "1.8.11", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", @@ -11315,6 +13511,25 @@ "dev": true, "license": "MIT" }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -12275,6 +14490,80 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", @@ -12282,6 +14571,28 @@ "dev": true, "license": "ISC" }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -12579,6 +14890,13 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" } } } diff --git a/vscode-wpilib/package.json b/vscode-wpilib/package.json index a8f71314..d41d9285 100644 --- a/vscode-wpilib/package.json +++ b/vscode-wpilib/package.json @@ -460,11 +460,17 @@ "repository": "https://github.com/wpilibsuite/vscode-wpilib", "homepage": "https://github.com/wpilibsuite/vscode-wpilib", "scripts": { - "vscode:prepublish": "gulp build && eslint . && webpack --config-node-env production", + "vscode:prepublish": "npm run build && gulp build && eslint .", "clean": "rmdir-cli out", "lint": "eslint .", + "build": "npm-run-all build:webviews webpack", + "build:dev": "npm-run-all build:webviews webpack-dev", "webpack": "webpack --config-node-env production", + "webpack-dev": "webpack --config-node-env development", "webpack-watch": "webpack --config-node-env development --watch", + "build:webviews": "rollup -c", + "watch:webviews": "rollup -c -w", + "watch": "npm-run-all --parallel webpack-watch watch:webviews", "unittest": "mocha -r ts-node/register -u tdd src/unittest/*.ts", "gulp": "gulp", "test": "webpack --config-node-env production && node ./node_modules/vscode/bin/test", @@ -485,6 +491,10 @@ "@typescript-eslint/eslint-plugin": "^8.42.0", "@typescript-eslint/parser": "^8.42.0", "@vscode/vsce": "^2.32.0", + "@rollup/plugin-commonjs": "^25.0.8", + "@rollup/plugin-html": "^1.0.3", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-typescript": "^11.1.6", "copy-webpack-plugin": "^6.4.1", "del": "^6.1.1", "eslint": "^9.34.0", @@ -498,7 +508,12 @@ "mocha": "^10.8.2", "prettier": "3.5.3", "rmdir-cli": "^2.0.6", + "rollup": "^4.22.4", + "rollup-plugin-svelte": "^7.2.3", "run-sequence": "^2.2.1", + "npm-run-all": "^4.1.5", + "svelte": "^5.0.0", + "svelte-preprocess": "^6.0.0", "terser-webpack-plugin": "^5.3.14", "ts-loader": "^9.5.4", "ts-node": "^9.1.1", diff --git a/vscode-wpilib/resources/media/main.css b/vscode-wpilib/resources/media/main.css index 8331475a..cd76ed5e 100644 --- a/vscode-wpilib/resources/media/main.css +++ b/vscode-wpilib/resources/media/main.css @@ -1,28 +1,11 @@ .installed-dependency, .available-dependency { margin-bottom: 10px; - - &:first-of-type { - margin-top: 10px; - } } -.uninstall-button button[id*='version-action'], -.uninstall-button button[id*='uninstall-action'], -.uninstall-button button[id*='install-action'] { - width: 72px; - height: 24px; - box-sizing: border-box; - padding: 1px 8px; - display: flex; - align-items: center; - justify-content: center; -} - -.uninstall-button { - background-color: var(--vscode-button-secondaryBackground, transparent); - color: var(--vscode-button-secondaryForeground); - border: 1px solid var(--vscode-button-border); +.installed-dependency:first-of-type, +.available-dependency:first-of-type { + margin-top: 10px; } .dependency-header { @@ -87,29 +70,16 @@ justify-content: space-between; align-items: center; margin-bottom: 8px; +} - &:has(#updateall-action) { - margin-top: 4px; - } +.top-line:has(#updateall-action) { + margin-top: 4px; } #updateall-action { width: 100%; } -i { - margin-right: 4px !important; -} - -.uninstall-button { - padding: 4px !important; - - & > i { - margin-right: 4px !important; - margin-left: 4px !important; - } -} - .vscode-collapsible div { overflow: visible; } @@ -119,13 +89,35 @@ i { flex-shrink: 2; } -button[id*='install-action'] { - flex-shrink: 0; +.dependency-controls .vscode-button, +.available-dependency .vscode-button, +.top-line .vscode-button, +.url-install-section .vscode-button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; + padding: 4px 10px; + min-height: 26px; + box-sizing: border-box; } -button[id*='version-action'] { - overflow: visible; - padding: 1px 6px; +.dependency-controls .vscode-button span, +.available-dependency .vscode-button span, +.url-install-section .vscode-button span { + line-height: 1.2; +} + +.dependency-controls .uninstall-button { + background-color: var(--vscode-button-secondaryBackground, transparent); + color: var(--vscode-button-secondaryForeground); + border: 1px solid var(--vscode-button-border); + min-width: 32px; + padding: 4px; +} + +.dependency-controls .uninstall-button i { + margin: 0; } /* Project Creator and Import Styles */ @@ -299,15 +291,25 @@ button[id*='version-action'] { text-align: center; position: relative; transition: all 0.2s; + background-color: var(--vscode-editor-background); } .selection-card:hover { - background-color: var(--vscode-list-hoverBackground); + background-color: var(--vscode-button-background); + border-color: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +.selection-card:hover h3, +.selection-card:hover p, +.selection-card:hover .card-icon { + color: var(--vscode-button-foreground); } .selection-card.selected { border-color: var(--vscode-button-background); - background-color: var(--vscode-editor-lineHighlightBackground, rgba(255, 255, 255, 0.05)); + background-color: var(--vscode-editor-background); + color: inherit; } .selection-card h3 { @@ -316,22 +318,22 @@ button[id*='version-action'] { } .selection-card p { - color: var(--vscode-descriptionForeground); + /* color: var(--vscode-descriptionForeground); */ font-size: 13px; margin-bottom: 16px; } -.card-icon { +/* .card-icon { color: var(--vscode-descriptionForeground); -} +} */ .card-icon i.codicon { font-size: 48px; } -.selection-card.selected .card-icon { +/* .selection-card.selected .card-icon { color: var(--vscode-button-background); -} +} */ .select-wrapper { position: relative; diff --git a/vscode-wpilib/resources/media/main.js b/vscode-wpilib/resources/media/main.js deleted file mode 100644 index 5d9830c1..00000000 --- a/vscode-wpilib/resources/media/main.js +++ /dev/null @@ -1,286 +0,0 @@ -//@ts-check - -// This script will be run within the webview itself -// It cannot access the main VS Code APIs directly. -(function () { - // @ts-ignore - const vscode = acquireVsCodeApi(); - let message; - - // Function to generate HTML for installed dependencies - function populateInstalledList(installed, container) { - // Create HTML for installed dependencies - const badge = Object.assign(document.createElement('span'), { - className: 'vscode-badge counter', - textContent: installed.length, - }); - document.querySelector('#installed-actions')?.replaceChildren(badge); - container.replaceChildren(); - - if (installed.length === 0) { - const emptyState = Object.assign(document.createElement('div'), { - className: 'empty-state', - textContent: 'No dependencies installed', - }); - container.appendChild(emptyState); - return; - } - - installed.forEach((dep, index) => { - const installedDep = Object.assign(document.createElement('div'), { - className: 'installed-dependency', - }); - - const header = Object.assign(document.createElement('div'), { - className: 'dependency-header', - }); - - const nameContainer = Object.assign(document.createElement('div'), { - className: 'dependency-title', - }); - - nameContainer.appendChild( - Object.assign(document.createElement('span'), { - textContent: dep.name, - className: 'dependency-name', - }) - ); - - nameContainer.appendChild( - Object.assign(document.createElement('span'), { - textContent: dep.currentVersion, - className: 'dependency-version', - }) - ); - - header.appendChild(nameContainer); - installedDep.appendChild(header); - - const controls = Object.assign(document.createElement('div'), { - className: 'dependency-controls', - }); - - const selectContainer = controls.appendChild( - Object.assign(document.createElement('div'), { - className: 'vscode-select', - style: 'margin: 4px 0', - }) - ); - - selectContainer.appendChild( - Object.assign(document.createElement('i'), { - className: 'codicon codicon-chevron-right chevron-icon', - }) - ); - - const versionSelect = selectContainer.appendChild( - Object.assign(document.createElement('select'), { - id: `version-select-${index}`, - }) - ); - - const versionAction = controls.appendChild( - Object.assign(document.createElement('button'), { - className: 'vscode-button', - id: `version-action-${index}`, - }) - ); - - dep.versionInfo.forEach((versionTuple, i) => { - const option = document.createElement('option'); - option.value = versionTuple.version; - option.textContent = versionTuple.version; - if (dep.currentVersion === versionTuple.version) { - option.selected = true; - versionAction.textContent = versionTuple.buttonText; - if (i === 0) { - // This is the first element of the version array thus the most current - versionAction.setAttribute('disabled', 'true'); - } - } - versionSelect.appendChild(option); - }); - - versionAction.addEventListener('click', () => { - if (versionSelect) { - var selectedText = versionSelect.options[versionSelect.selectedIndex].label; - // Handle update logic here - vscode.postMessage({ - type: 'update', - version: selectedText, - index: index, - }); - } - }); - - versionSelect.addEventListener('change', () => { - const versions = dep.versionInfo; - var selectedText = versionSelect.options[versionSelect.selectedIndex].label; - const version = versions.find((versionTuple) => versionTuple.version === selectedText); - // Change button text based on selected dropdown value - versionAction.textContent = version.buttonText; - - if ( - versionSelect.selectedIndex === 0 && - version.version === message.installed[index].currentVersion - ) { - // This is the first element of the version array thus the most current - versionAction.disabled = true; - } else { - versionAction.disabled = false; - } - }); - - const uninstallAction = controls.appendChild( - Object.assign(document.createElement('button'), { - id: `uninstall-action-${index}`, - className: 'uninstall-button vscode-button', - title: `Uninstall ${dep.name}`, - }) - ); - - uninstallAction.appendChild( - Object.assign(document.createElement('i'), { - className: 'codicon codicon-trash', - }) - ); - - uninstallAction.addEventListener('click', () => { - vscode.postMessage({ type: 'uninstall', index: index }); - }); - - installedDep.appendChild(controls); - container.appendChild(installedDep); - }); - } - - // Function to generate HTML for available dependencies - function populateAvailableList(available, container) { - const badge = Object.assign(document.createElement('span'), { - className: 'vscode-badge counter', - textContent: available.length, - }); - document.querySelector('#available-actions')?.replaceChildren(badge); - container.replaceChildren(); - - if (available.length === 0) { - const emptyState = Object.assign(document.createElement('div'), { - className: 'empty-state', - textContent: 'No additional dependencies available', - }); - container.appendChild(emptyState); - return; - } - - available.forEach((dep, index) => { - const availableDep = Object.assign(document.createElement('div'), { - className: 'available-dependency', - }); - - const header = Object.assign(document.createElement('div'), { - className: 'dependency-header', - }); - - header.appendChild( - Object.assign(document.createElement('span'), { - textContent: dep.name, - className: 'dependency-name', - }) - ); - - const installAction = header.appendChild( - Object.assign(document.createElement('button'), { - id: `install-action-${index}`, - className: 'vscode-button', - }) - ); - - installAction.appendChild( - Object.assign(document.createElement('i'), { - className: 'codicon codicon-add', - }) - ); - - installAction.appendChild(document.createTextNode(' Install')); - - installAction.addEventListener('click', () => { - vscode.postMessage({ type: 'install', index: index }); - }); - - availableDep.appendChild(header); - - const details = Object.assign(document.createElement('div'), { - className: 'dependency-description', - }); - - const versionSpan = details.appendChild( - Object.assign(document.createElement('span'), { - textContent: dep.version, - }) - ); - - details.appendChild(document.createTextNode(` - ${dep.description}`)); - availableDep.appendChild(details); - - container.appendChild(availableDep); - }); - } - - // Add event listeners to the buttons - function addEventListeners() { - // Handle messages sent from the extension to the webview - window.addEventListener('message', (event) => { - message = event.data; // The json data that the extension sent - switch (message.type) { - case 'updateDependencies': { - const installedContainer = document.getElementById('installed-dependencies'); - const availableContainer = document.getElementById('available-dependencies'); - - if (installedContainer) { - populateInstalledList(message.installed, installedContainer); - } else { - console.error('Element with ID "installed-dependencies" not found.'); - } - - if (availableContainer) { - populateAvailableList(message.available, availableContainer); - } else { - console.error('Element with ID "available-dependencies" not found.'); - } - - break; - } - } - }); - - document.getElementById('updateall-action')?.addEventListener('click', () => { - vscode.postMessage({ type: 'updateall' }); - }); - - document.getElementById('install-url-action')?.addEventListener('click', () => { - const urlInput = /** @type {HTMLInputElement | null} */ ( - document.getElementById('url-input') - ); - if (urlInput && urlInput.value.trim()) { - vscode.postMessage({ - type: 'installFromUrl', - url: urlInput.value.trim(), - }); - urlInput.value = ''; - } - }); - - document.getElementById('url-input')?.addEventListener('keypress', (event) => { - if (event.key === 'Enter') { - document.getElementById('install-url-action')?.click(); - } - }); - - // Listen for focus events - window.addEventListener('blur', () => { - vscode.postMessage({ type: 'blur' }); - }); - } - - addEventListeners(); -})(); diff --git a/vscode-wpilib/resources/webviews/gradle2025import.html b/vscode-wpilib/resources/webviews/gradle2025import.html deleted file mode 100644 index 674351a2..00000000 --- a/vscode-wpilib/resources/webviews/gradle2025import.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - WPILib 2025 Project Import - - - - - - -
- - -

Import WPILib 2025 Project

- -
-
Select Source
-
Configure Project
-
Review & Import
-
- - -
-
-

Step 1: Select Source Project

-

Select the build.gradle file of your 2025 WPILib project that you want to import.

-
- -
-
Gradle Project
- Select the build.gradle file of the gradle project to import. -
- -
- -
- -
- -
- -
-
- - -
-
- - -
-
-

Step 2: Configure Project

-

Configure the new project's location and settings.

-
- -
-
Base Folder
- Select a base folder to place the new project into. -
- -
- -
- -
- -
- -
-
Project Name
-
- -
Project name is required
-
-
- -
-
Team Number
-
- -
Invalid Team Number
-
-
- -
-
- - - Creates a new folder at Base Folder/Project Name -
-
- -
-
- - - Enables desktop simulation and unit testing -
-
- -
-

Hardware Platform

-

Select a hardware platform if applicable:

-
- - -
-
- - -
-
- - -
-
- -
- - -
-
- - -
-
-

Step 3: Review & Import

-

Review your settings and select additional options before importing.

-
- -
-
-
- Source Project: -
-
- Destination: -
-
- Team Number: -
-
-
- -
-
-

- Note: The import process copies your project source files to a new - directory and completely regenerates the gradle files. If you made non-standard - updates to the build.gradle, you'll need to make those changes again. Vendor libraries - must also be imported again. -

-

- For more details, see - Importing a Gradle Project - on frc-docs. -

-
-
- -
- - -
-
-
- - diff --git a/vscode-wpilib/resources/webviews/help.html b/vscode-wpilib/resources/webviews/help.html deleted file mode 100644 index 2d9a95de..00000000 --- a/vscode-wpilib/resources/webviews/help.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - WPILib Help - - - - - - -
- - -

WPILib Help

- -
-

- Welcome to WPILib Help! Thank you for alpha testing the Systemcore and 2027 WPILib. Please - see - - https://github.com/wpilibsuite/SystemcoreTesting/ - for the expectations for testing and to provide your feedback. -

- -

- To open this window again, open the Command Palette (F1 or View->Command Palette), and - select - Open WPILib Help. -

-

- For more help, see - the 2027 WPILib documentation. -

-
- -
-

Common Tasks

- -
- -
-

Setting Up Your Workspace

- -
- -
- - -
-
- - - - diff --git a/vscode-wpilib/resources/webviews/projectcreator.html b/vscode-wpilib/resources/webviews/projectcreator.html deleted file mode 100644 index cf72bae6..00000000 --- a/vscode-wpilib/resources/webviews/projectcreator.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - WPILib Project Creator - - - - - - -
- - -

Welcome to WPILib New Project Creator

- -
-
Project Type
-
Project Settings
-
Location & Config
-
Review & Create
-
- - -
-
-

Step 1: Select Project Type

-

Choose whether to create a project from a template or an example.

-
- -
-
-

Template

-

Start with a basic robot program structure

-
- -
-
-
-

Example

-

Start with a complete example project

-
- -
-
-
- -
-
- - -
-
- - -
-
-

Step 2: Select Language & Base

-

Choose the programming language and project base to use.

-
- -
-
Language
-
- - -
-
- -
-
Project Base
-
- - -
-
- -
- - -
-
- - -
-
-

Step 3: Project Location & Configuration

-

Set where to save your project and configure basic settings.

-
- -
-
Base Folder
-
- -
Base folder is required
-
-
- -
- -
- -
-
Project Name
-
- -
Project name is required
-
-
- -
-
Team Number
-
- -
Invalid Team Number
-
-
- -
-
- - - Creates a new folder at Base Folder/Project Name -
-
- -
-
- - - This enables unit testing and simulation support -
-
- -
- - -
-
- - -
-
-

Step 4: Review & Create

-

Review your selections and create the project.

-
- -
-
-
- Project Type: -
-
- Language: -
-
- Project Base: -
-
- Location: -
-
- Team Number: -
-
-
- -
- - -
-
-
- - diff --git a/vscode-wpilib/rollup.config.js b/vscode-wpilib/rollup.config.js new file mode 100644 index 00000000..1befc2fe --- /dev/null +++ b/vscode-wpilib/rollup.config.js @@ -0,0 +1,120 @@ +const path = require('path'); + +const commonjs = require('@rollup/plugin-commonjs'); +const html = require('@rollup/plugin-html'); +const resolve = require('@rollup/plugin-node-resolve'); +const typescript = require('@rollup/plugin-typescript'); +const svelte = require('rollup-plugin-svelte'); +const svelteConfig = require('./svelte.config'); + +const production = process.env.NODE_ENV === 'production'; + +const webviews = [ + { + name: 'help', + input: 'src/webviews/svelte/help/main.ts', + title: 'WPILib Help', + }, + { + name: 'projectcreator', + input: 'src/webviews/svelte/projectcreator/main.ts', + title: 'WPILib Project Creator', + }, + { + name: 'gradle2025import', + input: 'src/webviews/svelte/gradle2025import/main.ts', + title: 'WPILib Gradle 2025 Import', + }, + { + name: 'dependencyview', + input: 'src/webviews/svelte/dependencyview/main.ts', + title: 'WPILib Vendor Dependencies', + }, +]; + +function createHtmlTemplate(title) { + return ({ attributes, bundle, files, publicPath, title: templateTitle }) => { + // For IIFE format, entry chunks are in the bundle object + // Filter for JavaScript entry files from bundle + const bundleEntries = Object.values(bundle || {}); + const jsFiles = bundleEntries.filter( + (chunk) => chunk.isEntry && chunk.fileName && chunk.fileName.endsWith('.js') + ); + + // Fallback to files array if bundle doesn't have entries + const filesArray = Array.isArray(files) ? files : Object.values(files || {}); + const entryFiles = jsFiles.length > 0 + ? jsFiles + : filesArray.filter( + (file) => file.isEntry && file.fileName && file.fileName.endsWith('.js') + ); + + // Generate script tags with replaceresource prefix + // WebViewBase.replaceResources will convert these to webview URIs + const scriptTags = entryFiles + .map((file) => ` `) + .join('\n'); + + return ` + `${key}="${value}"`).join(' ')}` : ''}> + + + + ${templateTitle || title} + + +
+${scriptTags} + +`; + }; +} + +module.exports = webviews.map(({ name, input, title }) => ({ + input: path.resolve(__dirname, input), + output: { + dir: path.resolve(__dirname, 'resources', 'dist'), + entryFileNames: `${name}.js`, + format: 'iife', + name: `${name}App`, + sourcemap: true, + }, + onwarn(warning, handler) { + if ( + warning.code === 'CIRCULAR_DEPENDENCY' && + Array.isArray(warning.ids) && + warning.ids.every((id) => id.includes(`${path.sep}node_modules${path.sep}svelte${path.sep}`)) + ) { + return; + } + handler(warning); + }, + plugins: [ + svelte({ + compilerOptions: { + dev: !production, + }, + emitCss: false, + preprocess: svelteConfig.preprocess, + }), + resolve({ + browser: true, + dedupe: ['svelte'], + extensions: ['.mjs', '.js', '.json', '.ts', '.svelte'], + }), + commonjs(), + typescript({ + sourceMap: !production, + tsconfig: path.resolve(__dirname, 'tsconfig.webviews.json'), + }), + html({ + fileName: `${name}.html`, + title, + template: createHtmlTemplate(title), + }), + ], + watch: { + clearScreen: false, + }, +})); + diff --git a/vscode-wpilib/src/dependencyView.ts b/vscode-wpilib/src/dependencyView.ts index 69920627..bca997d5 100644 --- a/vscode-wpilib/src/dependencyView.ts +++ b/vscode-wpilib/src/dependencyView.ts @@ -1,4 +1,7 @@ -import * as fetch from 'node-fetch'; +import * as fs from 'fs'; +import fetch from 'node-fetch'; +import type { RequestInit } from 'node-fetch'; +import * as path from 'path'; import * as vscode from 'vscode'; import { IExternalAPI } from './api'; import { localize as i18n } from './locale'; @@ -8,7 +11,6 @@ import { IJsonDependency } from './shared/vendorlibrariesbase'; import { VendorLibraries } from './vendorlibraries'; import { isNewerVersion } from './versions'; // @ts-ignore -import elements from '!!raw-loader!@vscode-elements/elements/dist/bundled.js'; export interface IJsonList { path: string; name: string; @@ -32,6 +34,8 @@ export interface IJSMessage { url?: string; } +type NodeFetchOptions = RequestInit & { timeout?: number }; + export class DependencyViewProvider implements vscode.WebviewViewProvider { public static readonly viewType = 'wpilib.dependencyView'; private projectInfo: ProjectInfoGatherer; @@ -50,6 +54,14 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { private changed = 0; private refreshInProgress = false; private showingInstructions = false; + private viewReady = false; + private pendingDependenciesUpdate: + | { + type: 'updateDependencies'; + installed: IDepInstalled[]; + available: IJsonList[]; + } + | undefined; private _view?: vscode.WebviewView; @@ -70,6 +82,8 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { _token: vscode.CancellationToken ) { this._view = webviewView; + this.viewReady = false; + this.pendingDependenciesUpdate = undefined; webviewView.webview.options = { // Allow scripts in the webview @@ -78,6 +92,7 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { localResourceRoots: [ this._extensionUri, vscode.Uri.joinPath(this._extensionUri, 'resources', 'media'), + vscode.Uri.joinPath(this._extensionUri, 'resources', 'dist'), ], }; @@ -139,9 +154,23 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); + const disposeListener = webviewView.onDidDispose(() => { + this.viewReady = false; + this.pendingDependenciesUpdate = undefined; + }); + this.disposables.push(disposeListener); + webviewView.webview.onDidReceiveMessage((data) => { if (this.isJSMessage(data)) { switch (data.type) { + case 'loaded': { + this.viewReady = true; + if (this.pendingDependenciesUpdate) { + void this._view?.webview.postMessage(this.pendingDependenciesUpdate); + this.pendingDependenciesUpdate = undefined; + } + break; + } case 'install': { void this.install(data.index); break; @@ -460,12 +489,19 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { } public updateDependencies() { + const message = { + type: 'updateDependencies' as const, + installed: this.installedList, + available: this.availableDepsList, + }; + + if (!this.viewReady) { + this.pendingDependenciesUpdate = message; + return; + } + if (this._view) { - this._view.webview.postMessage({ - type: 'updateDependencies', - installed: this.installedList, - available: this.availableDepsList, - }); + this._view.webview.postMessage(message); } } @@ -489,62 +525,48 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { this.availableDepsList = []; this.availableDeps = await this.getAvailableDependencies(); - if (this.availableDeps.length !== 0) { - // Check Github for the VendorDep list - if (this.installedDeps.length !== 0) { - for (const id of this.installedDeps) { - let versionList = [{ version: id.version, buttonText: i18n('ui', 'To Latest') }]; - for (const ad of this.availableDeps) { - if (id.uuid === ad.uuid) { - // Populate version array with version and button text - if (id.version !== ad.version) { - if (isNewerVersion(ad.version, id.version)) { - versionList.push({ - version: ad.version, - buttonText: i18n('ui', 'Update'), - }); - } else { - versionList.push({ - version: ad.version, - buttonText: i18n('ui', 'Downgrade'), - }); - } - } + + if (this.installedDeps.length !== 0) { + for (const id of this.installedDeps) { + let versionList = [{ version: id.version, buttonText: i18n('ui', 'To Latest') }]; + for (const ad of this.availableDeps) { + if (id.uuid === ad.uuid) { + if (id.version !== ad.version) { + versionList.push({ + version: ad.version, + buttonText: isNewerVersion(ad.version, id.version) + ? i18n('ui', 'Update') + : i18n('ui', 'Downgrade'), + }); } } - // Now we need to sort the version list newest to oldest - versionList = this.sortVersions(versionList); - - this.installedList.push({ - name: id.name, - currentVersion: id.version, - versionInfo: versionList, - }); } + versionList = this.sortVersions(versionList); + + this.installedList.push({ + name: id.name, + currentVersion: id.version, + versionInfo: versionList, + }); } + } - // We need to group the available deps and filter out the installed ones - this.availableDeps.forEach((dep) => { - // See if the dep is one of the installed deps if so don't add it - const installedDep = this.installedDeps.findIndex((depend) => depend.uuid === dep.uuid); - if (installedDep < 0) { - // Check to see if it is already in the available list - const foundDep = this.availableDepsList.findIndex((depend) => depend.uuid === dep.uuid); - if (foundDep < 0) { - // Not in the list so just add it - this.availableDepsList.push(dep); - } else if (isNewerVersion(dep.version, this.availableDepsList[foundDep].version)) { - // It was in the list but this version is newer so lets use that - this.availableDepsList[foundDep] = dep; - } + this.availableDeps.forEach((dep) => { + const installedDep = this.installedDeps.findIndex((depend) => depend.uuid === dep.uuid); + if (installedDep < 0) { + const foundDep = this.availableDepsList.findIndex((depend) => depend.uuid === dep.uuid); + if (foundDep < 0) { + this.availableDepsList.push(dep); + } else if (isNewerVersion(dep.version, this.availableDepsList[foundDep].version)) { + this.availableDepsList[foundDep] = dep; } - }); + } + }); - this.sortInstalled(); - this.sortAvailable(); + this.sortInstalled(); + this.sortAvailable(); - this.updateDependencies(); - } + this.updateDependencies(); } finally { this.refreshInProgress = false; } @@ -646,9 +668,9 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { } protected async loadFileFromUrl(url: string): Promise { - const response = await fetch.default(url, { + const response = await fetch(url, { timeout: 5000, - }); + } as NodeFetchOptions); if (response === undefined) { throw new Error('Failed to fetch file'); } @@ -684,82 +706,45 @@ export class DependencyViewProvider implements vscode.WebviewViewProvider { return webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, ...fp.split('/'))); }; - const scriptUri = createUri(`resources/media/main.js`); const styleUri = createUri(`resources/media/main.css`); const vscodeElementsUri = createUri(`resources/media/vscode-elements.css`); const codiconUri = createUri(`resources/media/icons.css`); + const scriptUri = createUri(`resources/dist/dependencyview.js`); - // Return the complete HTML - return ` - - - - - - WPILib Vendor Dependencies - - - - - - - - - - -
- -
- -
- - -

- Install from URL -

-
-
-
- - -
-
- Enter a vendor dependency JSON URL to install a library not listed in the available dependencies. -
-
-
- -
- - -

- Installed Dependencies -

-
-
-
-
- -
- - -

- Available Dependencies -

-
-
-
-
- - - - + const htmlPath = path.join(this._extensionUri.fsPath, 'resources', 'dist', 'dependencyview.html'); + let html = fs.readFileSync(htmlPath, 'utf8'); + + const headInsert = ` + + + + + + + + `; + + html = html.replace('', `${headInsert} +`); + + // Convert replaceresource/dist/ script tags to webview URIs + html = html.replace( + /<\/script>/g, + (_match, fileName) => { + if (fileName === 'dependencyview.js') { + return ``; + } + // For other scripts, convert replaceresource to webview URI + const otherScriptUri = createUri(`resources/dist/${fileName}`); + return ``; + } + ); + + // Replace remaining replaceresource references + const extensionUri = webview.asWebviewUri(this._extensionUri); + html = html.replace(/replaceresource/g, extensionUri.toString()); + + return html; } } diff --git a/vscode-wpilib/src/types/svelte.d.ts b/vscode-wpilib/src/types/svelte.d.ts new file mode 100644 index 00000000..b0aa47d7 --- /dev/null +++ b/vscode-wpilib/src/types/svelte.d.ts @@ -0,0 +1,6 @@ +declare module '*.svelte' { + import type { SvelteComponentTyped } from 'svelte'; + + export default class Component, TEvents = Record, TSlots = Record> extends SvelteComponentTyped {} +} + diff --git a/vscode-wpilib/src/webviews/gradle2025import.ts b/vscode-wpilib/src/webviews/gradle2025import.ts index 4767cee3..7c95d4d4 100644 --- a/vscode-wpilib/src/webviews/gradle2025import.ts +++ b/vscode-wpilib/src/webviews/gradle2025import.ts @@ -359,8 +359,9 @@ export class Gradle2025Import extends WebViewBase { private async asyncInitialize() { await this.loadWebpage( - path.join(extensionContext.extensionPath, 'resources', 'webviews', 'gradle2025import.html'), - path.join(extensionContext.extensionPath, 'resources', 'dist', 'gradle2025importpage.js') + path.join(extensionContext.extensionPath, 'resources', 'dist', 'gradle2025import.html'), + undefined, + ['gradle2025import'] ); } } diff --git a/vscode-wpilib/src/webviews/help.ts b/vscode-wpilib/src/webviews/help.ts index cdf200c1..8c7a12df 100644 --- a/vscode-wpilib/src/webviews/help.ts +++ b/vscode-wpilib/src/webviews/help.ts @@ -21,11 +21,15 @@ export class Help extends WebViewBase { ); } + private messageHandlerSetup = false; + public displayHelp() { + const wasUndefined = this.webview === undefined; this.displayWebView(vscode.ViewColumn.Active, true); - // Set up message handler for button clicks if webview exists - if (this.webview) { + // Set up message handler for button clicks only when webview is first created + if (this.webview && wasUndefined && !this.messageHandlerSetup) { + this.messageHandlerSetup = true; this.webview.webview.onDidReceiveMessage( (message) => { switch (message.command) { @@ -43,12 +47,18 @@ export class Help extends WebViewBase { undefined, this.disposables ); + // Reset flag when webview is disposed + this.webview.onDidDispose(() => { + this.messageHandlerSetup = false; + }); } } private async asyncInitialize() { await this.loadWebpage( - path.join(extensionContext.extensionPath, 'resources', 'webviews', 'help.html') + path.join(extensionContext.extensionPath, 'resources', 'dist', 'help.html'), + undefined, + ['help'] ); } } diff --git a/vscode-wpilib/src/webviews/pages/gradle2025importpage.ts b/vscode-wpilib/src/webviews/pages/gradle2025importpage.ts deleted file mode 100644 index 9ef753fc..00000000 --- a/vscode-wpilib/src/webviews/pages/gradle2025importpage.ts +++ /dev/null @@ -1,165 +0,0 @@ -'use strict'; - -import { IGradle2025IPCReceive, IGradle2025IPCSend } from './gradle2025importpagetypes'; -import { - validateProject, - validateTeamNumber, - validateProjectFolder, - validateXrpRomi, -} from './sharedpages'; - -interface IVsCodeApi { - postMessage(message: IGradle2025IPCReceive): void; -} - -declare function acquireVsCodeApi(): IVsCodeApi; - -const vscode = acquireVsCodeApi(); - -function gradle2025SelectButtonClick() { - (document.activeElement as HTMLElement).blur(); - vscode.postMessage({ type: 'gradle2025' }); -} - -function projectSelectButtonClick() { - (document.activeElement as HTMLElement).blur(); - vscode.postMessage({ type: 'newproject' }); -} - -function importProjectButtonClick() { - const isValidTeam = validateTeamNumber(); - const isValidProject = validateProject(); - const isValidFolder = validateProjectFolder(); - const isXrpRomiValid = validateXrpRomi(); - if (!isValidTeam || !isValidProject || !isValidFolder || !isXrpRomiValid) { - return; - } - - (document.activeElement as HTMLElement).blur(); - - const hardwareSelection = document.querySelector( - 'input[name="hardware"]:checked' - ) as HTMLInputElement; - const romiSelected = hardwareSelection?.value === 'romi'; - const xrpSelected = hardwareSelection?.value === 'xrp'; - - vscode.postMessage({ - data: { - desktop: (document.getElementById('desktopCB') as HTMLInputElement).checked, - romi: romiSelected, - xrp: xrpSelected, - fromProps: (document.getElementById('gradle2025Input') as HTMLInputElement).value, - newFolder: (document.getElementById('newFolderCB') as HTMLInputElement).checked, - projectName: (document.getElementById('projectName') as HTMLInputElement).value, - teamNumber: (document.getElementById('teamNumber') as HTMLInputElement).value, - toFolder: (document.getElementById('projectFolder') as HTMLInputElement).value, - }, - type: 'importproject', - }); -} - -function navigateToStep(step: number) { - document.querySelectorAll('.wizard-step').forEach((el) => { - (el as HTMLElement).classList.remove('active'); - }); - - const targetStep = document.getElementById(`step-${step}`); - if (targetStep) { - targetStep.classList.add('active'); - } - - document.querySelectorAll('.progress-step').forEach((el) => { - const stepNumber = parseInt((el as HTMLElement).getAttribute('data-step') || '0', 10); - - (el as HTMLElement).classList.remove('active', 'completed'); - - if (stepNumber === step) { - (el as HTMLElement).classList.add('active'); - } else if (stepNumber < step) { - (el as HTMLElement).classList.add('completed'); - } - }); - - if (step === 3) { - updateSummary(); - } -} - -function updateSummary() { - const summarySource = document.getElementById('summary-source'); - const summaryDestination = document.getElementById('summary-destination'); - const summaryTeam = document.getElementById('summary-team'); - - if (summarySource) { - const gradle2025Input = document.getElementById('gradle2025Input') as HTMLInputElement; - summarySource.textContent = gradle2025Input.value || 'Not selected'; - } - - if (summaryDestination) { - const projectFolder = document.getElementById('projectFolder') as HTMLInputElement; - const projectName = document.getElementById('projectName') as HTMLInputElement; - const newFolder = document.getElementById('newFolderCB') as HTMLInputElement; - - let destination = projectFolder.value || 'Not selected'; - if (newFolder.checked && projectName.value) { - destination += `/${projectName.value}`; - } - summaryDestination.textContent = destination; - } - - if (summaryTeam) { - const teamNumber = document.getElementById('teamNumber') as HTMLInputElement; - summaryTeam.textContent = teamNumber.value || 'Not specified'; - } -} - -window.addEventListener('message', (event) => { - const data = event.data as IGradle2025IPCSend; - switch (data.type) { - case 'gradle2025': - (document.getElementById('gradle2025Input') as HTMLInputElement).value = data.data; - const nextButton = document.getElementById('next-to-step-2') as HTMLButtonElement; - if (nextButton) { - nextButton.disabled = false; - } - break; - case 'projectname': - const doc = document.getElementById('projectName') as HTMLInputElement; - doc.value = data.data; - doc.disabled = false; - validateProject(); - break; - case 'newproject': - const elem = document.getElementById('projectFolder') as HTMLInputElement; - elem.value = data.data; - validateProjectFolder(); - break; - case 'teamnumber': - const tn = document.getElementById('teamNumber') as HTMLInputElement; - tn.value = data.data; - validateTeamNumber(); - break; - default: - break; - } -}); - -window.addEventListener('load', (_: Event) => { - document.getElementById('gradle2025SelectButton')!.onclick = gradle2025SelectButtonClick; - document.getElementById('projectSelectButton')!.onclick = projectSelectButtonClick; - document.getElementById('projectName')!.oninput = validateProject; - document.getElementById('teamNumber')!.oninput = validateTeamNumber; - document.getElementById('importProject')!.onclick = importProjectButtonClick; - document.getElementById('projectFolder')!.oninput = validateProjectFolder; - document.getElementById('romiCB')!.onchange = validateXrpRomi; - document.getElementById('xrpCB')!.onchange = validateXrpRomi; - - document.getElementById('next-to-step-2')!.onclick = () => navigateToStep(2); - document.getElementById('next-to-step-3')!.onclick = () => navigateToStep(3); - document.getElementById('back-to-step-1')!.onclick = () => navigateToStep(1); - document.getElementById('back-to-step-2')!.onclick = () => navigateToStep(2); - - navigateToStep(1); - - vscode.postMessage({ type: 'loaded' }); -}); diff --git a/vscode-wpilib/src/webviews/pages/projectcreatorpage.ts b/vscode-wpilib/src/webviews/pages/projectcreatorpage.ts deleted file mode 100644 index eca004c7..00000000 --- a/vscode-wpilib/src/webviews/pages/projectcreatorpage.ts +++ /dev/null @@ -1,419 +0,0 @@ -'use strict'; - -import { IProjectIPCReceive, IProjectIPCSend, ProjectType } from './projectcreatorpagetypes'; -import { validateProject, validateTeamNumber, validateProjectFolder } from './sharedpages'; - -interface IVsCodeApi { - postMessage(message: IProjectIPCReceive): void; -} - -declare function acquireVsCodeApi(): IVsCodeApi; - -const vscode = acquireVsCodeApi(); - -let projectType: ProjectType = ProjectType.Template; -let language = ''; -let base = ''; -let currentStep = 1; -let languages: string[] = []; -let bases: string[] = []; - -function navigateToStep(step: number) { - // Hide all steps - document.querySelectorAll('.wizard-step').forEach((el) => { - (el as HTMLElement).classList.remove('active'); - }); - - // Show the target step - const targetStep = document.getElementById(`step-${step}`); - if (targetStep) { - targetStep.classList.add('active'); - } - - // Update progress indicators - document.querySelectorAll('.progress-step').forEach((el) => { - const stepNumber = parseInt((el as HTMLElement).getAttribute('data-step') || '0', 10); - - (el as HTMLElement).classList.remove('active', 'completed'); - - if (stepNumber === step) { - (el as HTMLElement).classList.add('active'); - } else if (stepNumber < step) { - (el as HTMLElement).classList.add('completed'); - } - }); - - currentStep = step; - - // If navigating to step 2, ensure dropdowns reflect the current project type - if (step === 2) { - // Reset language dropdown to default state if needed - const languageSelect = document.getElementById('language-select') as HTMLSelectElement; - if (languageSelect.selectedIndex !== 0) { - languageSelect.selectedIndex = 0; - language = ''; - } - - // Reset base dropdown - resetBaseDropdown(); - } - - // Update summary when navigating to the final step - if (step === 4) { - updateSummary(); - } -} - -function updateSummary() { - const typeEl = document.getElementById('summary-type'); - const languageEl = document.getElementById('summary-language'); - const baseEl = document.getElementById('summary-base'); - const locationEl = document.getElementById('summary-location'); - const teamEl = document.getElementById('summary-team'); - - if (typeEl) { - typeEl.textContent = ProjectType[projectType]; - } - - if (languageEl) { - languageEl.textContent = language; - } - - if (baseEl) { - baseEl.textContent = base; - } - - if (locationEl) { - const projectFolder = (document.getElementById('projectFolder') as HTMLInputElement).value; - const projectName = (document.getElementById('projectName') as HTMLInputElement).value; - const newFolder = (document.getElementById('newFolderCB') as HTMLInputElement).checked; - - locationEl.textContent = newFolder ? `${projectFolder}/${projectName}` : projectFolder; - } - - if (teamEl) { - const teamNumber = (document.getElementById('teamNumber') as HTMLInputElement).value; - teamEl.textContent = teamNumber ? teamNumber : 'Not specified'; - } -} - -function validateCurrentStep(): boolean { - switch (currentStep) { - case 1: - return validateStep1(); - case 2: - return validateStep2(); - case 3: - return validateStep3(); - case 4: - return validateStep4(); - default: - return true; - } -} - -function validateStep1(): boolean { - return projectType !== undefined; -} - -function validateStep2(): boolean { - return language !== '' && base !== ''; -} - -function validateStep3(): boolean { - const isValidProject = validateProject(); - const isValidFolder = validateProjectFolder(); - return isValidProject && isValidFolder; -} - -function validateStep4(): boolean { - return validateTeamNumber(); -} - -function resetBaseDropdown() { - const baseSelect = document.getElementById('base-select') as HTMLSelectElement; - - // Clear all options except the first default option - while (baseSelect.options.length > 1) { - baseSelect.remove(1); - } - - // Reset to default option and disable - baseSelect.selectedIndex = 0; - baseSelect.disabled = true; - - // Reset the base variable - base = ''; - - // Disable next button - const nextButton = document.getElementById('next-to-step-3'); - if (nextButton) { - (nextButton as HTMLButtonElement).disabled = true; - } -} - -function selectProjectType(type: ProjectType) { - projectType = type; - - // Update selection visuals - document.querySelectorAll('.selection-card').forEach((el) => { - el.classList.remove('selected'); - }); - - const selectedCard = document.querySelector(`.selection-card[data-value="${ProjectType[type]}"]`); - if (selectedCard) { - selectedCard.classList.add('selected'); - } - - // Enable next button - const nextButton = document.getElementById('next-to-step-2'); - if (nextButton) { - (nextButton as HTMLButtonElement).disabled = false; - } - - // Reset language and base since they depend on project type - language = ''; - base = ''; - - // Request languages for this project type - vscode.postMessage({ - data: { - base: '', - desktop: false, - language, - newFolder: false, - projectName: '', - projectType, - teamNumber: '', - toFolder: '', - }, - type: 'language', - }); -} - -function populateLanguageSelect(languages: string[]) { - const select = document.getElementById('language-select') as HTMLSelectElement; - - // Clear existing options except the default - while (select.options.length > 1) { - select.remove(1); - } - - // Add new options - languages.forEach((lang) => { - const option = document.createElement('option'); - option.value = lang; - option.textContent = lang; - select.appendChild(option); - }); - - // Enable the select - select.disabled = false; -} - -function populateBaseSelect(bases: string[]) { - const select = document.getElementById('base-select') as HTMLSelectElement; - - // Clear existing options except the default - while (select.options.length > 1) { - select.remove(1); - } - - // Add new options - bases.forEach((baseOption) => { - const option = document.createElement('option'); - option.value = baseOption; - option.textContent = baseOption; - select.appendChild(option); - }); - - // Enable the select - select.disabled = false; -} - -function selectProjectFolder() { - (document.activeElement as HTMLElement).blur(); - vscode.postMessage({ - type: 'newproject', - data: { - base, - desktop: false, - language, - newFolder: false, - projectName: '', - projectType, - teamNumber: '', - toFolder: (document.getElementById('projectFolder') as HTMLInputElement).value, - }, - }); -} - -function generateProject() { - if (!validateCurrentStep()) { - return; - } - - (document.activeElement as HTMLElement).blur(); - vscode.postMessage({ - data: { - base, - desktop: (document.getElementById('desktopCB') as HTMLInputElement).checked, - language, - newFolder: (document.getElementById('newFolderCB') as HTMLInputElement).checked, - projectName: (document.getElementById('projectName') as HTMLInputElement).value, - projectType, - teamNumber: (document.getElementById('teamNumber') as HTMLInputElement).value, - toFolder: (document.getElementById('projectFolder') as HTMLInputElement).value, - }, - type: 'createproject', - }); -} - -// Set up event handlers -function setupEventListeners() { - // Step 1 - Project Type Selection - document.querySelectorAll('.selection-card').forEach((el) => { - el.addEventListener('click', () => { - const typeValue = (el as HTMLElement).getAttribute('data-value'); - if (typeValue === 'Template') { - selectProjectType(ProjectType.Template); - } else if (typeValue === 'Example') { - selectProjectType(ProjectType.Example); - } - }); - }); - - document.getElementById('next-to-step-2')!.addEventListener('click', () => { - if (validateStep1()) { - navigateToStep(2); - } - }); - - // Step 2 - Language and Base Selection - const languageSelect = document.getElementById('language-select') as HTMLSelectElement; - languageSelect.addEventListener('change', () => { - language = languageSelect.value; - - // Reset base dropdown when language changes - resetBaseDropdown(); - - // Request project bases for this language - vscode.postMessage({ - data: { - base: '', - desktop: false, - language, - newFolder: false, - projectName: '', - projectType, - teamNumber: '', - toFolder: '', - }, - type: 'base', - }); - - validateStep2(); - }); - - const baseSelect = document.getElementById('base-select') as HTMLSelectElement; - baseSelect.addEventListener('change', () => { - base = baseSelect.value; - - // Enable next button if both selections are made - const nextButton = document.getElementById('next-to-step-3'); - if (nextButton) { - (nextButton as HTMLButtonElement).disabled = !validateStep2(); - } - }); - - document.getElementById('back-to-step-1')!.addEventListener('click', () => navigateToStep(1)); - document.getElementById('next-to-step-3')!.addEventListener('click', () => { - if (validateStep2()) { - navigateToStep(3); - } - }); - - // Step 3 - Project Location and Name - document.getElementById('projectSelectButton')!.addEventListener('click', selectProjectFolder); - document.getElementById('projectName')!.addEventListener('input', () => { - validateProject(); - // Update next button state - const nextButton = document.getElementById('next-to-step-4'); - if (nextButton) { - (nextButton as HTMLButtonElement).disabled = !validateStep3(); - } - }); - document.getElementById('projectFolder')!.addEventListener('input', () => { - validateProjectFolder(); - // Update next button state - const nextButton = document.getElementById('next-to-step-4'); - if (nextButton) { - (nextButton as HTMLButtonElement).disabled = !validateStep3(); - } - }); - - document.getElementById('back-to-step-2')!.addEventListener('click', () => navigateToStep(2)); - document.getElementById('next-to-step-4')!.addEventListener('click', () => { - if (validateStep3()) { - navigateToStep(4); - } - }); - - // Step 4 - Review and Create - document.getElementById('teamNumber')!.addEventListener('input', validateTeamNumber); - document.getElementById('back-to-step-3')!.addEventListener('click', () => navigateToStep(3)); - document.getElementById('generateProject')!.addEventListener('click', generateProject); -} - -window.addEventListener('message', (event) => { - const data = event.data as IProjectIPCSend; - const nextButton = document.getElementById('next-to-step-3') as HTMLButtonElement; - - switch (data.type) { - case 'newproject': - const elem = document.getElementById('projectFolder') as HTMLInputElement; - elem.value = data.data as string; - validateProjectFolder(); - // Update next button state - const step3NextButton = document.getElementById('next-to-step-4'); - if (step3NextButton) { - (step3NextButton as HTMLButtonElement).disabled = !validateStep3(); - } - break; - case 'projecttype': - projectType = data.data as ProjectType; - break; - case 'language': - const langData = data.data as string[]; - if (Array.isArray(langData)) { - // This is a language list response - languages = langData; - populateLanguageSelect(languages); - } else { - // This is a language selection response - language = data.data as string; - } - break; - case 'base': - const baseData = data.data as { label: string; description: string }[]; - if (Array.isArray(baseData)) { - // This is a base list response - bases = baseData.map((b) => b.label); - populateBaseSelect(bases); - } else { - // This is a base selection response - base = data.data as string; - if (nextButton) { - nextButton.disabled = !validateStep2(); - } - } - break; - default: - break; - } -}); - -window.addEventListener('load', (_: Event) => { - setupEventListeners(); - navigateToStep(1); // Start at first step -}); diff --git a/vscode-wpilib/src/webviews/pages/projectcreatorpagetypes.ts b/vscode-wpilib/src/webviews/pages/projectcreatorpagetypes.ts index b94a6239..79d6295a 100644 --- a/vscode-wpilib/src/webviews/pages/projectcreatorpagetypes.ts +++ b/vscode-wpilib/src/webviews/pages/projectcreatorpagetypes.ts @@ -1,6 +1,6 @@ 'use strict'; -import { ICreatorQuickPick } from '../../api'; +import type { ICreatorQuickPick } from '../../api'; export enum ProjectType { Example, diff --git a/vscode-wpilib/src/webviews/pages/sharedpages.ts b/vscode-wpilib/src/webviews/pages/sharedpages.ts deleted file mode 100644 index 074e3b88..00000000 --- a/vscode-wpilib/src/webviews/pages/sharedpages.ts +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -// import { logger } from '../../logger'; - -declare global { - interface Window { - i18nTrans: (domain: string, message: string, ...args: unknown[]) => string; - } -} - -export function validateProject(): boolean { - const projectName = document.getElementById('projectName') as HTMLInputElement; - const error = document.getElementById('projectNameError') as HTMLElement; - - if (projectName.value.trim() === '') { - projectName.classList.add('invalid'); - error.style.display = 'block'; - return false; - } else { - projectName.classList.remove('invalid'); - error.style.display = 'none'; - return true; - } -} - -export function validateProjectFolder(): boolean { - const projectFolder = document.getElementById('projectFolder') as HTMLInputElement; - const error = document.getElementById('projectFolderError') as HTMLElement; - const folderPath = projectFolder.value.trim(); - - if (folderPath === '' || folderPath.includes('OneDrive')) { - projectFolder.classList.add('invalid'); - if (error) { - error.style.display = 'block'; - error.innerText = folderPath.includes('OneDrive') - ? window.i18nTrans('ui', "Invalid Base Folder - Folder can't be in OneDrive") - : window.i18nTrans('ui', 'Invalid Base Folder'); - } - return false; - } else { - projectFolder.classList.remove('invalid'); - if (error) { - error.style.display = 'none'; - } - return true; - } -} - -export function validateXrpRomi(): boolean { - const romiDiv = document.getElementById('romidiv') as HTMLDivElement; - const xrpDiv = document.getElementById('xrpdiv') as HTMLDivElement; - - if (romiDiv) { - romiDiv.classList.remove('error'); - } - if (xrpDiv) { - xrpDiv.classList.remove('error'); - } - - return true; -} - -export function validateTeamNumber(): boolean { - const teamNumber = document.getElementById('teamNumber') as HTMLInputElement; - const error = document.getElementById('teamNumberError') as HTMLElement; - - if (teamNumber.value.trim() === '') { - // Empty is valid (optional) - teamNumber.classList.remove('invalid'); - if (error) { - error.style.display = 'none'; - } - return true; - } - - const num = Number.parseInt(teamNumber.value, 10); - if ( - Number.isNaN(num) || - teamNumber.value.includes('.') || - teamNumber.value.includes('e') || - num < 1 || - num > 25599 - ) { - teamNumber.classList.add('invalid'); - if (error) { - error.style.display = 'block'; - } - return false; - } else { - teamNumber.classList.remove('invalid'); - if (error) { - error.style.display = 'none'; - } - return true; - } -} diff --git a/vscode-wpilib/src/webviews/projectcreator.ts b/vscode-wpilib/src/webviews/projectcreator.ts index 28e091dd..b255bc6a 100644 --- a/vscode-wpilib/src/webviews/projectcreator.ts +++ b/vscode-wpilib/src/webviews/projectcreator.ts @@ -143,9 +143,14 @@ export class ProjectCreator extends WebViewBase { data.language ); - // Return the complete base objects to the UI + // Only send the fields the webview needs to avoid structured clone issues + const baseOptions = bases.map((base) => ({ + label: base.label, + description: base.description ?? '', + })); + await this.postMessage({ - data: bases, + data: baseOptions, type: 'base', }); } @@ -174,19 +179,13 @@ export class ProjectCreator extends WebViewBase { private async asyncInitialize() { const htmlPath = path.join( - extensionContext.extensionPath, - 'resources', - 'webviews', - 'projectcreator.html' - ); - const scriptPath = path.join( extensionContext.extensionPath, 'resources', 'dist', - 'projectcreatorpage.js' + 'projectcreator.html' ); // Include the 'projectcreator' domain for localization - await this.loadWebpage(htmlPath, scriptPath, ['projectcreator']); + await this.loadWebpage(htmlPath, undefined, ['projectcreator']); } } diff --git a/vscode-wpilib/src/webviews/svelte/components/shared/SummaryBox.svelte b/vscode-wpilib/src/webviews/svelte/components/shared/SummaryBox.svelte new file mode 100644 index 00000000..49b812a1 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/components/shared/SummaryBox.svelte @@ -0,0 +1,32 @@ + + + + +
+ {#if title} +

{title}

+ {/if} + + {#if children}{@render children()}{:else} + {#each items as item (item.label)} +
+ {item.label}: + {item.value ?? ''} +
+ {/each} + {/if} +
+ diff --git a/vscode-wpilib/src/webviews/svelte/components/shared/ValidationError.svelte b/vscode-wpilib/src/webviews/svelte/components/shared/ValidationError.svelte new file mode 100644 index 00000000..4721bd8d --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/components/shared/ValidationError.svelte @@ -0,0 +1,32 @@ + + +
+ {#if children}{@render children()}{:else} + {#if message} + {message} + {/if} + {/if} +
+ diff --git a/vscode-wpilib/src/webviews/svelte/components/shared/WizardProgress.svelte b/vscode-wpilib/src/webviews/svelte/components/shared/WizardProgress.svelte new file mode 100644 index 00000000..f0c8b044 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/components/shared/WizardProgress.svelte @@ -0,0 +1,28 @@ + + + + +
+ {#each steps as step (step.step)} +
step.step ? ' completed' : ''}`} + data-step={step.step} + > + {step.label} +
+ {/each} +
+ diff --git a/vscode-wpilib/src/webviews/svelte/components/shared/WizardStep.svelte b/vscode-wpilib/src/webviews/svelte/components/shared/WizardStep.svelte new file mode 100644 index 00000000..529a5a3a --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/components/shared/WizardStep.svelte @@ -0,0 +1,39 @@ + + +{#if element === 'section'} +
+ {@render children?.()} +
+{:else} +
+ {@render children?.()} +
+{/if} + diff --git a/vscode-wpilib/src/webviews/svelte/components/shared/index.ts b/vscode-wpilib/src/webviews/svelte/components/shared/index.ts new file mode 100644 index 00000000..20d440a3 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/components/shared/index.ts @@ -0,0 +1,5 @@ +export { default as WizardStep } from './WizardStep.svelte'; +export { default as WizardProgress } from './WizardProgress.svelte'; +export { default as ValidationError } from './ValidationError.svelte'; +export { default as SummaryBox } from './SummaryBox.svelte'; + diff --git a/vscode-wpilib/src/webviews/svelte/dependencyview/AvailableDependencies.svelte b/vscode-wpilib/src/webviews/svelte/dependencyview/AvailableDependencies.svelte new file mode 100644 index 00000000..ef2e9f33 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/dependencyview/AvailableDependencies.svelte @@ -0,0 +1,33 @@ + + +{#if dependencies.length === 0} +
No additional dependencies available
+{:else} + {#each dependencies as dependency, index} +
+
+ {dependency.name} + +
+
+ {dependency.version} + - {dependency.description} +
+
+ {/each} +{/if} + diff --git a/vscode-wpilib/src/webviews/svelte/dependencyview/DependencyView.svelte b/vscode-wpilib/src/webviews/svelte/dependencyview/DependencyView.svelte new file mode 100644 index 00000000..b41b8f88 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/dependencyview/DependencyView.svelte @@ -0,0 +1,102 @@ + + +
+ +
+ +
+ + +

Install from URL

+
+ installFromUrl(event.detail)} /> +
+ +
+ + +

Installed Dependencies

+
+ {installedDependencies.length} +
+
+ updateDependency(event.detail.index, event.detail.version)} + on:uninstall={(event) => uninstallDependency(event.detail.index)} + /> +
+ +
+ + +

Available Dependencies

+
+ {availableDependencies.length} +
+
+ installDependency(event.detail.index)} + /> +
+ diff --git a/vscode-wpilib/src/webviews/svelte/dependencyview/InstalledDependencies.svelte b/vscode-wpilib/src/webviews/svelte/dependencyview/InstalledDependencies.svelte new file mode 100644 index 00000000..45933c54 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/dependencyview/InstalledDependencies.svelte @@ -0,0 +1,81 @@ + + +{#if dependencies.length === 0} +
No dependencies installed
+{:else} + {#each dependencies as dependency, index} +
+
+
+ {dependency.name} + {dependency.currentVersion} +
+
+ +
+
+ + +
+ + + + +
+
+ {/each} +{/if} + diff --git a/vscode-wpilib/src/webviews/svelte/dependencyview/UrlInstallSection.svelte b/vscode-wpilib/src/webviews/svelte/dependencyview/UrlInstallSection.svelte new file mode 100644 index 00000000..b4c73f96 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/dependencyview/UrlInstallSection.svelte @@ -0,0 +1,46 @@ + + +
+
+ + +
+
+ Enter a vendor dependency JSON URL to install a library not listed in the available dependencies. +
+
+ diff --git a/vscode-wpilib/src/webviews/svelte/dependencyview/main.ts b/vscode-wpilib/src/webviews/svelte/dependencyview/main.ts new file mode 100644 index 00000000..52051bdf --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/dependencyview/main.ts @@ -0,0 +1,11 @@ +import { mount } from 'svelte'; +import DependencyView from './DependencyView.svelte'; + +const target = document.getElementById('app') ?? document.body; + +const app = mount(DependencyView, { + target, +}); + +export default app; + diff --git a/vscode-wpilib/src/webviews/svelte/dependencyview/types.ts b/vscode-wpilib/src/webviews/svelte/dependencyview/types.ts new file mode 100644 index 00000000..38b7bf5b --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/dependencyview/types.ts @@ -0,0 +1,14 @@ +export interface InstalledDependency { + name: string; + currentVersion: string; + versionInfo: { version: string; buttonText: string }[]; +} + +export interface AvailableDependency { + name: string; + version: string; + description: string; + website: string; + instructions?: string; +} + diff --git a/vscode-wpilib/src/webviews/svelte/gradle2025import/Gradle2025Import.svelte b/vscode-wpilib/src/webviews/svelte/gradle2025import/Gradle2025Import.svelte new file mode 100644 index 00000000..ce7d770e --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/gradle2025import/Gradle2025Import.svelte @@ -0,0 +1,223 @@ + + +
+ WPILib + +

Import WPILib 2025 Project

+ + + + + goToStep(2)} + /> + + + + { + projectName = event.detail; + showProjectNameError = true; + }} + on:teamNumberChange={(event) => { + teamNumber = event.detail; + showTeamNumberError = true; + }} + on:newFolderChange={(event) => (newFolder = event.detail)} + on:desktopChange={(event) => (desktop = event.detail)} + on:hardwareChange={(event) => (hardware = event.detail)} + on:back={() => goToStep(1)} + on:next={() => { + showProjectFolderError = true; + showProjectNameError = true; + showTeamNumberError = true; + if (!projectFolderError && !projectNameError && !teamNumberError) { + goToStep(3); + } + }} + /> + + + + goToStep(2)} + on:import={submitImport} + /> + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/gradle2025import/main.ts b/vscode-wpilib/src/webviews/svelte/gradle2025import/main.ts new file mode 100644 index 00000000..0c8f7005 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/gradle2025import/main.ts @@ -0,0 +1,11 @@ +import { mount } from 'svelte'; +import Gradle2025Import from './Gradle2025Import.svelte'; + +const target = document.getElementById('app') ?? document.body; + +const app = mount(Gradle2025Import, { + target, +}); + +export default app; + diff --git a/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step1SelectSource.svelte b/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step1SelectSource.svelte new file mode 100644 index 00000000..9320dae7 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step1SelectSource.svelte @@ -0,0 +1,50 @@ + + +
+

Step 1: Select Source Project

+

Select the build.gradle file of your 2025 WPILib project that you want to import.

+
+ +
+
Gradle Project
+ Select the build.gradle file of the gradle project to import. +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ diff --git a/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step2Configure.svelte b/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step2Configure.svelte new file mode 100644 index 00000000..1bf6e728 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step2Configure.svelte @@ -0,0 +1,225 @@ + + +
+

Step 2: Configure Project

+

Configure the new project's location and settings.

+
+ +
+
Base Folder
+ Select a base folder to place the new project into. +
+ +
+
+ + +
+
+ +
+ +
+ +
+
Project Name
+
+ + +
+
+ +
+
Team Number
+
+ + +
+
+ +
+
+ + + Creates a new folder at Base Folder/Project Name +
+
+ +
+
+ + + Enables desktop simulation and unit testing +
+
+ +
+

Hardware Platform

+

Select a hardware platform if applicable:

+
+ updateHardware('none')} + /> + +
+
+ updateHardware('romi')} + /> + +
+
+ updateHardware('xrp')} + /> + +
+
+ +
+ + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step3Review.svelte b/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step3Review.svelte new file mode 100644 index 00000000..d5cefcf1 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/gradle2025import/steps/Step3Review.svelte @@ -0,0 +1,59 @@ + + +
+

Step 3: Review & Import

+

Review your settings and select additional options before importing.

+
+ +
+ +
+ +
+
+

+ Note: The import process copies your project source files to a new directory and + completely regenerates the gradle files. If you made non-standard updates to the build.gradle, + you'll need to make those changes again. Vendor libraries must also be imported again. +

+

+ For more details, see + + Importing a Gradle Project + + on frc-docs. +

+
+
+ +
+ + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/gradle2025import/types.ts b/vscode-wpilib/src/webviews/svelte/gradle2025import/types.ts new file mode 100644 index 00000000..21e23482 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/gradle2025import/types.ts @@ -0,0 +1,16 @@ +export interface Gradle2025ImportData { + desktop: boolean; + romi: boolean; + xrp: boolean; + fromProps: string; + toFolder: string; + projectName: string; + newFolder: boolean; + teamNumber: string; +} + +export interface Gradle2025Message { + type: string; + data: string; +} + diff --git a/vscode-wpilib/src/webviews/svelte/help/Help.svelte b/vscode-wpilib/src/webviews/svelte/help/Help.svelte new file mode 100644 index 00000000..998a2266 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/help/Help.svelte @@ -0,0 +1,90 @@ + + +
+ WPILib + +

WPILib Help

+ +
+

+ Welcome to WPILib Help! Thank you for alpha testing the Systemcore and 2027 WPILib. Please + see + + https://github.com/wpilibsuite/SystemcoreTesting/ + for the expectations for testing and to provide your feedback. +

+ +

+ To open this window again, open the Command Palette (F1 or View->Command Palette), and + select + Open WPILib Help. +

+

+ For more help, see + the 2027 WPILib documentation. +

+
+ +
+

Common Tasks

+
    +
  • + Create a new project: Click on the Command Palette and type "WPILib: Create a new + project" +
  • +
  • + Deploy code to the robot: Click on the Command Palette and type "WPILib: Deploy Robot + Code" +
  • +
  • + Start a simulation: Click on the Command Palette and type "WPILib: Simulate Robot Code" +
  • +
  • Install vendor libraries: Click on "WPILib Dependencies" in the Activity Bar
  • +
+
+ +
+

Setting Up Your Workspace

+
    +
  • + Enable desktop support: Click on the Command Palette and type "WPILib: Set Desktop + Support" +
  • +
  • Run RioLog: Click on the Command Palette and type "WPILib: Start RioLog"
  • +
  • + Import a project: Click on the Command Palette and type "WPILib: Import a WPILib 2025 + Gradle project" +
  • +
+
+ +
+ + +
+
+ diff --git a/vscode-wpilib/src/webviews/svelte/help/main.ts b/vscode-wpilib/src/webviews/svelte/help/main.ts new file mode 100644 index 00000000..2668071e --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/help/main.ts @@ -0,0 +1,11 @@ +import { mount } from 'svelte'; +import Help from './Help.svelte'; + +const target = document.getElementById('app') ?? document.body; + +const app = mount(Help, { + target, +}); + +export default app; + diff --git a/vscode-wpilib/src/webviews/svelte/lib/i18n.ts b/vscode-wpilib/src/webviews/svelte/lib/i18n.ts new file mode 100644 index 00000000..a33daa08 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/lib/i18n.ts @@ -0,0 +1,54 @@ +import { readable } from 'svelte/store'; + +type MessageInput = string | [string, string]; + +type LocaleDomains = Record>; + +declare global { + interface Window { + i18nTrans: (domain: string, message: string, ...args: unknown[]) => string; + __I18N_LOCALE_DOMAINS?: LocaleDomains; + } +} + +const formatMessage = (message: string, args: unknown[]): string => { + return message.replace(/\{(\d+)\}/g, (match, index) => { + const argIndex = Number.parseInt(index, 10); + return argIndex >= 0 && argIndex < args.length ? String(args[argIndex]) : match; + }); +}; + +const fallbackLocalize = (domain: string, message: MessageInput, ...args: unknown[]): string => { + const [key, defaultText] = typeof message === 'string' ? [message, message] : message; + const localized = window.__I18N_LOCALE_DOMAINS?.[domain]?.[key] ?? defaultText; + return formatMessage(localized, args); +}; + +export function translate(domain: string, message: MessageInput, ...args: unknown[]): string { + if (typeof window !== 'undefined' && typeof window.i18nTrans === 'function') { + const [key] = typeof message === 'string' ? [message] : message; + return window.i18nTrans(domain, key, ...args); + } + + return fallbackLocalize(domain, message, ...args); +} + +export function createTranslator(defaultDomain: string) { + return (message: MessageInput, ...args: unknown[]) => translate(defaultDomain, message, ...args); +} + +export const localeDomainsStore = readable({}, (set) => { + if (typeof window !== 'undefined') { + set(window.__I18N_LOCALE_DOMAINS ?? {}); + } + + return () => undefined; +}); + +export function getLocaleDomains(): LocaleDomains { + if (typeof window !== 'undefined' && window.__I18N_LOCALE_DOMAINS) { + return window.__I18N_LOCALE_DOMAINS; + } + return {}; +} + diff --git a/vscode-wpilib/src/webviews/svelte/lib/index.ts b/vscode-wpilib/src/webviews/svelte/lib/index.ts new file mode 100644 index 00000000..8b96aa1a --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/lib/index.ts @@ -0,0 +1,3 @@ +export * from './vscode-api'; +export * from './i18n'; + diff --git a/vscode-wpilib/src/webviews/svelte/lib/vscode-api.ts b/vscode-wpilib/src/webviews/svelte/lib/vscode-api.ts new file mode 100644 index 00000000..18abcb8f --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/lib/vscode-api.ts @@ -0,0 +1,90 @@ +import { readable, writable } from 'svelte/store'; + +type VsCodeAPI = { + postMessage: (message: unknown) => void; + setState: (state: T) => void; + getState: () => T | undefined; +}; + +declare global { + interface Window { + acquireVsCodeApi?: () => VsCodeAPI; + } +} + +let cachedApi: VsCodeAPI | undefined; + +export function ensureVsCodeApi(): VsCodeAPI { + if (!cachedApi) { + if (typeof window !== 'undefined' && typeof window.acquireVsCodeApi === 'function') { + cachedApi = window.acquireVsCodeApi(); + } else { + throw new Error('VS Code API is not available in this context.'); + } + } + return cachedApi; +} + +export const vscodeApiStore = readable(null, (set) => { + try { + set(ensureVsCodeApi()); + } catch (err) { + console.error(err); + } + return () => { + set(null); + }; +}); + +export function postMessage(message: TMessage): void { + ensureVsCodeApi().postMessage(message); +} + +export function setState(state: TState): void { + ensureVsCodeApi().setState(state); +} + +export function getState(): TState | undefined { + return ensureVsCodeApi().getState(); +} + +export function subscribeToMessages(handler: (message: TMessage) => void): () => void { + const listener = (event: MessageEvent) => { + handler(event.data as TMessage); + }; + + window.addEventListener('message', listener); + return () => window.removeEventListener('message', listener); +} + +export function createMessageStore() { + return readable(null, (set) => { + const unsubscribe = subscribeToMessages((message) => { + set(message); + }); + return () => unsubscribe(); + }); +} + +export function createStateStore(key: string, initialValue: TState) { + const store = writable(initialValue); + + const currentState = getState | undefined>(); + if (currentState && key in currentState) { + store.set(currentState[key] as TState); + } + + const unsubscribe = store.subscribe((value) => { + const state = getState>() ?? {}; + state[key] = value; + setState(state); + }); + + return { + subscribe: store.subscribe, + set: store.set, + update: store.update, + dispose: unsubscribe, + }; +} + diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/ProjectCreator.svelte b/vscode-wpilib/src/webviews/svelte/projectcreator/ProjectCreator.svelte new file mode 100644 index 00000000..c28aeca9 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/ProjectCreator.svelte @@ -0,0 +1,329 @@ + + +
+ WPILib + +

Welcome to WPILib New Project Creator

+ + + + + handleProjectTypeSelection(event.detail)} + on:next={handleStep1Next} + /> + + + + goToStep(3)} + onBack={() => goToStep(1)} + /> + + + + handleProjectNameChange(event.detail)} + on:teamNumberChange={(event) => handleTeamNumberChange(event.detail)} + on:newFolderChange={(event) => (newFolder = event.detail)} + on:desktopChange={(event) => (desktop = event.detail)} + on:back={() => goToStep(2)} + on:next={handleStep3Next} + /> + + + + goToStep(3)} + on:create={createProject} + /> + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/main.ts b/vscode-wpilib/src/webviews/svelte/projectcreator/main.ts new file mode 100644 index 00000000..c9cb9c96 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/main.ts @@ -0,0 +1,11 @@ +import { mount } from 'svelte'; +import ProjectCreator from './ProjectCreator.svelte'; + +const target = document.getElementById('app') ?? document.body; + +const app = mount(ProjectCreator, { + target, +}); + +export default app; + diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step1ProjectType.svelte b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step1ProjectType.svelte new file mode 100644 index 00000000..bbf7fe8f --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step1ProjectType.svelte @@ -0,0 +1,68 @@ + + +
+

Step 1: Select Project Type

+

Choose whether to create a project from a template or an example.

+
+ +
+ + +
+ +
+
+ +
+ diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step2LanguageBase.svelte b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step2LanguageBase.svelte new file mode 100644 index 00000000..7dd16e59 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step2LanguageBase.svelte @@ -0,0 +1,118 @@ + + +
+

Step 2: Select Language & Base

+

Choose the programming language and project base to use.

+
+ +
+
Language
+
+ + +
+
+ +
+
Project Base
+
+ + +
+
+ +
+ + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step3LocationConfig.svelte b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step3LocationConfig.svelte new file mode 100644 index 00000000..49da8a6a --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step3LocationConfig.svelte @@ -0,0 +1,175 @@ + + +
+

Step 3: Project Location & Configuration

+

Set where to save your project and configure basic settings.

+
+ +
+
Base Folder
+
+ + +
+
+ +
+ +
+ +
+
Project Name
+
+ + +
+
+ +
+
Team Number
+
+ + +
+
+ +
+
+ + + Creates a new folder at Base Folder/Project Name +
+
+ +
+
+ + + This enables unit testing and simulation support +
+
+ +
+ + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step4Review.svelte b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step4Review.svelte new file mode 100644 index 00000000..86d3bead --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/steps/Step4Review.svelte @@ -0,0 +1,55 @@ + + +
+

Step 4: Review & Create

+

Review your selections and create the project.

+
+ +
+ +
+ +
+ + +
+ diff --git a/vscode-wpilib/src/webviews/svelte/projectcreator/types.ts b/vscode-wpilib/src/webviews/svelte/projectcreator/types.ts new file mode 100644 index 00000000..1f896426 --- /dev/null +++ b/vscode-wpilib/src/webviews/svelte/projectcreator/types.ts @@ -0,0 +1,21 @@ +export enum ProjectType { + Example, + Template, +} + +export interface BaseOption { + label: string; + description: string; +} + +export interface ProjectCreationData { + base: string; + desktop: boolean; + projectType: ProjectType; + language: string; + toFolder: string; + projectName: string; + newFolder: boolean; + teamNumber: string; +} + diff --git a/vscode-wpilib/src/webviews/webviewbase.ts b/vscode-wpilib/src/webviews/webviewbase.ts index 7fcf4567..086af931 100644 --- a/vscode-wpilib/src/webviews/webviewbase.ts +++ b/vscode-wpilib/src/webviews/webviewbase.ts @@ -3,23 +3,20 @@ import * as path from 'path'; import * as vscode from 'vscode'; import { loadLocaleFile } from '../locale'; -import { extensionContext, readFileAsync } from '../utilities'; import { logger } from '../logger'; +import { extensionContext, readFileAsync } from '../utilities'; export abstract class WebViewBase { - protected html: string = ''; - protected webview: vscode.WebviewPanel | undefined; + protected html = ''; + protected webview?: vscode.WebviewPanel; protected disposables: vscode.Disposable[] = []; - protected viewType: string; - protected title: string; - protected resourceRoot: string; - protected scriptPath?: string = undefined; - - protected constructor(viewType: string, title: string, resourceRoot: string) { - this.viewType = viewType; - this.title = title; - this.resourceRoot = resourceRoot; - } + protected scriptPath?: string; + + constructor( + protected readonly viewType: string, + protected readonly title: string, + protected readonly resourceRoot: string + ) {} public async loadWebpage( htmlPath: string, @@ -33,9 +30,7 @@ export abstract class WebViewBase { return; } - if (scriptPath) { - this.scriptPath = scriptPath; - } + this.scriptPath = scriptPath; this.html = this.html.replace( '', @@ -45,67 +40,39 @@ export abstract class WebViewBase { ` ); - if (localeDomains) { - localeDomains.push('ui'); - } else { - localeDomains = ['ui']; + const specifiedDomains = Array.isArray(localeDomains) ? localeDomains.filter(Boolean) : []; + if (!specifiedDomains.includes('ui')) { + specifiedDomains.push('ui'); } - const defaultDomain = localeDomains[0]; - - localeDomains.forEach((domain) => { - this.html += - `\r\n\r\n'; - }); - } + const uniqueDomains = [...new Set(specifiedDomains)]; - private replaceResources(webview: vscode.Webview) { - // Add CSS for main.css - const cssUri = webview.asWebviewUri( - vscode.Uri.file(path.join(extensionContext.extensionPath, 'resources', 'media', 'main.css')) - ); - // Add CSS for vscode-elements.css - const elementsCssUri = webview.asWebviewUri( - vscode.Uri.file( - path.join(extensionContext.extensionPath, 'resources', 'media', 'vscode-elements.css') - ) - ); - // Add CSS for icons.css - const iconsCssUri = webview.asWebviewUri( - vscode.Uri.file(path.join(extensionContext.extensionPath, 'resources', 'media', 'icons.css')) - ); - // Update the CSS paths with the webview URI - this.html = this.html.replace('replaceresource/media/main.css', cssUri.toString()); - this.html = this.html.replace( - 'replaceresource/media/vscode-elements.css', - elementsCssUri.toString() - ); - this.html = this.html.replace('replaceresource/media/icons.css', iconsCssUri.toString()); + if (uniqueDomains.length > 0) { + const defaultDomain = uniqueDomains[0]; + const scriptBlocks = uniqueDomains + .map((domain) => { + const localeJson = JSON.stringify(loadLocaleFile(domain)).replace( + /<\/(script)/gi, + '<\\/$1' + ); + const defaultAttr = defaultDomain === domain ? ' data-default-domain' : ''; + return ``; + }) + .join('\n'); - // Add script path if provided - if (this.scriptPath) { - this.html += this.getScriptTag(this.scriptPath, webview); + if (this.html.includes('')) { + this.html = this.html.replace('', `${scriptBlocks}\n`); + } else { + this.html += `\n${scriptBlocks}\n`; + } } - - // Add locale loader script - this.html += this.getScriptTag( - path.join(extensionContext.extensionPath, 'resources', 'dist', 'localeloader.js'), - webview - ); - - // Replace resource paths - const onDiskPath = vscode.Uri.file(extensionContext.extensionPath); - const replacePath = webview.asWebviewUri(onDiskPath); - this.html = this.html.replace(/replaceresource/g, replacePath.toString()); } public displayWebView( showOptions: vscode.ViewColumn | { preserveFocus: boolean; viewColumn: vscode.ViewColumn }, reveal?: boolean, options?: vscode.WebviewPanelOptions & vscode.WebviewOptions - ) { - if (this.webview === undefined) { + ): void { + if (!this.webview) { this.webview = vscode.window.createWebviewPanel(this.viewType, this.title, showOptions, { enableScripts: true, retainContextWhenHidden: true, @@ -115,36 +82,74 @@ export abstract class WebViewBase { vscode.Uri.file(path.join(extensionContext.extensionPath, 'resources', 'media')), ], }); + this.webview.iconPath = vscode.Uri.file(path.join(this.resourceRoot, 'wpilib-icon-128.png')); this.replaceResources(this.webview.webview); this.webview.webview.html = this.html; - this.webview.onDidDispose(() => { - this.webview = undefined; - }); - } - if (reveal) { - this.webview.reveal(); + + this.webview.onDidDispose(() => (this.webview = undefined)); } + + if (reveal) this.webview.reveal(); + } + + public dispose(): void { + this.webview?.dispose(); + for (const d of this.disposables) d.dispose(); } - public dispose() { - if (this.webview !== undefined) { - this.webview.dispose(); + private replaceResources(webview: vscode.Webview): void { + const cssMain = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionContext.extensionPath, 'resources', 'media', 'main.css')) + ); + const cssElems = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionContext.extensionPath, 'resources', 'media', 'vscode-elements.css')) + ); + const cssIcons = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionContext.extensionPath, 'resources', 'media', 'icons.css')) + ); + + this.html = this.html + .replace('replaceresource/resources/media/main.css', cssMain.toString()) + .replace('replaceresource/resources/media/vscode-elements.css', cssElems.toString()) + .replace('replaceresource/resources/media/icons.css', cssIcons.toString()); + + this.html = this.html.replace( + /<\/script>/gi, + (_, fileName: string) => { + const abs = path.join(extensionContext.extensionPath, 'resources', 'dist', fileName); + const uri = webview.asWebviewUri(vscode.Uri.file(abs)); + return ``; + } + ); + + if (this.scriptPath && !this.html.includes(path.basename(this.scriptPath))) { + const tag = this.buildScriptTag(this.scriptPath, webview); + this.html = this.html.includes('') + ? this.html.replace('', `${tag}`) + : this.html + tag; } - for (const d of this.disposables) { - d.dispose(); + + const localeLoaderPath = path.join( + extensionContext.extensionPath, + 'resources', + 'dist', + 'localeloader.js' + ); + const localeLoaderFileName = path.basename(localeLoaderPath); + if (!this.html.includes(localeLoaderFileName)) { + const loaderTag = this.buildScriptTag(localeLoaderPath, webview); + this.html = this.html.includes('') + ? this.html.replace('', `${loaderTag}`) + : this.html + loaderTag; } + + const baseUri = webview.asWebviewUri(vscode.Uri.file(extensionContext.extensionPath)); + this.html = this.html.replace(/replaceresource/g, baseUri.toString()); } - private getScriptTag(scriptPath: string, webview: vscode.Webview) { - let html = ''; - const scriptOnDisk = vscode.Uri.file(scriptPath); - // get the special URI to use with the webview - const scriptResourcePath = webview.asWebviewUri(scriptOnDisk); - html += '\r\n\r\n'; - return html; + private buildScriptTag(scriptPath: string, webview: vscode.Webview): string { + const uri = webview.asWebviewUri(vscode.Uri.file(scriptPath)); + return `\n\n`; } } diff --git a/vscode-wpilib/svelte.config.js b/vscode-wpilib/svelte.config.js new file mode 100644 index 00000000..0ef8dbc8 --- /dev/null +++ b/vscode-wpilib/svelte.config.js @@ -0,0 +1,15 @@ +const preprocess = require('svelte-preprocess'); + +/** @type {import('svelte/types/compiler/preprocess').PreprocessorGroup | import('svelte/types/compiler/preprocess').PreprocessorGroup[]} */ +module.exports = { + preprocess: preprocess({ + typescript: { + tsconfigFile: './tsconfig.webviews.json', + }, + }), + compilerOptions: { + css: true, + dev: process.env.NODE_ENV !== 'production', + }, +}; + diff --git a/vscode-wpilib/tsconfig.json b/vscode-wpilib/tsconfig.json index 3035a863..7ab847b0 100644 --- a/vscode-wpilib/tsconfig.json +++ b/vscode-wpilib/tsconfig.json @@ -6,6 +6,9 @@ "lib": ["es2019", "dom"], "sourceMap": true, "rootDir": "src", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "types": ["node", "svelte", "mocha"], /* Strict Type-Checking Option */ "strict": true /* enable all strict type-checking options */, /* Additional Checks */ @@ -14,5 +17,6 @@ "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, "noUnusedParameters": true /* Report errors on unused parameters. */ }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.svelte"], "exclude": ["node_modules", ".vscode-test", "out", "resources"] } diff --git a/vscode-wpilib/tsconfig.webviews.json b/vscode-wpilib/tsconfig.webviews.json new file mode 100644 index 00000000..b18f34ac --- /dev/null +++ b/vscode-wpilib/tsconfig.webviews.json @@ -0,0 +1,26 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "esnext", + "outDir": "./resources/dist/.tsbuild", + "noEmit": false, + "types": ["node", "svelte", "mocha"], + "verbatimModuleSyntax": true, + "noUnusedLocals": false + }, + "include": [ + "src/webviews/svelte/**/*.ts", + "src/webviews/svelte/**/*.svelte", + "src/webviews/pages/**/*.ts" + ], + "exclude": [ + "node_modules", + "out", + "resources", + "src/unittest", + "src/extension.ts", + "src/webviews/**/*.test.ts", + "src/webviews/**/*.spec.ts" + ] +} + diff --git a/vscode-wpilib/webpack.config.js b/vscode-wpilib/webpack.config.js index e7cad117..4bed5524 100644 --- a/vscode-wpilib/webpack.config.js +++ b/vscode-wpilib/webpack.config.js @@ -6,8 +6,6 @@ module.exports = [ { entry: { localeloader: './src/webviews/localeloader.ts', - gradle2025importpage: './src/webviews/pages/gradle2025importpage.ts', - projectcreatorpage: './src/webviews/pages/projectcreatorpage.ts', riologpage: ['./src/riolog/shared/sharedscript.ts', './src/riolog/script/implscript.ts'], }, devtool: isDevelopment ? 'inline-source-map' : 'source-map',