[Dev] Add support for manually rolling polyfills. Add polyfill for promise.withResolvers (#6103)

* Add polyfill for Promise.withResolvers

* Import polyfills in main

* Apply kev's suggestions from code review

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Address comments from code review

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
This commit is contained in:
Sirz Benjie 2025-07-19 10:06:32 -06:00 committed by GitHub
parent 556721127c
commit 2388372cca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 0 deletions

View File

@ -1,3 +1,6 @@
import "#app/polyfills";
// All polyfills MUST be loaded first for side effects
import { InvertPostFX } from "#app/pipelines/invert";
import { initI18n } from "#app/plugins/i18n";
import { version } from "#package.json";

21
src/polyfills.ts Normal file
View File

@ -0,0 +1,21 @@
/*
Manual rolling of polyfills desired by the project.
IMPORTANT: When adding / removing polyfills, ensure that typescript becomes
aware of their existence, either by creating `src/typings/polyfills.d.ts`
and defining them there, or or by adding the appropriate field polyfill to the
`lib` property in `tsconfig.json`.
*/
if (typeof Promise.withResolvers === "undefined") {
Promise.withResolvers = <T>() => {
// Bangs are OK here; they are guaranteed to be defined when the promise is invoked.
let resolve!: (value: T | PromiseLike<T>) => void;
let reject!: (reason?: unknown) => void;
const promise = new Promise<T>((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
};
}

View File

@ -2,6 +2,17 @@
"compilerOptions": {
"target": "ES2020",
"module": "ES2020",
// Modifying this option requires all values to be set manually because the defaults get overridden
// Values other than "ES2024.Promise" taken from https://github.com/microsoft/TypeScript/blob/main/src/lib/es2020.full.d.ts
"lib": [
"ES2020",
"ES2024.Promise",
"DOM",
"DOM.AsyncIterable",
"DOM.Iterable",
"ScriptHost",
"WebWorker.ImportScripts"
],
"moduleResolution": "bundler",
"resolveJsonModule": true,
"esModuleInterop": true,