tldraw/packages/utils/api-report.md
alex f9ed1bf2c9
Force interface instead of type for better docs (#3815)
Typescript's type aliases (`type X = thing`) can refer to basically
anything, which makes it hard to write an automatic document formatter
for them. Interfaces on the other hand are only object, so they play
much nicer with docs. Currently, object-flavoured type aliases don't
really get expanded at all on our docs site, which means we have a bunch
of docs content that's not shown on the site.

This diff introduces a lint rule that forces `interface X {foo: bar}`s
instead of `type X = {foo: bar}` where possible, as it results in a much
better documentation experience:

Before:
<img width="437" alt="Screenshot 2024-05-22 at 15 24 13"
src="https://github.com/tldraw/tldraw/assets/1489520/32606fd1-6832-4a1e-aa5f-f0534d160c92">

After:
<img width="431" alt="Screenshot 2024-05-22 at 15 33 01"
src="https://github.com/tldraw/tldraw/assets/1489520/4e0d59ee-c38e-4056-b9fd-6a7f15d28f0f">


### Change Type

- [x] `sdk` — Changes the tldraw SDK
- [x] `docs` — Changes to the documentation, examples, or templates.
- [x] `improvement` — Improving existing features
2024-05-22 15:55:49 +00:00

11 KiB

API Report File for "@tldraw/utils"

Do not edit this file. It is a report generated by API Extractor.


// @internal
export function annotateError(error: unknown, annotations: Partial<ErrorAnnotations>): void;

// @internal (undocumented)
export function areArraysShallowEqual<T>(arr1: readonly T[], arr2: readonly T[]): boolean;

// @internal (undocumented)
export function areObjectsShallowEqual<T extends Record<string, unknown>>(obj1: T, obj2: T): boolean;

// @internal (undocumented)
export const assert: (value: unknown, message?: string) => asserts value;

// @internal (undocumented)
export const assertExists: <T>(value: T, message?: string | undefined) => NonNullable<T>;

// @internal
export function clearLocalStorage(): void;

// @internal
export function clearSessionStorage(): void;

// @internal (undocumented)
export function compact<T>(arr: T[]): NonNullable<T>[];

// @public
export function debounce<T extends unknown[], U>(callback: (...args: T) => PromiseLike<U> | U, wait: number): {
    (...args: T): Promise<U>;
    cancel(): void;
};

// @public
export function dedupe<T>(input: T[], equals?: (a: any, b: any) => boolean): T[];

// @public (undocumented)
export const DEFAULT_SUPPORT_VIDEO_TYPES: readonly string[];

// @public (undocumented)
export const DEFAULT_SUPPORTED_IMAGE_TYPES: readonly string[];

// @public (undocumented)
export const DEFAULT_SUPPORTED_MEDIA_TYPE_LIST: string;

// @internal
export function deleteFromLocalStorage(key: string): void;

// @internal
export function deleteFromSessionStorage(key: string): void;

// @public (undocumented)
export interface ErrorResult<E> {
    // (undocumented)
    readonly error: E;
    // (undocumented)
    readonly ok: false;
}

// @internal (undocumented)
export function exhaustiveSwitchError(value: never, property?: string): never;

// @public (undocumented)
export type Expand<T> = T extends infer O ? {
    [K in keyof O]: O[K];
} : never;

// @public
export class FileHelpers {
    static blobToDataUrl(file: Blob): Promise<string>;
    static blobToText(file: Blob): Promise<string>;
    // (undocumented)
    static dataUrlToArrayBuffer(dataURL: string): Promise<ArrayBuffer>;
}

// @internal
export function filterEntries<Key extends string, Value>(object: {
    [K in Key]: Value;
}, predicate: (key: Key, value: Value) => boolean): {
    [K in Key]: Value;
};

// @internal
export function fpsThrottle(fn: () => void): () => void;

// @internal (undocumented)
export function getErrorAnnotations(error: Error): ErrorAnnotations;

// @public
export function getFirstFromIterable<T = unknown>(set: Map<any, T> | Set<T>): T;

// @internal
export function getFromLocalStorage(key: string): null | string;

// @internal
export function getFromSessionStorage(key: string): null | string;

// @public
export function getHashForBuffer(buffer: ArrayBuffer): string;

// @public
export function getHashForObject(obj: any): string;

// @public
export function getHashForString(string: string): string;

// @public
export function getIndexAbove(below?: IndexKey | undefined): IndexKey;

// @public
export function getIndexBelow(above?: IndexKey | undefined): IndexKey;

// @public
export function getIndexBetween(below: IndexKey | undefined, above: IndexKey | undefined): IndexKey;

// @public
export function getIndices(n: number, start?: IndexKey): IndexKey[];

// @public
export function getIndicesAbove(below: IndexKey | undefined, n: number): IndexKey[];

// @public
export function getIndicesBelow(above: IndexKey | undefined, n: number): IndexKey[];

// @public
export function getIndicesBetween(below: IndexKey | undefined, above: IndexKey | undefined, n: number): IndexKey[];

// @internal (undocumented)
export function getOwnProperty<K extends string, V>(obj: Partial<Record<K, V>>, key: K): undefined | V;

// @internal (undocumented)
export function getOwnProperty(obj: object, key: string): unknown;

// @internal (undocumented)
export function hasOwnProperty(obj: object, key: string): boolean;

// @public
export type IndexKey = string & {
    __orderKey: true;
};

// @public
export function invLerp(a: number, b: number, t: number): number;

// @public
export function isDefined<T>(value: T): value is typeof value extends undefined ? never : T;

// @internal (undocumented)
export const isNativeStructuredClone: boolean;

// @public
export function isNonNull<T>(value: T): value is typeof value extends null ? never : T;

// @public
export function isNonNullish<T>(value: T): value is typeof value extends undefined ? never : typeof value extends null ? never : T;

// @public (undocumented)
export type JsonArray = JsonValue[];

// @public (undocumented)
export interface JsonObject {
    // (undocumented)
    [key: string]: JsonValue | undefined;
}

// @public (undocumented)
export type JsonPrimitive = boolean | null | number | string;

// @public (undocumented)
export type JsonValue = JsonArray | JsonObject | JsonPrimitive;

// @internal (undocumented)
export function last<T>(arr: readonly T[]): T | undefined;

// @public
export function lerp(a: number, b: number, t: number): number;

// @public (undocumented)
export function lns(str: string): string;

// @internal
export function mapObjectMapValues<Key extends string, ValueBefore, ValueAfter>(object: {
    readonly [K in Key]: ValueBefore;
}, mapper: (key: Key, value: ValueBefore) => ValueAfter): {
    [K in Key]: ValueAfter;
};

// @internal (undocumented)
export function measureAverageDuration(_target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;

// @internal (undocumented)
export function measureCbDuration(name: string, cb: () => any): any;

// @internal (undocumented)
export function measureDuration(_target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;

// @public
export class MediaHelpers {
    static getImageSize(blob: Blob): Promise<{
        h: number;
        w: number;
    }>;
    static getVideoSize(blob: Blob): Promise<{
        h: number;
        w: number;
    }>;
    // (undocumented)
    static isAnimated(file: Blob): Promise<boolean>;
    // (undocumented)
    static isAnimatedImageType(mimeType: null | string): boolean;
    // (undocumented)
    static isImageType(mimeType: string): boolean;
    // (undocumented)
    static isStaticImageType(mimeType: null | string): boolean;
    static loadImage(src: string): Promise<HTMLImageElement>;
    static loadVideo(src: string): Promise<HTMLVideoElement>;
    // (undocumented)
    static usingObjectURL<T>(blob: Blob, fn: (url: string) => Promise<T>): Promise<T>;
}

// @internal (undocumented)
export function minBy<T>(arr: readonly T[], fn: (item: T) => number): T | undefined;

// @public
export function modulate(value: number, rangeA: number[], rangeB: number[], clamp?: boolean): number;

// @internal
export function noop(): void;

// @internal
export function objectMapEntries<Key extends string, Value>(object: {
    [K in Key]: Value;
}): Array<[Key, Value]>;

// @internal
export function objectMapFromEntries<Key extends string, Value>(entries: ReadonlyArray<readonly [Key, Value]>): {
    [K in Key]: Value;
};

// @internal
export function objectMapKeys<Key extends string>(object: {
    readonly [K in Key]: unknown;
}): Array<Key>;

// @internal
export function objectMapValues<Key extends string, Value>(object: {
    [K in Key]: Value;
}): Array<Value>;

// @public (undocumented)
export interface OkResult<T> {
    // (undocumented)
    readonly ok: true;
    // (undocumented)
    readonly value: T;
}

// @internal
export function omitFromStackTrace<Args extends Array<unknown>, Return>(fn: (...args: Args) => Return): (...args: Args) => Return;

// @internal
export function partition<T>(arr: T[], predicate: (item: T) => boolean): [T[], T[]];

// @public (undocumented)
export class PerformanceTracker {
    // (undocumented)
    isStarted(): boolean;
    // (undocumented)
    recordFrame: () => void;
    // (undocumented)
    start(name: string): void;
    // (undocumented)
    stop(): void;
}

// @public (undocumented)
export class PngHelpers {
    // (undocumented)
    static findChunk(view: DataView, type: string): {
        dataOffset: number;
        size: number;
        start: number;
    };
    // (undocumented)
    static getChunkType(view: DataView, offset: number): string;
    // (undocumented)
    static isPng(view: DataView, offset: number): boolean;
    // (undocumented)
    static parsePhys(view: DataView, offset: number): {
        ppux: number;
        ppuy: number;
        unit: number;
    };
    // (undocumented)
    static readChunks(view: DataView, offset?: number): Record<string, {
        dataOffset: number;
        size: number;
        start: number;
    }>;
    // (undocumented)
    static setPhysChunk(view: DataView, dpr?: number, options?: BlobPropertyBag): Blob;
}

// @internal (undocumented)
export function promiseWithResolve<T>(): Promise<T> & {
    reject: (reason?: any) => void;
    resolve: (value: T) => void;
};

// @public (undocumented)
export type RecursivePartial<T> = {
    [P in keyof T]?: RecursivePartial<T[P]>;
};

// @internal (undocumented)
type Required_2<T, K extends keyof T> = Expand<Omit<T, K> & _Required<Pick<T, K>>>;
export { Required_2 as Required }

// @public (undocumented)
export type Result<T, E> = ErrorResult<E> | OkResult<T>;

// @public (undocumented)
export const Result: {
    err<E>(error: E): ErrorResult<E>;
    ok<T>(value: T): OkResult<T>;
};

// @public
export function rng(seed?: string): () => number;

// @public
export function rotateArray<T>(arr: T[], offset: number): T[];

// @internal
export function setInLocalStorage(key: string, value: string): void;

// @internal
export function setInSessionStorage(key: string, value: string): void;

// @public (undocumented)
export function sortById<T extends {
    id: any;
}>(a: T, b: T): -1 | 1;

// @public
export function sortByIndex<T extends {
    index: IndexKey;
}>(a: T, b: T): -1 | 0 | 1;

// @internal
export const STRUCTURED_CLONE_OBJECT_PROTOTYPE: any;

// @public
const structuredClone_2: <T>(i: T) => T;
export { structuredClone_2 as structuredClone }

// @public
export function throttle<T extends (...args: any) => any>(func: T, limit: number): (...args: Parameters<T>) => ReturnType<T>;

// @internal
export function throttleToNextFrame(fn: () => void): () => void;

// @internal (undocumented)
export function validateIndexKey(key: string): asserts key is IndexKey;

// @internal (undocumented)
export function warnDeprecatedGetter(name: string): void;

// @public
export class WeakCache<K extends object, V> {
    get<P extends K>(item: P, cb: (item: P) => V): NonNullable<V>;
    items: WeakMap<K, V>;
}

// @public
export const ZERO_INDEX_KEY: IndexKey;

// (No @packageDocumentation comment for this package)