@mocanvas/store 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +37 -0
- package/dist/index.d.ts +607 -0
- package/dist/index.js +1261 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ids.ts","../src/indexKey.ts","../src/zkey.ts","../src/RecordsDiff.ts","../src/migrate.ts","../src/StoreSchema.ts","../src/Store.ts","../src/tldr.ts"],"names":["BASE_62","isPlainObject"],"mappings":"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","file":"index.js","sourcesContent":["import { nanoid } from \"nanoid\"\n\n/** Length of the unique part of a generated record id. */\nexport const UNIQUE_ID_LENGTH = 21\n\n/** Generate a URL-safe unique id (21 chars by default). */\nexport function uniqueId(size: number = UNIQUE_ID_LENGTH): string {\n return nanoid(size)\n}\n\n/**\n * A branded string id. The brand carries the record type so that ids of\n * different record types cannot be mixed up at compile time.\n */\nexport type RecordId<R extends UnknownRecord> = string & { __type__: R }\n\n/** Every record has an id and a type name. */\nexport interface BaseRecord<TypeName extends string, Id extends RecordId<UnknownRecord>> {\n readonly id: Id\n readonly typeName: TypeName\n}\n\nexport type UnknownRecord = BaseRecord<string, RecordId<UnknownRecord>>\n\nexport type IdOf<R extends UnknownRecord> = R[\"id\"]\n\n/** Extract the record type an id refers to. */\nexport type RecordFromId<K extends RecordId<UnknownRecord>> = K extends RecordId<infer R> ? R : never\n\n/**\n * Where a record lives:\n * - `document`: persisted, shared between collaborators (shapes, pages, ...)\n * - `session`: persisted locally only (camera, current page, ...)\n * - `presence`: shared but never persisted (cursors, ...)\n */\nexport type RecordScope = \"document\" | \"session\" | \"presence\"\n\nexport interface StoreValidator<R extends UnknownRecord> {\n validate(record: unknown): R\n /**\n * Optional fast path: validate `newRecord` knowing that `knownGoodVersion`\n * is a valid record of the same type. Implementations may skip the parts\n * that did not change.\n */\n validateUsingKnownGoodVersion?(knownGoodVersion: R, newRecord: unknown): R\n}\n\n/** Keys of `R` that hold data (everything except `id` and `typeName`). */\nexport type RecordDataKeys<R extends UnknownRecord> = Exclude<keyof R, \"id\" | \"typeName\">\n\nexport type EphemeralKeys<R extends UnknownRecord> = { readonly [K in RecordDataKeys<R>]: boolean }\n\nexport interface RecordTypeConfig<R extends UnknownRecord> {\n readonly scope: RecordScope\n readonly validator?: StoreValidator<R> | undefined\n /**\n * Keys whose changes should not be considered \"real\" document changes,\n * e.g. transient UI flags. Used by `Store.applyDiff({ ignoreEphemeralKeys })`.\n */\n readonly ephemeralKeys?: EphemeralKeys<R> | undefined\n}\n\n/**\n * Properties the caller must pass to `create()`: the record's data keys minus\n * whatever `withDefaultProperties` provides. `id` is always optional.\n */\nexport type RecordCreateProps<R extends UnknownRecord, RequiredProps extends keyof R> = Pick<\n R,\n RequiredProps\n> &\n Partial<Omit<R, RequiredProps | \"typeName\">>\n\n/**\n * Describes one kind of record in the store: how to make ids, defaults,\n * validation, and where the record lives (its scope).\n */\nexport class RecordType<R extends UnknownRecord, RequiredProps extends keyof R = RecordDataKeys<R>> {\n readonly typeName: R[\"typeName\"]\n readonly scope: RecordScope\n readonly validator: StoreValidator<R> | undefined\n readonly ephemeralKeys: EphemeralKeys<R> | undefined\n readonly ephemeralKeySet: ReadonlySet<string>\n\n constructor(\n typeName: R[\"typeName\"],\n private readonly config: RecordTypeConfig<R> & {\n readonly createDefaultProperties: () => Partial<Omit<R, \"id\" | \"typeName\">>\n },\n ) {\n this.typeName = typeName\n this.scope = config.scope\n this.validator = config.validator\n this.ephemeralKeys = config.ephemeralKeys\n const ephemeral = new Set<string>()\n if (config.ephemeralKeys) {\n for (const [key, value] of Object.entries(config.ephemeralKeys)) {\n if (value) ephemeral.add(key)\n }\n }\n this.ephemeralKeySet = ephemeral\n }\n\n /** Create a new record with defaults applied. A fresh id is generated when none is given. */\n create(properties: RecordCreateProps<R, RequiredProps>): R {\n const result: Record<string, unknown> = {\n ...this.config.createDefaultProperties(),\n ...(properties as Record<string, unknown>),\n }\n if (result[\"id\"] === undefined) result[\"id\"] = this.createId()\n result[\"typeName\"] = this.typeName\n return result as R\n }\n\n /** Shallow-clone a record (props/meta are shared). */\n clone(record: R): R {\n return { ...record }\n }\n\n /** Make an id of this type: `${typeName}:${uniquePart}`. */\n createId(customUniquePart?: string): IdOf<R> {\n return `${this.typeName}:${customUniquePart ?? uniqueId()}` as IdOf<R>\n }\n\n /** Recover the unique part of an id of this type. */\n parseId(id: IdOf<R>): string {\n if (!this.isId(id)) {\n throw new Error(`Id ${JSON.stringify(id)} is not a ${this.typeName} id`)\n }\n return (id as string).slice(this.typeName.length + 1)\n }\n\n isId(id?: string): id is IdOf<R> {\n if (typeof id !== \"string\") return false\n if (id.length <= this.typeName.length + 1) return false\n if (id.charCodeAt(this.typeName.length) !== 58 /* ':' */) return false\n return id.startsWith(this.typeName)\n }\n\n isInstance(record?: unknown): record is R {\n return (\n typeof record === \"object\" &&\n record !== null &&\n (record as { typeName?: unknown }).typeName === this.typeName\n )\n }\n\n /**\n * Return a new RecordType whose `create()` fills in the given defaults, so\n * those properties become optional for callers.\n */\n withDefaultProperties<DefaultProps extends RecordDataKeys<R>>(\n createDefaultProperties: () => Pick<R, DefaultProps>,\n ): RecordType<R, Exclude<RequiredProps, DefaultProps>> {\n return new RecordType<R, Exclude<RequiredProps, DefaultProps>>(this.typeName, {\n scope: this.scope,\n validator: this.validator,\n ephemeralKeys: this.ephemeralKeys,\n createDefaultProperties: createDefaultProperties as () => Partial<Omit<R, \"id\" | \"typeName\">>,\n })\n }\n\n /** Run the validator (if any). Throws on invalid input. */\n validate(record: unknown, recordBefore?: R): R {\n if (!this.validator) return record as R\n if (recordBefore !== undefined && this.validator.validateUsingKnownGoodVersion) {\n return this.validator.validateUsingKnownGoodVersion(recordBefore, record)\n }\n return this.validator.validate(record)\n }\n}\n\n/**\n * Define a record type.\n *\n * ```ts\n * const Book = createRecordType<Book>('book', { scope: 'document' })\n * .withDefaultProperties(() => ({ inStock: true }))\n * const b = Book.create({ title: 'Dune' }) // -> { id: 'book:...', typeName: 'book', title, inStock }\n * ```\n */\nexport function createRecordType<R extends UnknownRecord>(\n typeName: R[\"typeName\"],\n config: RecordTypeConfig<R>,\n): RecordType<R, RecordDataKeys<R>> {\n return new RecordType<R, RecordDataKeys<R>>(typeName, {\n scope: config.scope,\n validator: config.validator,\n ephemeralKeys: config.ephemeralKeys,\n createDefaultProperties: () => ({}),\n })\n}\n\n/** Split any `${typeName}:${unique}` id into its parts. */\nexport function parseRecordId(id: string): { typeName: string; uniquePart: string } {\n const colon = id.indexOf(\":\")\n if (colon <= 0 || colon === id.length - 1) {\n throw new Error(`Malformed record id ${JSON.stringify(id)}`)\n }\n return { typeName: id.slice(0, colon), uniquePart: id.slice(colon + 1) }\n}\n\n/** Assert that `value` looks like a record: an object with string `id` and `typeName`. */\nexport function isRecordLike(value: unknown): value is UnknownRecord {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { id?: unknown }).id === \"string\" &&\n typeof (value as { typeName?: unknown }).typeName === \"string\"\n )\n}\n","import { generateKeyBetween, generateNKeysBetween } from \"fractional-indexing\"\n\n/**\n * A fractional index: an order key that sorts lexicographically (plain string\n * comparison) and between which new keys can always be generated.\n */\nexport type IndexKey = string & { __brand: \"indexKey\" }\n\n/** The conventional first key. */\nexport const ZERO_INDEX_KEY = \"a0\" as IndexKey\n\nfunction assertOrdered(below: IndexKey | undefined, above: IndexKey | undefined) {\n if (below !== undefined && above !== undefined && !(below < above)) {\n throw new Error(`Index keys out of order: ${JSON.stringify(below)} must be below ${JSON.stringify(above)}`)\n }\n}\n\n/** Generate a key strictly between `below` and `above`; either may be omitted. Throws when `below >= above`. */\nexport function getIndexBetween(below?: IndexKey | undefined, above?: IndexKey | undefined): IndexKey {\n assertOrdered(below, above)\n return generateKeyBetween(below ?? null, above ?? null) as IndexKey\n}\n\n/** Generate a key strictly above `below` (or a first key when omitted). */\nexport function getIndexAbove(below?: IndexKey | undefined): IndexKey {\n return generateKeyBetween(below ?? null, null) as IndexKey\n}\n\n/** Generate a key strictly below `above` (or a first key when omitted). */\nexport function getIndexBelow(above?: IndexKey | undefined): IndexKey {\n return generateKeyBetween(null, above ?? null) as IndexKey\n}\n\n/** Generate `n` sorted keys strictly between `below` and `above`. */\nexport function getIndicesBetween(\n below: IndexKey | undefined,\n above: IndexKey | undefined,\n n: number,\n): IndexKey[] {\n assertOrdered(below, above)\n return generateNKeysBetween(below ?? null, above ?? null, n) as IndexKey[]\n}\n\n/** Generate `n` sorted keys strictly above `below`. */\nexport function getIndicesAbove(below: IndexKey | undefined, n: number): IndexKey[] {\n return generateNKeysBetween(below ?? null, null, n) as IndexKey[]\n}\n\n/** Generate `n` sorted keys strictly below `above`. */\nexport function getIndicesBelow(above: IndexKey | undefined, n: number): IndexKey[] {\n return generateNKeysBetween(null, above ?? null, n) as IndexKey[]\n}\n\n/**\n * Generate `n` sorted keys, the first of which is `start` (default `a0`).\n * Useful when creating `n` items at once.\n */\nexport function getIndices(n: number, start: IndexKey = ZERO_INDEX_KEY): IndexKey[] {\n if (n <= 0) return []\n validateIndexKey(start)\n return [start, ...getIndicesAbove(start, n - 1)]\n}\n\n/** Return a sorted copy of `items` ordered by their `index` (stable). */\nexport function sortByIndex<T extends { index: IndexKey }>(items: readonly T[]): T[] {\n return items\n .map((item, i) => [item, i] as const)\n .sort(([a, ai], [b, bi]) => {\n if (a.index < b.index) return -1\n if (a.index > b.index) return 1\n return ai - bi\n })\n .map(([item]) => item)\n}\n\n/** Compare two keys: negative, zero, or positive. */\nexport function compareIndexKeys(a: IndexKey, b: IndexKey): number {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\nconst BASE_62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nconst IS_DIGIT = new Uint8Array(128)\nfor (let i = 0; i < BASE_62.length; i++) IS_DIGIT[BASE_62.charCodeAt(i)] = 1\n\n/**\n * Length of the integer part (head marker included) encoded by a head\n * character, or -1 when the character is not a head marker.\n * `a`..`z` mark positive integer parts of length 2..27, `Z`..`A` negative ones.\n */\nfunction integerPartLength(head: number): number {\n if (head >= 97 && head <= 122) return head - 97 + 2 // a..z\n if (head >= 65 && head <= 90) return 90 - head + 2 // A..Z\n return -1\n}\n\n/**\n * Throws if `key` is not a well-formed fractional index key: a head marker,\n * enough base-62 integer digits for that head, then an optional fraction of\n * base-62 digits that does not end in `0`.\n * Narrows the type on success.\n */\nexport function validateIndexKey(key: string): asserts key is IndexKey {\n const fail = (why: string): never => {\n throw new Error(`Invalid index key ${JSON.stringify(key)}: ${why}`)\n }\n if (typeof key !== \"string\" || key.length === 0) fail(\"empty\")\n const intLen = integerPartLength(key.charCodeAt(0))\n if (intLen < 0) fail(\"bad head marker\")\n if (key.length < intLen) fail(`integer part needs ${intLen - 1} digits`)\n for (let i = 1; i < key.length; i++) {\n const c = key.charCodeAt(i)\n if (c > 127 || IS_DIGIT[c] !== 1) fail(`bad digit at ${i}`)\n }\n if (key.length > intLen && key.endsWith(\"0\")) fail(\"fraction ends in 0\")\n}\n\n/** Non-throwing variant of `validateIndexKey`. */\nexport function isIndexKey(key: unknown): key is IndexKey {\n if (typeof key !== \"string\") return false\n try {\n validateIndexKey(key)\n return true\n } catch {\n return false\n }\n}\n","import type { IndexKey } from \"./indexKey\"\n\n/**\n * Convert a fractional index key into a 64-bit unsigned sortable integer,\n * returned as two uint32 words `[lo, hi]` for transport into WASM memory.\n *\n * Key anatomy (fractional-indexing spec): the first character is a *head*\n * marker drawn from `A..Z` (negative integer parts, `Z` shortest) and `a..z`\n * (positive integer parts, `a` shortest). It encodes the length of the\n * integer part; the remaining characters are base-62 digits (integer digits\n * followed by fractional digits, no trailing `0` in the fraction).\n *\n * Because the head already sorts integer parts by length and sign, the\n * lexicographic order of two keys is: head rank first, then the digit string\n * compared as a zero-padded fixed-point fraction. We encode exactly that:\n *\n * zkey = headRank * 62^10 + Σ digit[i] * 62^(9 - i) for i in 0..9\n *\n * with headRank in 0..51 (`A`=0 … `Z`=25, `a`=26 … `z`=51). The maximum value\n * is 52 * 62^10 - 1 ≈ 4.36e18 < 2^64, so it fits in 64 bits. Ten base-62\n * digits after the head are significant; keys that agree on those ten digits\n * tie, which only happens for keys sharing a long common prefix.\n */\n\nconst BASE_62 = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nconst HEADS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n\n/** Number of base-62 digits (after the head marker) that affect the zkey. */\nexport const ZKEY_SIGNIFICANT_DIGITS = 10\n\nconst DIGIT_VALUE = new Int8Array(128).fill(-1)\nfor (let i = 0; i < BASE_62.length; i++) DIGIT_VALUE[BASE_62.charCodeAt(i)] = i\n\nconst HEAD_RANK = new Int8Array(128).fill(-1)\nfor (let i = 0; i < HEADS.length; i++) HEAD_RANK[HEADS.charCodeAt(i)] = i\n\nconst B = 62n\nconst B10 = B ** BigInt(ZKEY_SIGNIFICANT_DIGITS)\nconst MASK_32 = 0xffff_ffffn\n\nexport type ZKey = readonly [lo: number, hi: number]\n\nexport function indexKeyToZKey(key: IndexKey): [lo: number, hi: number] {\n if (key.length === 0) throw new Error(\"Cannot convert an empty index key\")\n const headRank = HEAD_RANK[key.charCodeAt(0)] ?? -1\n if (headRank < 0) throw new Error(`Invalid index key head in ${JSON.stringify(key)}`)\n\n let fraction = 0n\n const n = Math.min(key.length - 1, ZKEY_SIGNIFICANT_DIGITS)\n for (let i = 0; i < n; i++) {\n const d = DIGIT_VALUE[key.charCodeAt(i + 1)] ?? -1\n if (d < 0) throw new Error(`Invalid index key digit in ${JSON.stringify(key)}`)\n fraction = fraction * B + BigInt(d)\n }\n // Pad remaining digit positions with zero so shorter keys sort first.\n for (let i = n; i < ZKEY_SIGNIFICANT_DIGITS; i++) fraction *= B\n\n const value = BigInt(headRank) * B10 + fraction\n const lo = Number(value & MASK_32)\n const hi = Number((value >> 32n) & MASK_32)\n return [lo, hi]\n}\n\n/** Recombine a zkey into a BigInt (mostly for tests and debugging). */\nexport function zKeyToBigInt([lo, hi]: ZKey): bigint {\n return (BigInt(hi) << 32n) | BigInt(lo)\n}\n\n/** Compare two zkeys as unsigned 64-bit integers. */\nexport function compareZKeys(a: ZKey, b: ZKey): number {\n if (a[1] !== b[1]) return a[1] < b[1] ? -1 : 1\n if (a[0] !== b[0]) return a[0] < b[0] ? -1 : 1\n return 0\n}\n","import type { IdOf, UnknownRecord } from \"./ids\"\n\n/** A set of changes to a store's records. */\nexport interface RecordsDiff<R extends UnknownRecord> {\n added: Record<IdOf<R>, R>\n updated: Record<IdOf<R>, [from: R, to: R]>\n removed: Record<IdOf<R>, R>\n}\n\nexport function createEmptyRecordsDiff<R extends UnknownRecord>(): RecordsDiff<R> {\n return { added: {}, updated: {}, removed: {} } as RecordsDiff<R>\n}\n\nexport function isRecordsDiffEmpty<R extends UnknownRecord>(diff: RecordsDiff<R>): boolean {\n for (const _ in diff.added) return false\n for (const _ in diff.updated) return false\n for (const _ in diff.removed) return false\n return true\n}\n\n/** Produce the diff that undoes `diff`. */\nexport function reverseRecordsDiff<R extends UnknownRecord>(diff: RecordsDiff<R>): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const id in diff.added) {\n result.removed[id as IdOf<R>] = diff.added[id as IdOf<R>]!\n }\n for (const id in diff.removed) {\n result.added[id as IdOf<R>] = diff.removed[id as IdOf<R>]!\n }\n for (const id in diff.updated) {\n const [from, to] = diff.updated[id as IdOf<R>]!\n result.updated[id as IdOf<R>] = [to, from]\n }\n return result\n}\n\n/**\n * Record that `id` went from `before` to `after` in `target`, collapsing with\n * any change already recorded for the same id:\n *\n * added + updated -> added (latest)\n * added + removed -> (nothing)\n * updated + updated -> updated [original from, latest to]\n * updated + removed -> removed (original from)\n * removed + added -> updated [removed, added] (or nothing if identical)\n */\nexport function applyChangeToDiff<R extends UnknownRecord>(\n target: RecordsDiff<R>,\n id: IdOf<R>,\n before: R | undefined,\n after: R | undefined,\n): void {\n if (before === undefined && after === undefined) return\n\n if (id in target.added) {\n if (after === undefined) {\n delete target.added[id]\n } else {\n target.added[id] = after\n }\n return\n }\n\n if (id in target.updated) {\n const [from] = target.updated[id]!\n if (after === undefined) {\n delete target.updated[id]\n target.removed[id] = from\n } else if (from === after) {\n delete target.updated[id]\n } else {\n target.updated[id] = [from, after]\n }\n return\n }\n\n if (id in target.removed) {\n const original = target.removed[id]!\n if (after === undefined) return // removed twice: keep original\n delete target.removed[id]\n if (original !== after) target.updated[id] = [original, after]\n return\n }\n\n // No prior entry for this id.\n if (before === undefined) {\n if (after !== undefined) target.added[id] = after\n } else if (after === undefined) {\n target.removed[id] = before\n } else if (before !== after) {\n target.updated[id] = [before, after]\n }\n}\n\n/** Merge `diff` into `target` in place (see `applyChangeToDiff` for the rules). */\nexport function squashRecordDiffsMutable<R extends UnknownRecord>(\n target: RecordsDiff<R>,\n diff: RecordsDiff<R>,\n): void {\n for (const id in diff.added) {\n applyChangeToDiff(target, id as IdOf<R>, undefined, diff.added[id as IdOf<R>]!)\n }\n for (const id in diff.updated) {\n const [from, to] = diff.updated[id as IdOf<R>]!\n applyChangeToDiff(target, id as IdOf<R>, from, to)\n }\n for (const id in diff.removed) {\n applyChangeToDiff(target, id as IdOf<R>, diff.removed[id as IdOf<R>]!, undefined)\n }\n}\n\n/** Squash a sequence of diffs into one equivalent diff (does not mutate inputs). */\nexport function squashRecordDiffs<R extends UnknownRecord>(diffs: readonly RecordsDiff<R>[]): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const diff of diffs) squashRecordDiffsMutable(result, diff)\n return result\n}\n\n/** Shallow-copy a diff (entries are shared). */\nexport function cloneRecordsDiff<R extends UnknownRecord>(diff: RecordsDiff<R>): RecordsDiff<R> {\n return {\n added: { ...diff.added },\n updated: { ...diff.updated },\n removed: { ...diff.removed },\n } as RecordsDiff<R>\n}\n","import type { IdOf, UnknownRecord } from \"./ids\"\n\n/** Serialized records keyed by id. */\nexport type SerializedStore<R extends UnknownRecord> = Record<IdOf<R>, R>\n\n/**\n * Persisted description of a schema: for each migration sequence, how many\n * migrations had been applied when the data was saved.\n */\nexport interface SerializedSchemaV2 {\n schemaVersion: 2\n sequences: { [sequenceId: string]: number }\n}\n\nexport type SerializedSchema = SerializedSchemaV2\n\nexport type MigrationId = `${string}/${number}`\n\nexport interface RecordMigration {\n readonly id: MigrationId\n readonly scope: \"record\"\n /** Only records for which this returns true are migrated. Defaults to all records. */\n readonly filter?: ((record: UnknownRecord) => boolean) | undefined\n /** Mutate the record in place, or return a replacement. */\n readonly up: (record: UnknownRecord) => void | UnknownRecord\n readonly down?: ((record: UnknownRecord) => void | UnknownRecord) | undefined\n}\n\nexport interface StoreMigration {\n readonly id: MigrationId\n readonly scope: \"store\"\n /** Mutate the store in place, or return a replacement. */\n readonly up: (store: SerializedStore<UnknownRecord>) => void | SerializedStore<UnknownRecord>\n readonly down?:\n | ((store: SerializedStore<UnknownRecord>) => void | SerializedStore<UnknownRecord>)\n | undefined\n}\n\nexport type Migration = RecordMigration | StoreMigration\n\nexport interface MigrationSequence {\n readonly sequenceId: string\n /**\n * When data is loaded that has never seen this sequence, should every\n * migration be applied (`true`, the default) or should the data be assumed\n * already up to date (`false`)? Use `false` for sequences added to a type\n * that already existed before the sequence did.\n */\n readonly retroactive: boolean\n readonly sequence: readonly Migration[]\n}\n\nexport type MigrationResult<T> = { type: \"success\"; value: T } | { type: \"error\"; reason: string }\n\n/**\n * Build the ids of a sequence's migrations from friendly names:\n *\n * ```ts\n * const Versions = createMigrationIds('com.example.shape.box', { AddColor: 1, AddSize: 2 })\n * // Versions.AddColor === 'com.example.shape.box/1'\n * ```\n */\nexport function createMigrationIds<const ID extends string, const Versions extends Record<string, number>>(\n sequenceId: ID,\n versions: Versions,\n): { readonly [K in keyof Versions]: `${ID}/${Versions[K]}` } {\n const result: Record<string, string> = {}\n for (const [name, version] of Object.entries(versions)) {\n result[name] = `${sequenceId}/${version}`\n }\n return result as { readonly [K in keyof Versions]: `${ID}/${Versions[K]}` }\n}\n\nexport function parseMigrationId(id: string): { sequenceId: string; version: number } {\n const slash = id.lastIndexOf(\"/\")\n if (slash <= 0) throw new Error(`Malformed migration id ${JSON.stringify(id)}`)\n const version = Number(id.slice(slash + 1))\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(`Malformed migration id ${JSON.stringify(id)}: version must be a positive integer`)\n }\n return { sequenceId: id.slice(0, slash), version }\n}\n\n/**\n * Create a validated migration sequence. Migration ids must be\n * `${sequenceId}/1`, `${sequenceId}/2`, ... in order.\n */\nexport function createMigrationSequence(options: {\n sequenceId: string\n retroactive?: boolean | undefined\n sequence: readonly Migration[]\n}): MigrationSequence {\n const { sequenceId, retroactive = true, sequence } = options\n if (!sequenceId || sequenceId.includes(\"/\")) {\n throw new Error(`Invalid sequenceId ${JSON.stringify(sequenceId)}: must be non-empty and not contain \"/\"`)\n }\n sequence.forEach((migration, i) => {\n const id = migration.id\n const parsed = parseMigrationId(id)\n if (parsed.sequenceId !== sequenceId) {\n throw new Error(`Migration ${id} does not belong to sequence ${sequenceId}`)\n }\n if (parsed.version !== i + 1) {\n throw new Error(`Migration ${id} is out of order: expected version ${i + 1}`)\n }\n const scope: string = migration.scope\n if (scope !== \"record\" && scope !== \"store\") {\n throw new Error(`Migration ${id} has invalid scope ${JSON.stringify(scope)}`)\n }\n })\n return { sequenceId, retroactive, sequence: [...sequence] }\n}\n\n/**\n * Convenience for the common case: a sequence of record-scoped migrations\n * that all apply to one record type (optionally narrowed further by `filter`).\n */\nexport function createRecordMigrationSequence(options: {\n sequenceId: string\n recordType: string\n retroactive?: boolean | undefined\n filter?: ((record: UnknownRecord) => boolean) | undefined\n sequence: readonly Omit<RecordMigration, \"scope\" | \"filter\">[]\n}): MigrationSequence {\n const { recordType, filter } = options\n const combinedFilter = (record: UnknownRecord) =>\n record.typeName === recordType && (filter ? filter(record) : true)\n return createMigrationSequence({\n sequenceId: options.sequenceId,\n retroactive: options.retroactive,\n sequence: options.sequence.map(\n (m): RecordMigration => ({ id: m.id, scope: \"record\", filter: combinedFilter, up: m.up, down: m.down }),\n ),\n })\n}\n\n/** Apply one record migration to a single record, honoring its filter. */\nexport function applyRecordMigration(\n migration: RecordMigration,\n record: UnknownRecord,\n direction: \"up\" | \"down\",\n): UnknownRecord {\n if (migration.filter && !migration.filter(record)) return record\n const fn = direction === \"up\" ? migration.up : migration.down\n if (!fn) throw new Error(`Migration ${migration.id} has no ${direction} function`)\n const result = fn(record)\n return result === undefined ? record : result\n}\n\n/** Apply one migration (record- or store-scoped) to a whole store in place. */\nexport function applyMigrationToStore(\n migration: Migration,\n store: SerializedStore<UnknownRecord>,\n direction: \"up\" | \"down\",\n): SerializedStore<UnknownRecord> {\n if (migration.scope === \"store\") {\n const fn = direction === \"up\" ? migration.up : migration.down\n if (!fn) throw new Error(`Migration ${migration.id} has no ${direction} function`)\n const result = fn(store)\n return result === undefined ? store : result\n }\n for (const id in store) {\n const record = store[id as IdOf<UnknownRecord>]!\n const next = applyRecordMigration(migration, record, direction)\n if (next !== record) store[id as IdOf<UnknownRecord>] = next\n }\n return store\n}\n","import type { IdOf, RecordScope, RecordType, UnknownRecord } from \"./ids\"\nimport {\n applyMigrationToStore,\n applyRecordMigration,\n type Migration,\n type MigrationResult,\n type MigrationSequence,\n type SerializedSchema,\n type SerializedStore,\n} from \"./migrate\"\nimport type { Store } from \"./Store\"\n\nexport type StoreValidationPhase = \"initialize\" | \"createRecord\" | \"updateRecord\" | \"tests\"\n\nexport type RecordTypeMap<R extends UnknownRecord> = {\n readonly [TypeName in R[\"typeName\"]]: RecordType<Extract<R, { typeName: TypeName }>, any>\n}\n\nexport interface StoreValidationFailure<R extends UnknownRecord> {\n error: unknown\n store: Store<R, any>\n record: R\n phase: StoreValidationPhase\n recordBefore: R | null\n}\n\nexport interface StoreSchemaOptions<R extends UnknownRecord, Props> {\n readonly migrations?: readonly MigrationSequence[] | undefined\n /**\n * Called when a record fails validation. Return a repaired record to keep\n * going, or throw to abort the operation. When omitted the error is thrown.\n */\n readonly onValidationFailure?: ((data: StoreValidationFailure<R>) => R) | undefined\n /** Reserved for store-level integrity checks; unused by the schema itself. */\n readonly createIntegrityChecker?: ((store: Store<R, Props>) => void) | undefined\n}\n\nexport interface StoreSnapshot<R extends UnknownRecord> {\n store: SerializedStore<R>\n schema: SerializedSchema\n}\n\n/**\n * The set of record types a store holds plus the migrations that bring\n * persisted data up to date.\n */\nexport class StoreSchema<R extends UnknownRecord, Props = unknown> {\n static create<R extends UnknownRecord, Props = unknown>(\n types: RecordTypeMap<R>,\n options?: StoreSchemaOptions<R, Props>,\n ): StoreSchema<R, Props> {\n return new StoreSchema<R, Props>(types, options ?? {})\n }\n\n readonly migrations: Readonly<Record<string, MigrationSequence>>\n /** All migrations in application order (sequence registration order, then version). */\n readonly sortedMigrations: readonly Migration[]\n private readonly typeByName: ReadonlyMap<string, RecordType<R, any>>\n\n private constructor(\n readonly types: RecordTypeMap<R>,\n private readonly options: StoreSchemaOptions<R, Props>,\n ) {\n const byName = new Map<string, RecordType<R, any>>()\n for (const [name, type] of Object.entries(types) as [string, RecordType<R, any>][]) {\n if (type.typeName !== name) {\n throw new Error(`Record type registered under \"${name}\" has typeName \"${type.typeName}\"`)\n }\n byName.set(name, type)\n }\n this.typeByName = byName\n\n const migrations: Record<string, MigrationSequence> = {}\n const sorted: Migration[] = []\n const seenIds = new Set<string>()\n for (const sequence of options.migrations ?? []) {\n if (migrations[sequence.sequenceId]) {\n throw new Error(`Duplicate migration sequence \"${sequence.sequenceId}\"`)\n }\n migrations[sequence.sequenceId] = sequence\n for (const migration of sequence.sequence) {\n if (seenIds.has(migration.id)) throw new Error(`Duplicate migration id \"${migration.id}\"`)\n seenIds.add(migration.id)\n sorted.push(migration)\n }\n }\n this.migrations = migrations\n this.sortedMigrations = sorted\n }\n\n getType(typeName: string): RecordType<R, any> | undefined {\n return this.typeByName.get(typeName)\n }\n\n /** Scope of a record type; unknown types are treated as `document`. */\n getScope(typeName: string): RecordScope {\n return this.typeByName.get(typeName)?.scope ?? \"document\"\n }\n\n /**\n * Validate a record, delegating to its record type's validator. Records of\n * unknown types are passed through untouched so that foreign data survives\n * a load/save round-trip.\n */\n validateRecord(\n store: Store<R, any>,\n record: R,\n phase: StoreValidationPhase,\n recordBefore: R | undefined,\n ): R {\n const type = this.typeByName.get(record.typeName)\n if (!type) return record\n try {\n return type.validate(record, recordBefore)\n } catch (error) {\n if (this.options.onValidationFailure) {\n return this.options.onValidationFailure({\n error,\n store,\n record,\n phase,\n recordBefore: recordBefore ?? null,\n })\n }\n throw error\n }\n }\n\n /** The current version of every sequence. */\n serialize(): SerializedSchema {\n const sequences: Record<string, number> = {}\n for (const sequence of Object.values(this.migrations)) {\n sequences[sequence.sequenceId] = sequence.sequence.length\n }\n return { schemaVersion: 2, sequences }\n }\n\n /** A schema at version 0 of every sequence (all migrations still pending). */\n serializeEarliestVersion(): SerializedSchema {\n const sequences: Record<string, number> = {}\n for (const sequence of Object.values(this.migrations)) sequences[sequence.sequenceId] = 0\n return { schemaVersion: 2, sequences }\n }\n\n /**\n * The migrations that must run to bring data saved under `persistedSchema`\n * up to this schema, in order. Sequences the persisted schema knows but we\n * do not are ignored with a warning.\n */\n getMigrationsSince(persistedSchema: SerializedSchema): MigrationResult<Migration[]> {\n if (persistedSchema.schemaVersion !== 2) {\n return {\n type: \"error\",\n reason: `Unsupported schema version ${String((persistedSchema as { schemaVersion: unknown }).schemaVersion)}`,\n }\n }\n const persisted = persistedSchema.sequences ?? {}\n\n for (const sequenceId of Object.keys(persisted)) {\n if (!this.migrations[sequenceId]) {\n console.warn(`[store] ignoring unknown migration sequence \"${sequenceId}\" in persisted schema`)\n }\n }\n\n const result: Migration[] = []\n for (const sequence of Object.values(this.migrations)) {\n const persistedVersion = persisted[sequence.sequenceId]\n let startAt: number\n if (persistedVersion === undefined) {\n if (!sequence.retroactive) continue\n startAt = 0\n } else {\n if (!Number.isInteger(persistedVersion) || persistedVersion < 0) {\n return { type: \"error\", reason: `Invalid version ${String(persistedVersion)} for sequence \"${sequence.sequenceId}\"` }\n }\n if (persistedVersion > sequence.sequence.length) {\n return {\n type: \"error\",\n reason: `Sequence \"${sequence.sequenceId}\" is at version ${persistedVersion} but this schema only knows ${sequence.sequence.length}: data comes from a newer version`,\n }\n }\n startAt = persistedVersion\n }\n for (let i = startAt; i < sequence.sequence.length; i++) result.push(sequence.sequence[i]!)\n }\n return { type: \"success\", value: result }\n }\n\n /**\n * Migrate a single record. Only record-scoped migrations can be applied;\n * encountering a store-scoped one is an error. `down` runs the migrations\n * in reverse (from this schema to `persistedSchema`).\n */\n migratePersistedRecord(\n record: UnknownRecord,\n persistedSchema: SerializedSchema,\n direction: \"up\" | \"down\" = \"up\",\n ): MigrationResult<UnknownRecord> {\n const migrations = this.getMigrationsSince(persistedSchema)\n if (migrations.type === \"error\") return migrations\n const ordered = direction === \"up\" ? migrations.value : [...migrations.value].reverse()\n let current: UnknownRecord = structuredClone(record)\n try {\n for (const migration of ordered) {\n if (migration.scope !== \"record\") {\n return { type: \"error\", reason: `Migration ${migration.id} is store-scoped and cannot be applied to a single record` }\n }\n if (direction === \"down\" && !migration.down) {\n return { type: \"error\", reason: `Migration ${migration.id} has no down migration` }\n }\n current = applyRecordMigration(migration, current, direction)\n }\n } catch (error) {\n return { type: \"error\", reason: `Migration failed: ${error instanceof Error ? error.message : String(error)}` }\n }\n return { type: \"success\", value: current }\n }\n\n /**\n * Bring a whole persisted store up to date. The input is not mutated.\n * Records of types this schema does not know are preserved as-is.\n */\n migrateStoreSnapshot(snapshot: StoreSnapshot<R>): MigrationResult<SerializedStore<R>> {\n const migrations = this.getMigrationsSince(snapshot.schema)\n if (migrations.type === \"error\") return migrations\n\n let store: SerializedStore<UnknownRecord> = structuredClone(snapshot.store)\n if (migrations.value.length === 0) return { type: \"success\", value: store as SerializedStore<R> }\n\n try {\n for (const migration of migrations.value) {\n store = applyMigrationToStore(migration, store, \"up\")\n }\n } catch (error) {\n return { type: \"error\", reason: `Migration failed: ${error instanceof Error ? error.message : String(error)}` }\n }\n\n // Migrations must not change a record's id or lose it.\n for (const id in store) {\n const record = store[id as IdOf<UnknownRecord>]\n if (!record || record.id !== id) {\n return { type: \"error\", reason: `Migration produced a record whose id does not match its key (${id})` }\n }\n }\n return { type: \"success\", value: store as SerializedStore<R> }\n }\n}\n","import { atom, computed, transact, unsafe__withoutCapture, type Atom, type Computed } from \"./_signals\"\nimport type { IdOf, RecordFromId, RecordScope, RecordType, UnknownRecord } from \"./ids\"\nimport { parseRecordId, uniqueId } from \"./ids\"\nimport type { SerializedSchema, SerializedStore } from \"./migrate\"\nimport {\n applyChangeToDiff,\n createEmptyRecordsDiff,\n isRecordsDiffEmpty,\n type RecordsDiff,\n} from \"./RecordsDiff\"\nimport type { StoreSchema, StoreSnapshot, StoreValidationPhase } from \"./StoreSchema\"\n\nexport type ChangeSource = \"user\" | \"remote\"\n\nexport interface HistoryEntry<R extends UnknownRecord> {\n changes: RecordsDiff<R>\n source: ChangeSource\n}\n\nexport type StoreListener<R extends UnknownRecord> = (entry: HistoryEntry<R>) => void\n\nexport interface StoreListenerFilters {\n source: ChangeSource | \"all\"\n scope: RecordScope | \"all\"\n}\n\nexport type RecordFromTypeName<R extends UnknownRecord, T extends string> = Extract<R, { typeName: T }>\n\nexport type StoreRecord<S extends Store<any, any>> = S extends Store<infer R, any> ? R : never\n\nexport interface StoreOptions<R extends UnknownRecord, Props> {\n schema: StoreSchema<R, Props>\n initialData?: SerializedStore<R> | undefined\n props: Props\n id?: string | undefined\n}\n\n/* ------------------------------------------------------------------------ */\n/* side effects */\n/* ------------------------------------------------------------------------ */\n\nexport type StoreBeforeCreateHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => R\nexport type StoreAfterCreateHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void\nexport type StoreBeforeChangeHandler<R extends UnknownRecord> = (prev: R, next: R, source: ChangeSource) => R\nexport type StoreAfterChangeHandler<R extends UnknownRecord> = (prev: R, next: R, source: ChangeSource) => void\n/** Return `false` to veto the deletion. */\nexport type StoreBeforeDeleteHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void | false\nexport type StoreAfterDeleteHandler<R extends UnknownRecord> = (record: R, source: ChangeSource) => void\nexport type StoreOperationCompleteHandler = (source: ChangeSource) => void\n\nexport interface StoreSideEffectHandlers<R extends UnknownRecord> {\n beforeCreate?: StoreBeforeCreateHandler<R> | undefined\n afterCreate?: StoreAfterCreateHandler<R> | undefined\n beforeChange?: StoreBeforeChangeHandler<R> | undefined\n afterChange?: StoreAfterChangeHandler<R> | undefined\n beforeDelete?: StoreBeforeDeleteHandler<R> | undefined\n afterDelete?: StoreAfterDeleteHandler<R> | undefined\n}\n\ninterface HandlerSets<R extends UnknownRecord> {\n beforeCreate: Set<StoreBeforeCreateHandler<R>>\n afterCreate: Set<StoreAfterCreateHandler<R>>\n beforeChange: Set<StoreBeforeChangeHandler<R>>\n afterChange: Set<StoreAfterChangeHandler<R>>\n beforeDelete: Set<StoreBeforeDeleteHandler<R>>\n afterDelete: Set<StoreAfterDeleteHandler<R>>\n}\n\n/**\n * Hooks that run around record writes. `before*` handlers may replace the\n * record being written (or veto a delete); `after*` handlers observe.\n * `operationComplete` handlers run once when the outermost operation ends,\n * before history listeners are notified.\n */\nexport class StoreSideEffects<R extends UnknownRecord> {\n private readonly byType = new Map<string, HandlerSets<R>>()\n private readonly operationComplete = new Set<StoreOperationCompleteHandler>()\n private enabled = true\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n setIsEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n private sets(typeName: string): HandlerSets<R> {\n let sets = this.byType.get(typeName)\n if (!sets) {\n sets = {\n beforeCreate: new Set(),\n afterCreate: new Set(),\n beforeChange: new Set(),\n afterChange: new Set(),\n beforeDelete: new Set(),\n afterDelete: new Set(),\n }\n this.byType.set(typeName, sets)\n }\n return sets\n }\n\n private add<K extends keyof HandlerSets<R>>(\n typeName: string,\n kind: K,\n handler: HandlerSets<R>[K] extends Set<infer H> ? H : never,\n ): () => void {\n const set = this.sets(typeName)[kind] as Set<unknown>\n set.add(handler)\n return () => {\n set.delete(handler)\n }\n }\n\n /** Register several handlers for several types at once. Returns a disposer for all of them. */\n register(handlers: {\n [T in R[\"typeName\"]]?: StoreSideEffectHandlers<RecordFromTypeName<R, T>>\n }): () => void {\n const disposers: (() => void)[] = []\n for (const [typeName, h] of Object.entries(handlers) as [string, StoreSideEffectHandlers<any> | undefined][]) {\n if (!h) continue\n if (h.beforeCreate) disposers.push(this.add(typeName, \"beforeCreate\", h.beforeCreate))\n if (h.afterCreate) disposers.push(this.add(typeName, \"afterCreate\", h.afterCreate))\n if (h.beforeChange) disposers.push(this.add(typeName, \"beforeChange\", h.beforeChange))\n if (h.afterChange) disposers.push(this.add(typeName, \"afterChange\", h.afterChange))\n if (h.beforeDelete) disposers.push(this.add(typeName, \"beforeDelete\", h.beforeDelete))\n if (h.afterDelete) disposers.push(this.add(typeName, \"afterDelete\", h.afterDelete))\n }\n return () => disposers.forEach((d) => d())\n }\n\n registerBeforeCreateHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeCreateHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeCreate\", handler as unknown as StoreBeforeCreateHandler<R>)\n }\n\n registerAfterCreateHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterCreateHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterCreate\", handler as unknown as StoreAfterCreateHandler<R>)\n }\n\n registerBeforeChangeHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeChangeHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeChange\", handler as unknown as StoreBeforeChangeHandler<R>)\n }\n\n registerAfterChangeHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterChangeHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterChange\", handler as unknown as StoreAfterChangeHandler<R>)\n }\n\n registerBeforeDeleteHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreBeforeDeleteHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"beforeDelete\", handler as unknown as StoreBeforeDeleteHandler<R>)\n }\n\n registerAfterDeleteHandler<T extends R[\"typeName\"]>(\n typeName: T,\n handler: StoreAfterDeleteHandler<RecordFromTypeName<R, T>>,\n ): () => void {\n return this.add(typeName, \"afterDelete\", handler as unknown as StoreAfterDeleteHandler<R>)\n }\n\n registerOperationCompleteHandler(handler: StoreOperationCompleteHandler): () => void {\n this.operationComplete.add(handler)\n return () => {\n this.operationComplete.delete(handler)\n }\n }\n\n /** @internal */\n handleBeforeCreate(record: R, source: ChangeSource): R {\n const sets = this.byType.get(record.typeName)\n if (!sets) return record\n let result = record\n for (const handler of sets.beforeCreate) result = handler(result, source)\n return result\n }\n\n /** @internal */\n handleAfterCreate(record: R, source: ChangeSource): void {\n const sets = this.byType.get(record.typeName)\n if (!sets) return\n for (const handler of sets.afterCreate) handler(record, source)\n }\n\n /** @internal */\n handleBeforeChange(prev: R, next: R, source: ChangeSource): R {\n const sets = this.byType.get(next.typeName)\n if (!sets) return next\n let result = next\n for (const handler of sets.beforeChange) result = handler(prev, result, source)\n return result\n }\n\n /** @internal */\n handleAfterChange(prev: R, next: R, source: ChangeSource): void {\n const sets = this.byType.get(next.typeName)\n if (!sets) return\n for (const handler of sets.afterChange) handler(prev, next, source)\n }\n\n /** @internal Returns false when a handler vetoed the delete. */\n handleBeforeDelete(record: R, source: ChangeSource): boolean {\n const sets = this.byType.get(record.typeName)\n if (!sets) return true\n for (const handler of sets.beforeDelete) {\n if (handler(record, source) === false) return false\n }\n return true\n }\n\n /** @internal */\n handleAfterDelete(record: R, source: ChangeSource): void {\n const sets = this.byType.get(record.typeName)\n if (!sets) return\n for (const handler of sets.afterDelete) handler(record, source)\n }\n\n /** @internal */\n handleOperationComplete(source: ChangeSource): void {\n for (const handler of this.operationComplete) handler(source)\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* helpers */\n/* ------------------------------------------------------------------------ */\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nfunction shallowEqualObjects(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n if (a === b) return true\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (!(key in b) || a[key] !== b[key]) return false\n }\n return true\n}\n\n/**\n * Records are considered unchanged when every top-level value is identical,\n * with `props` and `meta` compared one level deeper. Cheap enough to run on\n * every `put`, and avoids no-op history entries.\n */\nexport function isRecordShallowEqual(a: UnknownRecord, b: UnknownRecord): boolean {\n if (a === b) return true\n const ao = a as unknown as Record<string, unknown>\n const bo = b as unknown as Record<string, unknown>\n const aKeys = Object.keys(ao)\n const bKeys = Object.keys(bo)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n if (!(key in bo)) return false\n const av = ao[key]\n const bv = bo[key]\n if (av === bv) continue\n if ((key === \"props\" || key === \"meta\") && isPlainObject(av) && isPlainObject(bv)) {\n if (!shallowEqualObjects(av, bv)) return false\n continue\n }\n return false\n }\n return true\n}\n\n/** Freeze a record and its `props` / `meta` bags (one level). */\nexport function freezeRecord<R extends UnknownRecord>(record: R): R {\n const r = record as unknown as Record<string, unknown>\n if (isPlainObject(r[\"props\"]) && !Object.isFrozen(r[\"props\"])) Object.freeze(r[\"props\"])\n if (isPlainObject(r[\"meta\"]) && !Object.isFrozen(r[\"meta\"])) Object.freeze(r[\"meta\"])\n return Object.freeze(record)\n}\n\ninterface TypeIndex<R extends UnknownRecord> {\n /** Mutated in place on every add/remove: O(1) per record. */\n readonly live: Set<IdOf<R>>\n /** Bumped whenever `live` changes; the reactive handle on membership. */\n readonly epoch: Atom<number>\n}\n\ninterface Listener<R extends UnknownRecord> {\n onHistory: StoreListener<R>\n filters: StoreListenerFilters\n}\n\n/* ------------------------------------------------------------------------ */\n/* queries */\n/* ------------------------------------------------------------------------ */\n\n/** Reactive views over the store's records, cached per type name. */\nexport class StoreQueries<R extends UnknownRecord> {\n private readonly idsCache = new Map<string, Computed<ReadonlySet<IdOf<R>>>>()\n private readonly recordsCache = new Map<string, Computed<R[]>>()\n\n constructor(private readonly store: Store<R, any>) {}\n\n /** The set of ids of every record of `typeName`. Maintained incrementally. */\n ids<T extends R[\"typeName\"]>(typeName: T): Computed<ReadonlySet<IdOf<RecordFromTypeName<R, T>>>> {\n let c = this.idsCache.get(typeName)\n if (!c) {\n const index = this.store.getTypeIndex(typeName)\n c = computed(`store:${this.store.id}:ids:${typeName}`, () => {\n index.epoch.get()\n return new Set(index.live) as ReadonlySet<IdOf<R>>\n })\n this.idsCache.set(typeName, c)\n }\n return c as unknown as Computed<ReadonlySet<IdOf<RecordFromTypeName<R, T>>>>\n }\n\n /** Every record of `typeName`, in insertion order. */\n records<T extends R[\"typeName\"]>(typeName: T): Computed<RecordFromTypeName<R, T>[]> {\n let c = this.recordsCache.get(typeName)\n if (!c) {\n const ids = this.ids(typeName)\n c = computed(`store:${this.store.id}:records:${typeName}`, () => {\n const result: R[] = []\n for (const id of ids.get()) {\n const record = this.store.get(id as IdOf<R>) as R | undefined\n if (record !== undefined) result.push(record)\n }\n return result\n })\n this.recordsCache.set(typeName, c)\n }\n return c as unknown as Computed<RecordFromTypeName<R, T>[]>\n }\n\n /** The first record of `typeName` matching `predicate` (or the first record, when omitted). */\n record<T extends R[\"typeName\"]>(\n typeName: T,\n predicate?: (record: RecordFromTypeName<R, T>) => boolean,\n ): Computed<RecordFromTypeName<R, T> | undefined> {\n const records = this.records(typeName)\n return computed(`store:${this.store.id}:record:${typeName}`, () => {\n const all = records.get()\n if (!predicate) return all[0]\n for (const record of all) if (predicate(record)) return record\n return undefined\n })\n }\n\n /** Non-reactive filter over the records of `typeName`. */\n exec<T extends R[\"typeName\"]>(\n typeName: T,\n predicate: (record: RecordFromTypeName<R, T>) => boolean,\n ): RecordFromTypeName<R, T>[] {\n return unsafe__withoutCapture(() => this.records(typeName).get().filter(predicate))\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* store */\n/* ------------------------------------------------------------------------ */\n\n/**\n * A reactive, transactional collection of records.\n *\n * - one atom per record, so consumers subscribe to exactly what they read\n * - per-type id sets maintained incrementally\n * - writes are batched; listeners receive one squashed diff per outermost operation\n * - records are frozen on write\n */\nexport class Store<R extends UnknownRecord = UnknownRecord, Props = unknown> {\n readonly id: string\n readonly schema: StoreSchema<R, Props>\n readonly props: Props\n readonly scopedTypes: { readonly [S in RecordScope]: ReadonlySet<string> }\n readonly sideEffects = new StoreSideEffects<R>()\n readonly query: StoreQueries<R>\n /** Bumped once per completed operation that changed something. */\n readonly history: Atom<number>\n\n private readonly records = new Map<IdOf<R>, Atom<R | undefined>>()\n private readonly typeIndexes = new Map<string, TypeIndex<R>>()\n private readonly listeners = new Set<Listener<R>>()\n private pendingEntries: HistoryEntry<R>[] = []\n private readonly extractStack: RecordsDiff<R>[] = []\n private depth = 0\n private source: ChangeSource = \"user\"\n private runCallbacks = true\n private inOperationComplete = false\n private disposed = false\n\n constructor(options: StoreOptions<R, Props>) {\n this.id = options.id ?? uniqueId()\n this.schema = options.schema\n this.props = options.props\n this.history = atom(`store:${this.id}:history`, 0)\n this.query = new StoreQueries(this)\n\n const scoped = { document: new Set<string>(), session: new Set<string>(), presence: new Set<string>() }\n for (const type of Object.values(this.schema.types) as RecordType<R, any>[]) {\n scoped[type.scope].add(type.typeName)\n }\n this.scopedTypes = scoped\n\n if (options.initialData) {\n const records = Object.values(options.initialData) as R[]\n this.atomic(() => this.put(records, \"initialize\"), { runCallbacks: false })\n }\n }\n\n /* ---- reading ---------------------------------------------------------- */\n\n /** @internal */\n getTypeIndex(typeName: string): TypeIndex<R> {\n let index = this.typeIndexes.get(typeName)\n if (!index) {\n index = { live: new Set(), epoch: atom(`store:${this.id}:index:${typeName}`, 0) }\n this.typeIndexes.set(typeName, index)\n }\n return index\n }\n\n /** Get a record (reactive: subscribes to the record, or to its type's membership when absent). */\n get<K extends IdOf<R>>(id: K): RecordFromId<K> | undefined {\n const a = this.records.get(id)\n if (a) return a.get() as RecordFromId<K> | undefined\n // Not present: depend on membership of this id's type so creation is observed.\n this.getTypeIndex(typeNameOfId(id)).epoch.get()\n return undefined\n }\n\n /** Get a record without registering a reactive dependency. */\n unsafeGetWithoutCapture<K extends IdOf<R>>(id: K): RecordFromId<K> | undefined {\n const a = this.records.get(id)\n return a ? (unsafe__withoutCapture(() => a.get()) as RecordFromId<K> | undefined) : undefined\n }\n\n has<K extends IdOf<R>>(id: K): boolean {\n return this.get(id) !== undefined\n }\n\n /** All records (reactive over every record and every type's membership). */\n allRecords(): R[] {\n for (const index of this.typeIndexes.values()) index.epoch.get()\n const result: R[] = []\n for (const a of this.records.values()) {\n const record = a.get()\n if (record !== undefined) result.push(record)\n }\n return result\n }\n\n /** Scope of a record type; unknown types are `document`. */\n getScope(typeName: string): RecordScope {\n return this.schema.getScope(typeName)\n }\n\n /* ---- writing ---------------------------------------------------------- */\n\n /**\n * Insert or update records. Records are validated, passed through `before*`\n * side effects, frozen, and written. `after*` side effects run once every\n * record in the call has been written.\n */\n put(records: readonly R[], phaseOverride?: StoreValidationPhase): void {\n this.atomic(() => {\n const source = this.source\n const callbacks = this.runCallbacks && this.sideEffects.isEnabled()\n const created: R[] = []\n const changed: [R, R][] = []\n\n for (const record of records) {\n const id = record.id\n const existing = this.records.get(id)\n const before = existing?.get()\n\n if (before !== undefined) {\n if (before === record) continue\n let next = this.schema.validateRecord(this, record, phaseOverride ?? \"updateRecord\", before)\n if (callbacks) next = this.sideEffects.handleBeforeChange(before, next, source)\n if (next === before || isRecordShallowEqual(before, next)) continue\n if (next.id !== id) {\n throw new Error(`Cannot change the id of a record (${id} -> ${next.id})`)\n }\n freezeRecord(next)\n if (before.typeName !== next.typeName) {\n this.removeFromIndex(before.typeName, id)\n this.addToIndex(next.typeName, id)\n }\n existing!.set(next)\n this.recordChange(id, before, next)\n changed.push([before, next])\n } else {\n let next = this.schema.validateRecord(this, record, phaseOverride ?? \"createRecord\", undefined)\n if (callbacks) next = this.sideEffects.handleBeforeCreate(next, source)\n if (next.id !== id) {\n throw new Error(`Cannot change the id of a record (${id} -> ${next.id})`)\n }\n freezeRecord(next)\n const a = existing ?? atom<R | undefined>(`store:${this.id}:record:${id}`, undefined)\n a.set(next)\n this.records.set(id, a)\n this.addToIndex(next.typeName, id)\n this.recordChange(id, undefined, next)\n created.push(next)\n }\n }\n\n if (callbacks) {\n for (const record of created) this.sideEffects.handleAfterCreate(record, source)\n for (const [prev, next] of changed) this.sideEffects.handleAfterChange(prev, next, source)\n }\n })\n }\n\n /** Remove records by id. Missing ids are ignored. `beforeDelete` handlers may veto. */\n remove(ids: readonly IdOf<R>[]): void {\n this.atomic(() => {\n const source = this.source\n const callbacks = this.runCallbacks && this.sideEffects.isEnabled()\n const toRemove: R[] = []\n\n for (const id of ids) {\n const a = this.records.get(id)\n if (!a) continue\n const record = a.get()\n if (record === undefined) continue\n if (callbacks && !this.sideEffects.handleBeforeDelete(record, source)) continue\n toRemove.push(record)\n }\n\n const removed: R[] = []\n for (const record of toRemove) {\n const a = this.records.get(record.id)\n if (!a) continue // a handler already removed it\n const current = a.get()\n if (current === undefined) continue\n a.set(undefined)\n this.records.delete(record.id)\n this.removeFromIndex(current.typeName, record.id)\n this.recordChange(record.id, current, undefined)\n removed.push(current)\n }\n\n if (callbacks) {\n for (const record of removed) this.sideEffects.handleAfterDelete(record, source)\n }\n })\n }\n\n /** Remove every record. */\n clear(): void {\n this.remove(Array.from(this.records.keys()))\n }\n\n /**\n * Update one record with a function. No-op when the record does not exist.\n */\n update<K extends IdOf<R>>(id: K, updater: (record: RecordFromId<K>) => RecordFromId<K>): void {\n const current = this.unsafeGetWithoutCapture(id)\n if (current === undefined) return\n this.put([updater(current) as unknown as R])\n }\n\n /* ---- transactions ----------------------------------------------------- */\n\n /**\n * Run `fn` as one operation: side effects' `operationComplete` handlers run\n * once at the end, and listeners get a single squashed history entry.\n */\n atomic<T>(fn: () => T, options?: { source?: ChangeSource | undefined; runCallbacks?: boolean | undefined }): T {\n const prevSource = this.source\n const prevRunCallbacks = this.runCallbacks\n if (options?.source !== undefined) this.source = options.source\n if (options?.runCallbacks !== undefined) this.runCallbacks = options.runCallbacks\n const source = this.source\n const runCallbacks = this.runCallbacks\n this.depth++\n try {\n return transact(() => unsafe__withoutCapture(fn))\n } finally {\n this.depth--\n if (this.depth === 0) {\n try {\n this.completeOperation(source, runCallbacks)\n } finally {\n this.source = prevSource\n this.runCallbacks = prevRunCallbacks\n }\n } else {\n this.source = prevSource\n this.runCallbacks = prevRunCallbacks\n }\n }\n }\n\n /** Changes made inside `fn` are reported to listeners with source `remote`. */\n mergeRemoteChanges(fn: () => void): void {\n this.atomic(fn, { source: \"remote\" })\n }\n\n /** Run `fn` and return the squashed diff of everything it changed. Listeners are still notified. */\n extractingChanges(fn: () => void): RecordsDiff<R> {\n const diff = createEmptyRecordsDiff<R>()\n this.extractStack.push(diff)\n try {\n this.atomic(fn)\n } finally {\n this.extractStack.pop()\n }\n return diff\n }\n\n /**\n * Apply a diff (e.g. from `extractingChanges` or `reverseRecordsDiff`).\n * With `ignoreEphemeralKeys`, ephemeral keys of updated records keep their\n * current store values instead of the diff's.\n */\n applyDiff(\n diff: RecordsDiff<R>,\n options?: { runCallbacks?: boolean | undefined; ignoreEphemeralKeys?: boolean | undefined },\n ): void {\n const runCallbacks = options?.runCallbacks ?? true\n const ignoreEphemeralKeys = options?.ignoreEphemeralKeys ?? false\n this.atomic(\n () => {\n const toPut: R[] = []\n for (const id in diff.added) toPut.push(diff.added[id as IdOf<R>]!)\n for (const id in diff.updated) {\n let [, to] = diff.updated[id as IdOf<R>]!\n if (ignoreEphemeralKeys) {\n const current = this.unsafeGetWithoutCapture(id as IdOf<R>)\n const type = this.schema.getType(to.typeName)\n if (current !== undefined && type && type.ephemeralKeySet.size > 0) {\n const merged: Record<string, unknown> = { ...(to as unknown as Record<string, unknown>) }\n const cur = current as unknown as Record<string, unknown>\n for (const key of type.ephemeralKeySet) {\n if (key in cur) merged[key] = cur[key]\n else delete merged[key]\n }\n to = merged as unknown as R\n }\n }\n toPut.push(to)\n }\n this.put(toPut)\n const toRemove = Object.keys(diff.removed) as IdOf<R>[]\n if (toRemove.length > 0) this.remove(toRemove)\n },\n { runCallbacks },\n )\n }\n\n /* ---- listening -------------------------------------------------------- */\n\n /**\n * Subscribe to history entries. Called after each outermost operation with\n * the squashed changes, filtered by source and record scope.\n */\n listen(onHistory: StoreListener<R>, filters?: Partial<StoreListenerFilters>): () => void {\n const listener: Listener<R> = {\n onHistory,\n filters: { source: filters?.source ?? \"all\", scope: filters?.scope ?? \"all\" },\n }\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n /* ---- persistence ------------------------------------------------------ */\n\n /** Plain-object snapshot of the records in `scope` (default `document`). */\n serialize(scope: RecordScope | \"all\" = \"document\"): SerializedStore<R> {\n const result = {} as SerializedStore<R>\n unsafe__withoutCapture(() => {\n for (const [id, a] of this.records) {\n const record = a.get()\n if (record === undefined) continue\n if (scope === \"all\" || this.getScope(record.typeName) === scope) result[id] = record\n }\n })\n return result\n }\n\n getStoreSnapshot(scope: RecordScope | \"all\" = \"document\"): StoreSnapshot<R> {\n return { store: this.serialize(scope), schema: this.schema.serialize() }\n }\n\n /**\n * Replace the store's contents with a snapshot (migrating it first).\n * Existing records in `document` scope and in every scope present in the\n * snapshot are removed unless the snapshot contains them; other scopes are\n * left alone. Side effects do not run; listeners are notified.\n */\n loadStoreSnapshot(snapshot: StoreSnapshot<R>): void {\n const migrated = this.schema.migrateStoreSnapshot(snapshot)\n if (migrated.type === \"error\") {\n throw new Error(`Failed to migrate snapshot: ${migrated.reason}`)\n }\n const incoming = migrated.value\n const records = Object.values(incoming) as R[]\n this.atomic(\n () => {\n const scopes = new Set<RecordScope>([\"document\"])\n for (const record of records) scopes.add(this.getScope(record.typeName))\n const toRemove: IdOf<R>[] = []\n for (const [id, a] of this.records) {\n const record = a.get()\n if (record === undefined) continue\n if (scopes.has(this.getScope(record.typeName)) && !(id in incoming)) toRemove.push(id)\n }\n this.remove(toRemove)\n this.put(records, \"initialize\")\n },\n { runCallbacks: false },\n )\n }\n\n /* ---- derived caches --------------------------------------------------- */\n\n /**\n * A per-record derived value, recomputed only when that record changes.\n * Entries are dropped automatically when records are removed.\n */\n createComputedCache<T, K extends IdOf<R> = IdOf<R>>(\n name: string,\n derive: (record: RecordFromId<K>) => T,\n options?: { isEqual?: ((a: T, b: T) => boolean) | undefined },\n ): { get(id: K): T | undefined } {\n const cache = new WeakMap<Atom<R | undefined>, Computed<T | undefined>>()\n return {\n get: (id: K) => {\n const a = this.records.get(id)\n if (!a) {\n this.getTypeIndex(typeNameOfId(id)).epoch.get()\n return undefined\n }\n let c = cache.get(a)\n if (!c) {\n c = computed(\n `${name}:${id}`,\n () => {\n const record = a.get()\n return record === undefined ? undefined : derive(record as unknown as RecordFromId<K>)\n },\n options?.isEqual\n ? { isEqual: (x, y) => (x === undefined || y === undefined ? x === y : options.isEqual!(x, y)) }\n : undefined,\n )\n cache.set(a, c)\n }\n return c.get()\n },\n }\n }\n\n /* ---- lifecycle -------------------------------------------------------- */\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n dispose(): void {\n this.disposed = true\n this.listeners.clear()\n }\n\n /* ---- internals -------------------------------------------------------- */\n\n private addToIndex(typeName: string, id: IdOf<R>) {\n const index = this.getTypeIndex(typeName)\n if (index.live.has(id)) return\n index.live.add(id)\n index.epoch.update((n) => n + 1)\n }\n\n private removeFromIndex(typeName: string, id: IdOf<R>) {\n const index = this.typeIndexes.get(typeName)\n if (!index || !index.live.delete(id)) return\n index.epoch.update((n) => n + 1)\n }\n\n private recordChange(id: IdOf<R>, before: R | undefined, after: R | undefined) {\n const last = this.pendingEntries[this.pendingEntries.length - 1]\n let entry: HistoryEntry<R>\n if (last && last.source === this.source) {\n entry = last\n } else {\n entry = { changes: createEmptyRecordsDiff<R>(), source: this.source }\n this.pendingEntries.push(entry)\n }\n applyChangeToDiff(entry.changes, id, before, after)\n for (const diff of this.extractStack) applyChangeToDiff(diff, id, before, after)\n }\n\n private completeOperation(source: ChangeSource, runCallbacks: boolean) {\n if (!this.pendingEntries.some((e) => !isRecordsDiffEmpty(e.changes))) {\n this.pendingEntries = []\n return\n }\n if (runCallbacks && this.sideEffects.isEnabled() && !this.inOperationComplete) {\n this.inOperationComplete = true\n const prevSource = this.source\n this.source = source\n this.depth++\n try {\n transact(() => unsafe__withoutCapture(() => this.sideEffects.handleOperationComplete(source)))\n } finally {\n this.depth--\n this.source = prevSource\n this.inOperationComplete = false\n }\n }\n this.history.update((n) => n + 1)\n this.flushHistory()\n }\n\n private flushHistory() {\n const entries = this.pendingEntries\n this.pendingEntries = []\n if (this.listeners.size === 0) return\n for (const entry of entries) {\n if (isRecordsDiffEmpty(entry.changes)) continue\n for (const listener of Array.from(this.listeners)) {\n if (listener.filters.source !== \"all\" && listener.filters.source !== entry.source) continue\n const changes =\n listener.filters.scope === \"all\" ? entry.changes : this.filterDiffByScope(entry.changes, listener.filters.scope)\n if (isRecordsDiffEmpty(changes)) continue\n listener.onHistory({ changes, source: entry.source })\n }\n }\n }\n\n private filterDiffByScope(diff: RecordsDiff<R>, scope: RecordScope): RecordsDiff<R> {\n const result = createEmptyRecordsDiff<R>()\n for (const id in diff.added) {\n const record = diff.added[id as IdOf<R>]!\n if (this.getScope(record.typeName) === scope) result.added[id as IdOf<R>] = record\n }\n for (const id in diff.updated) {\n const pair = diff.updated[id as IdOf<R>]!\n if (this.getScope(pair[1].typeName) === scope) result.updated[id as IdOf<R>] = pair\n }\n for (const id in diff.removed) {\n const record = diff.removed[id as IdOf<R>]!\n if (this.getScope(record.typeName) === scope) result.removed[id as IdOf<R>] = record\n }\n return result\n }\n}\n\nfunction typeNameOfId(id: string): string {\n const colon = id.indexOf(\":\")\n return colon > 0 ? id.slice(0, colon) : parseRecordId(id).typeName\n}\n","import { isRecordLike, type IdOf, type UnknownRecord } from \"./ids\"\nimport type { SerializedSchema, SerializedStore } from \"./migrate\"\n\n/**\n * `.tldr` file envelope. Schema-agnostic: this module does not know or care\n * what record types the file holds.\n */\nexport const TLDR_FILE_FORMAT_VERSION = 1\n\nexport interface TldrFile {\n tldrawFileFormatVersion: number\n schema: SerializedSchema\n records: UnknownRecord[]\n}\n\nexport type TldrFileParseError = \"notATldrFile\" | \"v1File\" | \"invalidRecords\" | \"futureVersion\"\n\nexport type ParseTldrFileResult =\n | { ok: true; schema: SerializedSchema; records: UnknownRecord[] }\n | { ok: false; error: TldrFileParseError; cause?: unknown }\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isSerializedSchema(value: unknown): value is SerializedSchema {\n return isPlainObject(value) && typeof value[\"schemaVersion\"] === \"number\"\n}\n\n/**\n * Parse a `.tldr` file. Accepts either the JSON text or the already-parsed\n * value. Never throws.\n */\nexport function parseTldrFile(json: unknown): ParseTldrFileResult {\n let data: unknown = json\n if (typeof json === \"string\") {\n try {\n data = JSON.parse(json)\n } catch (cause) {\n return { ok: false, error: \"notATldrFile\", cause }\n }\n }\n\n if (!isPlainObject(data)) return { ok: false, error: \"notATldrFile\" }\n\n if (!(\"tldrawFileFormatVersion\" in data)) {\n // The legacy (pre-envelope) format stored a whole document object.\n const legacyDocument = data[\"document\"]\n if (isPlainObject(legacyDocument) && (\"pages\" in legacyDocument || \"version\" in legacyDocument)) {\n return { ok: false, error: \"v1File\" }\n }\n return { ok: false, error: \"notATldrFile\" }\n }\n\n const version = data[\"tldrawFileFormatVersion\"]\n if (typeof version !== \"number\" || !Number.isInteger(version) || version < 1) {\n return { ok: false, error: \"notATldrFile\" }\n }\n if (version > TLDR_FILE_FORMAT_VERSION) return { ok: false, error: \"futureVersion\" }\n\n if (!isSerializedSchema(data[\"schema\"])) return { ok: false, error: \"notATldrFile\" }\n\n const records = data[\"records\"]\n if (!Array.isArray(records)) return { ok: false, error: \"invalidRecords\" }\n const seen = new Set<string>()\n for (const record of records) {\n if (!isRecordLike(record)) return { ok: false, error: \"invalidRecords\" }\n if (seen.has(record.id)) return { ok: false, error: \"invalidRecords\" }\n seen.add(record.id)\n }\n\n return { ok: true, schema: data[\"schema\"], records: records as UnknownRecord[] }\n}\n\n/**\n * JSON.stringify with object keys sorted recursively so that identical data\n * always produces identical text. Arrays keep their order.\n */\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeysDeep)\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {}\n for (const key of Object.keys(value).sort()) {\n const v = value[key]\n if (v !== undefined) out[key] = sortKeysDeep(v)\n }\n return out\n }\n return value\n}\n\n/**\n * Serialize records and their schema into the `.tldr` envelope\n * (pretty-printed, stable key order). Records are written in the given order.\n */\nexport function serializeTldrFile(schema: SerializedSchema, records: readonly UnknownRecord[]): string {\n const envelope = {\n tldrawFileFormatVersion: TLDR_FILE_FORMAT_VERSION,\n schema: sortKeysDeep(schema),\n records: records.map(sortKeysDeep),\n }\n return JSON.stringify(envelope, null, 2)\n}\n\n/** Convert a parsed file into a `{ store, schema }` snapshot. */\nexport function tldrFileToStoreSnapshot(file: { schema: SerializedSchema; records: readonly UnknownRecord[] }): {\n store: SerializedStore<UnknownRecord>\n schema: SerializedSchema\n} {\n const store = {} as SerializedStore<UnknownRecord>\n for (const record of file.records) store[record.id as IdOf<UnknownRecord>] = record\n return { store, schema: file.schema }\n}\n\n/** Convert a `{ store, schema }` snapshot into `.tldr` text. Records are ordered by id. */\nexport function storeSnapshotToTldrFile(snapshot: {\n store: SerializedStore<UnknownRecord>\n schema: SerializedSchema\n}): string {\n const records = Object.values(snapshot.store).sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return serializeTldrFile(snapshot.schema, records)\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mocanvas/store",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The mocanvas document model: reactive records, schema, migrations and .tldr file IO.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Symbio Digital",
|
|
7
|
+
"homepage": "https://github.com/SYMBIO/mocanvas/tree/main/packages/store#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/SYMBIO/mocanvas.git",
|
|
11
|
+
"directory": "packages/store"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/SYMBIO/mocanvas/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"store",
|
|
18
|
+
"records",
|
|
19
|
+
"crdt",
|
|
20
|
+
"schema",
|
|
21
|
+
"migrations",
|
|
22
|
+
"tldr",
|
|
23
|
+
"mocanvas"
|
|
24
|
+
],
|
|
25
|
+
"type": "module",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"main": "./dist/index.js",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"import": "./dist/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./package.json": "./package.json"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"fractional-indexing": "^3.2.0",
|
|
49
|
+
"nanoid": "^5.1.0",
|
|
50
|
+
"@mocanvas/state": "1.0.0"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsup",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"typecheck": "tsc --noEmit"
|
|
56
|
+
}
|
|
57
|
+
}
|