From 455f30a7b6401a9ed95942636037b2383c677f3d Mon Sep 17 00:00:00 2001 From: silverwind Date: Fri, 25 Sep 2026 07:56:07 +0200 Subject: [PATCH] chore(frontend): target ES2022 (#39420) Bump the TypeScript and Vite targets from ES2020 to ES2022. The frontend already calls ES2022 APIs like `Object.hasOwn` and `Array.prototype.at` without polyfills, so downleveling class syntax only added helpers. JS output shrinks by 36 KB. The only new syntax-level requirement is Safari 16.4 for mermaid, which ships class static blocks. Pale Moon supports all emitted syntax since 32.2. The ES2022 target implies `useDefineForClassFields`, so `noImplicitOverride` is enabled to flag class fields that shadow inherited DOM properties. --- tools/eslint-rules/unescaped-html-literal.test.ts | 8 +------- tsconfig.json | 3 ++- vite.config.ts | 2 +- web_src/js/webcomponents/relative-time.ts | 4 ++-- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/tools/eslint-rules/unescaped-html-literal.test.ts b/tools/eslint-rules/unescaped-html-literal.test.ts index b2c2ff27421..af3d473e764 100644 --- a/tools/eslint-rules/unescaped-html-literal.test.ts +++ b/tools/eslint-rules/unescaped-html-literal.test.ts @@ -4,13 +4,7 @@ import rule from './unescaped-html-literal.ts'; import {RuleTester} from 'eslint'; -class VitestRuleTester extends RuleTester { - static describe = describe; - static it = it; - static itOnly = it.only; -} - -const ruleTester = new VitestRuleTester(); +const ruleTester = new RuleTester(); ruleTester.run('unescaped-html-literal', rule, { valid: [ diff --git a/tsconfig.json b/tsconfig.json index bcecb172172..41bd533a9d0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "${configDir}/web_src/js/**/.*", ], "compilerOptions": { - "target": "es2020", + "target": "es2022", "module": "esnext", "moduleResolution": "bundler", "lib": ["dom", "esnext", "webworker"], @@ -26,6 +26,7 @@ "libReplacement": false, "noEmit": true, "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, "noImplicitReturns": true, "noUncheckedSideEffectImports": true, "noPropertyAccessFromIndexSignature": false, diff --git a/vite.config.ts b/vite.config.ts index 1ae9a927402..b4b5538b978 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -61,7 +61,7 @@ function commonViteOpts({build, ...other}: InlineConfig): InlineConfig { outDir, emptyOutDir: false, sourcemap: enableSourcemap !== 'false', - target: 'es2020', + target: 'es2022', minify: isProduction ? 'oxc' : false, cssMinify: isProduction ? 'esbuild' : false, chunkSizeWarningLimit: Infinity, diff --git a/web_src/js/webcomponents/relative-time.ts b/web_src/js/webcomponents/relative-time.ts index e7bff3f5092..ac7bb6cc22c 100644 --- a/web_src/js/webcomponents/relative-time.ts +++ b/web_src/js/webcomponents/relative-time.ts @@ -319,11 +319,11 @@ class RelativeTime extends HTMLElement { return undefined; } - get prefix(): string { + override get prefix(): string { return this.getAttribute('prefix') ?? (this.format === 'datetime' ? '' : 'on'); } - set prefix(v: string) { + override set prefix(v: string) { this.setAttribute('prefix', v); }