diff --git a/.gitignore b/.gitignore index b036266..39a5d63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*-off.md *.bak *.gz *.ipynb @@ -19,6 +20,7 @@ .apdisk .com.apple.timemachine.donotpresent .fseventsd +.idea .ipy* .vscode Icon @@ -32,12 +34,11 @@ benchmark/tables benchmark/tmp.json build docs/_build +docs/src/tutorials/customizing.md +docs/src/tutorials/lmp.md +docs/src/tutorials/market.md +docs/src/tutorials/usage.md instances/**/*.json instances/_source local notebooks -docs/src/tutorials/usage.md -docs/src/tutorials/customizing.md -docs/src/tutorials/market.md -docs/src/tutorials/lmp.md -*-off.md \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json index 6ec18a9..e3b5b8a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -21,8 +21,8 @@ "@types/papaparse": "^5.3.16", "@types/react": "^19.1.3", "@types/react-dom": "^19.1.3", - "@typescript-eslint/utils": "^8.32.1", "ajv": "^8.17.1", + "eslint": "^8.57.1", "papaparse": "^5.5.2", "react": "^19.1.0", "react-dom": "^19.1.0", @@ -33,7 +33,7 @@ }, "devDependencies": { "@types/tabulator-tables": "^6.2.6", - "eslint": "^8.57.1" + "prettier": "3.5.3" } }, "node_modules/@adobe/css-tools": { @@ -2422,18 +2422,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -2631,12 +2619,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3829,9 +3811,9 @@ } }, "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "license": "MIT", "dependencies": { "@types/estree": "*", @@ -4147,46 +4129,69 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", - "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", - "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/parser": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "debug": "^4.3.4" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4196,7 +4201,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4204,7 +4209,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", @@ -4221,7 +4226,34 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", @@ -4234,7 +4266,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", @@ -4261,7 +4293,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", @@ -4287,24 +4319,7 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-scope": { + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", @@ -4317,19 +4332,7 @@ "node": ">=8.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/estraverse": { + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", @@ -4338,129 +4341,17 @@ "node": ">=4.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", - "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/visitor-keys": "8.32.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", - "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", - "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.32.1", - "@typescript-eslint/types": "8.32.1", - "@typescript-eslint/typescript-estree": "8.32.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", - "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", - "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.32.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "8.32.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", - "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", - "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -4638,6 +4529,28 @@ "deprecated": "Use your platform's native atob() and btoa() methods instead", "license": "BSD-3-Clause" }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -4784,6 +4697,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", @@ -5511,22 +5436,73 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "license": "MIT" }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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==", - "license": "ISC" - }, + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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==", + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6092,15 +6068,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6122,6 +6089,18 @@ "node": ">=0.8" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -6137,6 +6116,21 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, "node_modules/core-js": { "version": "3.42.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", @@ -7092,9 +7086,9 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/emojis-list": { @@ -7447,6 +7441,34 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -7493,6 +7515,24 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, "node_modules/eslint-plugin-import": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", @@ -7556,6 +7596,30 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -7594,12 +7658,6 @@ "node": ">= 0.4" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -7632,6 +7690,18 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -7670,6 +7740,22 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -7687,17 +7773,70 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "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==", + "license": "MIT", + "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/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==", + "license": "MIT", + "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/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7714,18 +7853,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7749,18 +7876,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -7892,6 +8007,67 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8116,6 +8292,39 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -8375,27 +8584,6 @@ "node": ">= 6" } }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8418,6 +8606,15 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -8687,18 +8884,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -9299,12 +9484,12 @@ } }, "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10" } }, "node_modules/is-array-buffer": { @@ -11317,6 +11502,15 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "license": "CC0-1.0" }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memfs": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", @@ -11329,6 +11523,15 @@ "node": ">= 4.0.0" } }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -11379,10 +11582,22 @@ } }, "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, "engines": { "node": ">= 0.6" } @@ -11533,6 +11748,15 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "license": "MIT" }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -12061,6 +12285,12 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -13576,6 +13806,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -13682,6 +13928,15 @@ "node": ">= 0.10" } }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -13714,6 +13969,21 @@ "teleport": ">=0.2.0" } }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -13767,6 +14037,33 @@ "node": ">= 0.6" } }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -13943,857 +14240,482 @@ } } }, - "node_modules/react-scripts/node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "5.62.0" + "picomatch": "^2.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=8.10.0" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "license": "BSD-2-Clause", + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "minimatch": "^3.0.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=6.0.0" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "license": "BSD-2-Clause", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "regenerate": "^1.4.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=4" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/react-scripts/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6" } }, - "node_modules/react-scripts/node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" + "node": ">= 0.10" } }, - "node_modules/react-scripts/node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "license": "BSD-3-Clause", + "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==", + "license": "MIT", "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" + "strip-ansi": "^6.0.1" } }, - "node_modules/react-scripts/node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/react-scripts/node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "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==", "license": "MIT", "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/react-scripts/node_modules/eslint-plugin-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.58.0" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" + "bin": { + "resolve": "bin/resolve" }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/react-scripts/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-scripts/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==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "license": "MIT", "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" + "resolve-from": "^5.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": ">=8" } }, - "node_modules/react-scripts/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==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", - "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": ">=8" } }, - "node_modules/react-scripts/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" + "node": ">=4" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" + "node": ">=8.9" }, - "engines": { - "node": ">=8.10.0" + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "license": "MIT", "dependencies": { - "minimatch": "^3.0.5" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "engines": { "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regex-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", - "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, "engines": { - "node": ">=4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "license": "BSD-2-Clause", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { - "jsesc": "~3.0.2" + "glob": "^7.1.3" }, "bin": { - "regjsparser": "bin/parser" + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", "bin": { - "jsesc": "bin/jsesc" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "license": "MIT", - "engines": { - "node": ">= 0.10" + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" } }, - "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==", + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "license": "MIT", "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.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==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "license": "MIT", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" - }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } - } - }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/resolve-url-loader/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "license": "ISC" - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "license": "MIT", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" + "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14976,44 +14898,79 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/serve-index/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8.0" } }, "node_modules/serve-index/node_modules/debug": { @@ -15055,42 +15012,12 @@ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "license": "ISC" }, - "node_modules/serve-index/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/serve-index/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -15106,6 +15033,21 @@ "node": ">= 0.6" } }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -15602,6 +15544,18 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -16434,18 +16388,6 @@ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", "license": "MIT" }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -16534,9 +16476,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -16545,6 +16487,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -16688,726 +16643,387 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "license": "MIT" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "license": "ISC", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.99.8", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", - "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "crypto-random-string": "^2.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8" } }, - "node_modules/webpack-dev-server/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">= 10.0.0" } }, - "node_modules/webpack-dev-server/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/webpack-dev-server/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", "license": "MIT" }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=4", + "yarn": "*" } }, - "node_modules/webpack-dev-server/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">= 0.10.0" + "bin": { + "update-browserslist-db": "cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/webpack-dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "punycode": "^2.1.0" } }, - "node_modules/webpack-dev-server/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/webpack-dev-server/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "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==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 0.4.0" } }, - "node_modules/webpack-dev-server/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/webpack-dev-server/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" } }, - "node_modules/webpack-dev-server/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/webpack-dev-server/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" + "browser-process-hrtime": "^1.0.0" } }, - "node_modules/webpack-dev-server/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/webpack-dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "makeerror": "1.0.12" } }, - "node_modules/webpack-dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">= 0.8" + "node": ">=10.13.0" } }, - "node_modules/webpack-dev-server/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.8.0" + "node": ">=10.4" } }, - "node_modules/webpack-dev-server/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/webpack": { + "version": "5.99.8", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", + "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, "engines": { - "node": ">= 0.8" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/webpack-dev-server/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-server/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 0.6" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, "node_modules/webpack-dev-server/node_modules/ws": { @@ -17500,27 +17116,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/web/package.json b/web/package.json index af41226..4bef5a2 100644 --- a/web/package.json +++ b/web/package.json @@ -16,8 +16,8 @@ "@types/papaparse": "^5.3.16", "@types/react": "^19.1.3", "@types/react-dom": "^19.1.3", - "@typescript-eslint/utils": "^8.32.1", "ajv": "^8.17.1", + "eslint": "^8.57.1", "papaparse": "^5.5.2", "react": "^19.1.0", "react-dom": "^19.1.0", @@ -58,6 +58,6 @@ }, "devDependencies": { "@types/tabulator-tables": "^6.2.6", - "eslint": "^8.57.1" + "prettier": "3.5.3" } } diff --git a/web/public/index.html b/web/public/index.html index 93a22bb..30c50bc 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -1,14 +1,11 @@ - + - + Case Builder - UnitCommitment.jl diff --git a/web/src/components/CaseBuilder/Buses/BusOperations.test.ts b/web/src/components/CaseBuilder/Buses/BusOperations.test.ts index b2c1dbf..8cf2510 100644 --- a/web/src/components/CaseBuilder/Buses/BusOperations.test.ts +++ b/web/src/components/CaseBuilder/Buses/BusOperations.test.ts @@ -4,81 +4,105 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import {UnitCommitmentScenario} from "../../../core/data"; -import {changeBusData, createBus, deleteBus, renameBus} from "./BusOperations"; +import { UnitCommitmentScenario } from "../../../core/data"; +import { + changeBusData, + createBus, + deleteBus, + renameBus, +} from "./BusOperations"; import assert from "node:assert"; export const BUS_TEST_DATA_1: UnitCommitmentScenario = { - "Parameters": { - "Version": "0.4", - "Power balance penalty ($/MW)": 1000.0, - "Time horizon (h)": 5, - "Time step (min)": 60, - }, - "Buses": { - "b1": {"Load (MW)": [35.79534, 34.38835, 33.45083, 32.89729, 33.25044]}, - "b2": {"Load (MW)": [14.03739, 13.48563, 13.11797, 12.9009, 13.03939]}, - "b3": {"Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268]}, - } + Parameters: { + Version: "0.4", + "Power balance penalty ($/MW)": 1000.0, + "Time horizon (h)": 5, + "Time step (min)": 60, + }, + Buses: { + b1: { "Load (MW)": [35.79534, 34.38835, 33.45083, 32.89729, 33.25044] }, + b2: { "Load (MW)": [14.03739, 13.48563, 13.11797, 12.9009, 13.03939] }, + b3: { "Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268] }, + }, }; test("createBus", () => { - const newScenario = createBus(BUS_TEST_DATA_1); - assert.deepEqual(Object.keys(newScenario.Buses), ["b1", "b2", "b3", "b4"]); + const newScenario = createBus(BUS_TEST_DATA_1); + assert.deepEqual(Object.keys(newScenario.Buses), ["b1", "b2", "b3", "b4"]); }); test("changeBusData", () => { - let scenario = BUS_TEST_DATA_1; - scenario = changeBusData("b1", "Load 0", "99", scenario); - scenario = changeBusData("b1", "Load 3", "99", scenario); - scenario = changeBusData("b3", "Load 4", "99", scenario); - assert.deepEqual(scenario, { - "Parameters": { - "Version": "0.4", - "Power balance penalty ($/MW)": 1000.0, - "Time horizon (h)": 5, - "Time step (min)": 60, - }, - "Buses": { - "b1": {"Load (MW)": [99, 34.38835, 33.45083, 99, 33.25044]}, - "b2": {"Load (MW)": [14.03739, 13.48563, 13.11797, 12.9009, 13.03939]}, - "b3": {"Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 99]}, - } - }); + let scenario = BUS_TEST_DATA_1; + let err = null; + + [scenario, err] = changeBusData("b1", "Load 0", "99", scenario); + assert.equal(err, null); + + [scenario, err] = changeBusData("b1", "Load 3", "99", scenario); + assert.equal(err, null); + + [scenario, err] = changeBusData("b3", "Load 4", "99", scenario); + assert.equal(err, null); + + assert.deepEqual(scenario, { + Parameters: { + Version: "0.4", + "Power balance penalty ($/MW)": 1000.0, + "Time horizon (h)": 5, + "Time step (min)": 60, + }, + Buses: { + b1: { "Load (MW)": [99, 34.38835, 33.45083, 99, 33.25044] }, + b2: { "Load (MW)": [14.03739, 13.48563, 13.11797, 12.9009, 13.03939] }, + b3: { "Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 99] }, + }, + }); }); -test("deleteBus", () => { - let scenario = BUS_TEST_DATA_1; - scenario = deleteBus("b2", scenario); - assert.deepEqual(scenario, { - "Parameters": { - "Version": "0.4", - "Power balance penalty ($/MW)": 1000.0, - "Time horizon (h)": 5, - "Time step (min)": 60, - }, - "Buses": { - "b1": {"Load (MW)": [35.79534, 34.38835, 33.45083, 32.89729, 33.25044]}, - "b3": {"Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268]}, - } - }); +test("changeBusData with invalid numbers", () => { + let [, err] = changeBusData("b1", "Load 0", "xx", BUS_TEST_DATA_1); + assert(err !== null); + assert.equal(err.message, "Invalid value: xx"); }); +test("deleteBus", () => { + let scenario = BUS_TEST_DATA_1; + scenario = deleteBus("b2", scenario); + assert.deepEqual(scenario, { + Parameters: { + Version: "0.4", + "Power balance penalty ($/MW)": 1000.0, + "Time horizon (h)": 5, + "Time step (min)": 60, + }, + Buses: { + b1: { "Load (MW)": [35.79534, 34.38835, 33.45083, 32.89729, 33.25044] }, + b3: { "Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268] }, + }, + }); +}); test("renameBus", () => { - let scenario = BUS_TEST_DATA_1; - scenario = renameBus("b2", "b99", scenario); - assert.deepEqual(scenario, { - "Parameters": { - "Version": "0.4", - "Power balance penalty ($/MW)": 1000.0, - "Time horizon (h)": 5, - "Time step (min)": 60, - }, - "Buses": { - "b1": {"Load (MW)": [35.79534, 34.38835, 33.45083, 32.89729, 33.25044]}, - "b99": {"Load (MW)": [14.03739, 13.48563, 13.11797, 12.9009, 13.03939]}, - "b3": {"Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268]}, - } - }); -}); \ No newline at end of file + let [scenario, err] = renameBus("b2", "b99", BUS_TEST_DATA_1); + assert(err === null); + assert.deepEqual(scenario, { + Parameters: { + Version: "0.4", + "Power balance penalty ($/MW)": 1000.0, + "Time horizon (h)": 5, + "Time step (min)": 60, + }, + Buses: { + b1: { "Load (MW)": [35.79534, 34.38835, 33.45083, 32.89729, 33.25044] }, + b99: { "Load (MW)": [14.03739, 13.48563, 13.11797, 12.9009, 13.03939] }, + b3: { "Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268] }, + }, + }); +}); + +test("renameBus with duplicated name", () => { + let [, err] = renameBus("b3", "b1", BUS_TEST_DATA_1); + assert(err != null); + assert.equal(err.message, `Bus b1 already exists`); +}); diff --git a/web/src/components/CaseBuilder/Buses/BusOperations.ts b/web/src/components/CaseBuilder/Buses/BusOperations.ts index 9b26dae..1d55c67 100644 --- a/web/src/components/CaseBuilder/Buses/BusOperations.ts +++ b/web/src/components/CaseBuilder/Buses/BusOperations.ts @@ -4,78 +4,103 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import {Buses, UnitCommitmentScenario} from "../../../core/data"; +import { Buses, UnitCommitmentScenario } from "../../../core/data"; +import { ValidationError } from "../../../core/Validation/validate"; -function generateUniqueBusName(scenario: UnitCommitmentScenario) { - let newBusName = "b"; - let counter = 1; - let name = `${newBusName}${counter}`; - while (name in scenario.Buses) { - counter++; - name = `${newBusName}${counter}`; - } - return name; -} +const generateUniqueBusName = (scenario: UnitCommitmentScenario) => { + let newBusName = "b"; + let counter = 1; + let name = `${newBusName}${counter}`; + while (name in scenario.Buses) { + counter++; + name = `${newBusName}${counter}`; + } + return name; +}; -function generateDefaultBusLoad(scenario: UnitCommitmentScenario) { - const T = scenario.Parameters["Time horizon (h)"] * (60 / scenario.Parameters["Time step (min)"]); - return new Array(T).fill(0); -} +const generateDefaultBusLoad = (scenario: UnitCommitmentScenario) => { + const T = + scenario.Parameters["Time horizon (h)"] * + (60 / scenario.Parameters["Time step (min)"]); + return new Array(T).fill(0); +}; -export function createBus(scenario: UnitCommitmentScenario) { - const load = generateDefaultBusLoad(scenario); - let name = generateUniqueBusName(scenario); - return { - ...scenario, - "Buses": { - ...scenario.Buses, - [name]: { - "Load (MW)": load - } - } - }; -} +export const createBus = (scenario: UnitCommitmentScenario) => { + const load = generateDefaultBusLoad(scenario); + let name = generateUniqueBusName(scenario); + return { + ...scenario, + Buses: { + ...scenario.Buses, + [name]: { + "Load (MW)": load, + }, + }, + }; +}; -export function changeBusData(bus: string, field: string, newValue: string, scenario: UnitCommitmentScenario) { - // Load (MW) - const match = field.match(/Load (\d+)/); - if(match) { - const idx = parseInt(match[1]!, 10); - const newLoad = [...scenario.Buses[bus]!["Load (MW)"]]; - newLoad[idx] = parseFloat(newValue); - return { - ...scenario, - Buses: { - ...scenario.Buses, - [bus]: { - "Load (MW)": newLoad, - } - } - }; +export const changeBusData = ( + bus: string, + field: string, + newValueStr: string, + scenario: UnitCommitmentScenario, +): [UnitCommitmentScenario, ValidationError | null] => { + // Load (MW) + const match = field.match(/Load (\d+)/); + if (match) { + const newValueFloat = parseFloat(newValueStr); + if (isNaN(newValueFloat)) { + return [scenario, { message: `Invalid value: ${newValueStr}` }]; } + const idx = parseInt(match[1]!, 10); + const newLoad = [...scenario.Buses[bus]!["Load (MW)"]]; + newLoad[idx] = newValueFloat; + return [ + { + ...scenario, + Buses: { + ...scenario.Buses, + [bus]: { + "Load (MW)": newLoad, + }, + }, + }, + null, + ]; + } - throw Error(`Unknown field: ${field}`); -} + throw Error(`Unknown field: ${field}`); +}; -export function deleteBus(bus: string, scenario: UnitCommitmentScenario) { - const { [bus]: _, ...newBuses} = scenario.Buses; - return { - ...scenario, - Buses: newBuses - }; -} +export const deleteBus = (bus: string, scenario: UnitCommitmentScenario) => { + const { [bus]: _, ...newBuses } = scenario.Buses; + return { + ...scenario, + Buses: newBuses, + }; +}; -export function renameBus(oldName: string, newName: string, scenario: UnitCommitmentScenario) { - const newBuses: Buses = Object.keys(scenario.Buses).reduce((acc, val) => { - if(val === oldName) { - acc[newName] = scenario.Buses[val]!; - } else { - acc[val] = scenario.Buses[val]!; - } - return acc; - }, {} as Buses); - return { - ...scenario, - Buses: newBuses - }; -} \ No newline at end of file +export const renameBus = ( + oldName: string, + newName: string, + scenario: UnitCommitmentScenario, +): [UnitCommitmentScenario, ValidationError | null] => { + if (newName in scenario.Buses) { + return [scenario, { message: `Bus ${newName} already exists` }]; + } + const newBuses: Buses = Object.keys(scenario.Buses).reduce((acc, val) => { + if (val === oldName) { + acc[newName] = scenario.Buses[val]!; + } else { + acc[val] = scenario.Buses[val]!; + } + return acc; + }, {} as Buses); + return [ + { + ...scenario, + Buses: newBuses, + }, + null, + ]; +}; diff --git a/web/src/components/CaseBuilder/Buses/Buses.tsx b/web/src/components/CaseBuilder/Buses/Buses.tsx deleted file mode 100644 index 80d8804..0000000 --- a/web/src/components/CaseBuilder/Buses/Buses.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment - * Copyright (C) 2020-2025, UChicago Argonne, LLC. All rights reserved. - * Released under the modified BSD license. See COPYING.md for more details. - */ - -import SectionHeader from "../../Common/SectionHeader/SectionHeader"; -import {UnitCommitmentScenario} from "../../../core/data"; -import BusesTable, {generateBusesCsv, parseBusesCsv} from "./BusesTable"; -import SectionButton from "../../Common/Buttons/SectionButton"; -import {faDownload, faPlus, faUpload} from "@fortawesome/free-solid-svg-icons"; -import {offerDownload} from "../../Common/io"; -import FileUploadElement from "../../Common/Buttons/FileUploadElement"; -import {useRef} from "react"; - -interface BusesProps { - scenario: UnitCommitmentScenario, - onBusCreated: () => void, - onBusDataChanged: (bus: string, field: string, newValue: string) => void, - onBusDeleted: (bus: string) => void, - onBusRenamed: (oldName: string, newName: string) => void, - onDataChanged: (scenario: UnitCommitmentScenario) => void, -} - -function BusesComponent(props: BusesProps) { - const fileUploadElem = useRef(null); - - const onDownload = () => { - const csvContents = generateBusesCsv(props.scenario); - offerDownload(csvContents, "text/csv", "buses.csv"); - }; - - const onUpload = () => { - fileUploadElem.current!.showFilePicker((csvContents: any) => { - const newScenario = parseBusesCsv(props.scenario, csvContents); - props.onDataChanged(newScenario); - }); - }; - - return ( -
- - - - - - - -
- ); -} - -export default BusesComponent; diff --git a/web/src/components/CaseBuilder/Buses/BusesComponent.tsx b/web/src/components/CaseBuilder/Buses/BusesComponent.tsx new file mode 100644 index 0000000..7a6bd63 --- /dev/null +++ b/web/src/components/CaseBuilder/Buses/BusesComponent.tsx @@ -0,0 +1,75 @@ +/* + * UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment + * Copyright (C) 2020-2025, UChicago Argonne, LLC. All rights reserved. + * Released under the modified BSD license. See COPYING.md for more details. + */ + +import SectionHeader from "../../Common/SectionHeader/SectionHeader"; +import { UnitCommitmentScenario } from "../../../core/data"; +import BusesTable, { generateBusesCsv, parseBusesCsv } from "./BusesTable"; +import SectionButton from "../../Common/Buttons/SectionButton"; +import { + faDownload, + faPlus, + faUpload, +} from "@fortawesome/free-solid-svg-icons"; +import { offerDownload } from "../../Common/io"; +import FileUploadElement from "../../Common/Buttons/FileUploadElement"; +import { useRef } from "react"; +import { ValidationError } from "../../../core/Validation/validate"; + +interface BusesProps { + scenario: UnitCommitmentScenario; + onBusCreated: () => void; + onBusDataChanged: ( + bus: string, + field: string, + newValue: string, + ) => ValidationError | null; + onBusDeleted: (bus: string) => void; + onBusRenamed: (oldName: string, newName: string) => ValidationError | null; + onDataChanged: (scenario: UnitCommitmentScenario) => void; +} + +function BusesComponent(props: BusesProps) { + const fileUploadElem = useRef(null); + + const onDownload = () => { + const csvContents = generateBusesCsv(props.scenario); + offerDownload(csvContents, "text/csv", "buses.csv"); + }; + + const onUpload = () => { + fileUploadElem.current!.showFilePicker((csvContents: any) => { + const newScenario = parseBusesCsv(props.scenario, csvContents); + props.onDataChanged(newScenario); + }); + }; + + return ( +
+ + + + + + + +
+ ); +} + +export default BusesComponent; diff --git a/web/src/components/CaseBuilder/Buses/BusesTable.test.ts b/web/src/components/CaseBuilder/Buses/BusesTable.test.ts index 1b88600..dcda485 100644 --- a/web/src/components/CaseBuilder/Buses/BusesTable.test.ts +++ b/web/src/components/CaseBuilder/Buses/BusesTable.test.ts @@ -5,64 +5,51 @@ */ import assert from "node:assert"; -import {generateBusesCsv, parseBusesCsv} from "./BusesTable"; -import {BUS_TEST_DATA_1} from "./BusOperations.test"; +import { generateBusesCsv, parseBusesCsv } from "./BusesTable"; +import { BUS_TEST_DATA_1 } from "./BusOperations.test"; test("generate CSV", () => { - const actualCsv = generateBusesCsv(BUS_TEST_DATA_1); - const expectedCsv = - "Name,Load 0,Load 1,Load 2,Load 3,Load 4\n" + - "b1,35.79534,34.38835,33.45083,32.89729,33.25044\n" + - "b2,14.03739,13.48563,13.11797,12.9009,13.03939\n" + - "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; - assert.strictEqual(actualCsv, expectedCsv); + const actualCsv = generateBusesCsv(BUS_TEST_DATA_1); + const expectedCsv = + "Name,Load 0,Load 1,Load 2,Load 3,Load 4\n" + + "b1,35.79534,34.38835,33.45083,32.89729,33.25044\n" + + "b2,14.03739,13.48563,13.11797,12.9009,13.03939\n" + + "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; + assert.strictEqual(actualCsv, expectedCsv); }); test("parse valid CSV", () => { - const csvContents = - "Name,Load 0,Load 1,Load 2,Load 3,Load 4\n" + - "b1,0,1,2,3,4\n" + - "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; - const newScenario = parseBusesCsv(BUS_TEST_DATA_1, csvContents); - assert.deepEqual(newScenario.Buses, { - "b1": { - "Load (MW)": [ - 0, - 1, - 2, - 3, - 4, - ] - }, - "b3": { - "Load (MW)": [ - 27.3729, - 26.29698, - 25.58005, - 25.15675, - 25.4268, - ] - }, - }); - + const csvContents = + "Name,Load 0,Load 1,Load 2,Load 3,Load 4\n" + + "b1,0,1,2,3,4\n" + + "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; + const newScenario = parseBusesCsv(BUS_TEST_DATA_1, csvContents); + assert.deepEqual(newScenario.Buses, { + b1: { + "Load (MW)": [0, 1, 2, 3, 4], + }, + b3: { + "Load (MW)": [27.3729, 26.29698, 25.58005, 25.15675, 25.4268], + }, + }); }); test("parse invalid CSV (wrong headers)", () => { - const csvContents = - "Name,Load 5,Load 7,Load 23,Load 3,Load 4\n" + - "b1,0,1,2,3,4\n" + - "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; - expect(() => { - parseBusesCsv(BUS_TEST_DATA_1, csvContents); - }).toThrow(Error); + const csvContents = + "Name,Load 5,Load 7,Load 23,Load 3,Load 4\n" + + "b1,0,1,2,3,4\n" + + "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; + expect(() => { + parseBusesCsv(BUS_TEST_DATA_1, csvContents); + }).toThrow(Error); }); test("parse invalid CSV (wrong data length)", () => { - const csvContents = - "Name,Load 0,Load 1,Load 2,Load 3,Load 4\n" + - "b1,0,1,2,3\n" + - "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; - expect(() => { - parseBusesCsv(BUS_TEST_DATA_1, csvContents); - }).toThrow(Error); -}); \ No newline at end of file + const csvContents = + "Name,Load 0,Load 1,Load 2,Load 3,Load 4\n" + + "b1,0,1,2,3\n" + + "b3,27.3729,26.29698,25.58005,25.15675,25.4268"; + expect(() => { + parseBusesCsv(BUS_TEST_DATA_1, csvContents); + }).toThrow(Error); +}); diff --git a/web/src/components/CaseBuilder/Buses/BusesTable.tsx b/web/src/components/CaseBuilder/Buses/BusesTable.tsx index 8de3a11..82a889b 100644 --- a/web/src/components/CaseBuilder/Buses/BusesTable.tsx +++ b/web/src/components/CaseBuilder/Buses/BusesTable.tsx @@ -4,174 +4,195 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import Papa from 'papaparse'; -import {Buses, UnitCommitmentScenario} from "../../../core/data"; -import {useEffect, useRef} from "react"; -import {CellComponent, ColumnDefinition, TabulatorFull as Tabulator} from "tabulator-tables"; +import Papa from "papaparse"; +import { Buses, UnitCommitmentScenario } from "../../../core/data"; +import { useEffect, useRef } from "react"; +import { + CellComponent, + ColumnDefinition, + TabulatorFull as Tabulator, +} from "tabulator-tables"; +import { ValidationError } from "../../../core/Validation/validate"; const generateBusesTableData = (scenario: UnitCommitmentScenario) => { - const tableData: { [name: string]: any }[] = []; - for (const [busName, busData] of Object.entries(scenario.Buses)) { - const entry: { [key: string]: any } = {}; - entry["Name"] = busName; - for (const [i, mw] of Object.entries(busData["Load (MW)"])) { - entry[`Load ${i}`] = mw; - } - tableData.push(entry); + const tableData: { [name: string]: any }[] = []; + for (const [busName, busData] of Object.entries(scenario.Buses)) { + const entry: { [key: string]: any } = {}; + entry["Name"] = busName; + for (const [i, mw] of Object.entries(busData["Load (MW)"])) { + entry[`Load ${i}`] = mw; } - return tableData; + tableData.push(entry); + } + return tableData; }; -const generateBusesTableColumns = (scenario: UnitCommitmentScenario): [ColumnDefinition] => { - const timeHorizonHours = scenario["Parameters"]["Time horizon (h)"]; - const timeStepMin = scenario["Parameters"]["Time step (min)"]; - const columnsCommonAttrs: ColumnDefinition = { - title: "", - editor: "input", - editorParams: { - selectContents: true, - }, - headerHozAlign: "right", - cssClass: "custom-cell-style", - headerWordWrap: true, - formatter: "plaintext", - headerSort: false, - resizable: false, - }; - const columns: [ColumnDefinition] = [ - { - ...columnsCommonAttrs, - title: "Name", - field: "Name", - width: 150, - }, - ]; - for (let m = 0, offset = 0; m < timeHorizonHours * 60; m += timeStepMin, offset += 1) { - const hours = Math.floor(m / 60); - const mins = m % 60; - const formattedTime = `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`; - columns.push({ - ...columnsCommonAttrs, - title: `Load (MW)
${formattedTime}
`, - field: `Load ${offset}`, - width: 100, - }); - } - return columns; +const generateBusesTableColumns = ( + scenario: UnitCommitmentScenario, +): [ColumnDefinition] => { + const timeHorizonHours = scenario["Parameters"]["Time horizon (h)"]; + const timeStepMin = scenario["Parameters"]["Time step (min)"]; + const columnsCommonAttrs: ColumnDefinition = { + title: "", + editor: "input", + editorParams: { + selectContents: true, + }, + headerHozAlign: "right", + cssClass: "custom-cell-style", + headerWordWrap: true, + formatter: "plaintext", + headerSort: false, + resizable: false, + }; + const columns: [ColumnDefinition] = [ + { + ...columnsCommonAttrs, + title: "Name", + field: "Name", + width: 150, + }, + ]; + for ( + let m = 0, offset = 0; + m < timeHorizonHours * 60; + m += timeStepMin, offset += 1 + ) { + const hours = Math.floor(m / 60); + const mins = m % 60; + const formattedTime = `${String(hours).padStart(2, "0")}:${String(mins).padStart(2, "0")}`; + columns.push({ + ...columnsCommonAttrs, + title: `Load (MW)
${formattedTime}
`, + field: `Load ${offset}`, + width: 100, + }); + } + return columns; }; export const generateBusesCsv = (scenario: UnitCommitmentScenario) => { - const columns = generateBusesTableColumns(scenario); - const csvHeader = columns.map(row => row.field).join(","); - const csvBody = Object.entries(scenario.Buses).map(([busName, busData]) => { - const csvLoad = busData["Load (MW)"].join(","); - return `${busName},${csvLoad}`; - }).join("\n"); - return `${csvHeader}\n${csvBody}`; + const columns = generateBusesTableColumns(scenario); + const csvHeader = columns.map((row) => row.field).join(","); + const csvBody = Object.entries(scenario.Buses) + .map(([busName, busData]) => { + const csvLoad = busData["Load (MW)"].join(","); + return `${busName},${csvLoad}`; + }) + .join("\n"); + return `${csvHeader}\n${csvBody}`; }; function getNumTimesteps(scenario: UnitCommitmentScenario) { - return scenario.Parameters["Time horizon (h)"] * scenario.Parameters["Time step (min)"] / 60; + return ( + (scenario.Parameters["Time horizon (h)"] * + scenario.Parameters["Time step (min)"]) / + 60 + ); } -export const parseBusesCsv = (scenario: UnitCommitmentScenario, csvData: string): UnitCommitmentScenario => { - const results = Papa.parse(csvData, { - header: true, - skipEmptyLines: true, - transformHeader: (header) => header.trim(), - transform: (value) => value.trim() - }); - - // Check for parsing errors - if (results.errors.length > 0) { - throw Error(`Invalid CSV: Parsing error: ${results.errors}`); +export const parseBusesCsv = ( + scenario: UnitCommitmentScenario, + csvData: string, +): UnitCommitmentScenario => { + const results = Papa.parse(csvData, { + header: true, + skipEmptyLines: true, + transformHeader: (header) => header.trim(), + transform: (value) => value.trim(), + }); + + // Check for parsing errors + if (results.errors.length > 0) { + throw Error(`Invalid CSV: Parsing error: ${results.errors}`); + } + + // Check CSV headers + const expectedFields = generateBusesTableColumns(scenario).map( + (col) => col.field, + )!; + const actualFields = results.meta.fields!; + for (let i = 0; i < expectedFields.length; i++) { + if (expectedFields[i] !== actualFields[i]) { + throw Error(`Invalid CSV: Header mismatch at column ${i + 1}"`); } - - // Check CSV headers - const expectedFields = generateBusesTableColumns(scenario).map(col => col.field)!; - const actualFields = results.meta.fields!; - for (let i = 0; i < expectedFields.length; i++) { - if (expectedFields[i] !== actualFields[i]) { - throw Error(`Invalid CSV: Header mismatch at column ${i + 1}"`); - } + } + + // Parse each row + const T = getNumTimesteps(scenario); + const buses: Buses = {}; + for (let i = 0; i < results.data.length; i++) { + const row = results.data[i] as { [key: string]: any }; + const busName = row["Name"] as string; + const busLoad: number[] = Array(T); + for (let j = 0; j < T; j++) { + busLoad[j] = parseFloat(row[`Load ${j}`]); } - - // Parse each row - const T = getNumTimesteps(scenario); - const buses: Buses = {}; - for (let i = 0; i < results.data.length; i++) { - const row = results.data[i] as { [key: string]: any }; - const busName = row["Name"] as string; - const busLoad: number[] = Array(T); - for (let j = 0; j < T; j++) { - busLoad[j] = parseFloat(row[`Load ${j}`]); - } - buses[busName] = { - "Load (MW)": busLoad - }; - } - return { - ...scenario, - Buses: buses, + buses[busName] = { + "Load (MW)": busLoad, }; + } + return { + ...scenario, + Buses: buses, + }; }; interface BusesTableProps { - scenario: UnitCommitmentScenario - onBusDataChanged: (bus: string, field: string, newValue: string) => void, - onBusDeleted: (bus: string) => void, - onBusRenamed: (oldName: string, newName: string) => void, + scenario: UnitCommitmentScenario; + onBusDataChanged: ( + bus: string, + field: string, + newValue: string, + ) => ValidationError | null; + onBusDeleted: (bus: string) => void; + onBusRenamed: (oldName: string, newName: string) => ValidationError | null; } function BusesTable(props: BusesTableProps) { - const tableContainerRef = useRef(null); - - useEffect(() => { - const onCellEdited = (cell: CellComponent) => { - let newValue = cell.getValue(); - let oldValue = cell.getOldValue(); - if (newValue === oldValue) return; - - if (cell.getField() === "Name") { - if (newValue === "") { - props.onBusDeleted(oldValue); - cell.getRow().delete(); - } else { - props.onBusRenamed( - oldValue, - newValue, - ); - } - } else { - const row = cell.getRow().getData(); - const bus = row["Name"]; - props.onBusDataChanged( - bus, cell.getField(), newValue - ); - } - }; - - if (tableContainerRef.current === null) return; - const table = new Tabulator(tableContainerRef.current, { - layout: "fitColumns", - data: generateBusesTableData(props.scenario), - columns: generateBusesTableColumns(props.scenario), - maxHeight: "500px", - }); - table.on("cellEdited", (cell) => { - onCellEdited(cell); - }); - table.on("cellEditing", (cell) => { - }); - // table.on("scrollHorizontal", (left, leftDir) => { - // console.log(left, leftDir); - // }); - table.rowManager.scrollHorizontal(100, false); - // table.columnManager.scrollHorizontal(100, false); - }, [props, props.scenario]); - - return
; + const tableContainerRef = useRef(null); + + useEffect(() => { + const scenario = props.scenario; + const onCellEdited = (cell: CellComponent) => { + let newValue = cell.getValue(); + let oldValue = cell.getOldValue(); + // eslint-disable-next-line eqeqeq + if (newValue == oldValue) return; + + if (cell.getField() === "Name") { + if (newValue === "") { + props.onBusDeleted(oldValue); + cell.getRow().delete(); + } else { + const err = props.onBusRenamed(oldValue, newValue); + if (err) { + cell.restoreOldValue(); + } + } + } else { + const row = cell.getRow().getData(); + const bus = row["Name"]; + const err = props.onBusDataChanged(bus, cell.getField(), newValue); + if (err) { + cell.restoreOldValue(); + } + } + }; + + if (tableContainerRef.current === null) return; + const table = new Tabulator(tableContainerRef.current, { + layout: "fitColumns", + data: generateBusesTableData(scenario), + columns: generateBusesTableColumns(scenario), + maxHeight: "500px", + }); + table.on("cellEdited", (cell) => { + onCellEdited(cell); + }); + }, [props]); + + return
; } export default BusesTable; - diff --git a/web/src/components/CaseBuilder/CaseBuilder.tsx b/web/src/components/CaseBuilder/CaseBuilder.tsx index 3af9f12..e620443 100644 --- a/web/src/components/CaseBuilder/CaseBuilder.tsx +++ b/web/src/components/CaseBuilder/CaseBuilder.tsx @@ -6,83 +6,107 @@ import Header from "./Header/Header"; import Parameters from "./Parameters/Parameters"; -import BusesComponent from "./Buses/Buses"; -import {BLANK_SCENARIO, TEST_SCENARIO, UnitCommitmentScenario} from "../../core/data"; +import BusesComponent from "./Buses/BusesComponent"; +import { + BLANK_SCENARIO, + TEST_SCENARIO, + UnitCommitmentScenario, +} from "../../core/data"; import "tabulator-tables/dist/css/tabulator.min.css"; import "../Common/Forms/Tables.css"; -import {useState} from "react"; +import { useState } from "react"; import Footer from "./Footer/Footer"; -import {validate} from "../../core/Validation/validate"; -import {offerDownload} from "../Common/io"; -import {changeBusData, createBus, deleteBus, renameBus} from "./Buses/BusOperations"; +import { validate, ValidationError } from "../../core/Validation/validate"; +import { offerDownload } from "../Common/io"; +import { + changeBusData, + createBus, + deleteBus, + renameBus, +} from "./Buses/BusOperations"; const CaseBuilder = () => { - const [scenario, setScenario] = useState(TEST_SCENARIO); + const [scenario, setScenario] = useState(TEST_SCENARIO); - const onClear = () => { - setScenario(BLANK_SCENARIO); - }; + const onClear = () => { + setScenario(BLANK_SCENARIO); + }; - const onSave = () => { - offerDownload( - JSON.stringify(scenario, null, 2), - 'application/json', - 'case.json', - ); - }; + const onSave = () => { + offerDownload( + JSON.stringify(scenario, null, 2), + "application/json", + "case.json", + ); + }; - const onBusCreated = () => { - const newScenario = createBus(scenario); - setScenario(newScenario); - }; + const onBusCreated = () => { + const newScenario = createBus(scenario); + setScenario(newScenario); + }; - const onBusDataChanged = (bus: string, field: string, newValue: string) => { - const newScenario = changeBusData(bus, field, newValue, scenario); - setScenario(newScenario); - }; + const onBusDataChanged = ( + bus: string, + field: string, + newValue: string, + ): ValidationError | null => { + const [newScenario, err] = changeBusData(bus, field, newValue, scenario); + if (err) { + console.log(err); + return err; + } + setScenario(newScenario); + return null; + }; - const onBusDeleted = (bus: string) => { - const newScenario = deleteBus(bus, scenario); - setScenario(newScenario); - }; + const onBusDeleted = (bus: string) => { + const newScenario = deleteBus(bus, scenario); + setScenario(newScenario); + }; - const onBusRenamed = (oldName: string, newName: string) => { - const newScenario = renameBus(oldName, newName, scenario); - setScenario(newScenario); - }; + const onBusRenamed = ( + oldName: string, + newName: string, + ): ValidationError | null => { + const [newScenario, err] = renameBus(oldName, newName, scenario); + if (err) { + console.log(err); + return err; + } + setScenario(newScenario); + return null; + }; - const onDataChanged = (newScenario: UnitCommitmentScenario) => { - setScenario(newScenario); - }; + const onDataChanged = (newScenario: UnitCommitmentScenario) => { + setScenario(newScenario); + }; - const onLoad = (scenario: UnitCommitmentScenario) => { - if (!validate(scenario)) { - console.error(validate.errors); - return; - } - setScenario(scenario); - }; + const onLoad = (scenario: UnitCommitmentScenario) => { + if (!validate(scenario)) { + console.error(validate.errors); + return; + } + setScenario(scenario); + }; - return
-
+
+
+ + -
- - -
-
-
; +
+
+
+ ); }; -export default CaseBuilder; \ No newline at end of file +export default CaseBuilder; diff --git a/web/src/components/CaseBuilder/Footer/Footer.module.css b/web/src/components/CaseBuilder/Footer/Footer.module.css index c6bd5e6..1e31ba6 100644 --- a/web/src/components/CaseBuilder/Footer/Footer.module.css +++ b/web/src/components/CaseBuilder/Footer/Footer.module.css @@ -5,10 +5,10 @@ */ .Footer { - background-color: #333; - text-align: center; - color: #aaa; - font-size: 14px; - padding: 16px; - line-height: 24px; -} \ No newline at end of file + background-color: #333; + text-align: center; + color: #aaa; + font-size: 14px; + padding: 16px; + line-height: 24px; +} diff --git a/web/src/components/CaseBuilder/Footer/Footer.tsx b/web/src/components/CaseBuilder/Footer/Footer.tsx index e919a3b..3fc1e74 100644 --- a/web/src/components/CaseBuilder/Footer/Footer.tsx +++ b/web/src/components/CaseBuilder/Footer/Footer.tsx @@ -7,12 +7,13 @@ import styles from "./Footer.module.css"; function Footer() { - return ( -
- UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
- Copyright (C) 2020-2025, UChicago Argonne, LLC. All rights reserved. -
- ); + return ( +
+ UnitCommitment.jl: Optimization Package for Security-Constrained Unit + Commitment
+ Copyright (C) 2020-2025, UChicago Argonne, LLC. All rights reserved. +
+ ); } -export default Footer; \ No newline at end of file +export default Footer; diff --git a/web/src/components/CaseBuilder/Header/Header.module.css b/web/src/components/CaseBuilder/Header/Header.module.css index 46963c5..5131e12 100644 --- a/web/src/components/CaseBuilder/Header/Header.module.css +++ b/web/src/components/CaseBuilder/Header/Header.module.css @@ -5,38 +5,37 @@ */ .HeaderBox { - background-color: var(--contrast-0); - border-bottom: var(--box-border); - box-shadow: var(--box-shadow); - padding: 0; - margin: 0; + background-color: var(--contrast-0); + border-bottom: var(--box-border); + box-shadow: var(--box-shadow); + padding: 0; + margin: 0; } .HeaderContent { - margin: 0 auto; - max-width: var(--site-max-width); - min-width: var(--site-min-width); + margin: 0 auto; + max-width: var(--site-max-width); + min-width: var(--site-min-width); } -.HeaderContent h1, h2 { - color: var(--contrast-100); - display: inline-block; - line-height: 48px; - font-size: 28px; - margin: 0; - padding: 12px; +.HeaderContent h1, +h2 { + color: var(--contrast-100); + display: inline-block; + line-height: 48px; + font-size: 28px; + margin: 0; + padding: 12px; } .HeaderContent h2 { - display: inline-block; - font-size: 22px; - color: var(--contrast-80); - font-weight: normal; + display: inline-block; + font-size: 22px; + color: var(--contrast-80); + font-weight: normal; } .buttonContainer { - float: right; - padding: 16px 12px; + float: right; + padding: 16px 12px; } - - diff --git a/web/src/components/CaseBuilder/Header/Header.tsx b/web/src/components/CaseBuilder/Header/Header.tsx index 53036e8..e82209b 100644 --- a/web/src/components/CaseBuilder/Header/Header.tsx +++ b/web/src/components/CaseBuilder/Header/Header.tsx @@ -6,40 +6,40 @@ import styles from "./Header.module.css"; import SiteHeaderButton from "../../Common/Buttons/SiteHeaderButton"; -import {UnitCommitmentScenario} from "../../../core/data"; -import {useRef} from "react"; +import { UnitCommitmentScenario } from "../../../core/data"; +import { useRef } from "react"; import FileUploadElement from "../../Common/Buttons/FileUploadElement"; interface HeaderProps { - onClear: () => void - onSave: () => void - onLoad: (data: UnitCommitmentScenario) => void + onClear: () => void; + onSave: () => void; + onLoad: (data: UnitCommitmentScenario) => void; } function Header(props: HeaderProps) { - const fileElem = useRef(null); + const fileElem = useRef(null); - function onLoad() { - fileElem.current!.showFilePicker((data: any) => { - const scenario = JSON.parse(data) as UnitCommitmentScenario; - props.onLoad(scenario); - }); - } + function onLoad() { + fileElem.current!.showFilePicker((data: any) => { + const scenario = JSON.parse(data) as UnitCommitmentScenario; + props.onLoad(scenario); + }); + } - return ( -
-
-

UnitCommitment.jl

-

Case Builder

-
- - - -
- -
+ return ( +
+
+

UnitCommitment.jl

+

Case Builder

+
+ + +
- ); + +
+
+ ); } -export default Header; \ No newline at end of file +export default Header; diff --git a/web/src/components/CaseBuilder/Parameters/Parameters.tsx b/web/src/components/CaseBuilder/Parameters/Parameters.tsx index f32333e..18158d0 100644 --- a/web/src/components/CaseBuilder/Parameters/Parameters.tsx +++ b/web/src/components/CaseBuilder/Parameters/Parameters.tsx @@ -7,42 +7,41 @@ import SectionHeader from "../../Common/SectionHeader/SectionHeader"; import Form from "../../Common/Forms/Form"; import TextInputRow from "../../Common/Forms/TextInputRow"; -import {UnitCommitmentScenario} from "../../../core/data"; +import { UnitCommitmentScenario } from "../../../core/data"; interface ParametersProps { - scenario: UnitCommitmentScenario + scenario: UnitCommitmentScenario; } -function Parameters({scenario}: ParametersProps) { - return ( -
- - -
- - - - -
- ); +function Parameters({ scenario }: ParametersProps) { + return ( +
+ +
+ + + + +
+ ); } -export default Parameters; \ No newline at end of file +export default Parameters; diff --git a/web/src/components/Common/Buttons/FileUploadElement.tsx b/web/src/components/Common/Buttons/FileUploadElement.tsx index db374e7..56d00e1 100644 --- a/web/src/components/Common/Buttons/FileUploadElement.tsx +++ b/web/src/components/Common/Buttons/FileUploadElement.tsx @@ -4,39 +4,41 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import React, {Component} from "react"; +import React, { Component } from "react"; class FileUploadElement extends Component { - private inputRef = React.createRef(); - private callback: (data: any) => void = () => {}; + private inputRef = React.createRef(); + private callback: (data: any) => void = () => {}; - showFilePicker = (callback: (data: any) => void) => { - this.callback = callback; - this.inputRef.current?.click(); - }; + showFilePicker = (callback: (data: any) => void) => { + this.callback = callback; + this.inputRef.current?.click(); + }; - onFileSelected = (event: React.ChangeEvent) => { - const file = event.target.files![0]; - if (file) { - const reader = new FileReader(); - reader.onload = async (e) => { - this.callback(e.target?.result as string); - this.callback = () => {}; - }; - reader.readAsText(file); - } - event.target.value = ''; - }; - - override render() { - return ; + onFileSelected = (event: React.ChangeEvent) => { + const file = event.target.files![0]; + if (file) { + const reader = new FileReader(); + reader.onload = async (e) => { + this.callback(e.target?.result as string); + this.callback = () => {}; + }; + reader.readAsText(file); } + event.target.value = ""; + }; + + override render() { + return ( + + ); + } } -export default FileUploadElement; \ No newline at end of file +export default FileUploadElement; diff --git a/web/src/components/Common/Buttons/HelpButton.module.css b/web/src/components/Common/Buttons/HelpButton.module.css index 62edf92..389410d 100644 --- a/web/src/components/Common/Buttons/HelpButton.module.css +++ b/web/src/components/Common/Buttons/HelpButton.module.css @@ -5,39 +5,39 @@ */ .tooltip { - visibility: hidden; - background-color: var(--contrast-80); - color: var(--contrast-10); - opacity: 0; - width: 250px; - margin-top: 36px; - margin-left: -250px; - position: absolute; - z-index: 100; - font-size: 14px; - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); - line-height: 20px; - transition: opacity 0.5s; - font-weight: normal; - text-align: left; - padding: 6px 12px; + visibility: hidden; + background-color: var(--contrast-80); + color: var(--contrast-10); + opacity: 0; + width: 250px; + margin-top: 36px; + margin-left: -250px; + position: absolute; + z-index: 100; + font-size: 14px; + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + line-height: 20px; + transition: opacity 0.5s; + font-weight: normal; + text-align: left; + padding: 6px 12px; } .icon { - color: var(--contrast-60); - font-size: 16px; - padding: 8px 8px 8px 0; + color: var(--contrast-60); + font-size: 16px; + padding: 8px 8px 8px 0; } .HelpButton { - border: 0; - background-color: transparent; - cursor: pointer; + border: 0; + background-color: transparent; + cursor: pointer; } .HelpButton:hover .tooltip { - visibility: visible; - opacity: 100%; - transition: opacity 0.5s; + visibility: visible; + opacity: 100%; + transition: opacity 0.5s; } diff --git a/web/src/components/Common/Buttons/HelpButton.tsx b/web/src/components/Common/Buttons/HelpButton.tsx index c4e9f5f..b9ea0b6 100644 --- a/web/src/components/Common/Buttons/HelpButton.tsx +++ b/web/src/components/Common/Buttons/HelpButton.tsx @@ -5,19 +5,18 @@ */ import styles from "./HelpButton.module.css"; -import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCircleQuestion} from '@fortawesome/free-regular-svg-icons'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faCircleQuestion } from "@fortawesome/free-regular-svg-icons"; - -function HelpButton({text}: { text: String }) { - return ( - - ); +function HelpButton({ text }: { text: String }) { + return ( + + ); } -export default HelpButton; \ No newline at end of file +export default HelpButton; diff --git a/web/src/components/Common/Buttons/SectionButton.module.css b/web/src/components/Common/Buttons/SectionButton.module.css index 4160255..5c484e0 100644 --- a/web/src/components/Common/Buttons/SectionButton.module.css +++ b/web/src/components/Common/Buttons/SectionButton.module.css @@ -5,22 +5,22 @@ */ .SectionButton { - height: 48px; - width: 48px; - font-size: 16px; - border: 0; - background-color: transparent; - margin: 8px 0 8px 0px; - cursor: pointer; - color: var(--contrast-60); + height: 48px; + width: 48px; + font-size: 16px; + border: 0; + background-color: transparent; + margin: 8px 0 8px 0px; + cursor: pointer; + color: var(--contrast-60); } .SectionButton:hover { - color: var(--contrast-100); - background-color: var(--contrast-20); - border-radius: var(--border-radius); + color: var(--contrast-100); + background-color: var(--contrast-20); + border-radius: var(--border-radius); } .SectionButton:active { - background-color: var(--contrast-60); -} \ No newline at end of file + background-color: var(--contrast-60); +} diff --git a/web/src/components/Common/Buttons/SectionButton.tsx b/web/src/components/Common/Buttons/SectionButton.tsx index 0806262..8633bed 100644 --- a/web/src/components/Common/Buttons/SectionButton.tsx +++ b/web/src/components/Common/Buttons/SectionButton.tsx @@ -4,26 +4,26 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import {IconDefinition} from "@fortawesome/fontawesome-svg-core"; -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; +import { IconDefinition } from "@fortawesome/fontawesome-svg-core"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import styles from "./SectionButton.module.css"; interface SectionButtonProps { - icon: IconDefinition, - tooltip: string, - onClick?: () => void, + icon: IconDefinition; + tooltip: string; + onClick?: () => void; } function SectionButton(props: SectionButtonProps) { - return ( - - ); + return ( + + ); } -export default SectionButton; \ No newline at end of file +export default SectionButton; diff --git a/web/src/components/Common/Buttons/SiteHeaderButton.module.css b/web/src/components/Common/Buttons/SiteHeaderButton.module.css index efef584..8c5ef54 100644 --- a/web/src/components/Common/Buttons/SiteHeaderButton.module.css +++ b/web/src/components/Common/Buttons/SiteHeaderButton.module.css @@ -5,24 +5,24 @@ */ .SiteHeaderButton { - padding: 6px 36px; - margin: 0 0 0 8px; - line-height: 24px; - border: var(--box-border); - box-shadow: var(--box-shadow); - border-radius: var(--border-radius); - cursor: pointer; - color: var(--contrast-80); - text-transform: uppercase; - font-weight: bold; - font-size: 12px; - background: linear-gradient(var(--contrast-0) 25%, var(--contrast-10) 100%); + padding: 6px 36px; + margin: 0 0 0 8px; + line-height: 24px; + border: var(--box-border); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius); + cursor: pointer; + color: var(--contrast-80); + text-transform: uppercase; + font-weight: bold; + font-size: 12px; + background: linear-gradient(var(--contrast-0) 25%, var(--contrast-10) 100%); } .SiteHeaderButton:hover { - background: rgb(245, 245, 245); + background: rgb(245, 245, 245); } .SiteHeaderButton:active { - background: rgba(220, 220, 220); -} \ No newline at end of file + background: rgba(220, 220, 220); +} diff --git a/web/src/components/Common/Buttons/SiteHeaderButton.tsx b/web/src/components/Common/Buttons/SiteHeaderButton.tsx index 593cafd..55a1f14 100644 --- a/web/src/components/Common/Buttons/SiteHeaderButton.tsx +++ b/web/src/components/Common/Buttons/SiteHeaderButton.tsx @@ -6,14 +6,18 @@ import styles from "./SiteHeaderButton.module.css"; -function SiteHeaderButton({title, onClick}: { title: string, onClick?: () => void }) { - return ( - - ); +function SiteHeaderButton({ + title, + onClick, +}: { + title: string; + onClick?: () => void; +}) { + return ( + + ); } -export default SiteHeaderButton; \ No newline at end of file +export default SiteHeaderButton; diff --git a/web/src/components/Common/Forms/Form.module.css b/web/src/components/Common/Forms/Form.module.css index fabd9c0..f23421e 100644 --- a/web/src/components/Common/Forms/Form.module.css +++ b/web/src/components/Common/Forms/Form.module.css @@ -5,38 +5,38 @@ */ .Form { - background-color: var(--contrast-0); - border: var(--box-border); - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); - min-height: 48px; - margin: 0 auto; - min-width: var(--site-min-width); - max-width: var(--site-max-width); - max-height: 500px; - padding: 12px 0; + background-color: var(--contrast-0); + border: var(--box-border); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + min-height: 48px; + margin: 0 auto; + min-width: var(--site-min-width); + max-width: var(--site-max-width); + max-height: 500px; + padding: 12px 0; } .FormRow { - display: flex; - line-height: 24px; + display: flex; + line-height: 24px; } .FormRow label { - width: 350px; - padding: 6px 12px; - text-align: right; + width: 350px; + padding: 6px 12px; + text-align: right; } .FormRow input { - flex: 1; - font-family: monospace; - border: var(--box-border); - border-radius: var(--border-radius); - padding: 4px; - margin: 2px 3px; + flex: 1; + font-family: monospace; + border: var(--box-border); + border-radius: var(--border-radius); + padding: 4px; + margin: 2px 3px; } .FormRow_unit { - color: rgba(0, 0, 0, 0.4); + color: rgba(0, 0, 0, 0.4); } diff --git a/web/src/components/Common/Forms/Form.tsx b/web/src/components/Common/Forms/Form.tsx index 5d2d5c7..0b45a3e 100644 --- a/web/src/components/Common/Forms/Form.tsx +++ b/web/src/components/Common/Forms/Form.tsx @@ -4,11 +4,11 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import {ReactNode} from 'react'; +import { ReactNode } from "react"; import styles from "./Form.module.css"; -function Form({children}: { children: ReactNode }) { - return
{children}
; +function Form({ children }: { children: ReactNode }) { + return
{children}
; } -export default Form; \ No newline at end of file +export default Form; diff --git a/web/src/components/Common/Forms/Tables.css b/web/src/components/Common/Forms/Tables.css index 211b234..c64bf29 100644 --- a/web/src/components/Common/Forms/Tables.css +++ b/web/src/components/Common/Forms/Tables.css @@ -5,72 +5,72 @@ */ .tabulator { - background-color: var(--contrast-0); - border: var(--box-border) !important; - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); - min-height: 48px; - margin: 0 auto; - min-width: var(--site-min-width); - max-width: var(--site-max-width); - padding: 0; + background-color: var(--contrast-0); + border: var(--box-border) !important; + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + min-height: 48px; + margin: 0 auto; + min-width: var(--site-min-width); + max-width: var(--site-max-width); + padding: 0; } .tabulator .tabulator-header { - border-bottom: 1px solid #ccc; - font-size: 13px; - font-weight: bold; - color: var(--contrast-100); - line-height: 18px; + border-bottom: 1px solid #ccc; + font-size: 13px; + font-weight: bold; + color: var(--contrast-100); + line-height: 18px; } .tabulator .tabulator-header .subtitle { - color: var(--contrast-80); - font-weight: normal; + color: var(--contrast-80); + font-weight: normal; } .tabulator .tabulator-header .tabulator-col { - border-right: 1px solid rgba(0, 0, 0, 0.1) !important; - vertical-align: middle !important; + border-right: 1px solid rgba(0, 0, 0, 0.1) !important; + vertical-align: middle !important; } .tabulator .tabulator-header .tabulator-col .tabulator-col-content { - padding: 6px 8px; - height: 48px; + padding: 6px 8px; + height: 48px; } .tabulator .tabulator-header .tabulator-col:last-child { - border-right: 1px solid rgba(0, 0, 0, 0.1) !important; + border-right: 1px solid rgba(0, 0, 0, 0.1) !important; } .tabulator-row .tabulator-cell { - font-family: monospace; - font-size: 12px; - line-height: 28px; - height: 28px; - text-align: right; - vertical-align: middle !important; - border-right: 1px solid rgba(0, 0, 0, 0.1) !important; - border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; - padding: 0 8px; + font-family: monospace; + font-size: 12px; + line-height: 28px; + height: 28px; + text-align: right; + vertical-align: middle !important; + border-right: 1px solid rgba(0, 0, 0, 0.1) !important; + border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; + padding: 0 8px; } .tabulator-row-even { - background-color: rgba(0, 0, 0, 0.03) !important; + background-color: rgba(0, 0, 0, 0.03) !important; } .tabulator-row-odd { - background-color: rgba(0, 0, 0, 0) !important; + background-color: rgba(0, 0, 0, 0) !important; } .tabulator-row .tabulator-cell.tabulator-editing { - border: 0; - padding: 0 4px; - background-color: #cee; + border: 0; + padding: 0 4px; + background-color: #cee; } .tabulator-row .tabulator-cell.tabulator-editing input { - font-family: monospace; - text-align: right; - font-size: 12px; -} \ No newline at end of file + font-family: monospace; + text-align: right; + font-size: 12px; +} diff --git a/web/src/components/Common/Forms/TextInputRow.tsx b/web/src/components/Common/Forms/TextInputRow.tsx index 572f5b8..6e66f36 100644 --- a/web/src/components/Common/Forms/TextInputRow.tsx +++ b/web/src/components/Common/Forms/TextInputRow.tsx @@ -7,27 +7,29 @@ import formStyles from "./Form.module.css"; import HelpButton from "../Buttons/HelpButton"; -function TextInputRow({label, unit, tooltip, currentValue, defaultValue}: { - label: string, - unit: string, - tooltip: string, - currentValue: string, - defaultValue: string, +function TextInputRow({ + label, + unit, + tooltip, + currentValue, + defaultValue, +}: { + label: string; + unit: string; + tooltip: string; + currentValue: string; + defaultValue: string; }) { - return ( -
- - - -
- ); + return ( +
+ + + +
+ ); } -export default TextInputRow; \ No newline at end of file +export default TextInputRow; diff --git a/web/src/components/Common/SectionHeader/SectionHeader.module.css b/web/src/components/Common/SectionHeader/SectionHeader.module.css index c57eecc..f6db351 100644 --- a/web/src/components/Common/SectionHeader/SectionHeader.module.css +++ b/web/src/components/Common/SectionHeader/SectionHeader.module.css @@ -5,20 +5,20 @@ */ .SectionHeader { - max-width: var(--site-max-width); - min-width: var(--site-min-width); - margin: 0 auto; - color: var(--contrast-100); + max-width: var(--site-max-width); + min-width: var(--site-min-width); + margin: 0 auto; + color: var(--contrast-100); } .SectionHeader h1 { - margin: 0; - padding: 0 12px; - font-size: 16px; - line-height: 64px; + margin: 0; + padding: 0 12px; + font-size: 16px; + line-height: 64px; } .SectionButtonsContainer { - float: right; - height: 64px; -} \ No newline at end of file + float: right; + height: 64px; +} diff --git a/web/src/components/Common/SectionHeader/SectionHeader.tsx b/web/src/components/Common/SectionHeader/SectionHeader.tsx index fb657f7..85027b4 100644 --- a/web/src/components/Common/SectionHeader/SectionHeader.tsx +++ b/web/src/components/Common/SectionHeader/SectionHeader.tsx @@ -5,23 +5,20 @@ */ import styles from "./SectionHeader.module.css"; -import {ReactNode} from "react"; +import { ReactNode } from "react"; interface SectionHeaderProps { - title: string, - children: ReactNode + title: string; + children?: ReactNode; } - -function SectionHeader({title, children}: SectionHeaderProps) { - return ( -
-
- {children} -
-

{title}

-
- ); +function SectionHeader({ title, children }: SectionHeaderProps) { + return ( +
+
{children}
+

{title}

+
+ ); } -export default SectionHeader; \ No newline at end of file +export default SectionHeader; diff --git a/web/src/components/Common/io.ts b/web/src/components/Common/io.ts index 58b281e..1b3278f 100644 --- a/web/src/components/Common/io.ts +++ b/web/src/components/Common/io.ts @@ -5,13 +5,13 @@ */ export function offerDownload(data: string, type: string, filename: string) { - const dataBlob = new Blob([data], {type: type}); - const url = URL.createObjectURL(dataBlob); - const link = document.createElement('a'); - link.href = url; - link.download = filename; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - URL.revokeObjectURL(url); -} \ No newline at end of file + const dataBlob = new Blob([data], { type: type }); + const url = URL.createObjectURL(dataBlob); + const link = document.createElement("a"); + link.href = url; + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); +} diff --git a/web/src/core/Validation/schema.ts b/web/src/core/Validation/schema.ts index e7d0ae7..d1d8550 100644 --- a/web/src/core/Validation/schema.ts +++ b/web/src/core/Validation/schema.ts @@ -5,362 +5,358 @@ */ export const schema = { - $schema: "http://json-schema.org/draft-07/schema#", - title: "Schema for Unit Commitment Input File", - definitions: { - Parameters: { - type: "object", - properties: { - "Version": { - type: "string", - const: "0.4", - description: "Version of UnitCommitment.jl" - }, - "Time horizon (min)": { - type: "number", - exclusiveMinimum: 0, - description: "Length of the planning horizon in minutes" - }, - "Time horizon (h)": { - type: "number", - exclusiveMinimum: 0, - description: "Length of the planning horizon in hours" - }, - "Time step (min)": { - type: "number", - default: 60, - enum: [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1], - description: "Must be a divisor of 60" - }, - "Power balance penalty ($/MW)": { - type: "number", - default: 1000.0, - minimum: 0, - description: "Penalty for system-wide shortage or surplus" - }, - "Scenario name": { - type: "string", - default: "s1", - description: "Name of the scenario" - }, - "Scenario weight": { - type: "number", - default: 1.0, - exclusiveMinimum: 0, - description: "Weight of the scenario" - } - }, - required: ["Time step (min)", "Power balance penalty ($/MW)"], - oneOf: [ - { required: ["Time horizon (min)"] }, - { required: ["Time horizon (h)"] } - ], - not: { - required: ["Time horizon (min)", "Time horizon (h)"] - } + $schema: "http://json-schema.org/draft-07/schema#", + title: "Schema for Unit Commitment Input File", + definitions: { + Parameters: { + type: "object", + properties: { + Version: { + type: "string", + const: "0.4", + description: "Version of UnitCommitment.jl", }, - Bus: { - type: "object", - additionalProperties: { - type: "object", - properties: { - "Load (MW)": { - oneOf: [ - { type: "null" }, - { type: "number" }, - { - type: "array", - items: { - oneOf: [ - { type: "number" }, - { type: "null" } - ] - } - } - ] - } - } - }, + "Time horizon (min)": { + type: "number", + exclusiveMinimum: 0, + description: "Length of the planning horizon in minutes", }, - TransmissionLines: { - type: "object", - additionalProperties: { - type: "object", - properties: { - "Source bus": { - type: "string", - minLength: 1, - }, - "Target bus": { - type: "string", - minLength: 1, - not: { - const: { $data: "1/Source bus" } - } - }, - "Susceptance (S)": { - type: "number", - minimum: 0 - }, - "Normal flow limit (MW)": { - type: "number", - minimum: 0 - }, - "Emergency flow limit (MW)": { - type: "number", - minimum: 0 - }, - "Flow limit penalty ($/MW)": { - type: "number", - minimum: 0, - default: 5000.0 - } - }, - required: ["Source bus", "Target bus", "Susceptance (S)"] - } + "Time horizon (h)": { + type: "number", + exclusiveMinimum: 0, + description: "Length of the planning horizon in hours", }, - StorageUnits: { - type: "object", - additionalProperties: { - type: "object", - properties: { - "Bus": { - type: "string", - minLength: 1, - }, - "Minimum level (MWh)": { - type: "number", - }, - "Maximum level (MWh)": { - type: "number", - minimum: 0 - }, - "Allow simultaneous charging and discharging": { - type: "boolean", - default: true - }, - "Charge cost ($/MW)": { - type: "number", - minimum: 0 - }, - "Discharge cost ($/MW)": { - type: "number", - minimum: 0 - }, - "Charge efficiency": { - type: "number", - minimum: 0, - maximum: 1 - }, - "Discharge efficiency": { - type: "number", - minimum: 0, - maximum: 1 - }, - "Loss factor": { - type: "number", - minimum: 0 - }, - "Minimum charge rate (MW)": { - type: "number", - minimum: 0 - }, - "Maximum charge rate (MW)": { - type: "number", - minimum: 0 - }, - "Minimum discharge rate (MW)": { - type: "number", - minimum: 0 - }, - "Maximum discharge rate (MW)": { - type: "number", - minimum: 0 - }, - "Initial level (MWh)": { - type: "number", - minimum: 0 - }, - "Last period minimum level (MWh)": { - type: "number", - minimum: 0 - }, - "Last period maximum level (MWh)": { - type: "number", - minimum: 0 - } - }, - required: ["Bus"] - } + "Time step (min)": { + type: "number", + default: 60, + enum: [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1], + description: "Must be a divisor of 60", }, - Generators: { - type: "object", - additionalProperties: { - type: "object", - if: { - properties: { - "Type": { const: "Thermal" } - } - }, - then: { - properties: { - "Bus": { - type: "string", - minLength: 1, - }, - "Type": { - type: "string", - const: "Thermal" - }, - "Production cost curve (MW)": { - type: "array", - items: { - type: "number", - minimum: 0 - }, - minItems: 1 - }, - "Production cost curve ($)": { - type: "array", - items: { - type: "number", - minimum: 0 - }, - minItems: 1 - }, - "Startup costs ($)": { - type: "array", - items: { - type: "number", - minimum: 0 - }, - default: [0.0] - }, - "Startup delays (h)": { - type: "array", - items: { - type: "integer", - minimum: 1 - }, - default: [1] - }, - "Minimum uptime (h)": { - type: "integer", - default: 1, - minimum: 0 - }, - "Minimum downtime (h)": { - type: "integer", - default: 1, - minimum: 0 - }, - "Ramp up limit (MW)": { - type: "number", - minimum: 0 - }, - "Ramp down limit (MW)": { - type: "number", - minimum: 0 - }, - "Startup limit (MW)": { - type: "number", - minimum: 0 - }, - "Shutdown limit (MW)": { - type: "number", - minimum: 0 - }, - "Initial status (h)": { - type: "integer", - default: 1, - not: { const: 0 } - }, - "Initial power (MW)": { - type: "number", - minimum: 0 - }, - "Must run?": { - type: "boolean", - default: false - } - }, - required: [ - "Bus", - "Type", - "Production cost curve (MW)", - "Production cost curve ($)", - "Initial status (h)", - "Initial power (MW)" - ] - }, - else: { - properties: { - "Type": { const: "Profiled" }, - "Bus": { - type: "string", - minLength: 1, - }, - "Maximum power (MW)": { - oneOf: [ - { - type: "number", - }, - { - type: "array", - items: { - type: "number", - } - } - ] - }, - "Cost ($/MW)": { - type: "number", - minimum: 0 - } - }, - required: ["Type", "Bus", "Maximum power (MW)", "Cost ($/MW)"] - - } - } + "Power balance penalty ($/MW)": { + type: "number", + default: 1000.0, + minimum: 0, + description: "Penalty for system-wide shortage or surplus", + }, + "Scenario name": { + type: "string", + default: "s1", + description: "Name of the scenario", }, - Contingencies: { - type: "object", - additionalProperties: { - type: "object", - properties: { - "Affected lines": { - type: "array", - items: { - type: "string" - }, - maxItems: 1, - minItems: 1 - } + "Scenario weight": { + type: "number", + default: 1.0, + exclusiveMinimum: 0, + description: "Weight of the scenario", + }, + }, + required: ["Time step (min)", "Power balance penalty ($/MW)"], + oneOf: [ + { required: ["Time horizon (min)"] }, + { required: ["Time horizon (h)"] }, + ], + not: { + required: ["Time horizon (min)", "Time horizon (h)"], + }, + }, + Bus: { + type: "object", + additionalProperties: { + type: "object", + properties: { + "Load (MW)": { + oneOf: [ + { type: "null" }, + { type: "number" }, + { + type: "array", + items: { + oneOf: [{ type: "number" }, { type: "null" }], }, - required: ["Affected lines"] - } - } + }, + ], + }, + }, + }, }, - type: "object", - properties: { - Parameters: { - $ref: "#/definitions/Parameters" + TransmissionLines: { + type: "object", + additionalProperties: { + type: "object", + properties: { + "Source bus": { + type: "string", + minLength: 1, + }, + "Target bus": { + type: "string", + minLength: 1, + not: { + const: { $data: "1/Source bus" }, + }, + }, + "Susceptance (S)": { + type: "number", + minimum: 0, + }, + "Normal flow limit (MW)": { + type: "number", + minimum: 0, + }, + "Emergency flow limit (MW)": { + type: "number", + minimum: 0, + }, + "Flow limit penalty ($/MW)": { + type: "number", + minimum: 0, + default: 5000.0, + }, }, - Buses: { - $ref: "#/definitions/Bus" + required: ["Source bus", "Target bus", "Susceptance (S)"], + }, + }, + StorageUnits: { + type: "object", + additionalProperties: { + type: "object", + properties: { + Bus: { + type: "string", + minLength: 1, + }, + "Minimum level (MWh)": { + type: "number", + }, + "Maximum level (MWh)": { + type: "number", + minimum: 0, + }, + "Allow simultaneous charging and discharging": { + type: "boolean", + default: true, + }, + "Charge cost ($/MW)": { + type: "number", + minimum: 0, + }, + "Discharge cost ($/MW)": { + type: "number", + minimum: 0, + }, + "Charge efficiency": { + type: "number", + minimum: 0, + maximum: 1, + }, + "Discharge efficiency": { + type: "number", + minimum: 0, + maximum: 1, + }, + "Loss factor": { + type: "number", + minimum: 0, + }, + "Minimum charge rate (MW)": { + type: "number", + minimum: 0, + }, + "Maximum charge rate (MW)": { + type: "number", + minimum: 0, + }, + "Minimum discharge rate (MW)": { + type: "number", + minimum: 0, + }, + "Maximum discharge rate (MW)": { + type: "number", + minimum: 0, + }, + "Initial level (MWh)": { + type: "number", + minimum: 0, + }, + "Last period minimum level (MWh)": { + type: "number", + minimum: 0, + }, + "Last period maximum level (MWh)": { + type: "number", + minimum: 0, + }, }, - "Transmission lines": { - $ref: "#/definitions/TransmissionLines" + required: ["Bus"], + }, + }, + Generators: { + type: "object", + additionalProperties: { + type: "object", + if: { + properties: { + Type: { const: "Thermal" }, + }, }, - "Storage units": { - $ref: "#/definitions/StorageUnits" + then: { + properties: { + Bus: { + type: "string", + minLength: 1, + }, + Type: { + type: "string", + const: "Thermal", + }, + "Production cost curve (MW)": { + type: "array", + items: { + type: "number", + minimum: 0, + }, + minItems: 1, + }, + "Production cost curve ($)": { + type: "array", + items: { + type: "number", + minimum: 0, + }, + minItems: 1, + }, + "Startup costs ($)": { + type: "array", + items: { + type: "number", + minimum: 0, + }, + default: [0.0], + }, + "Startup delays (h)": { + type: "array", + items: { + type: "integer", + minimum: 1, + }, + default: [1], + }, + "Minimum uptime (h)": { + type: "integer", + default: 1, + minimum: 0, + }, + "Minimum downtime (h)": { + type: "integer", + default: 1, + minimum: 0, + }, + "Ramp up limit (MW)": { + type: "number", + minimum: 0, + }, + "Ramp down limit (MW)": { + type: "number", + minimum: 0, + }, + "Startup limit (MW)": { + type: "number", + minimum: 0, + }, + "Shutdown limit (MW)": { + type: "number", + minimum: 0, + }, + "Initial status (h)": { + type: "integer", + default: 1, + not: { const: 0 }, + }, + "Initial power (MW)": { + type: "number", + minimum: 0, + }, + "Must run?": { + type: "boolean", + default: false, + }, + }, + required: [ + "Bus", + "Type", + "Production cost curve (MW)", + "Production cost curve ($)", + "Initial status (h)", + "Initial power (MW)", + ], }, - "Generators": { - $ref: "#/definitions/Generators" + else: { + properties: { + Type: { const: "Profiled" }, + Bus: { + type: "string", + minLength: 1, + }, + "Maximum power (MW)": { + oneOf: [ + { + type: "number", + }, + { + type: "array", + items: { + type: "number", + }, + }, + ], + }, + "Cost ($/MW)": { + type: "number", + minimum: 0, + }, + }, + required: ["Type", "Bus", "Maximum power (MW)", "Cost ($/MW)"], }, - "Contingencies": { - $ref: "#/definitions/Contingencies" - } + }, + }, + Contingencies: { + type: "object", + additionalProperties: { + type: "object", + properties: { + "Affected lines": { + type: "array", + items: { + type: "string", + }, + maxItems: 1, + minItems: 1, + }, + }, + required: ["Affected lines"], + }, + }, + }, + type: "object", + properties: { + Parameters: { + $ref: "#/definitions/Parameters", + }, + Buses: { + $ref: "#/definitions/Bus", + }, + "Transmission lines": { + $ref: "#/definitions/TransmissionLines", + }, + "Storage units": { + $ref: "#/definitions/StorageUnits", + }, + Generators: { + $ref: "#/definitions/Generators", + }, + Contingencies: { + $ref: "#/definitions/Contingencies", }, - required: ["Parameters"], -}; \ No newline at end of file + }, + required: ["Parameters"], +}; diff --git a/web/src/core/Validation/validate.ts b/web/src/core/Validation/validate.ts index 377d30a..89e5f69 100644 --- a/web/src/core/Validation/validate.ts +++ b/web/src/core/Validation/validate.ts @@ -4,14 +4,18 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import { schema } from './schema'; +import { schema } from "./schema"; import Ajv from "ajv"; // Create Ajv instance with detailed debug options const ajv = new Ajv({ - verbose: true, - allErrors: true, - $data: true, + verbose: true, + allErrors: true, + $data: true, }); +export interface ValidationError { + message: string; +} + export const validate = ajv.compile(schema); diff --git a/web/src/core/data.tsx b/web/src/core/data.tsx index 6d78fcb..4c27387 100644 --- a/web/src/core/data.tsx +++ b/web/src/core/data.tsx @@ -5,196 +5,76 @@ */ export interface Buses { - [busName: string]: { "Load (MW)": number[] }; + [busName: string]: { "Load (MW)": number[] }; } export interface UnitCommitmentScenario { - Parameters: { - Version: string, - "Power balance penalty ($/MW)": number, - "Time horizon (h)": number, - "Time step (min)": number, - }, - Buses: Buses + Parameters: { + Version: string; + "Power balance penalty ($/MW)": number; + "Time horizon (h)": number; + "Time step (min)": number; + }; + Buses: Buses; } export const BLANK_SCENARIO: UnitCommitmentScenario = { - "Parameters": { - "Version": "0.4", - "Power balance penalty ($/MW)": 1000.0, - "Time horizon (h)": 24, - "Time step (min)": 60, - }, - "Buses": {} + Parameters: { + Version: "0.4", + "Power balance penalty ($/MW)": 1000.0, + "Time horizon (h)": 24, + "Time step (min)": 60, + }, + Buses: {}, }; export const TEST_SCENARIO: UnitCommitmentScenario = { - "Parameters": { - "Version": "0.4", - "Power balance penalty ($/MW)": 1000.0, - "Time horizon (h)": 36, - "Time step (min)": 60, + Parameters: { + Version: "0.4", + "Power balance penalty ($/MW)": 1000.0, + "Time horizon (h)": 36, + "Time step (min)": 60, + }, + Buses: { + b1: { + "Load (MW)": [ + 35.79534, 34.38835, 33.45083, 32.89729, 33.25044, 33.93851, 35.8654, + 37.27098, 38.08378, 38.99327, 38.65134, 38.83212, 37.60031, 37.27939, + 37.11823, 37.73063, 40.951, 44.77115, 43.67527, 44.40959, 44.33812, + 42.29071, 40.07654, 37.42093, 35.61175, 34.28185, 32.74174, 33.17336, + 33.5181, 35.63558, 38.12722, 39.61689, 40.80105, 42.55277, 42.76017, + 42.12535, + ], + }, + b2: { + "Load (MW)": [ + 14.03739, 13.48563, 13.11797, 12.9009, 13.03939, 13.30922, 14.06486, + 14.61607, 14.93482, 15.29148, 15.15739, 15.22828, 14.74522, 14.61937, + 14.55617, 14.79633, 16.05921, 17.55731, 17.12756, 17.41553, 17.3875, + 16.58459, 15.71629, 14.67487, 13.96539, 13.44386, 12.8399, 13.00916, + 13.14435, 13.97474, 14.95185, 15.53603, 16.00041, 16.68736, 16.76869, + 16.51974, + ], + }, + b3: { + "Load (MW)": [ + 27.3729, 26.29698, 25.58005, 25.15675, 25.4268, 25.95298, 27.42649, + 28.50134, 29.12289, 29.81839, 29.55691, 29.69515, 28.75318, 28.50777, + 28.38453, 28.85284, 31.31547, 34.23676, 33.39874, 33.96028, 33.90562, + 32.33996, 30.64676, 28.61601, 27.23252, 26.21553, 25.0378, 25.36786, + 25.63149, 27.25074, 29.15611, 30.29527, 31.2008, 32.54035, 32.69895, + 32.2135, + ], + }, + b4: { + "Load (MW)": [ + 27.3729, 26.29698, 25.58005, 25.15675, 25.4268, 25.95298, 27.42649, + 28.50134, 29.12289, 29.81839, 29.55691, 29.69515, 28.75318, 28.50777, + 28.38453, 28.85284, 31.31547, 34.23676, 33.39874, 33.96028, 33.90562, + 32.33996, 30.64676, 28.61601, 27.23252, 26.21553, 25.0378, 25.36786, + 25.63149, 27.25074, 29.15611, 30.29527, 31.2008, 32.54035, 32.69895, + 32.2135, + ], }, - "Buses": { - "b1": { - "Load (MW)": [ - 35.79534, - 34.38835, - 33.45083, - 32.89729, - 33.25044, - 33.93851, - 35.8654, - 37.27098, - 38.08378, - 38.99327, - 38.65134, - 38.83212, - 37.60031, - 37.27939, - 37.11823, - 37.73063, - 40.951, - 44.77115, - 43.67527, - 44.40959, - 44.33812, - 42.29071, - 40.07654, - 37.42093, - 35.61175, - 34.28185, - 32.74174, - 33.17336, - 33.5181, - 35.63558, - 38.12722, - 39.61689, - 40.80105, - 42.55277, - 42.76017, - 42.12535 - ] - }, - "b2": { - "Load (MW)": [ - 14.03739, - 13.48563, - 13.11797, - 12.9009, - 13.03939, - 13.30922, - 14.06486, - 14.61607, - 14.93482, - 15.29148, - 15.15739, - 15.22828, - 14.74522, - 14.61937, - 14.55617, - 14.79633, - 16.05921, - 17.55731, - 17.12756, - 17.41553, - 17.3875, - 16.58459, - 15.71629, - 14.67487, - 13.96539, - 13.44386, - 12.8399, - 13.00916, - 13.14435, - 13.97474, - 14.95185, - 15.53603, - 16.00041, - 16.68736, - 16.76869, - 16.51974 - ] - }, - "b3": { - "Load (MW)": [ - 27.3729, - 26.29698, - 25.58005, - 25.15675, - 25.4268, - 25.95298, - 27.42649, - 28.50134, - 29.12289, - 29.81839, - 29.55691, - 29.69515, - 28.75318, - 28.50777, - 28.38453, - 28.85284, - 31.31547, - 34.23676, - 33.39874, - 33.96028, - 33.90562, - 32.33996, - 30.64676, - 28.61601, - 27.23252, - 26.21553, - 25.0378, - 25.36786, - 25.63149, - 27.25074, - 29.15611, - 30.29527, - 31.2008, - 32.54035, - 32.69895, - 32.2135 - ] - }, - "b4": { - "Load (MW)": [ - 27.3729, - 26.29698, - 25.58005, - 25.15675, - 25.4268, - 25.95298, - 27.42649, - 28.50134, - 29.12289, - 29.81839, - 29.55691, - 29.69515, - 28.75318, - 28.50777, - 28.38453, - 28.85284, - 31.31547, - 34.23676, - 33.39874, - 33.96028, - 33.90562, - 32.33996, - 30.64676, - 28.61601, - 27.23252, - 26.21553, - 25.0378, - 25.36786, - 25.63149, - 27.25074, - 29.15611, - 30.29527, - 31.2008, - 32.54035, - 32.69895, - 32.2135 - ] - }, - } + }, }; diff --git a/web/src/index.tsx b/web/src/index.tsx index 66d8e0e..0eea569 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -4,19 +4,19 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import reportWebVitals from './reportWebVitals'; +import React from "react"; +import ReactDOM from "react-dom/client"; +import reportWebVitals from "./reportWebVitals"; import CaseBuilder from "./components/CaseBuilder/CaseBuilder"; const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement + document.getElementById("root") as HTMLElement, ); root.render( - - - + + + , ); reportWebVitals(); diff --git a/web/src/reportWebVitals.ts b/web/src/reportWebVitals.ts index 65131bb..65a93b7 100644 --- a/web/src/reportWebVitals.ts +++ b/web/src/reportWebVitals.ts @@ -4,18 +4,18 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import {ReportHandler} from 'web-vitals'; +import { ReportHandler } from "web-vitals"; const reportWebVitals = (onPerfEntry?: ReportHandler) => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({getCLS, getFID, getFCP, getLCP, getTTFB}) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } + if (onPerfEntry && onPerfEntry instanceof Function) { + import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } }; export default reportWebVitals; diff --git a/web/src/setupTests.ts b/web/src/setupTests.ts index fcbba6b..ef0badf 100644 --- a/web/src/setupTests.ts +++ b/web/src/setupTests.ts @@ -4,4 +4,4 @@ * Released under the modified BSD license. See COPYING.md for more details. */ -import '@testing-library/jest-dom'; +import "@testing-library/jest-dom"; diff --git a/web/tsconfig.json b/web/tsconfig.json index ac7400b..a5a6cae 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": false, "allowSyntheticDefaultImports": true, "alwaysStrict": true, @@ -35,7 +31,5 @@ "noUnusedParameters": false, "checkJs": true }, - "include": [ - "src" - ] + "include": ["src"] }