From 6bea3e7228229ec1699a11d57a0c7eeade79ac9f Mon Sep 17 00:00:00 2001 From: William So Date: Mon, 1 May 2023 01:26:54 +0800 Subject: [PATCH] Fix `revealPrivate()` for async functions But not powerful enough to model conditional async... Signed-off-by: William So --- sources/utils/obsidian-private.ts | 28 +++++++++++++++++++++++++--- sources/utils/obsidian.ts | 4 ++-- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/sources/utils/obsidian-private.ts b/sources/utils/obsidian-private.ts index 705028dc..49401761 100644 --- a/sources/utils/obsidian-private.ts +++ b/sources/utils/obsidian-private.ts @@ -30,9 +30,11 @@ export function revealPrivate( args: true extends { readonly [A in keyof As]: IsNever> }[number] ? never : Sized, - func: (...args: { readonly [A in keyof As]: RevealPrivate }) => R, - fallback: (error: unknown, ...args: As) => R, -): R { + func: (...args: { readonly [A in keyof As]: RevealPrivate }) => + R extends PromiseLike ? never : R, + fallback: (error: unknown, ...args: As) => + R extends PromiseLike ? never : R, +): R extends PromiseLike ? never : R { try { return func(...args as { readonly [A in keyof As]: RevealPrivate }) } catch (error) { @@ -43,6 +45,26 @@ export function revealPrivate( return fallback(error, ...args) } } +export async function revealPrivateAsync, + const As extends readonly unknown[]>( + plugin: TerminalPlugin, + args: true extends { + readonly [A in keyof As]: IsNever> + }[number] ? never : Sized, + func: (...args: { readonly [A in keyof As]: RevealPrivate }) => R, + fallback: (error: unknown, ...args: As) => R, + ): Promise> { + try { + return await func(...args as + { readonly [A in keyof As]: RevealPrivate }) + } catch (error) { + self.console.warn( + plugin.language.i18n.t("errors.private-API-changed"), + error, + ) + return await fallback(error, ...args) + } +} export type RevealPrivate = T extends DataAdapter ? $DataAdapter : T extends ViewStateResult ? $ViewStateResult : diff --git a/sources/utils/obsidian.ts b/sources/utils/obsidian.ts index 393f7d90..dbf25804 100644 --- a/sources/utils/obsidian.ts +++ b/sources/utils/obsidian.ts @@ -28,11 +28,11 @@ import { typedStructuredClone, } from "./util" import { constant, isUndefined } from "lodash-es" +import { revealPrivate, revealPrivateAsync } from "./obsidian-private" import { DEFAULT_LANGUAGE } from "assets/locales" import { Platform } from "./platforms" import type { TerminalPlugin } from "sources/main" import { around } from "monkey-around" -import { revealPrivate } from "./obsidian-private" import { saveAs } from "file-saver" export class UpdatableUI { @@ -390,7 +390,7 @@ export async function saveFileAs( data: File, ): Promise { if (inSet(Platform.MOBILE, Platform.CURRENT)) { - await revealPrivate(plugin, [adapter] as const, async ({ fs }) => { + await revealPrivateAsync(plugin, [adapter] as const, async ({ fs }) => { await fs.open( (await Filesystem.writeFile({ data: await data.text(),