From 35f0b7d0e6011c36a41e44ffe21d776dce3d00b0 Mon Sep 17 00:00:00 2001 From: RumovZ Date: Sat, 18 May 2024 21:23:41 +0200 Subject: [PATCH] Add requireAsync() --- ts/lib/tslib/runtime-require.ts | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/ts/lib/tslib/runtime-require.ts b/ts/lib/tslib/runtime-require.ts index 7ea815b5c01..3f8bf05eb0c 100644 --- a/ts/lib/tslib/runtime-require.ts +++ b/ts/lib/tslib/runtime-require.ts @@ -27,7 +27,8 @@ type AnkiPackages = | "anki/location" | "anki/surround" | "anki/ui" - | "anki/reviewer"; + | "anki/reviewer" + | "anki/ExportPage"; type PackageDeprecation> = { [key in keyof T]?: string; }; @@ -77,6 +78,24 @@ function require(name: T): Record | und } } +// Resolves as soon as the requested package is available. +function requireAsync(name: T): Promise> { + return new Promise((resolve) => { + const runtimePackage = runtimePackages[name]; + if (runtimePackage !== undefined) { + resolve(runtimePackage); + } else { + const intervalId = setInterval(() => { + const runtimePackage = runtimePackages[name]; + if (runtimePackage !== undefined) { + clearInterval(intervalId); + resolve(runtimePackage); + } + }, 50); + } + }); +} + function listPackages(): string[] { return Object.keys(runtimePackages); } @@ -91,8 +110,8 @@ function hasPackages(...names: string[]): boolean { return true; } -// Export require() as a global. -Object.assign(globalThis, { require }); +// Export require() and requireAsync() as globals. +Object.assign(globalThis, { require, requireAsync }); registerPackage("anki/packages", { // We also register require here, so add-ons can have a type-save variant of require (TODO, see AnkiPackages above)