## API Report File for "@tldraw/store" > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts import { Atom } from '@tldraw/state'; import { Computed } from '@tldraw/state'; import { Expand } from '@tldraw/utils'; import { Result } from '@tldraw/utils'; import { Signal } from '@tldraw/state'; import { UNINITIALIZED } from '@tldraw/state'; // @public export function assertIdType(id: string | undefined, type: RecordType): asserts id is IdOf; // @public export class AtomMap implements Map { [Symbol.iterator](): Generator<[K, V], undefined, unknown>; [Symbol.toStringTag]: string; constructor(name: string, entries?: Iterable); __unsafe__getWithoutCapture(key: K): undefined | V; __unsafe__hasWithoutCapture(key: K): boolean; clear(): void; delete(key: K): boolean; deleteMany(keys: Iterable): [K, V][]; entries(): Generator<[K, V], undefined, unknown>; forEach(callbackfn: (value: V, key: K, map: AtomMap) => void, thisArg?: any): void; get(key: K): undefined | V; // @internal getAtom(key: K): Atom | undefined; getOrInsert(key: K, defaultValue: V): V; getOrInsertComputed(key: K, callback: (key: K) => V): V; has(key: K): boolean; keys(): Generator; set(key: K, value: V): this; get size(): number; update(key: K, updater: (value: V) => V): void; values(): Generator; } // @public export class AtomSet { // (undocumented) [Symbol.iterator](): Generator; // (undocumented) [Symbol.toStringTag]: string; constructor(name: string, keys?: Iterable); // (undocumented) add(value: T): this; // (undocumented) clear(): void; // (undocumented) delete(value: T): boolean; // (undocumented) entries(): Generator<[T, T], undefined, unknown>; // (undocumented) forEach(callbackfn: (value: T, value2: T, set: AtomSet) => void, thisArg?: any): void; // (undocumented) has(value: T): boolean; // (undocumented) keys(): Generator; // (undocumented) get size(): number; // (undocumented) values(): Generator; } // @public export interface BaseRecord> { // (undocumented) readonly id: Id; // (undocumented) readonly typeName: TypeName; } // @public export type ChangeSource = 'remote' | 'user'; // @public export interface CollectionDiff { added?: Set; removed?: Set; } // @public export interface ComputedCache { get(id: IdOf): Data | undefined; } // @public export function createComputedCache, Result, Record extends StoreObjectRecordType = StoreObjectRecordType>(name: string, derive: (context: Context, record: Record) => Result | undefined, opts?: CreateComputedCacheOpts): { get(context: Context, id: IdOf): Result | undefined; }; // @public export interface CreateComputedCacheOpts { areRecordsEqual?(a: R, b: R): boolean; areResultsEqual?(a: Data, b: Data): boolean; } // @internal export function createEmptyRecordsDiff(): RecordsDiff; // @public export function createMigrationIds>(sequenceId: ID, versions: Versions): { [K in keyof Versions]: `${ID}/${Versions[K]}`; }; // @public export function createMigrationSequence({ sequence, sequenceId, retroactive, }: { retroactive?: boolean; sequence: Array; sequenceId: string; }): MigrationSequence; // @internal export function createRecordMigrationSequence(opts: { filter?(record: UnknownRecord): boolean; recordType: string; retroactive?: boolean; sequence: Omit, 'scope'>[]; sequenceId: string; }): MigrationSequence; // @public export function createRecordType(typeName: R['typeName'], config: { ephemeralKeys?: { readonly [K in Exclude]: boolean; }; scope: RecordScope; validator?: StoreValidator; }): RecordType>; // @public export function devFreeze(object: T): T; // @public export interface HistoryEntry { changes: RecordsDiff; source: ChangeSource; } // @public export type IdOf = R['id']; // @internal export class IncrementalSetConstructor { constructor( previousValue: Set); // @public add(item: T): void; // @public get(): { diff: CollectionDiff; value: Set; } | undefined; // @public remove(item: T): void; } // @public export function isRecordsDiffEmpty(diff: RecordsDiff): boolean; // @public export interface LegacyBaseMigrationsInfo { // (undocumented) currentVersion: number; // (undocumented) firstVersion: number; // (undocumented) migrators: { [version: number]: LegacyMigration; }; } // @public export interface LegacyMigration { // (undocumented) down: (newState: After) => Before; // (undocumented) up: (oldState: Before) => After; } // @public export interface LegacyMigrations extends LegacyBaseMigrationsInfo { // (undocumented) subTypeKey?: string; // (undocumented) subTypeMigrations?: Record; } // @public export type Migration = { readonly dependsOn?: readonly MigrationId[] | undefined; readonly id: MigrationId; } & ({ readonly down?: (newState: SerializedStore) => SerializedStore | void; readonly scope: 'store'; readonly up: (oldState: SerializedStore) => SerializedStore | void; } | { readonly down?: (newState: UnknownRecord) => UnknownRecord | void; readonly filter?: (record: UnknownRecord) => boolean; readonly scope: 'record'; readonly up: (oldState: UnknownRecord) => UnknownRecord | void; } | { readonly down?: never; readonly scope: 'storage'; readonly up: (storage: SynchronousRecordStorage) => void; }); // @public (undocumented) export const MigrationFailureReason: { readonly IncompatibleSubtype: 'incompatible-subtype'; readonly MigrationError: 'migration-error'; readonly TargetVersionTooNew: 'target-version-too-new'; readonly TargetVersionTooOld: 'target-version-too-old'; readonly UnknownType: 'unknown-type'; readonly UnrecognizedSubtype: 'unrecognized-subtype'; }; // @public (undocumented) export type MigrationFailureReason = (typeof MigrationFailureReason)[keyof typeof MigrationFailureReason]; // @public (undocumented) export namespace MigrationFailureReason { // (undocumented) export type IncompatibleSubtype = typeof MigrationFailureReason.IncompatibleSubtype; // (undocumented) export type MigrationError = typeof MigrationFailureReason.MigrationError; // (undocumented) export type TargetVersionTooNew = typeof MigrationFailureReason.TargetVersionTooNew; // (undocumented) export type TargetVersionTooOld = typeof MigrationFailureReason.TargetVersionTooOld; // (undocumented) export type UnknownType = typeof MigrationFailureReason.UnknownType; // (undocumented) export type UnrecognizedSubtype = typeof MigrationFailureReason.UnrecognizedSubtype; } // @public export type MigrationId = `${string}/${number}`; // @public export type MigrationResult = { reason: MigrationFailureReason; type: 'error'; } | { type: 'success'; value: T; }; // @public export interface MigrationSequence { retroactive: boolean; // (undocumented) sequence: Migration[]; // (undocumented) sequenceId: string; } // @internal export function parseMigrationId(id: MigrationId): { sequenceId: string; version: number; }; // @public (undocumented) export type QueryExpression = { [k in keyof R & string]?: R[k] extends boolean | null | number | string | undefined ? QueryValueMatcher : R[k] extends object ? QueryExpression : QueryValueMatcher; }; // @public export type QueryValueMatcher = { eq: T; } | { gt: number; } | { neq: T; }; // @public export type RecordFromId> = K extends RecordId ? R : never; // @public export type RecordId = string & { __type__: R; }; // @public export type RecordScope = 'document' | 'presence' | 'session'; // @public export interface RecordsDiff { added: Record, R>; removed: Record, R>; updated: Record, [from: R, to: R]>; } // @public export class RecordType> { constructor( typeName: R['typeName'], config: { readonly createDefaultProperties: () => Exclude, RequiredProperties>; readonly ephemeralKeys?: { readonly [K in Exclude]: boolean; }; readonly scope?: RecordScope; readonly validator?: StoreValidator; }); clone(record: R): R; create(properties: Expand & Omit, RequiredProperties>>): R; readonly createDefaultProperties: () => Exclude, RequiredProperties>; createId(customUniquePart?: string): IdOf; readonly ephemeralKeys?: { readonly [K in Exclude]: boolean; }; readonly ephemeralKeySet: ReadonlySet; isId(id?: string): id is IdOf; isInstance(record?: UnknownRecord): record is R; parseId(id: IdOf): string; readonly scope: RecordScope; readonly typeName: R['typeName']; validate(record: unknown, recordBefore?: R): R; readonly validator: StoreValidator; withDefaultProperties, 'id' | 'typeName'>>(createDefaultProperties: () => DefaultProps): RecordType>; } // @public export function reverseRecordsDiff(diff: RecordsDiff): RecordsDiff; // @public export type RSIndex = Computed, RSIndexDiff>; // @public export type RSIndexDiff = Map>>; // @public export type RSIndexMap = Map>>; // @public export type SerializedSchema = SerializedSchemaV1 | SerializedSchemaV2; // @public export interface SerializedSchemaV1 { recordVersions: Record; version: number; } | { version: number; }>; schemaVersion: 1; storeVersion: number; } // @public export interface SerializedSchemaV2 { // (undocumented) schemaVersion: 2; // (undocumented) sequences: { [sequenceId: string]: number; }; } // @public export type SerializedStore = Record, R>; // @public export function squashRecordDiffs(diffs: RecordsDiff[], options?: { mutateFirstDiff?: boolean; }): RecordsDiff; // @internal export function squashRecordDiffsMutable(target: RecordsDiff, diffs: RecordsDiff[], fromIndex?: number): void; // @public export interface StandaloneDependsOn { // (undocumented) readonly dependsOn: readonly MigrationId[]; } // @public export class Store { constructor(config: { props: Props; id?: string; schema: StoreSchema; initialData?: SerializedStore; }); // @internal (undocumented) addHistoryInterceptor(fn: (entry: HistoryEntry, source: ChangeSource) => void): () => void; allRecords(): R[]; // (undocumented) applyDiff(diff: RecordsDiff, { runCallbacks, ignoreEphemeralKeys, }?: { ignoreEphemeralKeys?: boolean; runCallbacks?: boolean; }): void; // @internal (undocumented) atomic(fn: () => T, runCallbacks?: boolean, isMergingRemoteChanges?: boolean): T; clear(): void; createCache(create: (id: IdOf, recordSignal: Signal) => Signal): { get: (id: IdOf) => Result | undefined; }; createComputedCache(name: string, derive: (record: Record) => Result | undefined, opts?: CreateComputedCacheOpts): ComputedCache; // (undocumented) dispose(): void; // @internal (undocumented) ensureStoreIsUsable(): void; extractingChanges(fn: () => void): RecordsDiff; filterChangesByScope(change: RecordsDiff, scope: RecordScope): { added: { [K in IdOf]: R; }; removed: { [K in IdOf]: R; }; updated: { [K in IdOf]: [from: R, to: R]; }; } | null; // (undocumented) _flushHistory(): void; get>(id: K): RecordFromId | undefined; getStoreSnapshot(scope?: 'all' | RecordScope): StoreSnapshot; has>(id: K): boolean; readonly history: Atom>; readonly id: string; // @internal (undocumented) isPossiblyCorrupted(): boolean; listen(onHistory: StoreListener, filters?: Partial): () => void; loadStoreSnapshot(snapshot: StoreSnapshot): void; // @internal (undocumented) markAsPossiblyCorrupted(): void; mergeRemoteChanges(fn: () => void): void; migrateSnapshot(snapshot: StoreSnapshot): StoreSnapshot; readonly props: Props; put(records: R[], phaseOverride?: 'initialize'): void; readonly query: StoreQueries; remove(ids: IdOf[]): void; readonly schema: StoreSchema; readonly scopedTypes: { readonly [K in RecordScope]: ReadonlySet; }; serialize(scope?: 'all' | RecordScope): SerializedStore; readonly sideEffects: StoreSideEffects; unsafeGetWithoutCapture>(id: K): RecordFromId | undefined; update>(id: K, updater: (record: RecordFromId) => RecordFromId): void; // (undocumented) validate(phase: 'createRecord' | 'initialize' | 'tests' | 'updateRecord'): void; } // @public export type StoreAfterChangeHandler = (prev: R, next: R, source: 'remote' | 'user') => void; // @public export type StoreAfterCreateHandler = (record: R, source: 'remote' | 'user') => void; // @public export type StoreAfterDeleteHandler = (record: R, source: 'remote' | 'user') => void; // @public export type StoreBeforeChangeHandler = (prev: R, next: R, source: 'remote' | 'user') => R; // @public export type StoreBeforeCreateHandler = (record: R, source: 'remote' | 'user') => R; // @public export type StoreBeforeDeleteHandler = (record: R, source: 'remote' | 'user') => false | void; // @public export interface StoreError { error: Error; isExistingValidationIssue: boolean; phase: 'createRecord' | 'initialize' | 'tests' | 'updateRecord'; recordAfter: unknown; recordBefore?: unknown; } // @public export type StoreListener = (entry: HistoryEntry) => void; // @public export interface StoreListenerFilters { scope: 'all' | RecordScope; source: 'all' | ChangeSource; } // @public export type StoreObject = { store: Store; } | Store; // @public export type StoreObjectRecordType> = Context extends Store ? R : Context extends { store: Store; } ? R : never; // @public export type StoreOperationCompleteHandler = (source: 'remote' | 'user') => void; // @public export class StoreQueries { // @internal constructor(recordMap: AtomMap, R>, history: Atom>); // @internal __uncached_createIndex(typeName: TypeName, path: string): RSIndex>; exec(typeName: TypeName, query: QueryExpression>): Array>; filterHistory(typeName: TypeName): Computed>>; // @internal (undocumented) getAllIdsForType(typeName: TypeName): Set>>; // @internal (undocumented) getRecordById(typeName: TypeName, id: IdOf>): Extract | undefined; ids(typeName: TypeName, queryCreator?: () => QueryExpression>, name?: string): Computed>>, CollectionDiff>>>; index(typeName: TypeName, path: string): RSIndex>; record(typeName: TypeName, queryCreator?: () => QueryExpression>, name?: string): Computed | undefined>; records(typeName: TypeName, queryCreator?: () => QueryExpression>, name?: string): Computed>>; } // @internal export type StoreRecord> = S extends Store ? R : never; // @public export class StoreSchema { static create(types: { [TypeName in R['typeName']]: { createId: any; }; }, options?: StoreSchemaOptions): StoreSchema; // @internal createIntegrityChecker(store: Store): (() => void) | undefined; getMigrationsSince(persistedSchema: SerializedSchema): Result; // @internal getType(typeName: string): RecordType; migratePersistedRecord(record: R, persistedSchema: SerializedSchema, direction?: 'down' | 'up'): MigrationResult; // (undocumented) migrateStorage(storage: SynchronousStorage): void; migrateStoreSnapshot(snapshot: StoreSnapshot, opts?: { mutateInputStore?: boolean; }): MigrationResult>; // (undocumented) readonly migrations: Record; serialize(): SerializedSchemaV2; // @internal @deprecated serializeEarliestVersion(): SerializedSchema; // (undocumented) readonly sortedMigrations: readonly Migration[]; // (undocumented) readonly types: { [Record in R as Record['typeName']]: RecordType; }; validateRecord(store: Store, record: R, phase: 'createRecord' | 'initialize' | 'tests' | 'updateRecord', recordBefore: null | R): R; } // @public export interface StoreSchemaOptions { // @internal (undocumented) createIntegrityChecker?(store: Store): void; // (undocumented) migrations?: MigrationSequence[]; // (undocumented) onValidationFailure?(data: StoreValidationFailure): R; } // @public export class StoreSideEffects { constructor(store: Store); // @internal handleAfterChange(prev: R, next: R, source: 'remote' | 'user'): void; // @internal handleAfterCreate(record: R, source: 'remote' | 'user'): void; // @internal handleAfterDelete(record: R, source: 'remote' | 'user'): void; // @internal handleBeforeChange(prev: R, next: R, source: 'remote' | 'user'): R; // @internal handleBeforeCreate(record: R, source: 'remote' | 'user'): R; // @internal handleBeforeDelete(record: R, source: 'remote' | 'user'): boolean; // @internal handleOperationComplete(source: 'remote' | 'user'): void; // @internal isEnabled(): boolean; // @internal register(handlersByType: { [T in R as T['typeName']]?: { afterChange?: StoreAfterChangeHandler; afterCreate?: StoreAfterCreateHandler; afterDelete?: StoreAfterDeleteHandler; beforeChange?: StoreBeforeChangeHandler; beforeCreate?: StoreBeforeCreateHandler; beforeDelete?: StoreBeforeDeleteHandler; }; }): () => void; registerAfterChangeHandler(typeName: T, handler: StoreAfterChangeHandler): () => void; registerAfterCreateHandler(typeName: T, handler: StoreAfterCreateHandler): () => void; registerAfterDeleteHandler(typeName: T, handler: StoreAfterDeleteHandler): () => void; registerBeforeChangeHandler(typeName: T, handler: StoreBeforeChangeHandler): () => void; registerBeforeCreateHandler(typeName: T, handler: StoreBeforeCreateHandler): () => void; registerBeforeDeleteHandler(typeName: T, handler: StoreBeforeDeleteHandler): () => void; registerOperationCompleteHandler(handler: StoreOperationCompleteHandler): () => void; // @internal setIsEnabled(enabled: boolean): void; } // @public export interface StoreSnapshot { schema: SerializedSchema; store: SerializedStore; } // @public export interface StoreValidationFailure { // (undocumented) error: unknown; // (undocumented) phase: 'createRecord' | 'initialize' | 'tests' | 'updateRecord'; // (undocumented) record: R; // (undocumented) recordBefore: null | R; // (undocumented) store: Store; } // @public export interface StoreValidator { validate(record: unknown): R; validateUsingKnownGoodVersion?(knownGoodVersion: R, record: unknown): R; } // @public export type StoreValidators = { [K in R['typeName']]: StoreValidator>; }; // @public export interface SynchronousRecordStorage { // (undocumented) delete(id: string): void; // (undocumented) entries(): Iterable<[string, R]>; // (undocumented) get(id: string): R | undefined; // (undocumented) keys(): Iterable; // (undocumented) set(id: string, record: R): void; // (undocumented) values(): Iterable; } // @public export interface SynchronousStorage extends SynchronousRecordStorage { // (undocumented) getSchema(): SerializedSchema; // (undocumented) setSchema(schema: SerializedSchema): void; } // @public export type UnknownRecord = BaseRecord>; // (No @packageDocumentation comment for this package) ```