diff --git a/.github/workflows/v3.yml b/.github/workflows/v3.yml index 8dc58b006c..3ae3508306 100644 --- a/.github/workflows/v3.yml +++ b/.github/workflows/v3.yml @@ -20,6 +20,12 @@ jobs: - name: Install Dependencies working-directory: v3 run: npm ci + - uses: actions/cache@v3 + with: + path: v3/node_modules/.cache/webpack/ + key: ${{ github.head_ref || github.ref_name }}-webpack-build + restore-keys: | + main-webpack-build - name: Build working-directory: v3 run: npm run build @@ -45,6 +51,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + - uses: actions/cache@v3 + with: + path: v3/node_modules/.cache/webpack/ + key: ${{ github.head_ref || github.ref_name }}-webpack-build + restore-keys: | + main-webpack-build - uses: cypress-io/github-action@v5 with: working-directory: v3 @@ -92,6 +104,12 @@ jobs: # skip installing cypress since it isn't needed for just building # This decreases the deploy time quite a bit CYPRESS_INSTALL_BINARY: 0 + - uses: actions/cache@v3 + with: + path: v3/node_modules/.cache/webpack/ + key: ${{ github.head_ref || github.ref_name }}-webpack-build + restore-keys: | + main-webpack-build - uses: concord-consortium/s3-deploy-action@v1 with: bucket: models-resources diff --git a/.gitignore b/.gitignore index 46835334f1..012bb5dc35 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ cypress/screenshots cypress/videos cypress/downloads cypress/snapshots/*/__diff_output__/** +v3/cypress/screenshots \ No newline at end of file diff --git a/v3/package-lock.json b/v3/package-lock.json index 3bd2fc0150..21e7e6b328 100644 --- a/v3/package-lock.json +++ b/v3/package-lock.json @@ -41,6 +41,7 @@ "@istanbuljs/nyc-config-typescript": "^1.0.2", "@jsdevtools/coverage-istanbul-loader": "^3.0.5", "@svgr/webpack": "^6.5.1", + "@swc/core": "^1.3.44", "@talabes/json5-jest": "^2.0.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", @@ -76,6 +77,7 @@ "eslint-plugin-testing-library": "^5.10.2", "eslint-webpack-plugin": "~3.2.0", "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "^8.0.0", "fs-extra": "^11.1.1", "html-webpack-plugin": "^5.5.0", "identity-obj-proxy": "^3.0.0", @@ -93,12 +95,13 @@ "sass-loader": "^13.2.1", "script-loader": "^0.7.2", "style-loader": "^3.3.2", + "swc-loader": "^0.2.3", "ts-jest": "^29.0.5", "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "typescript": "~4.9.5", "wait-on": "^7.0.1", - "webpack": "^5.76.2", + "webpack": "^5.77.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.13.1" } @@ -4840,6 +4843,192 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/core": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.44.tgz", + "integrity": "sha512-RC25C8nxOCdfGS//F9Q8aHKx4XoCsxvgO+sSUhvt7zDz1Y2ruVUTu2UOH0VeE0WkA8j6oEZH+xH2SUfDUkxXdA==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.44", + "@swc/core-darwin-x64": "1.3.44", + "@swc/core-linux-arm-gnueabihf": "1.3.44", + "@swc/core-linux-arm64-gnu": "1.3.44", + "@swc/core-linux-arm64-musl": "1.3.44", + "@swc/core-linux-x64-gnu": "1.3.44", + "@swc/core-linux-x64-musl": "1.3.44", + "@swc/core-win32-arm64-msvc": "1.3.44", + "@swc/core-win32-ia32-msvc": "1.3.44", + "@swc/core-win32-x64-msvc": "1.3.44" + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.44.tgz", + "integrity": "sha512-Y+oVsCjXUPvr3D9YLuB1gjP84TseM/CRkbPNrf+3JXQhsPEkgxdIdFP1cl/obeqMQrRgPpvSfK+TOvGuOuV22g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.44.tgz", + "integrity": "sha512-bM0IKBjlSD0yHJbd7bE3il5fTu3oUjUO2zjLkzfIx6tiqbmDyvOX8adaSqse9N+d8Ip9p26b5Vo7pMHq0POGkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.44.tgz", + "integrity": "sha512-D4lfVwCbkWscDTb6btb89+bN0kgvjGBPfOmcvih7nY5hxaorwvp+PefkYAhFw8vKmL92lrnWUFNiTemVFN4bxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.44.tgz", + "integrity": "sha512-muExPTrN26MFmtO+5uffkH5v4lmd8GdmyWvlC2tL95h7o9genTIQyr7kcSepGZrDe4fM9G6++5YfENhUpXHo+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.44.tgz", + "integrity": "sha512-MY1wY3kSIosjJKKCfFGniJFFVkt3oPvJLN4Dlj+bMgAt3O7anm8lGbyLqUpJ1Ep4rTsJj7ObO06DQiSWp4Fhcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.44.tgz", + "integrity": "sha512-xV4pDxJM06g0yUDTA22ZHgonzGqf/poIlgADRmEkx9cWWm5qLRhmWrrkVX1xZVvdlcXj1ERnia/UkvrDux96lg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.44.tgz", + "integrity": "sha512-NJnnlE8vCkKHoo/wIaoywNN/01vNsvhKUjBgUx865sUM/XWAIanpbV41yfdEkC+Iwd+/zB3ZZnOYql3b+Nn8aQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.44.tgz", + "integrity": "sha512-/xOtjZhX25GEOPLN55icjj9E061DDH7G0A9HfUAEilURgBbvm6bIlqK+t8mOKK0tOsDoHftdTBRkYhTAqUtakQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.44.tgz", + "integrity": "sha512-uKTAWQuMEW1gJnl8F3eiz3kdk8CiaR5dMWWlGbHIq6dRbur2hoKaEnINR4UqkvvAhhY1YB0Xr5DV1H986Xu2EA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.44.tgz", + "integrity": "sha512-D9fBRhr44cK4YIKFikpktyUDLkZgVj0ISaSl8IjiTvjqTrE/9+E+dzTNHULn5tc3lHVLLxyVwMjJRr2G0D4O6w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@talabes/json5-jest": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@talabes/json5-jest/-/json5-jest-2.0.0.tgz", @@ -10962,6 +11151,169 @@ "node": "*" } }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", @@ -15732,6 +16084,12 @@ "tslib": "^2.0.3" } }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -18930,6 +19288,16 @@ "node": ">= 10" } }, + "node_modules/swc-loader": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", + "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", + "dev": true, + "peerDependencies": { + "@swc/core": "^1.2.147", + "webpack": ">=2" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -20018,9 +20386,9 @@ } }, "node_modules/webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", + "version": "5.77.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", + "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", diff --git a/v3/package.json b/v3/package.json index f9e562be7b..cf4551fa16 100644 --- a/v3/package.json +++ b/v3/package.json @@ -93,6 +93,7 @@ "@istanbuljs/nyc-config-typescript": "^1.0.2", "@jsdevtools/coverage-istanbul-loader": "^3.0.5", "@svgr/webpack": "^6.5.1", + "@swc/core": "^1.3.44", "@talabes/json5-jest": "^2.0.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", @@ -128,6 +129,7 @@ "eslint-plugin-testing-library": "^5.10.2", "eslint-webpack-plugin": "~3.2.0", "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "^8.0.0", "fs-extra": "^11.1.1", "html-webpack-plugin": "^5.5.0", "identity-obj-proxy": "^3.0.0", @@ -145,12 +147,13 @@ "sass-loader": "^13.2.1", "script-loader": "^0.7.2", "style-loader": "^3.3.2", + "swc-loader": "^0.2.3", "ts-jest": "^29.0.5", "ts-loader": "^9.4.2", "ts-node": "^10.9.1", "typescript": "~4.9.5", "wait-on": "^7.0.1", - "webpack": "^5.76.2", + "webpack": "^5.77.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.13.1" }, diff --git a/v3/src/hooks/use-drop-handler.ts b/v3/src/hooks/use-drop-handler.ts index b7e7df72d7..3712a4ace5 100644 --- a/v3/src/hooks/use-drop-handler.ts +++ b/v3/src/hooks/use-drop-handler.ts @@ -87,7 +87,7 @@ export const useDropHandler = ({ selector, onImportDataSet, onImportV2Document, function removeDragData(event: DragEvent) { if (event.dataTransfer) { - if (event.dataTransfer.items) { + if (event.dataTransfer?.items?.clear) { // Use DataTransferItemList interface to remove the drag data event.dataTransfer.items.clear() } else { diff --git a/v3/webpack.config.js b/v3/webpack.config.js index 1faee4464e..1327e01ca9 100644 --- a/v3/webpack.config.js +++ b/v3/webpack.config.js @@ -5,6 +5,7 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin') const { CleanWebpackPlugin } = require('clean-webpack-plugin') const ESLintPlugin = require('eslint-webpack-plugin') +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin') const os = require('os') // DEPLOY_PATH is set by the s3-deploy-action its value will be: @@ -13,9 +14,34 @@ const os = require('os') // https://github.com/concord-consortium/s3-deploy-action/blob/main/README.md#top-branch-example const DEPLOY_PATH = process.env.DEPLOY_PATH + module.exports = (env, argv) => { const devMode = argv.mode !== 'production' + const webpackPlugins = [ + new ESLintPlugin({ + extensions: ['ts', 'tsx', 'js', 'jsx'], + }), + new MiniCssExtractPlugin({ + filename: devMode ? 'assets/[name].css' : 'assets/[name].[contenthash].css', + }), + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'src/index.html', + favicon: 'src/public/favicon.ico', + }), + ...(DEPLOY_PATH ? [new HtmlWebpackPlugin({ + filename: "index-top.html", + template: "src/index.html", + favicon: "src/public/favicon.ico", + publicPath: DEPLOY_PATH + })] : []), + new CleanWebpackPlugin(), + ]; + if (!process.env.CODE_COVERAGE) { + webpackPlugins.push(new ForkTsCheckerWebpackPlugin()) + } + return { context: __dirname, // to automatically find tsconfig.json devServer: { @@ -39,12 +65,36 @@ module.exports = (env, argv) => { path: path.resolve(__dirname, 'dist'), filename: 'assets/index.[contenthash].js', }, + cache: { + buildDependencies: { + config: [__filename], + }, + type: 'filesystem', + }, performance: { hints: false }, + optimization: devMode ? { + removeAvailableModules: false, + removeEmptyChunks: false, + splitChunks: false, + } : {}, module: { rules: [ { - test: /\.tsx?$/, - loader: 'ts-loader', + test: /.(ts|tsx)$/, + include: path.resolve(__dirname, "src"), + use: process.env.CODE_COVERAGE ? { loader: "ts-loader" } : { + loader: "swc-loader", + options: { + jsc: { + parser: { + syntax: "typescript", + decorators: true, + tsx: false, + dynamicImport: false, + }, + }, + }, + }, }, // This code coverage instrumentation should only be added when needed. It makes // the code larger and slower @@ -158,25 +208,6 @@ module.exports = (env, argv) => { 'react/jsx-dev-runtime': 'react/jsx-dev-runtime.js', }, }, - plugins: [ - new ESLintPlugin({ - extensions: ['ts', 'tsx', 'js', 'jsx'], - }), - new MiniCssExtractPlugin({ - filename: devMode ? 'assets/[name].css' : 'assets/[name].[contenthash].css', - }), - new HtmlWebpackPlugin({ - filename: 'index.html', - template: 'src/index.html', - favicon: 'src/public/favicon.ico', - }), - ...(DEPLOY_PATH ? [new HtmlWebpackPlugin({ - filename: "index-top.html", - template: "src/index.html", - favicon: "src/public/favicon.ico", - publicPath: DEPLOY_PATH - })] : []), - new CleanWebpackPlugin(), - ] + plugins: webpackPlugins, } }