From f829170923288203b820e3f3704d8775d9040aa2 Mon Sep 17 00:00:00 2001 From: Ian Littman Date: Thu, 9 Apr 2026 08:28:59 -0500 Subject: [PATCH] Update to TypeScript 6.0 (#43141) **Related issue:** Resolves # # Checklist for submitter If some of the following don't apply, delete the relevant line. - [x] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files) for more information. ## Testing - [ ] QA'd all new/changed functionality manually --- changes/ts6 | 1 + ee/fleetd-chrome/package-lock.json | 31 ++++++++++--------- ee/fleetd-chrome/package.json | 4 +-- ee/fleetd-chrome/src/mocks/handlers.ts | 4 +-- ee/fleetd-chrome/tsconfig.json | 12 +++---- .../DataTable/ActionButton/ActionButton.tsx | 4 ++- .../TableContainer/TableContainer.tsx | 6 +++- frontend/test/test-utils.tsx | 2 +- package.json | 4 +-- tsconfig.json | 7 +++-- yarn.lock | 16 +++++----- 11 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 changes/ts6 diff --git a/changes/ts6 b/changes/ts6 new file mode 100644 index 0000000000..330df6c288 --- /dev/null +++ b/changes/ts6 @@ -0,0 +1 @@ +* Upgraded to TypeScript 6.0 for the app frontend. diff --git a/ee/fleetd-chrome/package-lock.json b/ee/fleetd-chrome/package-lock.json index 0afaf3c6bd..422eea7602 100644 --- a/ee/fleetd-chrome/package-lock.json +++ b/ee/fleetd-chrome/package-lock.json @@ -24,9 +24,9 @@ "msw": "^1.1.0", "sass-loader": "^13.2.0", "style-loader": "^3.3.1", - "ts-jest": "^29.0.5", + "ts-jest": "^29.4.9", "ts-loader": "^9.4.2", - "typescript": "^4.9.5", + "typescript": "^6.0.2", "webpack": "^5.105.0", "webpack-cli": "^5.0.1", "webpack-merge": "^5.8.0" @@ -6629,9 +6629,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -7110,19 +7110,19 @@ "dev": true }, "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "version": "29.4.9", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", + "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", + "handlebars": "^4.7.9", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.3", + "semver": "^7.7.4", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, @@ -7139,7 +7139,7 @@ "babel-jest": "^29.0.0 || ^30.0.0", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" + "typescript": ">=4.3 <7" }, "peerDependenciesMeta": { "@babel/core": { @@ -7218,16 +7218,17 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { diff --git a/ee/fleetd-chrome/package.json b/ee/fleetd-chrome/package.json index b1ad2b1c95..0994fc26c6 100644 --- a/ee/fleetd-chrome/package.json +++ b/ee/fleetd-chrome/package.json @@ -19,9 +19,9 @@ "msw": "^1.1.0", "sass-loader": "^13.2.0", "style-loader": "^3.3.1", - "ts-jest": "^29.0.5", + "ts-jest": "^29.4.9", "ts-loader": "^9.4.2", - "typescript": "^4.9.5", + "typescript": "^6.0.2", "webpack": "^5.105.0", "webpack-cli": "^5.0.1", "webpack-merge": "^5.8.0" diff --git a/ee/fleetd-chrome/src/mocks/handlers.ts b/ee/fleetd-chrome/src/mocks/handlers.ts index dd08bf70ba..9211138c0b 100644 --- a/ee/fleetd-chrome/src/mocks/handlers.ts +++ b/ee/fleetd-chrome/src/mocks/handlers.ts @@ -8,14 +8,14 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export const handlers = [ // Return the actual webassembly file - rest.get(/\/wa-sqlite-async.wasm$/, (_req, res, ctx) => { + rest.get(/\/wa-sqlite-async\.wasm$/, (_req, res, ctx) => { const wasm = readFileSync( __dirname + "/../../node_modules/wa-sqlite/dist/wa-sqlite-async.wasm" ); return res( ctx.status(200), ctx.set("Content-Type", "application/wasm"), - ctx.body(wasm) + ctx.body(new Uint8Array(wasm)) ); }), ]; diff --git a/ee/fleetd-chrome/tsconfig.json b/ee/fleetd-chrome/tsconfig.json index b677f6f07c..b180d2d4f7 100644 --- a/ee/fleetd-chrome/tsconfig.json +++ b/ee/fleetd-chrome/tsconfig.json @@ -3,16 +3,16 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true, "jsx": "react", - "lib": [ - "es2020", - "dom" - ], + "lib": ["es2020", "dom"], "module": "es2020", - "moduleResolution": "node", + "moduleResolution": "bundler", "outDir": "dist/js", "rootDir": "src", "sourceMap": true, - "target": "es2015" + "skipLibCheck": true, + "strict": false, + "target": "es2015", + "types": ["chrome", "jest", "node"] }, "exclude": [ "node_modules", diff --git a/frontend/components/TableContainer/DataTable/ActionButton/ActionButton.tsx b/frontend/components/TableContainer/DataTable/ActionButton/ActionButton.tsx index d585ee7ede..fafb80474f 100644 --- a/frontend/components/TableContainer/DataTable/ActionButton/ActionButton.tsx +++ b/frontend/components/TableContainer/DataTable/ActionButton/ActionButton.tsx @@ -53,6 +53,8 @@ const ActionButton = (buttonProps: IActionButtonProps): JSX.Element | null => { isDisabled, tooltipContent, } = buttonProps; + const resolvedButtonText = + typeof buttonText === "function" ? buttonText(targetIds) : buttonText; const onButtonClick = useActionCallback(onClick || noop); // hideButton is intended to provide a flexible way to specify show/hide conditions via a boolean or a function that evaluates to a boolean @@ -88,7 +90,7 @@ const ActionButton = (buttonProps: IActionButtonProps): JSX.Element | null => { {iconPosition === "left" && iconSvg && ( )} - {buttonText} + {resolvedButtonText} {iconPosition !== "left" && iconSvg && ( )} diff --git a/frontend/components/TableContainer/TableContainer.tsx b/frontend/components/TableContainer/TableContainer.tsx index ad6da7c6e7..dd9a5e8449 100644 --- a/frontend/components/TableContainer/TableContainer.tsx +++ b/frontend/components/TableContainer/TableContainer.tsx @@ -319,6 +319,10 @@ const TableContainer = ({ const renderFilterActionButton = () => { // always !!actionButton here, this is for type checker if (actionButton) { + const resolvedButtonText = + typeof actionButton.buttonText === "function" + ? actionButton.buttonText(actionButton.targetIds ?? []) + : actionButton.buttonText; const button = (