/** * Used as an optional. * `{ value: S } | { error: E }`. */ export type SuccessOrFail<S, F> = { value: S; error?: undefined; } | { error: F; }; export declare function isSuccess<S, F>(successOrFail: SuccessOrFail<S, F>): successOrFail is { value: S; }; export declare function isFail<S, F>(successOrFail: SuccessOrFail<S, F>): successOrFail is { error: F; }; /** * Used as an optional for results of a Vm call. * `{ value: VmHandle } | { error: VmHandle }`. */ export type VmCallResult<VmHandle> = SuccessOrFail<VmHandle, VmHandle>; /** * A VmFunctionImplementation takes handles as arguments. * It should return a handle, or be void. * * To indicate an exception, a VMs can throw either a handle (transferred * directly) or any other Javascript value (only the poperties `name` and * `message` will be transferred). Or, the VmFunctionImplementation may return * a VmCallResult's `{ error: handle }` error variant. * * VmFunctionImplementation should not free its arguments or its return value. * It should not retain a reference to its return value or thrown error. */ export type VmFunctionImplementation<VmHandle> = (this: VmHandle, ...args: VmHandle[]) => VmHandle | VmCallResult<VmHandle> | void; /** * A minimal interface to a Javascript execution environment. * * Higher-level tools should build over the LowLevelJavascriptVm interface to * share as much as possible between executors. * * From https://www.figma.com/blog/how-we-built-the-figma-plugin-system/ */ export interface LowLevelJavascriptVm<VmHandle> { global: VmHandle; undefined: VmHandle; typeof(handle: VmHandle): string; getNumber(handle: VmHandle): number; getString(handle: VmHandle): string; newNumber(value: number): VmHandle; newString(value: string): VmHandle; newObject(prototype?: VmHandle): VmHandle; newFunction(name: string, value: VmFunctionImplementation<VmHandle>): VmHandle; getProp(handle: VmHandle, key: string | VmHandle): VmHandle; setProp(handle: VmHandle, key: string | VmHandle, value: VmHandle): void; defineProp(handle: VmHandle, key: string | VmHandle, descriptor: VmPropertyDescriptor<VmHandle>): void; callFunction(func: VmHandle, thisVal: VmHandle, ...args: VmHandle[]): VmCallResult<VmHandle>; evalCode(code: string, filename?: string): VmCallResult<VmHandle>; } /** * From https://www.figma.com/blog/how-we-built-the-figma-plugin-system/ */ export interface VmPropertyDescriptor<VmHandle> { value?: VmHandle; configurable?: boolean; enumerable?: boolean; get?: (this: VmHandle) => VmHandle; set?: (this: VmHandle, value: VmHandle) => void; }