diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3544d6d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "amodio.tsl-problem-matcher", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 0db84af..80c15e1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,9 +1,8 @@ -// A launch configuration that launches the extension inside a new window { "version": "0.2.0", "configurations": [ { - "name": "Run G-Code (Sandbox) - Samples", + "name": "Run G-Code (Sandbox)", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", @@ -23,10 +22,9 @@ ], "presentation": { "hidden": false, - "group": "Launch Extension", + "group": "1_run", "order": 1 }, - "preLaunchTask": "npm: webpack", "skipFiles": [ "/**", "**/node_modules/**", @@ -34,17 +32,51 @@ ], "smartStep": true, "sourceMaps": true, - "trace": true, + "trace": true }, { - "name": "Run G-Code (Sandbox)", + "name": "Run G-Code (Full)", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--trace-depreciation", + "--trace-warnings", + "--extensionDevelopmentPath=${workspaceFolder}", + "${workspaceFolder}/samplenc/sample-colors.nc", + "${workspaceFolder}/samplenc/sample-profile.nc", + "${workspaceFolder}/samplenc/sample-circular-pocket.nc" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "presentation": { + "hidden": false, + "group": "1_run", + "order": 2 + }, + "skipFiles": [ + "/**", + "**/node_modules/**", + "**/resources/app/out/vs/**" + ], + "smartStep": true, + "sourceMaps": true, + "trace": true + }, + { + "name": "Build & Run G-Code (Sandbox)", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", "args": [ "--disable-extensions", + "--trace-warnings", "--trace-depreciation", - "--extensionDevelopmentPath=${workspaceFolder}" + "--extensionDevelopmentPath=${workspaceFolder}", + "${workspaceFolder}/samplenc/sample-colors.nc", + "${workspaceFolder}/samplenc/sample-profile.nc", + "${workspaceFolder}/samplenc/sample-circular-pocket.nc" ], "cwd": "${workspaceFolder}", "outFiles": [ @@ -52,10 +84,10 @@ ], "presentation": { "hidden": false, - "group": "Launch Extension", - "order": 2 + "group": "2_build_launch", + "order": 1 }, - "preLaunchTask": "npm: webpack", + "preLaunchTask": "npm: build", "skipFiles": [ "/**", "**/node_modules/**", @@ -66,49 +98,66 @@ "trace": true }, { - "name": "Run G-Code (Full)", + "name": "Build & Run G-Code (Full)", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", "args": [ "--trace-depreciation", - "--extensionDevelopmentPath=${workspaceFolder}" + "--trace-warnings", + "--extensionDevelopmentPath=${workspaceFolder}", + "${workspaceFolder}/samplenc/sample-colors.nc", + "${workspaceFolder}/samplenc/sample-profile.nc", + "${workspaceFolder}/samplenc/sample-circular-pocket.nc" ], "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "presentation": { "hidden": false, - "group": "Launch Extension", - "order": 3 + "group": "2_build_launch", + "order": 2 }, - "preLaunchTask": "npm: webpack", + "preLaunchTask": "npm: build", "skipFiles": [ "/**", - "**/node_modules/**" + "**/node_modules/**", + "**/resources/app/out/vs/**" ], "smartStep": true, "sourceMaps": true, "trace": true }, { - "name": "Run G-Code As Web Extension", + "name": "Build & Run G-Code (Full/Production)", "type": "extensionHost", - "debugWebWorkerHost": true, "request": "launch", + "runtimeExecutable": "${execPath}", "args": [ + "--trace-depreciation", + "--trace-warnings", "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionDevelopmentKind=web" + "${workspaceFolder}/samplenc/sample-colors.nc", + "${workspaceFolder}/samplenc/sample-profile.nc", + "${workspaceFolder}/samplenc/sample-circular-pocket.nc" ], "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], - "preLaunchTask": "npm: webpack", "presentation": { "hidden": false, - "group": "Web Extension", - "order": 1 - } + "group": "2_build_launch", + "order": 3 + }, + "preLaunchTask": "npm: bundle", + "skipFiles": [ + "/**", + "**/node_modules/**", + "**/resources/app/out/vs/**" + ], + "smartStep": true, + "sourceMaps": true, + "trace": true }, { "name": "G-Code Mocha Unit Tests", @@ -127,11 +176,12 @@ ], "skipFiles": [ "/**", - "**/node_modules/**" + "**/node_modules/**", + "**/resources/app/out/vs/**" ], "presentation": { "hidden": false, - "group": "Testing", + "group": "3_test", "order": 1 }, "env": { diff --git a/.vscode/settings.json b/.vscode/settings.json index 8fb0f2b..3b7675b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,11 @@ { "files.exclude": { - "out": false // set this to true to hide the "out" folder with the compiled JS files + "out": false }, "search.exclude": { - "out": true // set this to false to include "out" folder in search results + "out": true, + "dist": true }, - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts "typescript.tsc.autoDetect": "off", "[typescript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 577788d..b46001f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,39 +1,24 @@ { "version": "2.0.0", + "presentation": { + "echo": false, + "reveal": "always", + "focus": false, + "panel": "dedicated", + "showReuseMessage": false, + "clear": false + }, "tasks": [ { "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "echo": true, - "reveal": "never", - "focus": false, - "panel": "shared", - "showReuseMessage": true, - "clear": false - }, + "script": "build", + "problemMatcher": [ + "$ts-webpack", + ], "group": { "kind": "build", "isDefault": true } - }, - { - "type": "npm", - "script": "webpack", - "problemMatcher": "$tsc-watch", - "label": "npm: webpack", - "detail": "webpack --mode development", - "isBackground": true, - "presentation": { - "echo": true, - "reveal": "always", - "focus": false, - "panel": "shared", - "showReuseMessage": true, - "clear": false - } } ] } \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore index b2f7b32..d702229 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -8,6 +8,7 @@ .prettierignore .prettierrc .vscode-test/** +.vscode-test-web/** .vscode/** **/*.map CODE_OF_CONDUCT.md @@ -18,9 +19,12 @@ images/**/[^logo]* out/test/** package-lock.json samplenc/** +scripts/** src/** test/** out/** +node_modules/** tsconfig** tsconfig.tsbuildinfo -webpack.config.js \ No newline at end of file +webpack.config*.js +.DS_Store \ No newline at end of file diff --git a/images/calculator-screenshot.png b/images/calculator-screenshot.png new file mode 100644 index 0000000..0aded90 Binary files /dev/null and b/images/calculator-screenshot.png differ diff --git a/package-lock.json b/package-lock.json index 3f76eca..16e559e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.7.7", "license": "MIT", "dependencies": { - "@appliedengdesign/gcode-reference": "^0.0.8" + "@appliedengdesign/gcode-reference": "^0.0.8", + "@vscode/webview-ui-toolkit": "^1.0.0" }, "devDependencies": { "@types/chai": "^4.3.4", @@ -20,14 +21,21 @@ "@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/parser": "^5.42.1", "chai": "^4.3.7", + "copy-webpack-plugin": "^11.0.0", + "csp-html-webpack-plugin": "^5.1.0", + "css-loader": "^6.7.1", "eslint": "^8.27.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.2.1", - "fork-ts-checker-webpack-plugin": "^7.2.13", + "eslint-webpack-plugin": "^3.2.0", "glob": "^8.0.3", + "html-loader": "^4.2.0", + "mini-css-extract-plugin": "^2.6.1", "mocha": "^10.1.0", "prettier": "^2.7.1", + "sass": "^1.54.0", + "sass-loader": "^13.0.2", "shx": "^0.3.4", "ts-loader": "^9.4.1", "ts-node": "^10.9.1", @@ -50,103 +58,6 @@ "url": "https://github.com/sponsors/appliedengdesign" } }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -282,6 +193,42 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@microsoft/fast-element": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.10.3.tgz", + "integrity": "sha512-ns/EEo5WSXNwRBe29O7sSA4SSqlapyHESXBT+JAcrR/3i0fLYQFMO/PdzfEMhsXmoUkZny6ewVbM4CttZa94Kg==" + }, + "node_modules/@microsoft/fast-foundation": { + "version": "2.46.10", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.46.10.tgz", + "integrity": "sha512-lu1jN/dRkdOqkrDudEMZAmWhBy0XFkGr8oU8Z8vjUwhU1Ag3gxKbmfU0Yf4V44tMDkId3nJh8bXvh1d+U6MvQA==", + "dependencies": { + "@microsoft/fast-element": "^1.10.3", + "@microsoft/fast-web-utilities": "^5.4.1", + "tabbable": "^5.2.0", + "tslib": "^1.13.0" + } + }, + "node_modules/@microsoft/fast-react-wrapper": { + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.1.48.tgz", + "integrity": "sha512-9NvEjru9Kn5ZKjomAMX6v+eF0DR+eDkxKDwDfi+Wb73kTbrNzcnmlwd4diN15ygH97kldgj2+lpvI4CKLQQWLg==", + "dependencies": { + "@microsoft/fast-element": "^1.9.0", + "@microsoft/fast-foundation": "^2.41.1" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@microsoft/fast-web-utilities": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", + "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==", + "dependencies": { + "exenv-es6": "^1.1.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -398,6 +345,13 @@ "@types/node": "*" } }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "peer": true + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -428,12 +382,6 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -633,6 +581,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vscode/webview-ui-toolkit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.0.0.tgz", + "integrity": "sha512-/qaHYZXqvIKkao54b7bLzyNH8BC+X4rBmTUx1MvcIiCjqRMxml0BCpqJhnDpfrCb0IOxXRO8cAy1eB5ayzQfBA==", + "dependencies": { + "@microsoft/fast-element": "^1.6.2", + "@microsoft/fast-foundation": "^2.38.0", + "@microsoft/fast-react-wrapper": "^0.1.18" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -894,6 +855,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -1055,6 +1055,12 @@ "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1152,6 +1158,22 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/caniuse-lite": { "version": "1.0.30001230", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", @@ -1226,6 +1248,189 @@ "node": "*" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1262,6 +1467,19 @@ "node": ">=6.0" } }, + "node_modules/clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "dev": true, + "peer": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1323,28 +1541,132 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -1365,6 +1687,87 @@ "node": ">= 8" } }, + "node_modules/csp-html-webpack-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/csp-html-webpack-plugin/-/csp-html-webpack-plugin-5.1.0.tgz", + "integrity": "sha512-6l/s6hACE+UA01PLReNKZfgLZWM98f7ewWmE79maDWIbEXiPcIWQGB3LQR/Zw+hPBj4XPZZ5zNrrO+aygqaLaQ==", + "dev": true, + "dependencies": { + "cheerio": "^1.0.0-rc.5", + "lodash": "^4.17.20" + }, + "peerDependencies": { + "html-webpack-plugin": "^4 || ^5", + "webpack": "^4 || ^5" + } + }, + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1400,15 +1803,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1454,6 +1848,90 @@ "node": ">=6.0.0" } }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "peer": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "peer": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -1494,6 +1972,16 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -1506,15 +1994,6 @@ "node": ">=4" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", @@ -1581,15 +2060,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.27.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", @@ -1890,6 +2360,97 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2022,6 +2583,11 @@ "node": ">=0.8.x" } }, + "node_modules/exenv-es6": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", + "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2142,60 +2708,6 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "vue-template-compiler": "*", - "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2503,6 +3015,156 @@ "he": "bin/he" } }, + "node_modules/html-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz", + "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==", + "dev": true, + "dependencies": { + "html-minifier-terser": "^7.0.0", + "parse5": "^7.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/html-loader/node_modules/clean-css": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", + "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/html-loader/node_modules/commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/html-loader/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/html-loader/node_modules/html-minifier-terser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", + "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "5.2.0", + "commander": "^9.4.0", + "entities": "^4.3.1", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.14.2" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "peer": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -2530,6 +3192,18 @@ "node": ">= 6" } }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -2539,6 +3213,12 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2683,12 +3363,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -2979,7 +3653,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "peer": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -3023,18 +3697,6 @@ "json5": "lib/cli.js" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3044,6 +3706,15 @@ "node": ">=0.10.0" } }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3057,12 +3728,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -3118,6 +3783,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", @@ -3127,6 +3804,21 @@ "get-func-name": "^2.0.0" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3145,18 +3837,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", - "dev": true, - "dependencies": { - "fs-monkey": "1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3173,13 +3853,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -3215,7 +3895,79 @@ "mime-db": "1.47.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/minimatch": { @@ -3392,10 +4144,20 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/node-abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", - "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, "node_modules/node-releases": { @@ -3413,6 +4175,18 @@ "node": ">=0.10.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -3537,6 +4311,22 @@ "node": ">=6" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3549,24 +4339,74 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=8" + "node": ">= 4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3618,10 +4458,16 @@ "node": "*" } }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -3630,6 +4476,120 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3666,6 +4626,17 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3710,6 +4681,18 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -3767,6 +4750,29 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "peer": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3776,6 +4782,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -3911,6 +4926,61 @@ } ] }, + "node_modules/sass": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, "node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -4091,6 +5161,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -4225,6 +5304,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -4405,8 +5489,7 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -4484,15 +5567,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -4526,6 +5600,13 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "peer": true + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -4855,15 +5936,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -4942,99 +6014,21 @@ "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@appliedengdesign/gcode-reference": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@appliedengdesign/gcode-reference/-/gcode-reference-0.0.8.tgz", - "integrity": "sha512-ZXA1UymxKJhn4++m9QI1bgjt33zMJZTUw0fDCm9JfbNJq/c+8y3gCq66jFpT3uc6ej6qUsmYQTrOo4O/Eo33Pw==" - }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } + } + }, + "dependencies": { + "@appliedengdesign/gcode-reference": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@appliedengdesign/gcode-reference/-/gcode-reference-0.0.8.tgz", + "integrity": "sha512-ZXA1UymxKJhn4++m9QI1bgjt33zMJZTUw0fDCm9JfbNJq/c+8y3gCq66jFpT3uc6ej6qUsmYQTrOo4O/Eo33Pw==" }, "@cspotcode/source-map-support": { "version": "0.8.1", @@ -5140,6 +6134,39 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@microsoft/fast-element": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.10.3.tgz", + "integrity": "sha512-ns/EEo5WSXNwRBe29O7sSA4SSqlapyHESXBT+JAcrR/3i0fLYQFMO/PdzfEMhsXmoUkZny6ewVbM4CttZa94Kg==" + }, + "@microsoft/fast-foundation": { + "version": "2.46.10", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.46.10.tgz", + "integrity": "sha512-lu1jN/dRkdOqkrDudEMZAmWhBy0XFkGr8oU8Z8vjUwhU1Ag3gxKbmfU0Yf4V44tMDkId3nJh8bXvh1d+U6MvQA==", + "requires": { + "@microsoft/fast-element": "^1.10.3", + "@microsoft/fast-web-utilities": "^5.4.1", + "tabbable": "^5.2.0", + "tslib": "^1.13.0" + } + }, + "@microsoft/fast-react-wrapper": { + "version": "0.1.48", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.1.48.tgz", + "integrity": "sha512-9NvEjru9Kn5ZKjomAMX6v+eF0DR+eDkxKDwDfi+Wb73kTbrNzcnmlwd4diN15ygH97kldgj2+lpvI4CKLQQWLg==", + "requires": { + "@microsoft/fast-element": "^1.9.0", + "@microsoft/fast-foundation": "^2.41.1" + } + }, + "@microsoft/fast-web-utilities": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", + "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==", + "requires": { + "exenv-es6": "^1.1.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5244,6 +6271,13 @@ "@types/node": "*" } }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "peer": true + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -5274,12 +6308,6 @@ "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -5390,6 +6418,16 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@vscode/webview-ui-toolkit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.0.0.tgz", + "integrity": "sha512-/qaHYZXqvIKkao54b7bLzyNH8BC+X4rBmTUx1MvcIiCjqRMxml0BCpqJhnDpfrCb0IOxXRO8cAy1eB5ayzQfBA==", + "requires": { + "@microsoft/fast-element": "^1.6.2", + "@microsoft/fast-foundation": "^2.38.0", + "@microsoft/fast-react-wrapper": "^0.1.18" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -5618,6 +6656,35 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -5738,6 +6805,12 @@ "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5810,6 +6883,24 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, "caniuse-lite": { "version": "1.0.30001230", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", @@ -5867,6 +6958,138 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + } + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "dependencies": { + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true + } + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -5889,6 +7112,16 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, + "clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "dev": true, + "peer": true, + "requires": { + "source-map": "~0.6.0" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -5944,25 +7177,95 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -5980,6 +7283,58 @@ "which": "^2.0.1" } }, + "csp-html-webpack-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/csp-html-webpack-plugin/-/csp-html-webpack-plugin-5.1.0.tgz", + "integrity": "sha512-6l/s6hACE+UA01PLReNKZfgLZWM98f7ewWmE79maDWIbEXiPcIWQGB3LQR/Zw+hPBj4XPZZ5zNrrO+aygqaLaQ==", + "dev": true, + "requires": { + "cheerio": "^1.0.0-rc.5", + "lodash": "^4.17.20" + } + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "peer": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6004,12 +7359,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -6043,6 +7392,74 @@ "esutils": "^2.0.2" } }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "peer": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "peer": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "peer": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "peer": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6080,21 +7497,19 @@ "tapable": "^2.2.0" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "peer": true + }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-abstract": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", @@ -6146,12 +7561,6 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, "eslint": { "version": "8.27.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", @@ -6413,12 +7822,77 @@ } } }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dev": true, + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, "espree": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", @@ -6482,6 +7956,11 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, + "exenv-es6": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", + "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6584,43 +8063,6 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6844,6 +8286,106 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "html-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.2.0.tgz", + "integrity": "sha512-OxCHD3yt+qwqng2vvcaPApCEvbx+nXWu+v69TYHx1FO8bffHn/JjHtE3TTQZmHjwvnJe4xxzuecetDVBrQR1Zg==", + "dev": true, + "requires": { + "html-minifier-terser": "^7.0.0", + "parse5": "^7.0.0" + }, + "dependencies": { + "clean-css": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.0.tgz", + "integrity": "sha512-2639sWGa43EMmG7fn8mdVuBSs6HuWaSor+ZPoFWzenBc6oN+td8YhTfghWXZ25G1NiiSvz8bOFBS7PdSbTiqEA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, + "html-minifier-terser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.0.0.tgz", + "integrity": "sha512-Adqk0b/pWKIQiGvEAuzPKpBKNHiwblr3QSGS7TTr6v+xXKV9AI2k4vWW+6Oytt6Z5SeBnfvYypKOnz8r75pz3Q==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "5.2.0", + "commander": "^9.4.0", + "entities": "^4.3.1", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.14.2" + } + } + } + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "peer": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "peer": true + } + } + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "peer": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "peer": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -6865,12 +8407,25 @@ "debug": "4" } }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6978,12 +8533,6 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -7181,7 +8730,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "peer": true }, "js-yaml": { "version": "4.1.0", @@ -7219,22 +8768,18 @@ "minimist": "^1.2.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7245,12 +8790,6 @@ "type-check": "~0.4.0" } }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -7294,6 +8833,15 @@ "is-unicode-supported": "^0.1.0" } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loupe": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", @@ -7303,6 +8851,23 @@ "get-func-name": "^2.0.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7318,15 +8883,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", - "dev": true, - "requires": { - "fs-monkey": "1.0.3" - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7340,13 +8896,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -7370,6 +8926,56 @@ "mime-db": "1.47.0" } }, + "mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7512,11 +9118,23 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node-abort-controller": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", - "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", - "dev": true + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } }, "node-releases": { "version": "1.1.71", @@ -7530,6 +9148,15 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", @@ -7618,6 +9245,24 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7627,16 +9272,60 @@ "callsites": "^3.0.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "requires": { + "entities": "^4.3.0" + }, + "dependencies": { + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "dev": true + } + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "dependencies": { + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + } + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } } }, "path-exists": { @@ -7675,10 +9364,87 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "prelude-ls": { @@ -7702,6 +9468,17 @@ "fast-diff": "^1.1.2" } }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "peer": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -7729,6 +9506,15 @@ "safe-buffer": "^5.1.0" } }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -7776,12 +9562,38 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "peer": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -7862,6 +9674,27 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "sass": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", + "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -7992,6 +9825,12 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -8094,6 +9933,11 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tabbable": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -8208,8 +10052,7 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { "version": "3.21.0", @@ -8259,12 +10102,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, "unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -8298,6 +10135,13 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "peer": true + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -8524,12 +10368,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index de72370..ae97f9c 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,8 @@ "activationEvents": [ "onLanguage:gcode", "onView:gcode.gcodeTree", - "onView:gcode.gcodeStats" + "onView:gcode.gcodeStats", + "onView:gcode.webviews.calc" ], "capabilities": { "virtualWorkspaces": true @@ -152,185 +153,205 @@ "path": "./snippets/general-snippets.json" } ], - "configuration": { - "type": "object", - "title": "G-Code", - "properties": { - "gcode.general.machineType": { - "type": "string", - "default": "Mill", - "enum": [ - "Mill", - "Lathe", - "3D Printer", - "Swiss", - "Laser", - "EDM" - ], - "enumDescriptions": [ - "Configure G-Code Extension for CNC Mill", - "Configure G-Code Extension for CNC Lathe", - "Configure G-Code Extension for 3D Printers", - "Configure G-Code Extension for Swiss-style Lathes", - "Configure G-Code Extension for Laser Machine Tools", - "Configure G-Code Extension for EDM" - ], - "markdownDescription": "Configure G-Code Extension for a Specific Machine Type", - "scope": "window" - }, - "gcode.general.hovers.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "Enable G-Code Hovers", - "scope": "window" - }, - "gcode.general.statusBars.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "Enable G-Code Statusbars", - "scope": "window" - }, - "gcode.general.statusBars.alignment": { - "type": "string", - "default": "Left", - "enum": [ - "Left", - "Right" - ], - "enumDescriptions": [ - "Aligns to the left", - "Aligns to the right" - ], - "markdownDescription": "Specifies status bars alignment", - "scope": "window" - }, - "gcode.general.units": { - "type": "string", - "default": "Auto", - "enum": [ - "Auto", - "Inch", - "Metric" - ], - "markdownDescription": "Configure Units for G-Code Files. Choose Auto to have G-Code parse for ```G20/G21```" - }, - "gcode.general.outputLevel": { - "type": "string", - "default": "verbose", - "enum": [ - "silent", - "errors", - "warnings", - "verbose", - "debug" - ], - "enumDescriptions": [ - "No Output", - "Outputs only Errors", - "Outputs all errors, warnings and messages", - "Outputs Everything for Debugging Purposes" - ], - "markdownDescription": "Specifies how much output will be sent to the G-Code Output Channel.", - "scope": "window" - }, - "gcode.lineNumberer.addSpaceAfter": { - "type": "boolean", - "default": true, - "markdownDescription": "Add Space After Line Number", - "scope": "window" - }, - "gcode.lineNumberer.defaultIncrement": { - "type": "number", - "default": 10, - "markdownDescription": "Default Line Numberer Increment", - "scope": "window" - }, - "gcode.lineNumberer.defaultStart": { - "type": "number", - "default": 10, - "markdownDescription": "Default Line Numberer Start", - "scope": "window" - }, - "gcode.lineNumbere.enableQuickPick": { - "type": "boolean", - "default": true, - "markdownDescription": "Enable or Disable Input for Line Numberer (Will use above defaults).", - "scope": "window" - }, - "gcode.lineNumberer.frequency": { - "type": "string", - "default": "Every Line", - "enum": [ - "Every Line", - "At Tool Changes" - ], - "enumDescriptions": [ - "Line Number at Every Line", - "Line Number only at Tool Changes" - ], - "markdownDescription": "Specify Frequency of Line Numbering" - }, - "gcode.lineNumberer.ignoreBlank": { - "type": "boolean", - "default": true, - "markdownDescription": "Ignore Blank Lines when Numbering", - "scope": "window" - }, - "gcode.lineNumberer.ignoreComments": { - "type": "boolean", - "default": true, - "markdownDescription": "Ignore Comments when Numbering", - "scope": "window" - }, - "gcode.lineNumberer.ignoreExtra": { - "type": "array", - "items": { - "type": "string" + "configuration": [ + { + "title": "General", + "order": 0, + "properties": { + "gcode.general.machineType": { + "type": "string", + "default": "Mill", + "enum": [ + "Mill", + "Lathe", + "3D Printer", + "Swiss", + "Laser", + "EDM" + ], + "enumDescriptions": [ + "Configure G-Code Extension for CNC Mill", + "Configure G-Code Extension for CNC Lathe", + "Configure G-Code Extension for 3D Printers", + "Configure G-Code Extension for Swiss-style Lathes", + "Configure G-Code Extension for Laser Machine Tools", + "Configure G-Code Extension for EDM" + ], + "markdownDescription": "Configure G-Code Extension for a Specific Machine Type", + "scope": "window" }, - "default": [ - "%" - ], - "markdownDescription": "Additional characters to ignore (Beginning of Line)", - "scope": "window" - }, - "gcode.lineNumberer.ignoreProgramNumbers": { - "type": "boolean", - "default": true, - "markdownDescription": "Ignore program numbers, e.g. `O12345`", - "scope": "window" - }, - "gcode.lineNumberer.matchLineNumber": { - "type": "boolean", - "default": false, - "markdownDescription": "When numbering, match N number to file's line number.", - "scope": "window" - }, - "gcode.views.maxAutoRefresh": { - "type": "integer", - "default": "10000", - "markdownDescription": "Maximum Number of Lines in Editor to allow Auto Refresh", - "scope": "window" - }, - "gcode.views.navTree.autoRefresh": { - "type": "boolean", - "default": true, - "markdownDescription": "Enable G-Code Tree Auto Refresh", - "scope": "window" - }, - "gcode.views.stats.autoRefresh": { - "type": "boolean", - "default": false, - "markdownDescription": "Enable G-Code Stats Auto Refresh", - "scope": "window" - }, - "gcode.webviews.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "Enable or Disable WebViews", - "scope": "window" + "gcode.general.hovers.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable G-Code Hovers", + "scope": "window" + }, + "gcode.general.statusBars.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable G-Code Statusbars", + "scope": "window" + }, + "gcode.general.statusBars.alignment": { + "type": "string", + "default": "Left", + "enum": [ + "Left", + "Right" + ], + "enumDescriptions": [ + "Aligns to the left", + "Aligns to the right" + ], + "markdownDescription": "Specifies status bars alignment", + "scope": "window" + }, + "gcode.general.units": { + "type": "string", + "default": "Auto", + "enum": [ + "Auto", + "Inch", + "Metric" + ], + "markdownDescription": "Configure Units for G-Code Files. Choose Auto to have G-Code parse for ```G20/G21```" + }, + "gcode.general.outputLevel": { + "type": "string", + "default": "verbose", + "enum": [ + "silent", + "errors", + "warnings", + "verbose", + "debug" + ], + "enumDescriptions": [ + "No Output", + "Outputs only Errors", + "Outputs all errors, warnings and messages", + "Outputs Everything for Debugging Purposes" + ], + "markdownDescription": "Specifies how much output will be sent to the G-Code Output Channel.", + "scope": "window" + } + } + }, + { + "title": "Line Numberer", + "order": 10, + "properties": { + "gcode.lineNumberer.addSpaceAfter": { + "type": "boolean", + "default": true, + "markdownDescription": "Add Space After Line Number", + "scope": "window" + }, + "gcode.lineNumberer.defaultIncrement": { + "type": "number", + "default": 10, + "markdownDescription": "Default Line Numberer Increment", + "scope": "window" + }, + "gcode.lineNumberer.defaultStart": { + "type": "number", + "default": 10, + "markdownDescription": "Default Line Numberer Start", + "scope": "window" + }, + "gcode.lineNumbere.enableQuickPick": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable or Disable Input for Line Numberer (Will use above defaults).", + "scope": "window" + }, + "gcode.lineNumberer.frequency": { + "type": "string", + "default": "Every Line", + "enum": [ + "Every Line", + "At Tool Changes" + ], + "enumDescriptions": [ + "Line Number at Every Line", + "Line Number only at Tool Changes" + ], + "markdownDescription": "Specify Frequency of Line Numbering" + }, + "gcode.lineNumberer.ignoreBlank": { + "type": "boolean", + "default": true, + "markdownDescription": "Ignore Blank Lines when Numbering", + "scope": "window" + }, + "gcode.lineNumberer.ignoreComments": { + "type": "boolean", + "default": true, + "markdownDescription": "Ignore Comments when Numbering", + "scope": "window" + }, + "gcode.lineNumberer.ignoreExtra": { + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "%" + ], + "markdownDescription": "Additional characters to ignore (Beginning of Line)", + "scope": "window" + }, + "gcode.lineNumberer.ignoreProgramNumbers": { + "type": "boolean", + "default": true, + "markdownDescription": "Ignore program numbers, e.g. `O12345`", + "scope": "window" + }, + "gcode.lineNumberer.matchLineNumber": { + "type": "boolean", + "default": false, + "markdownDescription": "When numbering, match N number to file's line number.", + "scope": "window" + } + } + }, + { + "title": "Views", + "order": 20, + "properties": { + "gcode.views.maxAutoRefresh": { + "type": "integer", + "default": "10000", + "markdownDescription": "Maximum Number of Lines in Editor to allow Auto Refresh", + "scope": "window" + }, + "gcode.views.navTree.autoRefresh": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable G-Code Tree Auto Refresh", + "scope": "window" + }, + "gcode.views.stats.autoRefresh": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable G-Code Stats Auto Refresh", + "scope": "window" + } + } + }, + { + "title": "Webviews", + "order": 30, + "properties": { + "gcode.webviews.calc.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable Machining Calculator", + "scope": "window" + } } } - }, + ], "viewsContainers": { "activitybar": [ { @@ -343,14 +364,24 @@ "views": { "gcode": [ { + "type": "tree", "id": "gcode.views.navTree", "name": "Tree", "contextualTitle": "G-Code" }, { + "type": "tree", "id": "gcode.views.stats", "name": "Stats", "contextualTitle": "G-Code" + }, + { + "type": "webview", + "id": "gcode.webviews.calc", + "name": "Machining Calculator", + "contextualTitle": "G-Code", + "visibility": "collapsed", + "when": "gcode:webviews:calc:enabled" } ] }, @@ -416,6 +447,10 @@ { "command": "gcode.views.stats.refresh", "when": "editorLangId == gcode" + }, + { + "command": "gcode.webviews.calc.show", + "when": "editorLangId == gcode" } ], "editor/context": [ @@ -439,6 +474,38 @@ "command": "gcode.removeComment", "group": "gcode" }, + { + "when": "editorLangId == gcode && gcode:webviews:calc:enabled", + "command": "gcode.webviews.calc.show", + "group": "gcode" + }, + { + "when": "editorLangId == gcode", + "command": "gcode.showSettings", + "group": "gcode" + } + ], + "editor/title/context": [ + { + "when": "editorLangId == gcode", + "command": "gcode.views.navTree.refresh", + "group": "gcode" + }, + { + "when": "editorLangId == gcode", + "command": "gcode.views.stats.refresh", + "group": "gcode" + }, + { + "when": "editorLangId == gcode", + "command": "gcode.addLineNumbers", + "group": "gcode" + }, + { + "when": "editorLangId == gcode", + "command": "gcode.removeLineNumbers", + "group": "gcode" + }, { "when": "editorLangId == gcode", "command": "gcode.showSettings", @@ -493,11 +560,6 @@ "title": "G-Code: Remove Comment", "category": "G-Code" }, - { - "command": "gcode.webviews.codes.show", - "title": "G-Code: Show Code Reference", - "category": "G-Code" - }, { "command": "gcode.addLineNumbers", "title": "G-Code: Add Line Numbers", @@ -507,18 +569,30 @@ "command": "gcode.removeLineNumbers", "title": "G-Code: Remove Line Numbers", "category": "G-Code" + }, + { + "command": "gcode.webviews.codes.show", + "title": "G-Code: Show Code Reference", + "category": "G-Code" + }, + { + "command": "gcode.webviews.calc.show", + "title": "G-Code: Show Calculator", + "category": "G-Code" } ] }, "scripts": { "analyze:bundle": "webpack --env analyzeBundle", - "build": "webpack -mode development", - "bundle": "webpack --mode production", + "build": "webpack --mode development", + "build:extension": "webpack --mode development --config-name extension", + "build:webviews": "webpack --mode development --config-name webviews", + "bundle": "npm run clean && webpack --mode production --devtool hidden-source-map", "clean": "shx rm -rf out/* && rm -rf dist/*", "compile": "tsc -p ./", "lint": "eslint --ext .ts src/**/*.ts --cache", - "watch": "tsc -watch -p ./", "pack": "vsce package", + "package": "npm run clean && webpack --mode production --devtool hidden-source-map", "pretest": "npm run compile", "pretty": "prettier --config .prettierrc --loglevel warn .", "pub": "vsce publish", @@ -526,8 +600,7 @@ "test": "node ./out/test/runTests.js", "test:unit": "SET TS_NODE_PROJECT=./tsconfig.tests.json && mocha -r ts-node/register test/unit/*.test.ts", "vscode:prepublish": "npm run bundle", - "webpack": "webpack --mode development", - "webpack-dev": "webpack --mode development --watch" + "watch": "webpack --watch -mode deveopment" }, "devDependencies": { "@types/chai": "^4.3.4", @@ -538,14 +611,21 @@ "@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/parser": "^5.42.1", "chai": "^4.3.7", + "copy-webpack-plugin": "^11.0.0", + "csp-html-webpack-plugin": "^5.1.0", + "css-loader": "^6.7.1", "eslint": "^8.27.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.2.1", - "fork-ts-checker-webpack-plugin": "^7.2.13", + "eslint-webpack-plugin": "^3.2.0", "glob": "^8.0.3", + "html-loader": "^4.2.0", + "mini-css-extract-plugin": "^2.6.1", "mocha": "^10.1.0", "prettier": "^2.7.1", + "sass": "^1.54.0", + "sass-loader": "^13.0.2", "shx": "^0.3.4", "ts-loader": "^9.4.1", "ts-node": "^10.9.1", @@ -556,6 +636,7 @@ "webpack-cli": "^4.10.0" }, "dependencies": { - "@appliedengdesign/gcode-reference": "^0.0.8" + "@appliedengdesign/gcode-reference": "^0.0.8", + "@vscode/webview-ui-toolkit": "^1.0.0" } } \ No newline at end of file diff --git a/src/control.ts b/src/control.ts index b9caa90..ea8d125 100644 --- a/src/control.ts +++ b/src/control.ts @@ -5,24 +5,22 @@ 'use strict'; -import { commands, Disposable, ExtensionContext } from 'vscode'; +import { commands, ExtensionContext } from 'vscode'; import { Config, configuration } from './util/configuration/config'; import { Logger } from './util/logger'; import { StatusBarControl } from './util/statusBar'; import { NavTreeView } from './views/navTreeView'; -import { GCodeUnitsController } from './gcodeUnits'; +import { UnitsController } from './util/unitsController'; import { StatsView } from './views/statsView'; import { constants, Contexts, GCommands, PIcon, VSBuiltInCommands } from './util/constants'; import { Version } from './util/version'; import { Messages } from './util/messages'; import { StateControl } from './util/stateControl'; -import { CodesWebview } from './webviews/codesWebview'; -import { MachineTypeControl } from './util/machineType'; +import { MachineTypeController } from './util/machineTypeController'; import { GCodeHoverControl } from './hovers/gcodeHoverControl'; -import { defaults } from './util/configuration/defaults'; import { registerCommands } from './util/commands'; +import { CalcWebviewView } from './webviews/calc/calcWebviewView'; -const cfgUnits = 'general.units'; const cfgAutoRef = { navTree: 'views.navTree.autoRefresh', stats: 'views.stats.autoRefresh', @@ -31,13 +29,12 @@ const cfgAutoRef = { export class Control { private static _config: Config | undefined; private static _context: ExtensionContext; - private static _units: string | undefined; private static _version: Version; // Controllers - private static _machineTypeControl: MachineTypeControl | undefined; + private static _machineTypeController: MachineTypeController; private static _statusBarControl: StatusBarControl; - private static _unitsController: GCodeUnitsController | undefined; + private static _unitsController: UnitsController; private static _stateController: StateControl; private static _hoverController: GCodeHoverControl; @@ -46,7 +43,7 @@ export class Control { private static _navTree: NavTreeView | undefined; // Webviews - private static _codesWebview: CodesWebview | undefined; + private static _calcWebviewView: CalcWebviewView | undefined; private static async _checkVersion() { const prevVer = this._stateController.getVersion(); @@ -100,36 +97,14 @@ export class Control { // Load Machine Type Logger.log('Loading Machine Type Controller...'); - context.subscriptions.push((this._machineTypeControl = new MachineTypeControl())); + context.subscriptions.push((this._machineTypeController = new MachineTypeController())); // Load Hover Controller Logger.log('Loading Hover Controller...'); context.subscriptions.push((this._hoverController = new GCodeHoverControl())); - // Units - this._units = config.getParam(cfgUnits) ?? defaults.general.units; - Logger.log(`Units: ${this._units}`); - if (this._units === 'Auto') { - // Load Units Monitor - context.subscriptions.push((this._unitsController = new GCodeUnitsController())); - } else { - let disposable: Disposable; - // eslint-disable-next-line prefer-const - disposable = configuration.onDidChange(e => { - if (configuration.changed(e, cfgUnits)) { - this._units = configuration.getParam(cfgUnits); - if (this._units === 'Auto') { - disposable.dispose(); - Logger.log(`Units: ${this._units}`); - context.subscriptions.push((this._unitsController = new GCodeUnitsController())); - } else { - return; - } - } - }); - - this._statusBarControl.updateStatusBar(this._units, 'unitsBar'); - } + // Load Units Controller + context.subscriptions.push((this._unitsController = new UnitsController())); // Load Nav Tree Logger.log('Loading Nav Tree...'); @@ -154,8 +129,8 @@ export class Control { GCommands.ShowSupportGCode, ); - // Set Up Webviews - context.subscriptions.push((this._codesWebview = new CodesWebview())); + // Webviews + context.subscriptions.push((this._calcWebviewView = new CalcWebviewView())); Logger.log('Done Initializing.'); } @@ -164,14 +139,15 @@ export class Control { Logger.log('Terminating Extension...'); // Dispose Views - this._codesWebview?.dispose(); + this._calcWebviewView?.dispose(); this._statsView?.dispose(); this._statsView?.dispose(); + this._navTree?.dispose(); // Dispose Controllers this._hoverController.dispose(); this._unitsController?.dispose(); - this._machineTypeControl?.dispose(); + this._machineTypeController?.dispose(); this._statusBarControl?.dispose(); } @@ -196,10 +172,6 @@ export class Control { return this._version; } - static get machineType() { - return this._machineTypeControl; - } - static get navTree() { if (this._navTree === undefined) { this._context.subscriptions.push((this._navTree = new NavTreeView())); @@ -220,11 +192,23 @@ export class Control { return this._statusBarControl; } - static get gcodeUnitsController() { + static get unitsController() { return this._unitsController; } static get stateController() { return this._stateController; } + + static get machineTypeController() { + return this._machineTypeController; + } + + static get hoverController() { + return this._hoverController; + } + + static get calcWebviewView() { + return this._calcWebviewView; + } } diff --git a/src/gcodeUnits.ts b/src/gcodeUnits.ts deleted file mode 100644 index 6d4b85d..0000000 --- a/src/gcodeUnits.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* --------------------------------------------------------------------------------------------- - * Copyright (c) Applied Eng & Design All rights reserved. - * Licensed under the MIT License. See License.md in the project root for license information. - * -------------------------------------------------------------------------------------------- */ -'use strict'; - -import { ConfigurationChangeEvent, Disposable, TextDocumentChangeEvent, TextEditor, window, workspace } from 'vscode'; -import { Control } from './control'; -import { configuration } from './util/configuration/config'; -import { defaults } from './util/configuration/defaults'; -import { GCommands } from './util/constants'; -import { Logger } from './util/logger'; -import { StatusBar, StatusBarControl } from './util/statusBar'; - -export const enum GCodeUnits { - Inch = 'Inch', - MM = 'Metric', - Auto = 'Auto', - Default = 'Default (Inch)', -} - -const cfgUnits = 'general.units'; - -export class GCodeUnitsController implements Disposable { - private readonly _disposable: Disposable | undefined; - private _editor: TextEditor | undefined; - private _statusbar: StatusBarControl; - private readonly unitsStatusBar: StatusBar = 'unitsBar'; - private _units: GCodeUnits; - private _auto: boolean; - - constructor() { - this._statusbar = Control.statusBarController; - - this._auto = (this._units = configuration.getParam(cfgUnits) ?? defaults.general.units) === GCodeUnits.Auto; - - this._statusbar.updateStatusBar( - this._units, - this.unitsStatusBar, - undefined, - undefined, - GCommands.ShowGCodeSettings, - ); - - Control.context.subscriptions.push(configuration.onDidChange(this.onConfigurationChanged, this)); - Control.context.subscriptions.push(window.onDidChangeActiveTextEditor(() => this.onActiveEditorChanged())); - Control.context.subscriptions.push(workspace.onDidChangeTextDocument(e => this.onDocumentChanged(e), this)); - } - - dispose() { - this._disposable && this._disposable.dispose(); - } - - private onConfigurationChanged(e: ConfigurationChangeEvent) { - if (configuration.changed(e, cfgUnits)) { - if ((this._units = configuration.getParam(cfgUnits) ?? defaults.general.units) !== GCodeUnits.Auto) { - Logger.log(`Units: ${this._units}`); - this._auto = false; - this._statusbar.updateStatusBar( - this._units, - this.unitsStatusBar, - undefined, - undefined, - GCommands.ShowGCodeSettings, - ); - } else { - Logger.log(`Units: ${this._units}`); - this._auto = true; - this._statusbar.updateStatusBar( - this._units, - this.unitsStatusBar, - undefined, - undefined, - GCommands.ShowGCodeSettings, - ); - } - } - } - - private onActiveEditorChanged(): void { - if ((this._editor = window.activeTextEditor) && this._editor.document.uri.scheme === 'file') { - if (this._auto) { - const text = this._editor.document.getText(); - - // Parse doc for units - this._units = this.parseUnits(text); - - // Update Status Bar - this._statusbar.updateStatusBar( - this._units, - this.unitsStatusBar, - undefined, - undefined, - GCommands.ShowGCodeSettings, - ); - } else { - return; - } - } - } - - private onDocumentChanged(_changeEvent: TextDocumentChangeEvent): void { - if ((this._editor = window.activeTextEditor) && this._editor.document.uri.scheme === 'file') { - if (this._auto) { - const text = this._editor.document.getText(); - // Parse doc for units - this._units = this.parseUnits(text); - - // Update Status Bar - this._statusbar.updateStatusBar( - this._units, - this.unitsStatusBar, - undefined, - undefined, - GCommands.ShowGCodeSettings, - ); - } else { - return; - } - } - } - - private parseUnits(text: string): GCodeUnits { - const reUnits = /(G20)|(G21)/im; - - const units = reUnits.exec(text); - - // Check for Inch - if (units === null) { - return GCodeUnits.Default; - } else if (units[0] === 'G21') { - return GCodeUnits.MM; - } else { - return GCodeUnits.Inch; - } - } -} diff --git a/src/hovers/gcodeHoverProvider.ts b/src/hovers/gcodeHoverProvider.ts index 2ac6e7a..4d406e0 100644 --- a/src/hovers/gcodeHoverProvider.ts +++ b/src/hovers/gcodeHoverProvider.ts @@ -29,7 +29,7 @@ export class GCodeHoverProvider implements HoverProvider { } private lookup(text: string): MarkdownString | undefined { - const ref = Control.machineType?.gReference; + const ref = Control.machineTypeController?.gReference; const code = ref?.get(text); diff --git a/src/util/configuration/defaults.ts b/src/util/configuration/defaults.ts index 9db981f..7b326a4 100644 --- a/src/util/configuration/defaults.ts +++ b/src/util/configuration/defaults.ts @@ -6,8 +6,9 @@ 'use strict'; import { StatusBarAlignment } from 'vscode'; -import { GCodeUnits } from '../../gcodeUnits'; +import { GCodeUnits } from '../constants'; import { LineNumbererOptions, LineNumberFrequency } from '../lineNumberer'; +import { MachineType, MachineTypes } from '@appliedengdesign/gcode-reference'; export enum TraceLevel { Silent = 'silent', @@ -19,7 +20,7 @@ export enum TraceLevel { export interface GCodeConfiguration { general: { - machineType: 'Mill' | 'Lathe' | '3D Printer'; + machineType: MachineType; hovers: { enabled: boolean; @@ -47,8 +48,10 @@ export interface GCodeConfiguration { stats: { autoRefresh: boolean; }; + }; - webviews: { + webviews: { + calc: { enabled: boolean; }; }; @@ -56,7 +59,7 @@ export interface GCodeConfiguration { export const defaults: GCodeConfiguration = { general: { - machineType: 'Mill', + machineType: MachineTypes.Mill, hovers: { enabled: true, }, @@ -88,7 +91,9 @@ export const defaults: GCodeConfiguration = { stats: { autoRefresh: false, }, - webviews: { + }, + webviews: { + calc: { enabled: true, }, }, diff --git a/src/util/constants.ts b/src/util/constants.ts index 4b9c39c..24008cf 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -74,6 +74,14 @@ export enum Contexts { MachineType = 'gcode:general:machineType', ViewsNavTreeEnabled = 'gcode:views:navTree:enabled', ViewsStatsEnabled = 'gcode:views:stats:enabled', + CalcWebviewViewEnabled = 'gcode:webviews:calc:enabled', +} + +export enum GCodeUnits { + Auto = 'Auto', + Inch = 'Inch', + MM = 'Metric', + Default = 'Default (Inch)', } export enum GCommands { @@ -85,12 +93,21 @@ export enum GCommands { RemoveLineNumbers = 'gcode.removeLineNumbers', } -export const enum ViewCommands { +export enum Webviews { + CalcWebviewView = 'gcode.webviews.calc', +} + +export enum WebviewTitles { + CalcWebviewView = 'Machining Calculators', +} + +export enum ViewCommands { RefreshStats = 'gcode.views.stats.refresh', RefreshTree = 'gcode.views.navTree.refresh', TreeSelect = 'gcode.views.navTree.select', } -export const enum WebViewCommands { +export enum WebviewCommands { ShowCodesWebview = 'gcode.webviews.codes.show', + ShowCalcWebview = 'gcode.webviews.calc.show', } diff --git a/src/util/machineType.ts b/src/util/machineTypeController.ts similarity index 67% rename from src/util/machineType.ts rename to src/util/machineTypeController.ts index 5153f67..892244e 100644 --- a/src/util/machineType.ts +++ b/src/util/machineTypeController.ts @@ -4,48 +4,49 @@ * -------------------------------------------------------------------------------------------- */ 'use strict'; -import { ConfigurationChangeEvent, Disposable, Event, EventEmitter, workspace } from 'vscode'; -import { GReference, MachineTypes } from '@appliedengdesign/gcode-reference'; +import { ConfigurationChangeEvent, Disposable, Event, EventEmitter } from 'vscode'; +import { GReference, MachineType, MachineTypes } from '@appliedengdesign/gcode-reference'; import { configuration } from './configuration/config'; import { Logger } from './logger'; import { StatusBar, StatusBarControl } from './statusBar'; import { Control } from '../control'; import { GCommands } from './constants'; +import { defaults } from './configuration/defaults'; -export class MachineTypeControl implements Disposable { - private readonly _dispoable: Disposable | undefined; - private _machineType: MachineTypes | undefined; +export class MachineTypeController implements Disposable { + private readonly _dispoables: Disposable[] = []; + private _machineType: MachineType = defaults.general.machineType; private _statusbar: StatusBarControl; private readonly mtypeStatusBar: StatusBar = 'machineTypeBar'; private _gReference: GReference; - private _onDidChange = new EventEmitter(); - get onDidChange(): Event { - return this._onDidChange.event; + private _onDidChangeMachineType: EventEmitter = new EventEmitter(); + get onDidChangeMachineType(): Event { + return this._onDidChangeMachineType.event; } constructor() { this._statusbar = Control.statusBarController; this._gReference = new GReference(); - this.update(); + this._update(); - this._dispoable = Disposable.from(workspace.onDidChangeConfiguration(this.onConfigurationChanged, this)); + this._dispoables.push(configuration.onDidChange(this._onConfigurationChanged, this)); } dispose() { - this._dispoable && this._dispoable.dispose(); + Disposable.from(...this._dispoables).dispose(); } - private onConfigurationChanged(e: ConfigurationChangeEvent) { + private _onConfigurationChanged(e: ConfigurationChangeEvent) { if (configuration.changed(e, 'general.machineType')) { - this.update(); + this._update(); } else { return; } } - private update() { - const cfgMachineType = configuration.getParam('general.machineType'); + private _update() { + const cfgMachineType = configuration.getParam('general.machineType') ?? defaults.general.machineType; Logger.log(`Machine Type: ${cfgMachineType}`); switch (cfgMachineType) { case 'Mill': @@ -76,6 +77,7 @@ export class MachineTypeControl implements Disposable { return; } + // Update Status Bar this._statusbar.updateStatusBar( cfgMachineType, this.mtypeStatusBar, @@ -84,10 +86,18 @@ export class MachineTypeControl implements Disposable { GCommands.ShowGCodeSettings, ); + // Update GReference this._gReference.setType(this._machineType); + + // Fire Event + this._onDidChangeMachineType.fire(this._machineType); } get gReference() { return this._gReference; } + + get machineType() { + return this._machineType; + } } diff --git a/src/util/unitsController.ts b/src/util/unitsController.ts new file mode 100644 index 0000000..dc49369 --- /dev/null +++ b/src/util/unitsController.ts @@ -0,0 +1,174 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +import { + ConfigurationChangeEvent, + Disposable, + Event, + EventEmitter, + TextDocumentChangeEvent, + TextEditor, + window, + workspace, +} from 'vscode'; +import { Control } from '../control'; +import { configuration } from './configuration/config'; +import { defaults } from './configuration/defaults'; +import { GCodeUnits, GCommands } from './constants'; +import { Logger } from './logger'; +import { StatusBar, StatusBarControl } from './statusBar'; + +type Units = GCodeUnits.Inch | GCodeUnits.MM | GCodeUnits.Default; + +export const cfgUnits = 'general.units'; + +export class UnitsController implements Disposable { + private readonly _disposables: Disposable[] = []; + private readonly unitsStatusBar: StatusBar = 'unitsBar'; + private _editor: TextEditor | undefined; + private _statusbar: StatusBarControl; + private _units: Units; + private _auto: boolean; + + private _onDidChangeUnits: EventEmitter = new EventEmitter(); + get onDidChangeUnits(): Event { + return this._onDidChangeUnits.event; + } + + constructor() { + Logger.log('Loading Units Controller...'); + + this._statusbar = Control.statusBarController; + + const units = configuration.getParam(cfgUnits) ?? defaults.general.units; + if (units === GCodeUnits.Auto) { + this._auto = true; + this._units = GCodeUnits.Default; + } else { + this._auto = false; + this._units = units; + } + + this.updateStatusBar(); + + this._disposables.push( + configuration.onDidChange(this.onConfigurationChanged, this), + window.onDidChangeActiveTextEditor(() => this.onActiveEditorChanged()), + workspace.onDidChangeTextDocument(e => this.onDocumentChanged(e), this), + ); + } + + dispose() { + Disposable.from(...this._disposables).dispose(); + } + + get units(): Units { + return this._units; + } + + private onConfigurationChanged(e: ConfigurationChangeEvent) { + if (configuration.changed(e, cfgUnits)) { + const units = configuration.getParam(cfgUnits) ?? defaults.general.units; + if (units !== GCodeUnits.Auto) { + // Update Units + this._units = units; + Logger.log(`Units: ${this._units}`); + + // Set Auto False + this._auto = false; + + this.updateStatusBar(); + + // Fire Units Change Event + this._onDidChangeUnits.fire(this._units); + } else { + // Units = Auto + Logger.log('Units: Auto'); + + // Set Auto True + this._auto = true; + } + } + } + + private onActiveEditorChanged(): void { + if ((this._editor = window.activeTextEditor) && this._editor.document.uri.scheme === 'file') { + if (this._auto) { + const text = this._editor.document.getText(); + + // Parse doc for units + const newUnits = this.parseUnits(text); + + if (newUnits === this._units) { + return; + } else { + this._units = newUnits; + + // Update Statusbar + this.updateStatusBar(); + + // Fire Units Change Event + this._onDidChangeUnits.fire(this._units); + } + } else { + return; + } + } + } + + private onDocumentChanged(_changeEvent: TextDocumentChangeEvent): void { + if ((this._editor = window.activeTextEditor) && this._editor.document.uri.scheme === 'file') { + if (this._auto) { + const text = this._editor.document.getText(); + + // Parse doc for units + const newUnits = this.parseUnits(text); + + if (newUnits === this._units) { + return; + } else { + this._units = newUnits; + + // Update Statusbar + this.updateStatusBar(); + + // Fire Units Change Event + this._onDidChangeUnits.fire(this._units); + } + } else { + return; + } + } + } + + private updateStatusBar(): void { + let tooltip = `${this._units}`; + let units = `${this.units}`; + if (this._auto && this._units !== GCodeUnits.Default) { + this._units === GCodeUnits.Inch + ? (tooltip = `${tooltip} (G20 Found)`) + : (tooltip = `${tooltip} (G21 Found)`); + + units = `${units} (Auto)`; + } + this._statusbar.updateStatusBar(units, this.unitsStatusBar, tooltip, undefined, GCommands.ShowGCodeSettings); + } + + private parseUnits(text: string): Units { + const reUnits = /(G20)|(G21)/im; + + const units = reUnits.exec(text); + + // Check for Inch + if (units === null) { + return GCodeUnits.Default; + } else if (units[0] === 'G21') { + return GCodeUnits.MM; + } else { + return GCodeUnits.Inch; + } + } +} diff --git a/src/views/gView.ts b/src/views/gView.ts index 5868166..4c118f8 100644 --- a/src/views/gView.ts +++ b/src/views/gView.ts @@ -78,10 +78,10 @@ export abstract class GView> implements TreeDa return this._tree?.visible ?? false; } - protected async show() { + protected async show(options?: { preserveFocus?: boolean }) { if (!this.visible) { try { - void (await commands.executeCommand(`${this.id}.focus`)); + void (await commands.executeCommand(`${this.id}.focus`, options)); } catch (err) { Logger.error(err, 'Error focusing view'); } diff --git a/src/webviews/apps/.eslintrc.json b/src/webviews/apps/.eslintrc.json new file mode 100644 index 0000000..0de801f --- /dev/null +++ b/src/webviews/apps/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "../../../.eslintrc.json" + ], + "env": { + "browser": true + }, + "parserOptions": { + "project": "src/webviews/apps/tsconfig.json" + } +} \ No newline at end of file diff --git a/src/webviews/apps/calc/calc.html b/src/webviews/apps/calc/calc.html new file mode 100644 index 0000000..f3bbeed --- /dev/null +++ b/src/webviews/apps/calc/calc.html @@ -0,0 +1,105 @@ +<%= require('html-loader?{"esModule":false}!../shared/partials/head.html') %> + + + +
+ + + SPEEDS + FEEDS + MRR + + +
+
+

RPM

+ + Cutting Speed + Tool Diameter + + Calculate +
+
+

Cutting Speed

+ + RPM + Tool Diameter + + Calculate +
+
+
+ + Clear Fields + +
+
+ Units: +
+
+ +
+
+

Feedrate

+ + RPM + # of Flutes + Feed / Tooth + + Calculate +
+
+

Chip Load

+ + Feedrate + RPM + # of Flutes + + Calculate +
+
+
+ + Clear Fields + +
+
+ +
+
+ +
+
+

Metal Removal

+ + Ap - Axial DoC + Ae - Radial DoC + Feedrate + + Calculate +
+
+

Surface Finish

+ + Corner Radius + Feedrate + + + Calculate +
+
+
+ + Clear Fields + +
+
+ Units: +
+
+
+
+ {bootstrap} + + +<%= require('html-loader?{"esModule":false}!../shared/partials/tail.html') %> \ No newline at end of file diff --git a/src/webviews/apps/calc/calc.scss b/src/webviews/apps/calc/calc.scss new file mode 100644 index 0000000..0ddec8e --- /dev/null +++ b/src/webviews/apps/calc/calc.scss @@ -0,0 +1,86 @@ +@import '../shared/scss/reset'; +@import '../shared/scss/vscode'; +@import '../shared/scss/base'; + +.container { + display: flex; + justify-content: center; + min-height: 100%; + margin: 0; + padding: 0; +} + +section { + display: flex; + flex-direction: column; + justify-content: start; + padding: 1em; +} + +section.row { + flex-direction: row; + flex: none; + justify-content: center; + padding: 0; +} + +h3 { + border: none; + font-weight: 600; + margin-top: 0; + white-space: nowrap; +} + +vscode-text-field, +vscode-button { + margin: 0.5rem 0; +} + +vscode-panel-view { + flex-wrap: wrap; + flex-direction: column; + padding: 0; +} + +vscode-text-field.results { + font-style: italic; +} + +span.clear-btn { + margin-top: 1rem; +} + +span.units { + font-weight: 600; + font-size: 0.9em; +} + +label.results { + font-style: italic; + margin-top: 1rem; + margin-bottom: 2px; +} + +span.results { + border: 1px solid var(--vscode-inputValidation-infoBorder); + background: transparent; + width: 90px; + height: 20px; + padding: 5px; +} + +section.calculator > vscode-button { + margin-top: 1rem; +} + +.error { + color: var(--vscode-errorForeground); +} + +.hidden { + visibility: hidden; +} + +#finish .label { + padding-bottom: 3.5px; +} \ No newline at end of file diff --git a/src/webviews/apps/calc/calc.ts b/src/webviews/apps/calc/calc.ts new file mode 100644 index 0000000..166c389 --- /dev/null +++ b/src/webviews/apps/calc/calc.ts @@ -0,0 +1,536 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +import { GWebviewApp } from '../shared/gWebviewApp'; +import { WebviewMsg } from '../../webviewMsg.types'; +import { calcBootstrap, ICalcDom, MachineType, MachineTypes, TCalcDom, Units } from './calc.types'; + +export class CalcApp extends GWebviewApp { + private _calcDom: ICalcDom = {}; + private _clearBtns: NodeListOf | undefined; + private _machineType: MachineType = MachineTypes.Mill; + private _units: Units = Units.Default; + + constructor() { + super('CalcApp'); + + // Populate DOM + this._populateDOM(); + + // Register Button Events + this._registerBtns(); + + // Load Units & MachineType from Bootstrap + if (this.bootstrap) { + this._machineType = (this.bootstrap.payload as calcBootstrap).machineType; + this._units = (this.bootstrap.payload as calcBootstrap).units; + this._updateUnits(); + this._updateMachineType(); + } + } + + private _populateDOM(): void { + // Populate RPM Calculator + this._calcDom.rpm = { + btn: document.getElementById('rpm-calc-btn') as HTMLElement, + speed: document.getElementById('rpm-speed')?.shadowRoot?.getElementById('control') as HTMLInputElement, + toolDia: document.getElementById('rpm-tool-dia')?.shadowRoot?.getElementById('control') as HTMLInputElement, + results: document.getElementById('rpm-results') as HTMLSpanElement, + }; + + // Populate SFM Calculator + this._calcDom.speed = { + btn: document.getElementById('speed-calc-btn') as HTMLElement, + rpm: document.getElementById('speed-rpm')?.shadowRoot?.getElementById('control') as HTMLInputElement, + toolDia: document + .getElementById('speed-tool-dia') + ?.shadowRoot?.getElementById('control') as HTMLInputElement, + results: document.getElementById('speed-results') as HTMLSpanElement, + }; + + // Populate Feedrate Calculator + this._calcDom.feedrate = { + btn: document.getElementById('fr-calc-btn') as HTMLElement, + rpm: document.getElementById('fr-rpm')?.shadowRoot?.getElementById('control') as HTMLInputElement, + numFlutes: document + .getElementById('fr-num-flutes') + ?.shadowRoot?.getElementById('control') as HTMLInputElement, + chipLoad: document + .getElementById('fr-chip-load') + ?.shadowRoot?.getElementById('control') as HTMLInputElement, + results: document.getElementById('fr-results') as HTMLSpanElement, + }; + + // Populate Chipload Calculator + this._calcDom.chipLoad = { + btn: document.getElementById('cl-calc-btn') as HTMLElement, + feedRate: document.getElementById('cl-feedrate')?.shadowRoot?.getElementById('control') as HTMLInputElement, + rpm: document.getElementById('cl-rpm')?.shadowRoot?.getElementById('control') as HTMLInputElement, + numFlutes: document + .getElementById('cl-num-flutes') + ?.shadowRoot?.getElementById('control') as HTMLInputElement, + results: document.getElementById('cl-results') as HTMLSpanElement, + }; + + // Populate MRR Calculator + this._calcDom.mrr = { + btn: document.getElementById('mrr-calc-btn') as HTMLElement, + axialDepth: document.getElementById('mrr-ap')?.shadowRoot?.getElementById('control') as HTMLInputElement, + radialDepth: document.getElementById('mrr-ae')?.shadowRoot?.getElementById('control') as HTMLInputElement, + feedRate: document.getElementById('mrr-fr')?.shadowRoot?.getElementById('control') as HTMLInputElement, + results: document.getElementById('mrr-results') as HTMLSpanElement, + }; + + // Populate Finish Calculator + this._calcDom.finish = { + btn: document.getElementById('finish-btn') as HTMLElement, + radius: document.getElementById('finish-radius')?.shadowRoot?.getElementById('control') as HTMLInputElement, + feedRate: document + .getElementById('finish-feedrate') + ?.shadowRoot?.getElementById('control') as HTMLInputElement, + results: document.getElementById('finish-results') as HTMLSpanElement, + }; + } + + protected onMsgReceived(e: MessageEvent): void { + const message = e.data; + + switch (message.type) { + case 'changeUnits': + { + this._units = message.payload as Units; + this._updateUnits(); + this._clearBtns?.forEach(btn => { + btn.click(); + }); + } + break; + + case 'changeMachineType': + { + this._machineType = message.payload as MachineType; + this._updateMachineType(); + } + break; + + default: + return; + } + } + + private _updateUnits(): void { + document.querySelectorAll('span.units').forEach(elem => { + elem.innerHTML = `Units: ${this._units}`; + }); + } + + private _updateMachineType(): void { + // Clear Fields + this._clearFields(); + + switch (this._machineType) { + case MachineTypes.Mill: + { + // Focus Speeds Tab + const speedsTab = document.getElementById('tab-1') as HTMLElement; + if (speedsTab) { + speedsTab.click(); + } + + // Hide Surface Finish Calculator + const finishSection = document.getElementById('finish') as HTMLElement; + if (finishSection) { + finishSection.style.visibility = 'hidden'; + } + + const mrrTab = document.getElementById('tab-3') as HTMLElement; + if (mrrTab) { + mrrTab.innerHTML = 'MRR'; + } + + // Show Feeds Tab + const tab = document.getElementById('tab-2') as HTMLElement; + const tabView = document.getElementById('view-2') as HTMLElement; + if (tab && tabView) { + tab.style.display = ''; + tabView.style.display = ''; + } + + // Update Diameter -> Tool Dia + const rpmDiaField = document.getElementById('rpm-tool-dia') as HTMLElement; + if (rpmDiaField) { + rpmDiaField.setAttribute('placeholder', 'Enter Tool Dia'); + rpmDiaField.innerHTML = 'Diameter'; + } + + const speedDiaField = document.getElementById('speed-tool-dia') as HTMLElement; + if (speedDiaField) { + speedDiaField.setAttribute('placeholder', 'Enter Tool Dia'); + speedDiaField.innerHTML = 'Diameter'; + } + + // Update MRR Calculator + const mrrDepth = document.getElementById('mrr-ap') as HTMLElement; + if (mrrDepth) { + mrrDepth.setAttribute('placeholder', 'Axial DoC'); + mrrDepth.innerHTML = 'Ap - Axial DoC'; + } + + const mrrSpeed = document.getElementById('mrr-ae') as HTMLElement; + if (mrrSpeed) { + mrrSpeed.setAttribute('placeholder', 'Radial DoC'); + mrrSpeed.innerHTML = 'Ae - Radial DoC'; + } + } + break; + + case MachineTypes.Lathe: + case MachineTypes.Swiss: + { + // Focus Speeds Tab + const speedsTab = document.getElementById('tab-1') as HTMLElement; + if (speedsTab) { + speedsTab.click(); + } + + // Hide Feeds Tab + const tab = document.getElementById('tab-2') as HTMLElement; + const tabView = document.getElementById('view-2') as HTMLElement; + if (tab && tabView) { + tab.style.display = 'none'; + tabView.style.display = 'none'; + } + + // Update Tool Dia -> Diameter + const rpmDiaField = document.getElementById('rpm-tool-dia') as HTMLElement; + if (rpmDiaField) { + rpmDiaField.setAttribute('placeholder', 'Enter Dia'); + rpmDiaField.innerHTML = 'Diameter'; + } + + const speedDiaField = document.getElementById('speed-tool-dia') as HTMLElement; + if (speedDiaField) { + speedDiaField.setAttribute('placeholder', 'Enter Dia'); + speedDiaField.innerHTML = 'Diameter'; + } + + // Update MRR Calculator + const mrrDepth = document.getElementById('mrr-ap') as HTMLElement; + if (mrrDepth) { + mrrDepth.setAttribute('placeholder', 'Depth of Cut'); + mrrDepth.innerHTML = 'Depth of Cut'; + } + + const mrrSpeed = document.getElementById('mrr-ae') as HTMLElement; + if (mrrSpeed) { + mrrSpeed.setAttribute('placeholder', `Enter ${this._units === Units.MM ? 'SMM' : 'SFM'}`); + mrrSpeed.innerHTML = 'Cutting Speed'; + } + + // Show Surface Finish Calculator + const finishSection = document.getElementById('finish') as HTMLElement; + if (finishSection) { + finishSection.style.visibility = ''; + } + + const mrrTab = document.getElementById('tab-3') as HTMLElement; + if (mrrTab) { + mrrTab.innerHTML = 'MRR / SF'; + } + } + break; + + default: + return; + } + } + + private _registerBtns(): void { + Object.keys(this._calcDom).forEach(key => { + this._calcDom[key as keyof ICalcDom]?.btn.addEventListener('click', this._processEvent.bind(this), false); + }); + + this._clearBtns = document.querySelectorAll('span.clear-btn > vscode-button'); + + if (this._clearBtns) { + this._clearBtns.forEach(btn => { + btn.addEventListener('click', this._clearFields.bind(this), false); + }); + } + } + + private _processEvent(e: MouseEvent): void { + const target = e.target as HTMLButtonElement; + let result: number | undefined; + + if (target) { + switch (target.id) { + case 'rpm-calc-btn': + { + if (this._calcDom.rpm) { + const sfm = Math.abs(Number(this._calcDom.rpm.speed.value)); + const toolDia = Math.abs(Number(this._calcDom.rpm.toolDia.value)); + + this._calcDom.rpm.speed.value = sfm ? sfm.toString() : ''; + this._calcDom.rpm.toolDia.value = toolDia ? sfm.toString() : ''; + + result = this._calcRPM(sfm, toolDia); + + this._displayResults(result, this._calcDom.rpm); + } + } + break; + + case 'speed-calc-btn': + { + if (this._calcDom.speed) { + const rpm = Math.abs(Number(this._calcDom.speed.rpm.value)); + const toolDia = Math.abs(Number(this._calcDom.speed.toolDia.value)); + + this._calcDom.speed.rpm.value = rpm ? rpm.toString() : ''; + this._calcDom.speed.toolDia.value = toolDia ? toolDia.toString() : ''; + + result = this._calcSFM(rpm, toolDia); + + this._displayResults(result, this._calcDom.speed); + } + } + break; + + case 'fr-calc-btn': + { + if (this._calcDom.feedrate) { + const rpm = Math.abs(Number(this._calcDom.feedrate.rpm.value)); + const numFlutes = Math.abs(Number(this._calcDom.feedrate.numFlutes.value)); + const chipLoad = Math.abs(Number(this._calcDom.feedrate.chipLoad.value)); + + this._calcDom.feedrate.rpm.value = rpm ? rpm.toString() : ''; + this._calcDom.feedrate.numFlutes.value = numFlutes ? numFlutes.toString() : ''; + this._calcDom.feedrate.chipLoad.value = chipLoad ? chipLoad.toString() : ''; + + result = this._calcFeedRate(rpm, numFlutes, chipLoad); + + this._displayResults(result, this._calcDom.feedrate); + } + } + break; + + case 'cl-calc-btn': + { + if (this._calcDom.chipLoad) { + const feedRate = Math.abs(Number(this._calcDom.chipLoad.feedRate.value)); + const rpm = Math.abs(Number(this._calcDom.chipLoad.rpm.value)); + const numFlutes = Math.abs(Number(this._calcDom.chipLoad.numFlutes.value)); + + this._calcDom.chipLoad.feedRate.value = feedRate ? feedRate.toString() : ''; + this._calcDom.chipLoad.rpm.value = rpm ? rpm.toString() : ''; + this._calcDom.chipLoad.numFlutes.value = numFlutes ? numFlutes.toString() : ''; + + result = this._calcChipLoad(feedRate, rpm, numFlutes); + + this._displayResults(result, this._calcDom.chipLoad); + } + } + break; + + case 'mrr-calc-btn': + { + if (this._calcDom.mrr) { + const axialDepth = Math.abs(Number(this._calcDom.mrr.axialDepth.value)); + const radialDepth = Math.abs(Number(this._calcDom.mrr.radialDepth.value)); + const feedRate = Math.abs(Number(this._calcDom.mrr.feedRate.value)); + + this._calcDom.mrr.axialDepth.value = axialDepth ? axialDepth.toString() : ''; + this._calcDom.mrr.radialDepth.value = radialDepth ? radialDepth.toString() : ''; + this._calcDom.mrr.feedRate.value = feedRate ? feedRate.toString() : ''; + + result = this._calcMRR(axialDepth, radialDepth, feedRate); + + this._displayResults(result, this._calcDom.mrr); + } + } + break; + + case 'finish-btn': + { + if (this._calcDom.finish) { + const radius = Math.abs(Number(this._calcDom.finish.radius.value)); + const feedRate = Math.abs(Number(this._calcDom.finish.feedRate.value)); + + this._calcDom.finish.radius.value = radius ? radius.toString() : ''; + this._calcDom.finish.feedRate.value = feedRate ? feedRate.toString() : ''; + + result = this._calcSurfaceFinish(radius, feedRate); + + this._displayResults(result, this._calcDom.finish); + } + } + break; + } + } + } + + private _clearFields(e?: MouseEvent): void { + if (e) { + const target = e.target as HTMLButtonElement; + + if (target) { + const targetView = target.id.split('-')[1]; + + // Clear Input Fields + document.querySelectorAll(`#view-${targetView} vscode-text-field`).forEach(input => { + const element = input.shadowRoot?.getElementById('control') as HTMLInputElement; + element.value = ''; + }); + + // Clear Results Field + document.querySelectorAll(`#view-${targetView} span.results`).forEach(span => { + span.innerHTML = ''; + }); + } + } else { + // Clear All Fields + document.querySelectorAll('vscode-text-field').forEach(input => { + const element = input.shadowRoot?.getElementById('control') as HTMLInputElement; + element.value = ''; + }); + + document.querySelectorAll('span.results').forEach(span => { + span.innerHTML = ''; + }); + } + } + + private _displayResults(result: number | undefined, target: TCalcDom): void { + if (result && result !== Number.POSITIVE_INFINITY) { + if (target) { + target.results.classList.remove('error'); + + // Set Precision to 2 for > 1 or 4 or < 1 + const precision = target !== this._calcDom.mrr && result < 1 ? 4 : 2; + let units = ''; + + // Assign units + switch (target) { + case this._calcDom.rpm: + { + units = '[RPM]'; + } + break; + + case this._calcDom.speed: + { + if (this._units === Units.MM) { + units = '[m/min]'; + } else { + units = '[SFM]'; + } + } + break; + + case this._calcDom.feedrate: + { + if (this._units === Units.MM) { + units = '[mm/min]'; + } else { + units = '[in/min]'; + } + } + break; + + case this._calcDom.chipLoad: + { + if (this._units === Units.MM) { + units = '[mm]'; + } else { + units = '[in]'; + } + } + break; + + case this._calcDom.mrr: + { + if (this._units === Units.MM) { + units = '[cm3/min]'; + } else { + units = '[mm3/min]'; + } + } + break; + + case this._calcDom.finish: + { + if (this._units === Units.MM) { + units = '[μ]'; + } else { + units = '[μ in]'; + } + } + break; + } + target.results.innerHTML = `${result.toFixed(precision)} ${units}`; + } + } else { + // Answer is NaN or Infinity + if (target) { + target.results.classList.add('error'); + target.results.innerHTML = 'Err'; + } + } + } + + private _calcRPM(sfm: number, toolDia: number): number | undefined { + const rpm = sfm / (Math.PI * toolDia); + if (this._units === Units.MM) { + return rpm * 1000; + } else { + return rpm * 12; + } + } + + private _calcSFM(rpm: number, toolDia: number): number | undefined { + const sfm = Math.PI * toolDia * rpm; + if (this._units === Units.MM) { + return sfm / 1000; + } else { + return sfm / 12; + } + } + + private _calcFeedRate(rpm: number, numFlutes: number, feedPerTooth: number): number | undefined { + return rpm * feedPerTooth * numFlutes; + } + + private _calcChipLoad(feedRate: number, rpm: number, numFlutes: number): number | undefined { + return feedRate / rpm / numFlutes; + } + + private _calcMRR(axialDepth: number, radialDepth: number, feedRate: number): number | undefined { + const mrr = feedRate * radialDepth * axialDepth; + + if (this._machineType === MachineTypes.Lathe || this._machineType === MachineTypes.Swiss) { + if (this._units === Units.MM) { + return mrr; + } else { + return mrr * 12; + } + } else { + return mrr; + } + } + + private _calcSurfaceFinish(radius: number, feedRate: number): number | undefined { + const finish = Math.pow(feedRate, 2) / radius; + + if (this._units === Units.MM) { + return finish * 46; + } else { + return finish * 31675; + } + } +} + +new CalcApp(); diff --git a/src/webviews/apps/calc/calc.types.ts b/src/webviews/apps/calc/calc.types.ts new file mode 100644 index 0000000..39e19f9 --- /dev/null +++ b/src/webviews/apps/calc/calc.types.ts @@ -0,0 +1,76 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +export interface ICalcDom { + rpm?: { + btn: HTMLElement; + speed: HTMLInputElement; + toolDia: HTMLInputElement; + results: HTMLSpanElement; + }; + + speed?: { + btn: HTMLElement; + rpm: HTMLInputElement; + toolDia: HTMLInputElement; + results: HTMLSpanElement; + }; + + feedrate?: { + btn: HTMLElement; + rpm: HTMLInputElement; + numFlutes: HTMLInputElement; + chipLoad: HTMLInputElement; + results: HTMLSpanElement; + }; + + chipLoad?: { + btn: HTMLElement; + feedRate: HTMLInputElement; + rpm: HTMLInputElement; + numFlutes: HTMLInputElement; + results: HTMLSpanElement; + }; + + mrr?: { + btn: HTMLElement; + axialDepth: HTMLInputElement; + radialDepth: HTMLInputElement; + feedRate: HTMLInputElement; + results: HTMLSpanElement; + }; + + finish?: { + btn: HTMLElement; + radius: HTMLInputElement; + feedRate: HTMLInputElement; + results: HTMLSpanElement; + }; +} + +export type TCalcDom = ICalcDom[keyof ICalcDom]; + +export enum MachineTypes { + EDM = 'edm', + Mill = 'mill', + Lathe = 'lathe', + Laser = 'laser', + Printer = 'printer', + Swiss = 'swiss', +} + +export type MachineType = MachineTypes; + +export enum Units { + Inch = 'Inch', + MM = 'Metric', + Default = 'Default (Inch)', +} + +export interface calcBootstrap { + machineType: MachineTypes; + units: Units; +} diff --git a/src/webviews/apps/shared/gWebviewApp.ts b/src/webviews/apps/shared/gWebviewApp.ts new file mode 100644 index 0000000..3a557c5 --- /dev/null +++ b/src/webviews/apps/shared/gWebviewApp.ts @@ -0,0 +1,50 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +import { WebviewMsg } from '../../webviewMsg.types'; + +declare let __BOOTSTRAP__: WebviewMsg; + +interface VsCodeApi { + postMessage(msg: any): void; + setState(state: any): void; + getState(): any; +} + +declare function acquireVsCodeApi(): VsCodeApi; + +export abstract class GWebviewApp { + private readonly _api: VsCodeApi; + protected bootstrap: WebviewMsg | undefined; + + constructor(protected readonly appName: string) { + // Get Bootstrap if any + if (typeof __BOOTSTRAP__ !== 'undefined') { + this.bootstrap = __BOOTSTRAP__; + } + + this._api = acquireVsCodeApi(); + this._registerEvents(); + } + + private _registerEvents(): void { + window.addEventListener('message', this.onMsgReceived.bind(this)); + } + + protected postMessage(msg: any): void { + this._api.postMessage(msg); + } + + protected getState(): any { + return this._api.getState(); + } + + protected setState(state: any): void { + this._api.setState(state); + } + + protected abstract onMsgReceived(e: MessageEvent): void; +} diff --git a/src/webviews/apps/shared/partials/head.html b/src/webviews/apps/shared/partials/head.html new file mode 100644 index 0000000..19c271b --- /dev/null +++ b/src/webviews/apps/shared/partials/head.html @@ -0,0 +1,14 @@ + + + + + + + + + + {toolkit} + + {title} + + diff --git a/src/webviews/apps/shared/partials/tail.html b/src/webviews/apps/shared/partials/tail.html new file mode 100644 index 0000000..62d09b8 --- /dev/null +++ b/src/webviews/apps/shared/partials/tail.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/webviews/apps/shared/scss/base.scss b/src/webviews/apps/shared/scss/base.scss new file mode 100644 index 0000000..86bb761 --- /dev/null +++ b/src/webviews/apps/shared/scss/base.scss @@ -0,0 +1,14 @@ +html { + height: 100%; + font-size: 62.5%; +} + +body { + height: 100%; + line-height: 1.4; + font-size: 100% !important; +} + +a { + border: 0; +} \ No newline at end of file diff --git a/resources/webviews/css/reset.css b/src/webviews/apps/shared/scss/reset.scss similarity index 100% rename from resources/webviews/css/reset.css rename to src/webviews/apps/shared/scss/reset.scss diff --git a/resources/webviews/css/vscode.css b/src/webviews/apps/shared/scss/vscode.scss similarity index 100% rename from resources/webviews/css/vscode.css rename to src/webviews/apps/shared/scss/vscode.scss diff --git a/src/webviews/apps/tsconfig.json b/src/webviews/apps/tsconfig.json new file mode 100644 index 0000000..81d0397 --- /dev/null +++ b/src/webviews/apps/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "ES2021" + ], + "outDir": "../../" + }, + "include": [ + "**/*.ts", + "../webviewMsg.types.ts" + ], + "exclude": [ + "node_modules", + "test" + ] +} \ No newline at end of file diff --git a/src/webviews/calc/calcWebviewView.ts b/src/webviews/calc/calcWebviewView.ts new file mode 100644 index 0000000..331cd5c --- /dev/null +++ b/src/webviews/calc/calcWebviewView.ts @@ -0,0 +1,170 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +import { MachineType, MachineTypes } from '@appliedengdesign/gcode-reference'; +import { TextDecoder } from 'util'; +import { commands, ConfigurationChangeEvent, Disposable, Uri, Webview, workspace } from 'vscode'; +import { Control } from '../../control'; +import { configuration } from '../../util/configuration/config'; +import { defaults } from '../../util/configuration/defaults'; +import { Contexts, WebviewCommands, Webviews, WebviewTitles } from '../../util/constants'; +import { Logger } from '../../util/logger'; +import { GWebviewView } from '../gWebviewView'; +import { getNonce } from '../helpers'; +import { WebviewMsg } from '../webviewMsg.types'; + +export class CalcWebviewView extends GWebviewView { + private _shortId: string; + private _machineType: MachineType; + + constructor() { + const title = `${WebviewTitles.CalcWebviewView} (${ + Control.machineTypeController.machineType.toString() ?? '' + })`; + + super(Webviews.CalcWebviewView, title); + + this._shortId = this.id.split('.').pop() ?? ''; + this._machineType = Control.machineTypeController.machineType; + + if ((this._enabled = configuration.getParam(`${this.id.slice(6)}.enabled`) ?? defaults.webviews.calc.enabled)) { + Logger.log('Loading Calculator...'); + + if ( + this._machineType === MachineTypes.Mill || + this._machineType === MachineTypes.Lathe || + this._machineType === MachineTypes.Swiss + ) { + void Control.setContext(Contexts.CalcWebviewViewEnabled, true); + } else { + void Control.setContext(Contexts.CalcWebviewViewEnabled, false); + } + } + + this._disposables.push( + configuration.onDidChange(this._onConfigurationChanged, this), + Control.unitsController.onDidChangeUnits(this._changeUnits, this), + Control.machineTypeController.onDidChangeMachineType(this._changeMachineType, this), + ); + } + + private _onConfigurationChanged(e: ConfigurationChangeEvent) { + // Enable / Disable Calculator Webview + if (configuration.changed(e, `${this.id.slice(6)}.enabled`)) { + if (this._enabled) { + // Disable + void Control.setContext(Contexts.CalcWebviewViewEnabled, false); + Logger.log('Disabling Calculator...'); + } else { + // Enable + Logger.log('Loading Calculator...'); + void Control.setContext(Contexts.CalcWebviewViewEnabled, true); + } + + this._enabled = configuration.getParam(`${this.id.slice(6)}.enabled`) ?? defaults.webviews.calc.enabled; + } + } + + protected override registerCommands(): Disposable[] { + return [ + commands.registerCommand( + WebviewCommands.ShowCalcWebview, + () => { + void this.show(); + }, + this, + ), + ]; + } + + protected override bootstrap(): WebviewMsg { + return { + type: 'bootstrap', + payload: { units: Control.unitsController.units, machineType: Control.machineTypeController.machineType }, + }; + } + + protected async getHtml(webview: Webview): Promise { + const webRootUri = Uri.joinPath(Control.context.extensionUri, 'dist', 'webviews'); + const uri = Uri.joinPath(webRootUri, this._shortId, `${this._shortId}.html`); + const content = new TextDecoder('utf8').decode(await workspace.fs.readFile(uri)); + + const cspSource = webview.cspSource; + const cspNonce = getNonce(); + + const root = webview.asWebviewUri(Control.context.extensionUri).toString(); + + const bootstrap = this.bootstrap(); + + // vscode-webview-ui-toolkit + const toolkitUri = webview.asWebviewUri( + Uri.joinPath( + Control.context.extensionUri, + 'node_modules', + '@vscode', + 'webview-ui-toolkit', + 'dist', + 'toolkit.js', + ), + ); + + const html = content.replace(/{(bootstrap|cspNonce|cspSource|root|title|toolkit)}/g, (_substring, token) => { + switch (token) { + case 'cspNonce': + return cspNonce.toString(); + + case 'cspSource': + return cspSource.toString(); + + case 'root': + return root; + + case 'title': + return `${this.title}`; + + case 'toolkit': + return ``; + + case 'bootstrap': + return ``; + + default: + return ''; + } + }); + + return Promise.resolve(html); + } + + private async _changeUnits() { + if (this._enabled) { + await this.postMessage({ type: 'changeUnits', payload: Control.unitsController.units }); + } + } + + private async _changeMachineType(e: MachineType) { + this._machineType = e; + + if ( + this._machineType === MachineTypes.Mill || + this._machineType === MachineTypes.Lathe || + this._machineType === MachineTypes.Swiss + ) { + if (this._enabled) { + void Control.setContext(Contexts.CalcWebviewViewEnabled, true); + this.title = `${WebviewTitles.CalcWebviewView} (${this._machineType.toString()})`; + await this.postMessage({ + type: 'changeMachineType', + payload: Control.machineTypeController.machineType, + }); + } + } else { + void Control.setContext(Contexts.CalcWebviewViewEnabled, false); + } + } +} diff --git a/src/webviews/codesWebview.ts b/src/webviews/codesWebview.ts deleted file mode 100644 index d83b5be..0000000 --- a/src/webviews/codesWebview.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable max-len */ -/* eslint-disable @typescript-eslint/restrict-template-expressions */ -/* --------------------------------------------------------------------------------------------- - * Copyright (c) Applied Eng & Design All rights reserved. - * Licensed under the MIT License. See License.md in the project root for license information. - * -------------------------------------------------------------------------------------------- */ - -'use strict'; - -import { Uri, Webview } from 'vscode'; -import { Control } from '../control'; -import { WebViewCommands } from '../util/constants'; -import { GWebview } from './gWebview'; - -const GCodesWebviewInfo = { - ViewId: 'gcode.webviews.codes', - Title: 'G/M Code Reference', -}; - -export class CodesWebview extends GWebview { - constructor() { - super(GCodesWebviewInfo.ViewId, GCodesWebviewInfo.Title, WebViewCommands.ShowCodesWebview); - } - - getHtml(webview: Webview): Promise { - // CSS styles - const stylesReset = webview.asWebviewUri( - Uri.joinPath(Control.context.extensionUri, 'resources', 'webviews', 'css', 'reset.css'), - ); - - const stylesMain = webview.asWebviewUri( - Uri.joinPath(Control.context.extensionUri, 'resources', 'webviews', 'css', 'vscode.css'), - ); - - const nonce = this.getNonce(); - - return Promise.resolve(` - - - - - - - - - - - - G/M Codes - - Test - `); - } -} diff --git a/src/webviews/gWebview.ts b/src/webviews/gWebview.ts index a2861c7..d196b84 100644 --- a/src/webviews/gWebview.ts +++ b/src/webviews/gWebview.ts @@ -7,8 +7,6 @@ 'use strict'; import { - commands, - ConfigurationChangeEvent, Disposable, Uri, ViewColumn, @@ -18,39 +16,28 @@ import { WebviewPanelOnDidChangeViewStateEvent, window, } from 'vscode'; -import { configuration } from '../util/configuration/config'; -import { constants, WebViewCommands } from '../util/constants'; +import { constants, WebviewCommands } from '../util/constants'; import { Control } from '../control'; export abstract class GWebview implements Disposable { - protected _disposable: Disposable; + protected _disposables: Disposable[] = []; private _panel: WebviewPanel | undefined; private _dPanel: Disposable | undefined; - private _enabled: boolean; + private _title: string; constructor( public readonly id: string, - public readonly title: string, - showCommand: WebViewCommands, + title: string, + showCommand: WebviewCommands, private readonly _column?: ViewColumn, ) { - this._disposable = Disposable.from( - configuration.onDidChange(this.onConfigurationChanged, this), - commands.registerCommand(showCommand, this.onShowCommand, this), - ); - - this._enabled = configuration.getParam('webviews.enabled'); - } - - private onConfigurationChanged(e: ConfigurationChangeEvent) { - if (e.affectsConfiguration('webviews.enabled')) { - this._enabled = configuration.getParam('webviews.enabled'); - } + this._title = title; + this._disposables.push(...this.registerCommands()); } dispose() { - this._disposable && this._disposable.dispose(); - this._dPanel && this._dPanel.dispose(); + Disposable.from(...this._disposables).dispose(); + this._dPanel?.dispose(); } hide() { @@ -61,17 +48,14 @@ export abstract class GWebview implements Disposable { return this._panel?.visible ?? false; } - setTitle(title: string) { - if (this._panel == null) { - return; - } - - this._panel.title = title; + get title(): string { + return this._panel?.title ?? this._title; } - protected onShowCommand() { - if (this._enabled) { - void this.show(this._column); + setTitle(title: string) { + this._title = title; + if (this._panel) { + this._panel.title = title; } } @@ -86,11 +70,15 @@ export abstract class GWebview implements Disposable { } } + protected onShowCommand(): void { + void this.show(); + } + async show(column: ViewColumn = ViewColumn.Beside): Promise { - if (this._panel == null) { + if (!this._panel) { this._panel = window.createWebviewPanel( this.id, - this.title, + this._title, { viewColumn: column, preserveFocus: false }, this.getWebviewOptions(), ); @@ -114,68 +102,20 @@ export abstract class GWebview implements Disposable { } } - protected abstract getHtml(webview: Webview): Promise; - - private _getHtmlForWebview(webview: Webview, ...opts: string[]) { - // CSS styles - const stylesReset = webview - .asWebviewUri(Uri.joinPath(Control.context.extensionUri, 'resources', 'webviews', 'css', 'reset.css')) - .with({ scheme: 'vscode-resource' }); - - const stylesMain = webview - .asWebviewUri(Uri.joinPath(Control.context.extensionUri, 'resources', 'webviews', 'css', 'vscode.css')) - .with({ scheme: 'vscode-resource' }); - - const nonce = this.getNonce(); - - const scriptUri = webview - .asWebviewUri(Uri.joinPath(Control.context.extensionUri, 'resources', 'webviews', 'js', `${opts[0]}.js`)) - .with({ scheme: 'vscode-resource' }); - - return ` - - - - - - - ${this.title} - - - - - - - - - - - -
- - - - - - `; - } - - protected getNonce(): string { - let text = ''; - - const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); + async refresh(): Promise { + if (this._panel) { + this._panel.webview.html = await this.getHtml(this._panel.webview); } - return text; } + protected abstract getHtml(webview: Webview): Promise; + protected abstract registerCommands(): Disposable[]; + private getWebviewOptions(): WebviewOptions { return { enableScripts: true, enableCommandUris: true, - localResourceRoots: [Uri.joinPath(Control.context.extensionUri, 'resources', 'webviews')], + localResourceRoots: [Uri.joinPath(Control.context.extensionUri)], }; } } diff --git a/src/webviews/gWebviewView.ts b/src/webviews/gWebviewView.ts new file mode 100644 index 0000000..3dd99df --- /dev/null +++ b/src/webviews/gWebviewView.ts @@ -0,0 +1,149 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +import { + CancellationToken, + commands, + Disposable, + Uri, + Webview, + WebviewOptions, + WebviewView, + WebviewViewProvider, + WebviewViewResolveContext, + window, +} from 'vscode'; +import { Control } from '../control'; +import { Logger } from '../util/logger'; +import { WebviewMsg } from './webviewMsg.types'; + +export abstract class GWebviewView implements WebviewViewProvider, Disposable { + protected readonly _disposables: Disposable[] = []; + protected _enabled: boolean | undefined; + private _view: WebviewView | undefined; + private _disposableView: Disposable | undefined; + private _title: string; + + constructor(public readonly id: string, title: string) { + this._title = title; + + this._disposables.push(window.registerWebviewViewProvider(id, this), ...(this.registerCommands?.() ?? [])); + } + + dispose() { + Disposable.from(...this._disposables).dispose(); + this._disposableView?.dispose(); + } + + isEnabled(): boolean { + return this._enabled ?? false; + } + + disable() { + this._enabled = false; + } + + get visible() { + return this._view?.visible ?? false; + } + + get title(): string { + return this._view?.title ?? this._title; + } + + set title(title: string) { + this._title = title; + if (this._view) { + this._view.title = title; + } + } + + get description(): string | undefined { + return this._view?.description; + } + + set description(desc: string | undefined) { + if (this._view) { + this._view.description = desc; + } + } + + async show(options?: { preserveFocus?: boolean }) { + try { + void (await commands.executeCommand(`${this.id}.focus`), options); + } catch (err) { + Logger.error(err); + } + } + + async resolveWebviewView( + webviewView: WebviewView, + _context: WebviewViewResolveContext, + _token: CancellationToken, + ): Promise { + this._view = webviewView; + + webviewView.webview.options = this.getWebviewOptions(); + webviewView.title = this.title; + + this._disposableView = Disposable.from( + this._view.onDidDispose(this.onViewDisposed, this), + this._view.onDidChangeVisibility(this.onViewVisabilityChanged, this), + this._view.webview.onDidReceiveMessage(this.onMessageReceived, this), + ); + + await this.refresh(); + } + + protected async refresh(): Promise { + if (this._view) { + this._view.webview.html = await this.getHtml(this._view.webview); + } + } + + protected abstract getHtml(webview: Webview): Promise; + protected registerCommands?(): Disposable[]; + protected handleMessage?(msg: WebviewMsg): void; + protected bootstrap?(): WebviewMsg; + + protected getWebviewOptions(): WebviewOptions { + return { + enableScripts: true, + enableCommandUris: true, + localResourceRoots: [Uri.joinPath(Control.context.extensionUri)], + }; + } + + protected onMessageReceived(msg: WebviewMsg): void { + if (msg) { + this.handleMessage?.(msg); + } else { + return; + } + } + + protected async postMessage(msg: WebviewMsg) { + if (this._view) { + return await this._view.webview.postMessage(msg); + } else { + return Promise.resolve(false); + } + } + + private onViewDisposed() { + this._disposableView?.dispose(); + this._disposableView = undefined; + this._view = undefined; + } + + private async onViewVisabilityChanged() { + const visable = this.visible; + + if (visable) { + await this.refresh(); + } + } +} diff --git a/src/webviews/helpers.ts b/src/webviews/helpers.ts new file mode 100644 index 0000000..2313d4a --- /dev/null +++ b/src/webviews/helpers.ts @@ -0,0 +1,11 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +import crypto from 'crypto'; + +export function getNonce(): string { + return crypto.randomBytes(16).toString('base64'); +} diff --git a/src/webviews/webviewMsg.types.ts b/src/webviews/webviewMsg.types.ts new file mode 100644 index 0000000..c8383ef --- /dev/null +++ b/src/webviews/webviewMsg.types.ts @@ -0,0 +1,10 @@ +/* --------------------------------------------------------------------------------------------- + * Copyright (c) Applied Eng & Design All rights reserved. + * Licensed under the MIT License. See License.md in the project root for license information. + * -------------------------------------------------------------------------------------------- */ +'use strict'; + +export interface WebviewMsg { + type: string; + payload?: any; +} diff --git a/tsconfig.json b/tsconfig.json index fbed3ed..a83d598 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,6 +29,7 @@ ], "exclude": [ "node_modules", - "samplenc" + "samplenc", + "src/webviews/apps/**/*" ] } \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 5caa8d5..ddf4f11 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -5,21 +5,42 @@ 'use strict'; -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +// @ts-check +/** @typedef {import('webpack').Configuration} */ + +const ESLintPlugin = require('eslint-webpack-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CspHtmlPlugin = require('csp-html-webpack-plugin'); const path = require('path'); +const fs = require('fs'); + + -// @ts-check -/** @typedef {import('webpack').Configuration} */ + +module.exports = function (env, argv) { + const mode = argv.mode || 'none'; + + env = { + analyzeBundle: false, + analyzeDeps: false, + ...env, + }; + + return [ + getExtensionConfig(mode, env), + getWebviewsConfig(mode, env), + ]; +}; function getExtensionConfig(mode, env) { const plugins = []; + plugins.push( - new ForkTsCheckerWebpackPlugin({ - async: false, - // eslint: { enabled: true, files: 'src/**/*.ts', options: { cache: true } }, - formatter: 'basic', - }), + new ESLintPlugin({ + extensions: ['ts'] + }) ); if (env.analyzeBundle) { @@ -30,6 +51,8 @@ function getExtensionConfig(mode, env) { name: 'extension', mode: mode, target: 'node', + devtool: 'source-map', + entry: './src/extension.ts', output: { @@ -37,11 +60,8 @@ function getExtensionConfig(mode, env) { filename: 'extension.js', libraryTarget: 'commonjs2', devtoolFallbackModuleFilenameTemplate: '../[resource-path]', - clean: true, }, - devtool: 'source-map', - externals: { vscode: 'commonjs vscode', '@appliedengdesign/gcode-reference': '@appliedengdesign/gcode-reference', @@ -49,6 +69,7 @@ function getExtensionConfig(mode, env) { resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], + mainFields: ['browser', 'module', 'main'], }, module: { @@ -68,12 +89,17 @@ function getExtensionConfig(mode, env) { plugins: plugins, + infrastructureLogging: { + level: 'log', + }, + stats: { preset: 'error-warnings', assets: true, colors: true, env: true, errorsCount: true, + errorDetails: true, warningsCount: true, timings: true, }, @@ -82,14 +108,193 @@ function getExtensionConfig(mode, env) { return config; } -module.exports = function (env, argv) { - const mode = argv.mode || 'none'; +function getWebviewsConfig(mode, env) { + const basePath = path.resolve(__dirname, 'src', 'webviews', 'apps'); + const outPath = path.resolve(__dirname, 'dist', 'webviews'); + const plugins = []; - env = { - analyzeBundle: false, - analyzeDeps: false, - ...env, + const entries = getWebviewEntries(basePath); + + plugins.push( + new ESLintPlugin({ + extensions: ['ts'] + }) + ); + + plugins.push(...getWebviewPlugins(outPath, basePath, entries)); + + plugins.push(getCspHtml(mode, env)); + + const config = { + name: 'webviews', + mode: mode, + target: 'web', + devtool: 'source-map', + context: basePath, + + entry: entries, + + output: { + path: path.resolve(__dirname, 'dist', 'webviews'), + filename: `[name]/[name][ext]`, + publicPath: '{root}/dist/webviews/', + }, + + plugins: plugins, + + module: { + rules: [ + { + exclude: /\.d.ts$/i, + test: /.tsx?$/, + use: [ + { + loader: 'ts-loader', + options: { + configFile: path.resolve(basePath, 'tsconfig.json'), + //transpileOnly: true, + } + }, + ], + exclude: /node_modules/, + }, + { + test: /\.s[ca]ss$/i, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + //esModule: false, + } + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + url: false, + }, + }, + { + loader: 'sass-loader', + options: { + sourceMap: true, + } + } + ], + exclude: /node_modules/, + }, + { + test: /\.(woff|woff2|eot|ttf|otf)$/, + type: 'asset/resource', + }, + ], + }, + + resolve: { + extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], + }, + + infrastructureLogging: { + level: 'log', + }, + + stats: { + preset: 'error-warnings', + assets: true, + colors: true, + env: true, + errorsCount: true, + errorDetails: true, + warningsCount: true, + timings: true, + }, }; - return getExtensionConfig(mode, env); -}; + return config; +} + +function getWebviewEntries(_path) { + // Get Entries from apps path + const entries = fs.readdirSync(_path, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .filter(dirent => dirent.name !== 'shared') + .map(dirent => dirent.name) + .reduce((result, item, index, array) => { + // App TS File + result[item] = { import: [`./${item}/${item}.ts`, `./${item}/${item}.scss` ], filename: `${item}/${item}.js` }; + + return result; + }, {}); + + return entries; +} + +function getWebviewPlugins(_outPath, _basePath, entries) { + const webviewPlugins = []; + + Object.keys(entries).forEach(entry => { + if (entry !== undefined && (/\.s[ca]ss$/).test(entry)) { + const name = entry.split('.').shift(); + if (name) { + webviewPlugins.push( + new MiniCssExtractPlugin({ + filename: path.join(name, `${name}.css`), + chunkFilename: '[id].css', + }) + ); + } + + return; + } + webviewPlugins.push( + new HtmlWebpackPlugin({ + template: path.resolve(_basePath, entry, `${entry}.html`), + inject: 'head', + filename: path.resolve(_outPath, `${entry}`, `${entry}.html`), + scriptLoading: 'module', + }), + ); + + webviewPlugins.push( + new MiniCssExtractPlugin({ + filename: `${entry}/${entry}.css`, + + }) + ); + + return; + }); + + //console.log(webviewPlugins); + //process.exit(1); + return webviewPlugins; +} + +function getCspHtml(mode, env) { + const cspPlugin = new CspHtmlPlugin( + { + 'default-src': "'none'", + 'img-src': [ '{cspSource}', 'https:', 'data:' ], + 'script-src': [ '{cspSource}', "'nonce-{cspNonce}'" ], + 'style-src': [ '{cspSource}', "'nonce-{cspNonce}'" ], + 'font-src': [ '{cspSource}' ], + }, + { + enabled: true, + hashingMethod: 'sha256', + hashEnabled: { + 'script-src': true, + 'style-src:': true, + }, + nonceEnabled: { + 'script-src': true, + 'style-src': true, + }, + }, + ); + + // Override nonce creation + cspPlugin.createNonce = () => '{cspNonce}'; + + return cspPlugin; +} \ No newline at end of file