From 25ef9a64ed8024b5cc5a692d7d7186bfa8cb73fb Mon Sep 17 00:00:00 2001 From: Thiago Dallacqua Date: Thu, 2 Feb 2023 14:03:20 -0300 Subject: [PATCH 01/27] feat: made first config into compiling work --- webui/react/index.html | 33 + webui/react/package-lock.json | 1260 +++++++++++++++++++--- webui/react/package.json | 5 +- webui/react/src/shared/utils/datetime.ts | 5 +- webui/react/src/shared/utils/dom.ts | 2 +- webui/react/src/vite-env.d.ts | 1 + webui/react/vite.config.ts | 29 + 7 files changed, 1205 insertions(+), 130 deletions(-) create mode 100644 webui/react/index.html create mode 100644 webui/react/src/vite-env.d.ts create mode 100644 webui/react/vite.config.ts diff --git a/webui/react/index.html b/webui/react/index.html new file mode 100644 index 00000000000..0a58f3a73aa --- /dev/null +++ b/webui/react/index.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + Determined + + + + +
+ + + + + diff --git a/webui/react/package-lock.json b/webui/react/package-lock.json index a566075c7de..7e42284181b 100644 --- a/webui/react/package-lock.json +++ b/webui/react/package-lock.json @@ -75,6 +75,7 @@ "@types/webpack": "^5.28.0", "@typescript-eslint/eslint-plugin": "^5.48.0", "@typescript-eslint/parser": "^5.48.0", + "@vitejs/plugin-react": "^3.1.0", "browserslist": "^4.21.4", "craco-sass-resources-loader": "^1.1.0", "csp-html-webpack-plugin": "^5.1.0", @@ -110,7 +111,9 @@ "stylelint-scss": "^3.18.0", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", - "typescript": "^4.8.4" + "typescript": "^4.8.4", + "vite": "^4.1.1", + "vite-tsconfig-paths": "^4.0.5" }, "engines": { "node": ">=16.13 <17", @@ -123,6 +126,32 @@ "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", "dev": true }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@ant-design/colors": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", @@ -201,9 +230,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -256,12 +285,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", "dev": true, "dependencies": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -291,14 +320,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -308,6 +338,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "dev": true, @@ -316,6 +355,12 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", @@ -442,19 +487,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -508,12 +553,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -540,18 +585,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -578,14 +623,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -606,9 +651,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1353,22 +1398,30 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1677,33 +1730,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1712,13 +1765,13 @@ } }, "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1909,6 +1962,358 @@ "node": "^14 || ^16 || ^17 || ^18 || ^19" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -5314,6 +5719,85 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.9.0", "dev": true, @@ -9759,6 +10243,43 @@ "ext": "^1.1.2" } }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, "node_modules/escalade": { "version": "3.1.1", "dev": true, @@ -12044,6 +12565,12 @@ "dev": true, "license": "MIT" }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/gonzales-pe": { "version": "4.3.0", "dev": true, @@ -15919,9 +16446,9 @@ "license": "MIT" }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -24891,6 +25418,27 @@ } } }, + "node_modules/tsconfck": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.2.tgz", + "integrity": "sha512-H3DWlwKpow+GpVLm/2cpmok72pwRr1YFROV3YzAmvzfGFiC1zEM/mc9b7+1XnrxuXtEbhJ7xUSIqjPFbedp7aQ==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18", + "pnpm": "^7.18.0" + }, + "peerDependencies": { + "typescript": "^4.3.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -25620,6 +26168,115 @@ "node": ">=4" } }, + "node_modules/vite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", + "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", + "dev": true, + "dependencies": { + "esbuild": "^0.16.14", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.10.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.5.tgz", + "integrity": "sha512-/L/eHwySFYjwxoYt1WRJniuK/jPv+WGwgRGBYx3leciR5wBeqntQpUE6Js6+TJemChc+ter7fDBKieyEWDx4yQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.0.1" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.1.tgz", + "integrity": "sha512-t9elERrz2i4UU9z7AwISj3CQcXP39cWxgRWLdf4Tm6aKm1eYrqHIgjzXBgb67GNY1sZckTFFi0oMozh3/S++Ig==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite/node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "dev": true, @@ -27557,6 +28214,28 @@ "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", "dev": true }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@ant-design/colors": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", @@ -27618,9 +28297,9 @@ } }, "@babel/compat-data": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.0.tgz", - "integrity": "sha512-y5rqgTTPTmaF5e2nVhOxw+Ur9HDJLsWb6U/KpgUzRZEdPfE6VOubXBKLdbcUTijzRptednSBDQbYZBOSqJxpJw==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", "dev": true }, "@babel/core": { @@ -27656,12 +28335,12 @@ } }, "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", "dev": true, "requires": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } @@ -27684,20 +28363,36 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.0.tgz", - "integrity": "sha512-Ai5bNWXIvwDvWM7njqsG3feMlL9hCVQsPYXodsZyLwshYkZVJt59Gftau4VrE8S9IT9asd2uSP1hG6wCNw+sXA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { "version": "6.3.0", "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -27795,19 +28490,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" } }, "@babel/helper-optimise-call-expression": { @@ -27848,12 +28543,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -27873,15 +28568,15 @@ } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/helper-validator-option": { @@ -27901,14 +28596,14 @@ } }, "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" } }, "@babel/highlight": { @@ -27923,9 +28618,9 @@ } }, "@babel/parser": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz", - "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { @@ -28411,17 +29106,21 @@ } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-react-pure-annotations": { @@ -28653,42 +29352,42 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.0.tgz", - "integrity": "sha512-4pKpFRDh+utd2mbRC8JLnlsMUii3PMHjpL6a0SZ4NMZy7YFP9aXORxEhdMVOc9CpWtDF09IkciQLEhK7Ml7gRA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.0", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -28822,6 +29521,160 @@ "jsdoc-type-pratt-parser": "~3.1.0" } }, + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -31197,6 +32050,65 @@ "eslint-visitor-keys": "^2.0.0" } }, + "@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "requires": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + } + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "dev": true, @@ -34424,6 +35336,36 @@ "ext": "^1.1.2" } }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, "escalade": { "version": "3.1.1", "dev": true @@ -36002,6 +36944,12 @@ "version": "0.1.4", "dev": true }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "gonzales-pe": { "version": "4.3.0", "dev": true, @@ -38573,9 +39521,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonfile": { @@ -44737,6 +45685,12 @@ "version": "1.2.0", "dev": true }, + "tsconfck": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.2.tgz", + "integrity": "sha512-H3DWlwKpow+GpVLm/2cpmok72pwRr1YFROV3YzAmvzfGFiC1zEM/mc9b7+1XnrxuXtEbhJ7xUSIqjPFbedp7aQ==", + "dev": true + }, "tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -45213,6 +46167,58 @@ "unist-util-stringify-position": "^2.0.0" } }, + "vite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", + "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", + "dev": true, + "requires": { + "esbuild": "^0.16.14", + "fsevents": "~2.3.2", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.10.0" + }, + "dependencies": { + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "rollup": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.1.tgz", + "integrity": "sha512-t9elERrz2i4UU9z7AwISj3CQcXP39cWxgRWLdf4Tm6aKm1eYrqHIgjzXBgb67GNY1sZckTFFi0oMozh3/S++Ig==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + } + } + }, + "vite-tsconfig-paths": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.5.tgz", + "integrity": "sha512-/L/eHwySFYjwxoYt1WRJniuK/jPv+WGwgRGBYx3leciR5wBeqntQpUE6Js6+TJemChc+ter7fDBKieyEWDx4yQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.0.1" + } + }, "vm-browserify": { "version": "1.1.2", "dev": true diff --git a/webui/react/package.json b/webui/react/package.json index c6e15b4b941..312ac54d70b 100644 --- a/webui/react/package.json +++ b/webui/react/package.json @@ -109,6 +109,7 @@ "@types/webpack": "^5.28.0", "@typescript-eslint/eslint-plugin": "^5.48.0", "@typescript-eslint/parser": "^5.48.0", + "@vitejs/plugin-react": "^3.1.0", "browserslist": "^4.21.4", "craco-sass-resources-loader": "^1.1.0", "csp-html-webpack-plugin": "^5.1.0", @@ -144,7 +145,9 @@ "stylelint-scss": "^3.18.0", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", - "typescript": "^4.8.4" + "typescript": "^4.8.4", + "vite": "^4.1.1", + "vite-tsconfig-paths": "^4.0.5" }, "jest": { "coveragePathIgnorePatterns": [ diff --git a/webui/react/src/shared/utils/datetime.ts b/webui/react/src/shared/utils/datetime.ts index 6bf0cfd8722..8079053f7ae 100644 --- a/webui/react/src/shared/utils/datetime.ts +++ b/webui/react/src/shared/utils/datetime.ts @@ -1,12 +1,15 @@ import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; +// TODO: check types for this. +// @ts-ignore +import humanizeDuration from 'humanize-duration'; + import { StartEndTimes } from 'types'; dayjs.extend(utc); /* eslint-disable @typescript-eslint/no-var-requires */ -const humanizeDuration = require('humanize-duration'); export const DURATION_SECOND = 1000; export const DURATION_MINUTE = 60 * DURATION_SECOND; diff --git a/webui/react/src/shared/utils/dom.ts b/webui/react/src/shared/utils/dom.ts index 8f30dc21c07..eb39c7c79e2 100644 --- a/webui/react/src/shared/utils/dom.ts +++ b/webui/react/src/shared/utils/dom.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -const ansiConverter = require('ansi-to-html'); +import ansiConverter from 'ansi-to-html'; const converter = new ansiConverter({ newline: true }); export const ansiToHtml = (ansi: string): string => { diff --git a/webui/react/src/vite-env.d.ts b/webui/react/src/vite-env.d.ts new file mode 100644 index 00000000000..151aa6856ff --- /dev/null +++ b/webui/react/src/vite-env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts new file mode 100644 index 00000000000..3fc43dc687a --- /dev/null +++ b/webui/react/vite.config.ts @@ -0,0 +1,29 @@ +import fs from 'fs'; +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tsconfigPaths from 'vite-tsconfig-paths' + +// https://vitejs.dev/config/ +export default defineConfig({ + css: { + preprocessorOptions: { + scss: { + additionalData: fs.readFileSync('./src/shared/styles/global.scss'), + }, + } + }, + define: { + 'process.env.IS_DEV': JSON.stringify(process.env.DET_NODE_ENV === 'development'), + 'process.env.SERVER_ADDRESS': JSON.stringify(process.env.SERVER_ADDRESS), + 'process.env.VERSION': '"0.19.11-dev0"', + }, + plugins: [tsconfigPaths(), react()], + resolve: { + alias: [ + { + find: 'react/jsx-runtime.js', + replacement: 'react/jsx-runtime' + } + ] + }, +}) From 1bd05c402e362988dfae7b71164a6d38ba13a6a6 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 12:46:56 -0500 Subject: [PATCH 02/27] get server and build working locally --- webui/react/.eslintignore | 1 + webui/react/Makefile | 2 +- webui/react/package-lock.json | 123 +++++++++++++----- webui/react/package.json | 10 +- webui/react/src/components/MonacoEditor.tsx | 19 ++- .../CodeViewer/IpynbRenderer.tsx | 3 +- webui/react/src/shared/utils/datetime.ts | 5 - webui/react/src/shared/utils/dom.ts | 2 +- .../src/vendor/{ => notebook}/notebook.js | 0 webui/react/src/vendor/notebook/package.json | 12 ++ webui/react/vite.config.ts | 74 +++++++++-- 11 files changed, 191 insertions(+), 60 deletions(-) rename webui/react/src/vendor/{ => notebook}/notebook.js (100%) create mode 100644 webui/react/src/vendor/notebook/package.json diff --git a/webui/react/.eslintignore b/webui/react/.eslintignore index 93010aa4067..45767b8a0fd 100644 --- a/webui/react/.eslintignore +++ b/webui/react/.eslintignore @@ -1,6 +1,7 @@ src/serviceWorker.ts src/services/api-ts-sdk/ src/vendor/notebook.js +src/vendor/notebook/notebook.js !.eslintrc.js !.stylelintrc.js node_modules diff --git a/webui/react/Makefile b/webui/react/Makefile index 3e7c9ec6645..713094ad4bf 100644 --- a/webui/react/Makefile +++ b/webui/react/Makefile @@ -22,7 +22,7 @@ get-deps: check-requirements node_modules/done.stamp .PHONY: build build: check-requirements build/done.stamp -build/done.stamp: $(source_files) node_modules/done.stamp tsconfig.json craco.config.js jest.config.js +build/done.stamp: $(source_files) node_modules/done.stamp tsconfig.json craco.config.js jest.config.js vite.config.ts npm run build touch $@ diff --git a/webui/react/package-lock.json b/webui/react/package-lock.json index 7e42284181b..30998c1164c 100644 --- a/webui/react/package-lock.json +++ b/webui/react/package-lock.json @@ -9,12 +9,10 @@ "version": "1.0.0", "dependencies": { "@determined-ai/hermes-parallel-coordinates": "^0.6.1", - "ansi_up": "^5.1.0", "ansi-to-html": "^0.7.1", "antd": "^5.1.7", "dayjs": "^1.10.7", "debug": "^4.3.4", - "dompurify": "^2.4.0", "fp-ts": "^2.11.2", "fuse.js": "^6.4.6", "history": "^5.3.0", @@ -24,8 +22,8 @@ "js-sha512": "^0.8.0", "js-yaml": "^4.1.0", "markdown-to-jsx": "^7.1.3", - "marked": "^4.1.1", "micro-observables": "^1.7.2", + "notebook": "file:src/vendor/notebook", "omnibar": "github:hamidzr/omnibar", "path-to-regexp": "^6.2.1", "portable-fetch": "^3.0.0", @@ -57,6 +55,7 @@ "@testing-library/user-event": "^14.4.3", "@types/debug": "^4.1.7", "@types/express": "^4.17.14", + "@types/humanize-duration": "^3.27.1", "@types/jest": "^29.2.2", "@types/js-yaml": "^4.0.5", "@types/morgan": "^1.9.3", @@ -93,6 +92,7 @@ "jest-junit": "^13.0.0", "less": "^4.1.1", "less-loader": "^7.0.2", + "magic-string": "^0.27.0", "monaco-editor-webpack-plugin": "^3.0.1", "morgan": "^1.10.0", "npm-force-resolutions": "0.0.10", @@ -3466,6 +3466,15 @@ "rollup": "^1.20.0 || ^2.0.0" } }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "dev": true, @@ -3543,6 +3552,15 @@ "magic-string": "^0.25.0" } }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", "dev": true, @@ -4179,6 +4197,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/humanize-duration": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.27.1.tgz", + "integrity": "sha512-K3e+NZlpCKd6Bd/EIdqjFJRFHbrq5TzPPLwREk5Iv/YoIjQrs6ljdAUCo+Lb2xFlGNOjGSE0dqsVD19cZL137w==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "dev": true, @@ -5768,18 +5792,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@vitejs/plugin-react/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -16832,11 +16844,15 @@ } }, "node_modules/magic-string": { - "version": "0.25.7", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, - "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.4" + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/make-dir": { @@ -17893,6 +17909,10 @@ "node": ">=0.10.0" } }, + "node_modules/notebook": { + "resolved": "src/vendor/notebook", + "link": true + }, "node_modules/npm-force-resolutions": { "version": "0.0.10", "dev": true, @@ -23675,8 +23695,10 @@ }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true }, "node_modules/spdx-correct": { "version": "3.1.1", @@ -28205,6 +28227,14 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "src/vendor/notebook": { + "version": "0.7.0", + "dependencies": { + "ansi_up": "^5.1.0", + "dompurify": "^2.4.0", + "marked": "^4.1.1" + } } }, "dependencies": { @@ -30460,6 +30490,17 @@ "requires": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } } }, "@rollup/pluginutils": { @@ -30518,6 +30559,17 @@ "requires": { "ejs": "^2.6.1", "magic-string": "^0.25.0" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } } }, "@svgr/babel-plugin-add-jsx-attribute": { @@ -30927,6 +30979,12 @@ "version": "5.1.1", "dev": true }, + "@types/humanize-duration": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@types/humanize-duration/-/humanize-duration-3.27.1.tgz", + "integrity": "sha512-K3e+NZlpCKd6Bd/EIdqjFJRFHbrq5TzPPLwREk5Iv/YoIjQrs6ljdAUCo+Lb2xFlGNOjGSE0dqsVD19cZL137w==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "dev": true @@ -32086,15 +32144,6 @@ "semver": "^6.3.0" } }, - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, "react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -39778,10 +39827,12 @@ "dev": true }, "magic-string": { - "version": "0.25.7", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "@jridgewell/sourcemap-codec": "^1.4.13" } }, "make-dir": { @@ -40542,6 +40593,14 @@ } } }, + "notebook": { + "version": "file:src/vendor/notebook", + "requires": { + "ansi_up": "^5.1.0", + "dompurify": "^2.4.0", + "marked": "^4.1.1" + } + }, "npm-force-resolutions": { "version": "0.0.10", "dev": true, @@ -44515,6 +44574,8 @@ }, "sourcemap-codec": { "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "spdx-correct": { diff --git a/webui/react/package.json b/webui/react/package.json index 312ac54d70b..f4e1cc6b75f 100644 --- a/webui/react/package.json +++ b/webui/react/package.json @@ -8,8 +8,8 @@ }, "scripts": { "postshrinkwrap": "npx npm-force-resolutions && npm install --ignore-scripts", - "start": "craco start", - "build": "craco build", + "start": "vite serve", + "build": "vite build --mode=${DET_NODE_ENV:-production}", "prettier": "prettier", "eslint": "eslint", "stylelint": "stylelint --config .stylelintrc.js", @@ -31,12 +31,10 @@ }, "dependencies": { "@determined-ai/hermes-parallel-coordinates": "^0.6.1", - "ansi_up": "^5.1.0", "ansi-to-html": "^0.7.1", "antd": "^5.1.7", "dayjs": "^1.10.7", "debug": "^4.3.4", - "dompurify": "^2.4.0", "fp-ts": "^2.11.2", "fuse.js": "^6.4.6", "history": "^5.3.0", @@ -46,8 +44,8 @@ "js-sha512": "^0.8.0", "js-yaml": "^4.1.0", "markdown-to-jsx": "^7.1.3", - "marked": "^4.1.1", "micro-observables": "^1.7.2", + "notebook": "file:src/vendor/notebook", "omnibar": "github:hamidzr/omnibar", "path-to-regexp": "^6.2.1", "portable-fetch": "^3.0.0", @@ -91,6 +89,7 @@ "@testing-library/user-event": "^14.4.3", "@types/debug": "^4.1.7", "@types/express": "^4.17.14", + "@types/humanize-duration": "^3.27.1", "@types/jest": "^29.2.2", "@types/js-yaml": "^4.0.5", "@types/morgan": "^1.9.3", @@ -127,6 +126,7 @@ "jest-junit": "^13.0.0", "less": "^4.1.1", "less-loader": "^7.0.2", + "magic-string": "^0.27.0", "monaco-editor-webpack-plugin": "^3.0.1", "morgan": "^1.10.0", "npm-force-resolutions": "0.0.10", diff --git a/webui/react/src/components/MonacoEditor.tsx b/webui/react/src/components/MonacoEditor.tsx index f098ed9a11d..9bc32be39b4 100644 --- a/webui/react/src/components/MonacoEditor.tsx +++ b/webui/react/src/components/MonacoEditor.tsx @@ -1,4 +1,15 @@ -import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api'; +// monaco languages +import 'monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution'; +import 'monaco-editor/esm/vs/basic-languages/python/python.contribution'; +import 'monaco-editor/esm/vs/basic-languages/markdown/markdown.contribution'; +// monaco features +import 'monaco-editor/esm/vs/editor/contrib/codelens/codelensController'; +import 'monaco-editor/esm/vs/editor/contrib/find/findController'; +import 'monaco-editor/esm/vs/editor/contrib/parameterHints/parameterHints'; +import 'monaco-editor/esm/vs/editor/contrib/suggest/suggestController'; +import 'monaco-editor/esm/vs/editor/contrib/wordHighlighter/wordHighlighter'; +import 'monaco-editor/esm/vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess'; +import type * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api'; import React, { useCallback, useEffect, useRef } from 'react'; import ReactMonacoEditor, { MonacoEditorProps } from 'react-monaco-editor'; @@ -8,6 +19,12 @@ import { DarkLight } from 'shared/themes'; import css from './MonacoEditor.module.scss'; +/** + * NOTE: non-basic modes like diffs might need manual loading of workers. refer + * to + * https://github.com/microsoft/monaco-editor/blob/main/docs/integrate-esm.md#using-vite + */ + const PADDING = 8; const MonacoEditor: React.FC = ({ diff --git a/webui/react/src/pages/ExperimentDetails/CodeViewer/IpynbRenderer.tsx b/webui/react/src/pages/ExperimentDetails/CodeViewer/IpynbRenderer.tsx index 559e8c667ab..2cf73e71472 100644 --- a/webui/react/src/pages/ExperimentDetails/CodeViewer/IpynbRenderer.tsx +++ b/webui/react/src/pages/ExperimentDetails/CodeViewer/IpynbRenderer.tsx @@ -1,7 +1,6 @@ +import NotebookJS from 'notebook'; import React from 'react'; -import NotebookJS from 'vendor/notebook'; - import 'vendor/monokai.css'; interface Props { diff --git a/webui/react/src/shared/utils/datetime.ts b/webui/react/src/shared/utils/datetime.ts index 8079053f7ae..74133e6762c 100644 --- a/webui/react/src/shared/utils/datetime.ts +++ b/webui/react/src/shared/utils/datetime.ts @@ -1,16 +1,11 @@ import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; - -// TODO: check types for this. -// @ts-ignore import humanizeDuration from 'humanize-duration'; import { StartEndTimes } from 'types'; dayjs.extend(utc); -/* eslint-disable @typescript-eslint/no-var-requires */ - export const DURATION_SECOND = 1000; export const DURATION_MINUTE = 60 * DURATION_SECOND; export const DURATION_HOUR = 60 * DURATION_MINUTE; diff --git a/webui/react/src/shared/utils/dom.ts b/webui/react/src/shared/utils/dom.ts index eb39c7c79e2..9d23ceead00 100644 --- a/webui/react/src/shared/utils/dom.ts +++ b/webui/react/src/shared/utils/dom.ts @@ -1,5 +1,5 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ import ansiConverter from 'ansi-to-html'; + const converter = new ansiConverter({ newline: true }); export const ansiToHtml = (ansi: string): string => { diff --git a/webui/react/src/vendor/notebook.js b/webui/react/src/vendor/notebook/notebook.js similarity index 100% rename from webui/react/src/vendor/notebook.js rename to webui/react/src/vendor/notebook/notebook.js diff --git a/webui/react/src/vendor/notebook/package.json b/webui/react/src/vendor/notebook/package.json new file mode 100644 index 00000000000..2ba241b7d84 --- /dev/null +++ b/webui/react/src/vendor/notebook/package.json @@ -0,0 +1,12 @@ +{ + "name": "notebook", + "description": "in-browser support for ipython notebooks", + "version": "0.7.0", + "author": "jsvine", + "main": "notebook.js", + "dependencies": { + "marked": "^4.1.1", + "ansi_up": "^5.1.0", + "dompurify": "^2.4.0" + } +} diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts index 3fc43dc687a..37533261193 100644 --- a/webui/react/vite.config.ts +++ b/webui/react/vite.config.ts @@ -1,29 +1,75 @@ +import crypto from 'crypto'; import fs from 'fs'; -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import tsconfigPaths from 'vite-tsconfig-paths' +import path from 'path'; + +import react from '@vitejs/plugin-react'; +import MagicString from 'magic-string'; +import { defineConfig } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +// want to fallback in case of empty string, hence no ?? +const webpackProxyUrl = process.env.DET_WEBPACK_PROXY_URL || 'http://localhost:8080'; + +// https://github.com/swagger-api/swagger-codegen/issues/10027 +const portableFetchFix = () => ({ + name: 'fix-portable-fetch', + transform: (source: string, id: string) => { + if (id.endsWith('api-ts-sdk/api.ts')) { + const newSource = new MagicString(source.replace('import * as portableFetch from "portable-fetch"', 'import portableFetch from "portable-fetch"')); + return { + code: newSource.toString(), + map: newSource.generateMap(), + }; + } + }, +}); // https://vitejs.dev/config/ -export default defineConfig({ +export default defineConfig(({ mode }) => ({ + build: { + commonjsOptions: { + include: [/node_modules/, /notebook/], + }, + outDir: 'build', + sourcemap: true, + }, css: { + modules: { + generateScopedName: (name, filename) => { + const basename = path.basename(filename).split('.')[0]; + const hashable = `${basename}_${name}`; + const hash = crypto.createHash('sha256').update(filename).digest('hex').substring(0, 5); + + return `${hashable}_${hash}`; + }, + }, preprocessorOptions: { scss: { additionalData: fs.readFileSync('./src/shared/styles/global.scss'), }, - } + }, }, define: { - 'process.env.IS_DEV': JSON.stringify(process.env.DET_NODE_ENV === 'development'), + 'process.env.IS_DEV': JSON.stringify(mode === 'development'), + 'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || ''), 'process.env.SERVER_ADDRESS': JSON.stringify(process.env.SERVER_ADDRESS), 'process.env.VERSION': '"0.19.11-dev0"', }, - plugins: [tsconfigPaths(), react()], + optimizeDeps: { + include: ['notebook'], + }, + plugins: [tsconfigPaths(), react(), portableFetchFix(), cspHtml()], resolve: { - alias: [ - { - find: 'react/jsx-runtime.js', - replacement: 'react/jsx-runtime' - } - ] + alias: { + // needed for react-dnd + 'react/jsx-runtime.js': 'react/jsx-runtime', + }, + }, + server: { + open: true, + proxy: { + '/api': { target: webpackProxyUrl }, + '/proxy': { target: webpackProxyUrl }, + }, }, -}) +})); From d78d3e7921a6ef18a090fab93504835c8a9fc430 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 14:45:09 -0500 Subject: [PATCH 03/27] add csp support --- webui/react/index.html | 3 +- webui/react/package-lock.json | 1 + webui/react/package.json | 1 + .../src/shared/configs/vite-plugin-csp.ts | 60 +++++++++++++++++++ webui/react/src/vite-env.d.ts | 2 +- webui/react/vite.config.ts | 16 ++++- 6 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 webui/react/src/shared/configs/vite-plugin-csp.ts diff --git a/webui/react/index.html b/webui/react/index.html index 0a58f3a73aa..f0447f10e0e 100644 --- a/webui/react/index.html +++ b/webui/react/index.html @@ -3,7 +3,6 @@ - @@ -13,7 +12,7 @@ it is still included here in order for Safari to at least show one. https://stackoverflow.com/questions/63781987/cant-change-favicon-with-javascript-in-safari --> - + Determined diff --git a/webui/react/package-lock.json b/webui/react/package-lock.json index 30998c1164c..1c4c1dc8712 100644 --- a/webui/react/package-lock.json +++ b/webui/react/package-lock.json @@ -76,6 +76,7 @@ "@typescript-eslint/parser": "^5.48.0", "@vitejs/plugin-react": "^3.1.0", "browserslist": "^4.21.4", + "cheerio": "^1.0.0-rc.12", "craco-sass-resources-loader": "^1.1.0", "csp-html-webpack-plugin": "^5.1.0", "eslint": "^7.32.0", diff --git a/webui/react/package.json b/webui/react/package.json index f4e1cc6b75f..e8b758568a2 100644 --- a/webui/react/package.json +++ b/webui/react/package.json @@ -110,6 +110,7 @@ "@typescript-eslint/parser": "^5.48.0", "@vitejs/plugin-react": "^3.1.0", "browserslist": "^4.21.4", + "cheerio": "^1.0.0-rc.12", "craco-sass-resources-loader": "^1.1.0", "csp-html-webpack-plugin": "^5.1.0", "eslint": "^7.32.0", diff --git a/webui/react/src/shared/configs/vite-plugin-csp.ts b/webui/react/src/shared/configs/vite-plugin-csp.ts new file mode 100644 index 00000000000..148f21d583d --- /dev/null +++ b/webui/react/src/shared/configs/vite-plugin-csp.ts @@ -0,0 +1,60 @@ +import crypto from 'crypto'; + +import type { Plugin } from 'vite'; + +// incomplete list of directives +type CspHashDirective = 'script-src' | 'style-src'; +type CspDirective = 'base-uri' | 'frame-src' | 'object-src' | CspHashDirective; + +type CspRuleConfig = { + [key in CspDirective]?: string[]; +}; + +type CspHashConfig = { + [key in CspHashDirective]?: boolean; +}; + +interface CspHtmlPluginConfig { + cspRules: CspRuleConfig; + hashEnabled: CspHashConfig; +} + +export const cspHtml = ({ cspRules, hashEnabled = {} }: CspHtmlPluginConfig): Plugin => ({ + name: 'csp-html', + async transformIndexHtml(html: string) { + const finalCspRules: CspRuleConfig = { + 'base-uri': ["'self'"], + ...cspRules, + }; + const hashRules = Object.entries(hashEnabled) as [CspHashDirective, boolean][]; + if (hashRules.length) { + const cheerio = await import('cheerio'); + const $ = cheerio.load(html); + hashRules.forEach(([directive, enabled]: [CspHashDirective, boolean]) => { + if (!enabled) return; + const [tag] = directive.split('-'); + $(tag).each((_, el) => { + const source = $(el).html(); + if (source) { + const hash = crypto.createHash('sha256').update(source).digest('base64'); + finalCspRules[directive] = (finalCspRules[directive] || []).concat([ + `'sha256-${hash}'`, + ]); + } + }); + }); + } + const content = Object.entries(finalCspRules) + .map(([directive, sources]) => `${directive} ${sources.join(' ')}`) + .join('; '); + return [ + { + attrs: { + content, + 'http-equiv': 'Content-Security-Policy', + }, + tag: 'meta', + }, + ]; + }, +}); diff --git a/webui/react/src/vite-env.d.ts b/webui/react/src/vite-env.d.ts index 151aa6856ff..11f02fe2a00 100644 --- a/webui/react/src/vite-env.d.ts +++ b/webui/react/src/vite-env.d.ts @@ -1 +1 @@ -/// \ No newline at end of file +/// diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts index 37533261193..226a63ca6f9 100644 --- a/webui/react/vite.config.ts +++ b/webui/react/vite.config.ts @@ -7,6 +7,8 @@ import MagicString from 'magic-string'; import { defineConfig } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; +import { cspHtml } from './src/shared/configs/vite-plugin-csp'; + // want to fallback in case of empty string, hence no ?? const webpackProxyUrl = process.env.DET_WEBPACK_PROXY_URL || 'http://localhost:8080'; @@ -26,6 +28,7 @@ const portableFetchFix = () => ({ // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ + base: process.env.PUBLIC_URL || '', build: { commonjsOptions: { include: [/node_modules/, /notebook/], @@ -58,7 +61,18 @@ export default defineConfig(({ mode }) => ({ optimizeDeps: { include: ['notebook'], }, - plugins: [tsconfigPaths(), react(), portableFetchFix(), cspHtml()], + plugins: [tsconfigPaths(), react(), portableFetchFix(), cspHtml({ + cspRules: { + 'frame-src': ["'self'", 'netlify.determined.ai'], + 'object-src': ["'none'"], + 'script-src': ["'self'", 'cdn.segment.com'], + 'style-src': ["'self'", "'unsafe-inline'"], + }, + hashEnabled: { + 'script-src': true, + 'style-src': false, + }, + })], resolve: { alias: { // needed for react-dnd From 9400322b212efee54f209a09fc24ebf85af99658 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 15:23:50 -0500 Subject: [PATCH 04/27] remove old index --- webui/react/public/index.html | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 webui/react/public/index.html diff --git a/webui/react/public/index.html b/webui/react/public/index.html deleted file mode 100644 index 9afb5b85b9e..00000000000 --- a/webui/react/public/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - Determined - - - - -
- - - - From 94a7189b7783960a2336fd2b873e4bac361baaec Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 16:14:12 -0500 Subject: [PATCH 05/27] check types on build --- webui/react/package.json | 2 +- webui/react/src/shared/configs/tsconfig.json | 2 +- webui/react/src/utils/experiment.test.ts | 1 + webui/react/src/utils/task.test.ts | 1 + webui/react/src/utils/wait.test.ts | 3 +++ webui/react/src/vendor/notebook.js | 0 webui/react/typings/notebook.d.ts | 3 +++ 7 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 webui/react/src/vendor/notebook.js create mode 100644 webui/react/typings/notebook.d.ts diff --git a/webui/react/package.json b/webui/react/package.json index e8b758568a2..3ca544c7d20 100644 --- a/webui/react/package.json +++ b/webui/react/package.json @@ -9,7 +9,7 @@ "scripts": { "postshrinkwrap": "npx npm-force-resolutions && npm install --ignore-scripts", "start": "vite serve", - "build": "vite build --mode=${DET_NODE_ENV:-production}", + "build": "tsc & vite build --mode=${DET_NODE_ENV:-production}", "prettier": "prettier", "eslint": "eslint", "stylelint": "stylelint --config .stylelintrc.js", diff --git a/webui/react/src/shared/configs/tsconfig.json b/webui/react/src/shared/configs/tsconfig.json index b75b896878b..b62d38eb481 100644 --- a/webui/react/src/shared/configs/tsconfig.json +++ b/webui/react/src/shared/configs/tsconfig.json @@ -3,7 +3,7 @@ "target": "es2020", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": false, - "skipLibCheck": false, + "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, diff --git a/webui/react/src/utils/experiment.test.ts b/webui/react/src/utils/experiment.test.ts index 84348a2981a..be901f443ae 100644 --- a/webui/react/src/utils/experiment.test.ts +++ b/webui/react/src/utils/experiment.test.ts @@ -35,6 +35,7 @@ describe('Experiment Utilities', () => { state: Type.CommandState.Queued, type: Type.CommandType.Command, userId: 345, + workspaceId: 0, }; expect(utils.isExperiment(commandTask)).toBe(false); }); diff --git a/webui/react/src/utils/task.test.ts b/webui/react/src/utils/task.test.ts index e173e8c2f80..2be9fe0c845 100644 --- a/webui/react/src/utils/task.test.ts +++ b/webui/react/src/utils/task.test.ts @@ -20,6 +20,7 @@ const SampleCommandTask: CommandTask = { state: 'PENDING' as CommandState, type: 'COMMAND' as CommandType, userId: 345, + workspaceId: 0, }; describe('isExperimentTask', () => { diff --git a/webui/react/src/utils/wait.test.ts b/webui/react/src/utils/wait.test.ts index 26cc56370f3..582ae6f7845 100644 --- a/webui/react/src/utils/wait.test.ts +++ b/webui/react/src/utils/wait.test.ts @@ -26,6 +26,7 @@ const COMMAND_TASK: Record = { state: CommandState.Queued, type: CommandType.JupyterLab, userId: 34, + workspaceId: 0, }, [CommandType.Shell]: { ...SHARED_TASK, @@ -38,6 +39,7 @@ const COMMAND_TASK: Record = { state: CommandState.Terminated, type: CommandType.Shell, userId: 34, + workspaceId: 0, }, [CommandType.TensorBoard]: { ...SHARED_TASK, @@ -50,6 +52,7 @@ const COMMAND_TASK: Record = { state: CommandState.Running, type: CommandType.TensorBoard, userId: 16, + workspaceId: 0, }, }; diff --git a/webui/react/src/vendor/notebook.js b/webui/react/src/vendor/notebook.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/webui/react/typings/notebook.d.ts b/webui/react/typings/notebook.d.ts new file mode 100644 index 00000000000..df03185fd0f --- /dev/null +++ b/webui/react/typings/notebook.d.ts @@ -0,0 +1,3 @@ +declare module 'notebook' { + export default any; +} From d81019fec22da1a3115173d5425864092a79aeb8 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 16:40:19 -0500 Subject: [PATCH 06/27] prevent out of memory error? --- webui/react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/react/package.json b/webui/react/package.json index 3ca544c7d20..7b3d3ec3720 100644 --- a/webui/react/package.json +++ b/webui/react/package.json @@ -9,7 +9,7 @@ "scripts": { "postshrinkwrap": "npx npm-force-resolutions && npm install --ignore-scripts", "start": "vite serve", - "build": "tsc & vite build --mode=${DET_NODE_ENV:-production}", + "build": "tsc; vite build --mode=${DET_NODE_ENV:-production}", "prettier": "prettier", "eslint": "eslint", "stylelint": "stylelint --config .stylelintrc.js", From 4df1c8797aac10e6b6f1ff353f5721ffd96ebdff Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 17:36:50 -0500 Subject: [PATCH 07/27] fix memory leak --- webui/react/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts index 226a63ca6f9..220b18c3957 100644 --- a/webui/react/vite.config.ts +++ b/webui/react/vite.config.ts @@ -28,7 +28,7 @@ const portableFetchFix = () => ({ // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ - base: process.env.PUBLIC_URL || '', + base: process.env.PUBLIC_URL, build: { commonjsOptions: { include: [/node_modules/, /notebook/], From 8a1cbc3cb60b076daf30115812c1c16dd10e4f29 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 17:50:57 -0500 Subject: [PATCH 08/27] give node more memory --- webui/react/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/webui/react/Makefile b/webui/react/Makefile index 713094ad4bf..8fafaf5763c 100644 --- a/webui/react/Makefile +++ b/webui/react/Makefile @@ -1,6 +1,7 @@ # Set the path React is going to be served from eg ./ for serving from root. export PUBLIC_URL ?= /det export ESLINT_NO_DEV_ERRORS ?= true +export NODE_OPTIONS=--max-old-space-size=6144 source_files := $(shell find src public -type f) .PHONY: default From e2335c1a14aa6590a2f991e3bdc2aae567650967 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Fri, 3 Feb 2023 18:05:28 -0500 Subject: [PATCH 09/27] try applying it here for netlify? --- webui/react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/react/package.json b/webui/react/package.json index 7b3d3ec3720..bd8b964421b 100644 --- a/webui/react/package.json +++ b/webui/react/package.json @@ -9,7 +9,7 @@ "scripts": { "postshrinkwrap": "npx npm-force-resolutions && npm install --ignore-scripts", "start": "vite serve", - "build": "tsc; vite build --mode=${DET_NODE_ENV:-production}", + "build": "tsc; NODE_OPTIONS=--max-old-space-size=6144 vite build --mode=${DET_NODE_ENV:-production}", "prettier": "prettier", "eslint": "eslint", "stylelint": "stylelint --config .stylelintrc.js", From f6d10b6b1b8bf27f2dae253bda5b24cdda9bf00c Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Mon, 6 Feb 2023 10:19:38 -0500 Subject: [PATCH 10/27] ensure csphtml plugin runs after all other plugins --- .../src/shared/configs/vite-plugin-csp.ts | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/webui/react/src/shared/configs/vite-plugin-csp.ts b/webui/react/src/shared/configs/vite-plugin-csp.ts index 148f21d583d..aaab413c983 100644 --- a/webui/react/src/shared/configs/vite-plugin-csp.ts +++ b/webui/react/src/shared/configs/vite-plugin-csp.ts @@ -21,40 +21,43 @@ interface CspHtmlPluginConfig { export const cspHtml = ({ cspRules, hashEnabled = {} }: CspHtmlPluginConfig): Plugin => ({ name: 'csp-html', - async transformIndexHtml(html: string) { - const finalCspRules: CspRuleConfig = { - 'base-uri': ["'self'"], - ...cspRules, - }; - const hashRules = Object.entries(hashEnabled) as [CspHashDirective, boolean][]; - if (hashRules.length) { - const cheerio = await import('cheerio'); - const $ = cheerio.load(html); - hashRules.forEach(([directive, enabled]: [CspHashDirective, boolean]) => { - if (!enabled) return; - const [tag] = directive.split('-'); - $(tag).each((_, el) => { - const source = $(el).html(); - if (source) { - const hash = crypto.createHash('sha256').update(source).digest('base64'); - finalCspRules[directive] = (finalCspRules[directive] || []).concat([ - `'sha256-${hash}'`, - ]); - } + transformIndexHtml: { + async handler(html: string) { + const finalCspRules: CspRuleConfig = { + 'base-uri': ["'self'"], + ...cspRules, + }; + const hashRules = Object.entries(hashEnabled) as [CspHashDirective, boolean][]; + if (hashRules.length) { + const cheerio = await import('cheerio'); + const $ = cheerio.load(html); + hashRules.forEach(([directive, enabled]: [CspHashDirective, boolean]) => { + if (!enabled) return; + const [tag] = directive.split('-'); + $(tag).each((_, el) => { + const source = $(el).html(); + if (source) { + const hash = crypto.createHash('sha256').update(source).digest('base64'); + finalCspRules[directive] = (finalCspRules[directive] || []).concat([ + `'sha256-${hash}'`, + ]); + } + }); }); - }); - } - const content = Object.entries(finalCspRules) - .map(([directive, sources]) => `${directive} ${sources.join(' ')}`) - .join('; '); - return [ - { - attrs: { - content, - 'http-equiv': 'Content-Security-Policy', + } + const content = Object.entries(finalCspRules) + .map(([directive, sources]) => `${directive} ${sources.join(' ')}`) + .join('; '); + return [ + { + attrs: { + content, + 'http-equiv': 'Content-Security-Policy', + }, + tag: 'meta', }, - tag: 'meta', - }, - ]; + ]; + }, + order: 'post', }, }); From 2d89f5516f569c2b8d86c0bc33ca297171642028 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Mon, 6 Feb 2023 10:43:09 -0500 Subject: [PATCH 11/27] default base url to root? --- webui/react/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts index 220b18c3957..4905c35b89d 100644 --- a/webui/react/vite.config.ts +++ b/webui/react/vite.config.ts @@ -28,7 +28,7 @@ const portableFetchFix = () => ({ // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ - base: process.env.PUBLIC_URL, + base: process.env.PUBLIC_URL || '/', build: { commonjsOptions: { include: [/node_modules/, /notebook/], From 5f16c611d10875a5eeb696381c8b9b82f53b76aa Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Mon, 6 Feb 2023 10:51:28 -0500 Subject: [PATCH 12/27] undo public url change, record public url --- webui/react/vite.config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts index 4905c35b89d..6fd181ff97d 100644 --- a/webui/react/vite.config.ts +++ b/webui/react/vite.config.ts @@ -26,9 +26,11 @@ const portableFetchFix = () => ({ }, }); +console.log('public_url is ', JSON.stringify(process.env.PUBLIC_URL)); + // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ - base: process.env.PUBLIC_URL || '/', + base: process.env.PUBLIC_URL, build: { commonjsOptions: { include: [/node_modules/, /notebook/], From d76e78f07d109854e1099ca74ee4caf0c64ef741 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Mon, 6 Feb 2023 11:27:53 -0500 Subject: [PATCH 13/27] drop sourcemap from non-prod builds --- webui/react/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui/react/vite.config.ts b/webui/react/vite.config.ts index 6fd181ff97d..ead328428d8 100644 --- a/webui/react/vite.config.ts +++ b/webui/react/vite.config.ts @@ -36,7 +36,7 @@ export default defineConfig(({ mode }) => ({ include: [/node_modules/, /notebook/], }, outDir: 'build', - sourcemap: true, + sourcemap: mode === 'production', }, css: { modules: { From 124948a7a7d17b88a8c856529ecb55176976aa48 Mon Sep 17 00:00:00 2001 From: Ashton Galloway Date: Mon, 6 Feb 2023 11:46:32 -0500 Subject: [PATCH 14/27] remove csp comment --- webui/react/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/webui/react/index.html b/webui/react/index.html index f0447f10e0e..51904f9193e 100644 --- a/webui/react/index.html +++ b/webui/react/index.html @@ -6,7 +6,6 @@ -