@weasel-js/prefs 1.10.1 → 1.11.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/alias.ts","../src/unit.ts","../src/helpers.ts","../src/bounds.ts","../src/locus.ts","../src/blend.ts","../src/splitCheck.ts","../src/css.ts","../src/union.ts","../src/repair.ts","../src/stamp.ts","../src/snapshot.ts"],"names":["read","isPlainObject","endlessAllows"],"mappings":"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","file":"chunk-OZFER7VN.js","sourcesContent":["import type { PrefBase, PrefLeaf } from './schema';\n\n/**\n * A second place for another leaf: its row draws that leaf's control and\n * reads and writes that leaf's value, so one setting can sit on two pages.\n * It holds no value of its own. A store neither reads nor writes one, and\n * its path is not a {@link PrefPath}.\n *\n * `name` and `description` left empty are the target's.\n */\nexport interface PrefAlias extends PrefBase<'alias', undefined> {\n /** The leaf shown here, by the full path its value is read and written at (`'view.grid'`). */\n of: string;\n}\n\n/**\n * The leaf an alias stands for and the path its value lives at, following an\n * alias of an alias to its end. `undefined` when a path along the way names\n * no leaf, or the aliases lead back to one already passed.\n */\nexport function prefAliasTarget(\n alias: PrefAlias,\n leafAt: (path: string) => PrefLeaf | undefined,\n): { path: string; leaf: PrefLeaf } | undefined {\n const passed = new Set<string>();\n let path = alias.of;\n for (;;) {\n if (passed.has(path)) return undefined;\n passed.add(path);\n const leaf = leafAt(path);\n if (leaf === undefined) return undefined;\n if (leaf.kind !== 'alias') return { path, leaf };\n path = (leaf as PrefAlias).of;\n }\n}\n\n/**\n * What an alias is called wherever one is drawn or named: its own name, else\n * that of `target`, the leaf it shows, else `Alias` for one that shows\n * nothing.\n */\nexport function prefAliasName(alias: PrefAlias, target?: PrefLeaf): string {\n if (alias.name !== '') return alias.name;\n return target === undefined ? 'Alias' : target.name;\n}\n\n/** A leaf drawn through an alias: the target, under the alias's own name, description and access letter where it gives them. */\nexport function prefAliasedLeaf(alias: PrefAlias, target: PrefLeaf): PrefLeaf {\n return {\n ...target,\n name: prefAliasName(alias, target),\n description: alias.description === '' ? target.description : alias.description,\n ...(alias.access ? { access: alias.access } : {}),\n ...(alias.tags ? { tags: [...(target.tags ?? []), ...alias.tags] } : {}),\n };\n}\n","// A number leaf's display unit: the stored value stays canonical (radians, millimeters), and a UI converts\n// at its edge. A unit is data where the conversion is linear, and a pair of functions where it is not.\n\nimport { formatUnit, unitScale, type Unit, type UnitEntry, type UnitScale, type UnitSystem, type UnitTable } from '@weasel-js/quantity';\n\n/** What both forms of a unit say about the text around the number. */\ninterface PrefUnitText {\n /** Shown after the input, e.g. `'°'`. */\n suffix?: string;\n /** Suffixes a person may type, each mapped to the scale that turns a\n * number in that unit into a display number: `{ mm: 0.1, cm: 1 }` for a\n * field showing centimeters. A unit that disagrees with the display unit\n * about zero carries an `offset` as well. */\n accepts?: Readonly<Record<string, UnitEntry>>;\n}\n\n/**\n * A display unit as data, for a conversion that is linear: `stored = display * scale + offset`, the direction a\n * `UnitEntry` runs toward its base, so `scale` is what one display unit is worth in stored units. Degrees shown\n * over radians stored is `{ suffix: '°', scale: Math.PI / 180 }`, and `{ scale: 1 }` changes nothing. Being data,\n * it is written to JSON, printed in a schema literal, and edited in `PrefSchemaEditor` like any other attribute.\n */\nexport interface PrefLinearUnit extends PrefUnitText {\n /** Stored units per display unit. Never 0. */\n scale: number;\n /** The stored value a display of 0 stands for. Absent is 0. */\n offset?: number;\n /** Decimal places the shown value is rounded to. Absent, the value shows unrounded and formats to two places.\n * What is typed is stored unrounded either way: a decimal typed at a decimal `scale` is stored as the\n * decimal the two multiply to, without the dust of multiplying them in binary. */\n precision?: number;\n}\n\n/** A display unit as code, for a conversion that is not linear. It cannot be written to JSON or edited as data. */\nexport interface PrefFunctionUnit extends PrefUnitText {\n toDisplay: (stored: number) => number;\n fromDisplay: (display: number) => number;\n /** The stored value as display text, suffix included. */\n format?: (stored: number) => string;\n}\n\n/** Display-unit conversion for number leaves whose stored value uses a\n * canonical unit the user shouldn't see (e.g. radians stored, degrees\n * shown). Read one through {@link resolvePrefUnit}, which answers for both forms. */\nexport type PrefNumberUnit = PrefLinearUnit | PrefFunctionUnit;\n\n/** A unit of either form as the functions that convert and format with it. */\nexport interface ResolvedPrefUnit extends PrefFunctionUnit {\n format: (stored: number) => string;\n}\n\n/** What a unit leaf's field reads as typed text: its `accepts` table, and its\n * `suffix` as the display unit itself. */\nexport function prefUnitAccepts(unit: PrefNumberUnit): Readonly<UnitTable> {\n return unit.suffix === undefined ? { ...unit.accepts } : { [unit.suffix]: 1, ...unit.accepts };\n}\n\n/** Whether `unit` is the data form, and so can be written out and edited. */\nexport function isPrefLinearUnit(unit: PrefNumberUnit): unit is PrefLinearUnit {\n return typeof (unit as PrefFunctionUnit).toDisplay !== 'function';\n}\n\n/** The name `formatUnit` is asked for a linear unit's one unit by. */\nconst SHOWN = 'shown';\n\n/** The decimal places `n` is written with. Undefined for one written with an exponent, which is no short decimal. */\nfunction decimalPlaces(n: number): number | undefined {\n const text = String(n);\n if (text.includes('e')) return undefined;\n const dot = text.indexOf('.');\n return dot === -1 ? 0 : text.length - dot - 1;\n}\n\n/** Beyond this many places a number is not a decimal someone wrote, and the product is left as computed. */\nconst DECIMAL_PLACES = 12;\n\n/**\n * `shown * scale + offset` as the decimal it is, where all three are short decimals: 33.3 at a scale of 0.01\n * is 0.333, where the product computed in binary is 0.33299999999999996. Nothing is rounded away: the places\n * kept are every place the exact answer has.\n */\nfunction storedOf(shown: number, scale: number, offset: number): number {\n const raw = shown * scale + offset;\n const [a, b, c] = [decimalPlaces(shown), decimalPlaces(scale), decimalPlaces(offset)];\n if (a === undefined || b === undefined || c === undefined || !Number.isFinite(raw)) return raw;\n const places = Math.max(a + b, c);\n return places > DECIMAL_PLACES ? raw : Number(raw.toFixed(places));\n}\n\n/** How to convert and format with `unit`, whichever form it was written in. */\nexport function resolvePrefUnit(unit: PrefNumberUnit): ResolvedPrefUnit {\n if (!isPrefLinearUnit(unit)) {\n return { ...unit, format: unit.format ?? ((stored) => `${unit.toDisplay(stored)}${unit.suffix ?? ''}`) };\n }\n const { scale, offset = 0, precision, suffix, accepts } = unit;\n const round = precision === undefined ? undefined : 10 ** precision;\n const system: UnitSystem = { base: 'stored', units: { [SHOWN]: { factor: scale, offset } } };\n return {\n toDisplay: (stored) => {\n const shown = (stored - offset) / scale;\n return round === undefined ? shown : Math.round(shown * round) / round;\n },\n fromDisplay: (shown) => storedOf(shown, scale, offset),\n format: (stored) => `${formatUnit(stored, SHOWN, system, { precision: precision ?? 2, suffix: false })}${suffix ?? ''}`,\n ...(suffix === undefined ? {} : { suffix }),\n ...(accepts === undefined ? {} : { accepts }),\n };\n}\n\n/**\n * A display unit built from a {@link UnitSystem}: values are stored in the\n * system's base and shown in `display`, rounded to `precision` places when\n * given, and every unit in the system is accepted as typed text. `suffix`\n * defaults to the unit's name and is accepted too. Every unit of a system is\n * linear, so what comes back is data.\n */\nexport function prefUnit(\n system: UnitSystem,\n display: Unit,\n opts?: { precision?: number; suffix?: string },\n): PrefLinearUnit {\n let self: Required<UnitScale>;\n try {\n self = unitScale(system, display);\n } catch (e) {\n throw new Error(`prefUnit: ${e instanceof Error ? e.message : String(e)}`);\n }\n const suffix = opts?.suffix ?? display;\n const accepts: Record<string, UnitEntry> = { [suffix]: 1 };\n for (const name of Object.keys(system.units)) {\n const other = unitScale(system, name);\n // A number typed in `name` reaches display units through base:\n // `(n * factor + offset - self.offset) / self.factor`.\n const factor = other.factor / self.factor;\n const offset = (other.offset - self.offset) / self.factor;\n accepts[name] = offset === 0 ? factor : { factor, offset };\n }\n return {\n suffix,\n scale: self.factor,\n ...(self.offset === 0 ? {} : { offset: self.offset }),\n accepts,\n ...(opts?.precision === undefined ? {} : { precision: opts.precision }),\n };\n}\n","import type { Endless } from '@weasel-js/quantity';\nimport { matchQuery } from '@weasel-js/registry';\nimport { prefAliasedLeaf, prefAliasTarget, type PrefAlias } from './alias';\nimport type { PrefGroup, PrefSection } from './groups';\nimport type { PrefLeaf, PrefNumber, PrefObject } from './schema';\nimport { resolvePrefUnit } from './unit';\n\n/**\n * A number leaf's bounds in the unit it is displayed in.\n *\n * Only what the leaf declares converts: an omitted bound has no stored\n * counterpart to put through the conversion, and its fallback — 0..100 for a\n * slider's track, a step of 1 — is a display-space number already. `min` and\n * `max` are points, so they convert the way the value does; `step` is a\n * distance, and a unit with an offset maps zero somewhere else, so converting\n * it as a point would scale it wrong. A decreasing conversion swaps which end\n * is the lower one, and which end is `endless`.\n */\nexport function prefDisplayBounds(\n p: PrefNumber,\n): { min?: number; max?: number; step: number; endless?: Endless } {\n const ends = p.endless === undefined ? {} : { endless: p.endless };\n if (!p.unit) return { min: p.min, max: p.max, step: p.step ?? 1, ...ends };\n const { toDisplay } = resolvePrefUnit(p.unit);\n const backward = toDisplay(1) < toDisplay(0);\n const lo = p.min === undefined ? undefined : toDisplay(p.min);\n const hi = p.max === undefined ? undefined : toDisplay(p.max);\n const flipped = lo !== undefined && hi !== undefined && lo > hi;\n const step = p.step === undefined\n ? 1\n : Math.abs(toDisplay(p.step) - toDisplay(0)) || p.step;\n const flip = { min: 'max', max: 'min', both: 'both' } as const;\n const endless = backward && p.endless !== undefined ? flip[p.endless] : p.endless;\n return { min: flipped ? hi : lo, max: flipped ? lo : hi, step, ...(endless === undefined ? {} : { endless }) };\n}\n\n/** Distinguishes a leaf from a group or a section while walking a schema tree. */\nexport function isPrefLeaf(node: PrefLeaf | PrefGroup | PrefSection): node is PrefLeaf {\n return 'kind' in node;\n}\n\nconst VALUELESS: ReadonlySet<string> = new Set(['action', 'actions', 'alias', 'label', 'separator']);\n\n/** Whether a leaf has a value to store: an `action` is a button and holds none, nor does an `actions` run of them, an `alias` shows another leaf's,\n * and a `label` and a `separator` are text and a rule. */\nexport function prefHoldsValue(leaf: PrefLeaf): boolean {\n return !VALUELESS.has(leaf.kind);\n}\n\n/** Distinguishes a section, whose key adds nothing to a path, from a group, whose key is a segment. */\nexport function isPrefSection(node: PrefLeaf | PrefGroup | PrefSection): node is PrefSection {\n return !isPrefLeaf(node) && 'members' in node;\n}\n\n/**\n * Every leaf under a section's `members` or an object leaf's `children`, in\n * schema order, by its own key: the sections between contribute nothing.\n */\nexport function prefSectionLeaves(members: PrefSection['members']): [key: string, leaf: PrefLeaf][] {\n return Object.entries(members).flatMap(([key, child]): [string, PrefLeaf][] =>\n isPrefLeaf(child) ? [[key, child]] : prefSectionLeaves(child.members),\n );\n}\n\n/**\n * The leaf whose value lives at `path`, as the schema's own shape builds\n * paths: a segment per key under a {@link PrefGroup}, the leaf's own key\n * under a {@link PrefSection}. `undefined` for a path that names a group, a\n * field inside an `object` leaf, or nothing.\n */\nexport function prefLeafAt(schema: PrefGroup | PrefSection, path: string): PrefLeaf | undefined {\n if (isPrefSection(schema)) return prefSectionLeaves(schema.members).find(([key]) => key === path)?.[1];\n let node: PrefLeaf | PrefGroup = schema;\n for (const seg of path.split('.')) {\n if (isPrefLeaf(node) || !Object.hasOwn(node.children, seg)) return undefined;\n node = node.children[seg]!;\n }\n return isPrefLeaf(node) ? node : undefined;\n}\n\n/** Get the value at a dotted path inside a nested value tree. Returns\n * `undefined` when a segment is missing or hits a non-object. */\nexport function prefValueAtPath(values: unknown, path: string): unknown {\n let cur: unknown = values;\n for (const seg of path.split('.')) {\n if (cur == null || typeof cur !== 'object' || !Object.hasOwn(cur, seg)) return undefined;\n cur = (cur as Record<string, unknown>)[seg];\n }\n return cur;\n}\n\n/** An object leaf's fields without the `hidden` ones, and without the sections that leaves empty (unless `keepEmpty`). */\nfunction visibleFields(fields: PrefObject['children'], keepEmpty: boolean): PrefObject['children'] {\n const out: PrefObject['children'] = {};\n for (const [key, child] of Object.entries(fields)) {\n if (isPrefLeaf(child)) {\n const kept = visiblePrefSubtree(child, false, keepEmpty);\n if (kept) out[key] = kept;\n continue;\n }\n const members = visibleFields(child.members, keepEmpty);\n if (Object.keys(members).length > 0 || keepEmpty) out[key] = { ...child, members };\n }\n return out;\n}\n\n/**\n * Recursively drop `hidden` leaves (unless `showHidden`), an object leaf's\n * hidden fields among them, pruning groups\n * that end up empty (unless `keepEmpty`). Returns null when the entire\n * subtree is pruned.\n */\nexport function visiblePrefSubtree<T extends PrefLeaf | PrefGroup>(\n node: T,\n showHidden: boolean,\n keepEmpty = false,\n): T | null {\n if (isPrefLeaf(node)) {\n if (node.hidden && !showHidden) return null;\n if (showHidden || node.kind !== 'object') return node;\n return { ...node, children: visibleFields((node as PrefObject).children, keepEmpty) };\n }\n const group = node as PrefGroup;\n const children: Record<string, PrefLeaf | PrefGroup> = {};\n for (const [key, child] of Object.entries(group.children)) {\n const kept = visiblePrefSubtree(child, showHidden, keepEmpty);\n if (kept) children[key] = kept;\n }\n if (Object.keys(children).length === 0 && !keepEmpty) return null;\n return { ...node, children };\n}\n\n/** The record holding the schema version the stored values were written at.\n * Reserved: no top-level schema key may take its name. */\nexport const VERSION_RECORD = '$version';\n\n/** Every leaf under `schema`, by dotted path, in schema order. A group's key\n * is a segment; {@link prefSectionLeaves} is the walk for a section. */\nexport function prefLeaves(schema: PrefGroup): Map<string, PrefLeaf> {\n const out = new Map<string, PrefLeaf>();\n const walk = (group: PrefGroup, prefix: string): void => {\n for (const [key, child] of Object.entries(group.children)) {\n if (key.includes('.')) {\n throw new Error(`[prefs] schema key \"${key}\" contains \".\"; group keys are path segments`);\n }\n if (prefix === '' && key === VERSION_RECORD) {\n throw new Error(`[prefs] schema key \"${VERSION_RECORD}\" is reserved`);\n }\n const path = prefix === '' ? key : `${prefix}.${key}`;\n if (isPrefLeaf(child)) out.set(path, child);\n else walk(child, path);\n }\n };\n walk(schema, '');\n return out;\n}\n\n/** Set `key` on `tree` itself. Plain assignment to `__proto__` replaces the\n * tree's prototype instead, and a schema key or a record name may be one. */\nexport function setOwnPrefValue(tree: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(tree, key, { value, writable: true, enumerable: true, configurable: true });\n}\n\n/** Set `value` at the dotted `path` in `root` itself, creating missing branches. */\nexport function assignPrefValueAtPath(root: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let cursor = root;\n for (const part of parts.slice(0, -1)) {\n if (!Object.hasOwn(cursor, part) || cursor[part] == null) setOwnPrefValue(cursor, part, {});\n cursor = cursor[part] as Record<string, unknown>;\n }\n setOwnPrefValue(cursor, parts[parts.length - 1]!, value);\n}\n\n/** Each of `schema`'s leaves that `tree` holds a value for, as a path and\n * that value — the inverse of building a tree from per-leaf records. */\nexport function flattenPrefValues(schema: PrefGroup, tree: unknown): [string, unknown][] {\n const out: [string, unknown][] = [];\n for (const path of prefLeaves(schema).keys()) {\n const value = prefValueAtPath(tree, path);\n if (value !== undefined) out.push([path, value]);\n }\n return out;\n}\n\n/** Whether one leaf answers to a filter query, by name, description, path or tag. */\nfunction prefLeafMatches(pref: PrefLeaf, path: string, query: string): boolean {\n return matchQuery(query, { text: [pref.name, pref.description, path], tags: pref.tags }) !== null;\n}\n\n/**\n * Drop every leaf that does not answer to `query`, pruning groups left empty.\n * A group whose own name or tag matches keeps all of its leaves. An empty or\n * whitespace query matches everything.\n *\n * An alias answers as the row it draws: its target's name and description\n * where it gives none. That target is looked for in `over`, and in `node`\n * without it; pass the whole schema when `node` is a part of it.\n */\nexport function filterPrefSubtree<T extends PrefLeaf | PrefGroup>(\n node: T,\n query: string,\n path = '',\n over?: PrefGroup | PrefSection,\n): T | null {\n const q = query.trim().toLowerCase();\n if (q === '') return node;\n const within = over ?? (isPrefLeaf(node) ? undefined : (node as PrefGroup));\n const find = (p: string): PrefLeaf | undefined => within && prefLeafAt(within, p);\n if (isPrefLeaf(node)) {\n const target = node.kind === 'alias' ? prefAliasTarget(node as PrefAlias, find) : undefined;\n const drawn = target ? prefAliasedLeaf(node as PrefAlias, target.leaf) : node;\n return prefLeafMatches(drawn, path, q) ? node : null;\n }\n const group = node as PrefGroup;\n if (matchQuery(q, { text: [group.name], tags: group.tags }) !== null) return node;\n const children: Record<string, PrefLeaf | PrefGroup> = {};\n for (const [key, child] of Object.entries(group.children)) {\n const kept = filterPrefSubtree(child, q, path === '' ? key : `${path}.${key}`, within);\n if (kept) children[key] = kept;\n }\n if (Object.keys(children).length === 0) return null;\n return { ...node, children };\n}\n","import { endlessAllows } from '@weasel-js/quantity';\nimport type { PrefNumber } from './schema';\n\n/** Reads a value held beside a number leaf, by the path a condition there would name. */\nexport type PrefBoundReader = (path: string) => unknown;\n\n/**\n * A number leaf's bound where its value is held: `undefined` for none. Asked\n * per holder, so each scene node a panel edits can have its own.\n */\nexport type PrefBoundAt = (read: PrefBoundReader) => number | undefined;\n\n/**\n * `leaf` with its `minAt` and `maxAt` read against `read` and folded into\n * `min` and `max`, whichever is tighter. The leaf itself when it has neither.\n */\nexport function prefNumberAt(leaf: PrefNumber, read: PrefBoundReader): PrefNumber {\n const { minAt, maxAt, ...rest } = leaf;\n if (minAt === undefined && maxAt === undefined) return leaf;\n const lo = minAt?.(read);\n const hi = maxAt?.(read);\n return {\n ...rest,\n ...(lo === undefined ? {} : { min: leaf.min === undefined ? lo : Math.max(leaf.min, lo) }),\n ...(hi === undefined ? {} : { max: leaf.max === undefined ? hi : Math.min(leaf.max, hi) }),\n };\n}\n\n/** `n` held to `leaf`'s `min` and `max`, except an infinity an `endless` end stands for. */\nexport function prefClampNumber(leaf: PrefNumber, n: number): number {\n if (endlessAllows(leaf.endless, n)) return n;\n let v = n;\n if (leaf.min !== undefined && v < leaf.min) v = leaf.min;\n if (leaf.max !== undefined && v > leaf.max) v = leaf.max;\n return v;\n}\n","// A value held once per option of an enum leaf: the stored shape, and what\n// reads and rewrites it. Nothing here knows a schema; the store supplies the\n// options, the order, and how a member is repaired and blended.\n\nimport { isPlainObject } from '@weasel-js/registry';\n\n/**\n * A leaf's value split by another leaf: one member for each option of the\n * `enum` leaf at `$by`. A member may itself be a locus, by a second selector.\n * The alternatives are folded by weight when the value is read, and a plain\n * setting of the selector gives one of them all of it.\n */\nexport interface PrefLocus {\n /** The full path of the `enum` leaf whose options key `$of`. */\n $by: string;\n $of: Record<string, unknown>;\n}\n\n/** A value for each selector a read is made under: its path, then the option chosen. */\nexport type PrefSelection = Readonly<Record<string, string>>;\n\n/** A weight for each option of each selector, by the selector's path. An option left out weighs nothing. */\nexport type PrefWeights = Readonly<Record<string, Readonly<Record<string, number>>>>;\n\n/** One alternative of a split value, and its share of the whole. */\nexport interface PrefWeighted {\n value: unknown;\n weight: number;\n}\n\n/** Whether `value` is a {@link PrefLocus}: an object of exactly `$by` and `$of`. */\nexport function isPrefLocus(value: unknown): value is PrefLocus {\n if (!isPlainObject(value)) return false;\n const keys = Object.keys(value);\n return keys.length === 2 && typeof value.$by === 'string' && isPlainObject(value.$of);\n}\n\n/** The weights a plain selection amounts to: all of each selector's on the option chosen. */\nexport function selectionWeights(selection: PrefSelection): PrefWeights {\n return Object.fromEntries(Object.entries(selection).map(([path, option]) => [path, { [option]: 1 }]));\n}\n\nconst member = (locus: PrefLocus, option: string, absent: unknown): unknown =>\n (Object.hasOwn(locus.$of, option) ? locus.$of[option] : absent);\n\n/**\n * Every alternative of `stored` that weighs something under `weights`, each\n * with its share: the product of the weights on the way down to it. An option\n * the locus holds nothing for reads as `absent`. Members come in the order\n * `weights` lists each selector's options.\n */\nexport function weighLocus(stored: unknown, weights: PrefWeights, absent: unknown): PrefWeighted[] {\n const out: PrefWeighted[] = [];\n const walk = (value: unknown, weight: number): void => {\n if (!isPrefLocus(value)) {\n out.push({ value, weight });\n return;\n }\n for (const [option, share] of Object.entries(weights[value.$by] ?? {})) {\n if (share > 0) walk(member(value, option, absent), weight * share);\n }\n };\n walk(stored, 1);\n return out;\n}\n\n/** The one member `selection` names. A selector it leaves out, or an option the locus holds nothing for, reads as `absent`. */\nexport function memberAt(stored: unknown, selection: PrefSelection, absent: unknown): unknown {\n let value = stored;\n while (isPrefLocus(value)) {\n const option = selection[value.$by];\n if (option === undefined) return absent;\n value = member(value, option, absent);\n }\n return value;\n}\n\n/** `stored` with the member `selection` names replaced by `next`. A value that is not split is replaced whole. */\nexport function writeMember(stored: unknown, selection: PrefSelection, next: unknown): unknown {\n if (!isPrefLocus(stored)) return next;\n const option = selection[stored.$by];\n if (option === undefined) return stored;\n return { $by: stored.$by, $of: { ...stored.$of, [option]: writeMember(stored.$of[option], selection, next) } };\n}\n\n/**\n * `stored` split by the selector at `by`, every option starting as the value\n * it had. `order` is the leaf's `splitBy`: a selector earlier in it sits\n * outside a later one, so one meaning has one stored form.\n */\nexport function splitLocus(stored: unknown, by: string, options: readonly string[], order: readonly string[]): unknown {\n const across = (value: unknown): PrefLocus => ({ $by: by, $of: Object.fromEntries(options.map((option) => [option, value])) });\n if (!isPrefLocus(stored)) return across(stored);\n if (stored.$by === by) return stored;\n if (order.indexOf(stored.$by) > order.indexOf(by)) return across(stored);\n return mapMembers(stored, (inner) => splitLocus(inner, by, options, order));\n}\n\n/** `stored` no longer split by the selector at `by`: where it was, the member `selection` names stays. */\nexport function joinLocus(stored: unknown, by: string, selection: PrefSelection, absent: unknown): unknown {\n if (!isPrefLocus(stored)) return stored;\n if (stored.$by !== by) return mapMembers(stored, (inner) => joinLocus(inner, by, selection, absent));\n const option = selection[by];\n return option === undefined ? absent : member(stored, option, absent);\n}\n\nfunction mapMembers(locus: PrefLocus, fn: (member: unknown) => unknown): PrefLocus {\n let out: Record<string, unknown> | undefined;\n for (const [option, value] of Object.entries(locus.$of)) {\n const next = fn(value);\n if (next !== value) (out ??= { ...locus.$of })[option] = next;\n }\n return out ? { $by: locus.$by, $of: out } : locus;\n}\n\n/** `stored` with each alternative mapped, at any depth. The same value when no member changed. */\nexport function mapLocusMembers(stored: unknown, fn: (value: unknown) => unknown): unknown {\n return isPrefLocus(stored) ? mapMembers(stored, (inner) => mapLocusMembers(inner, fn)) : fn(stored);\n}\n\n/** The path of every selector `stored` is split by, outermost first. */\nexport function locusSelectors(stored: unknown): Set<string> {\n const out = new Set<string>();\n const walk = (value: unknown): void => {\n if (!isPrefLocus(value)) return;\n out.add(value.$by);\n for (const inner of Object.values(value.$of)) walk(inner);\n };\n walk(stored);\n return out;\n}\n\n/**\n * What a stored locus reads as: each member repaired, and a key that is none\n * of its selector's options left out. `undefined` when it is split by a\n * selector not in `allowed`, by one `optionsOf` has no options for, or by the\n * same one twice on the way to a member.\n */\nexport function repairLocus(\n stored: unknown,\n allowed: readonly string[],\n optionsOf: (path: string) => readonly string[] | undefined,\n repairMember: (value: unknown) => unknown,\n): unknown {\n const BAD = Symbol('bad');\n const walk = (value: unknown, met: readonly string[]): unknown => {\n if (!isPrefLocus(value)) return repairMember(value);\n const options = allowed.includes(value.$by) && !met.includes(value.$by) ? optionsOf(value.$by) : undefined;\n if (!options) return BAD;\n const of: Record<string, unknown> = {};\n for (const option of options) {\n if (!Object.hasOwn(value.$of, option)) continue;\n const read = walk(value.$of[option], [...met, value.$by]);\n if (read === BAD) return BAD;\n of[option] = read;\n }\n return { $by: value.$by, $of: of };\n };\n const read = walk(stored, []);\n return read === BAD ? undefined : read;\n}\n","// How the alternatives of a split value fold into one, by kind.\n\nimport { hexToRgba, interpolateSrgb, rgbaToHex } from '@weasel-js/paint';\nimport type { PrefWeighted } from './locus';\nimport type { PrefLeaf } from './schema';\n\n/**\n * Folds a split value's alternatives into the one value read. `members` holds\n * two or more, each weighing more than nothing, and their weights need not\n * sum to 1.\n */\nexport type PrefBlend = (members: readonly PrefWeighted[], leaf: PrefLeaf) => unknown;\n\n/** The first of the members that weigh the most. */\nconst heaviest: PrefBlend = (members) => members.reduce((most, m) => (m.weight > most.weight ? m : most)).value;\n\nconst blendNumber: PrefBlend = (members, leaf) => {\n let sum = 0;\n let total = 0;\n for (const { value, weight } of members) {\n if (typeof value !== 'number' || !Number.isFinite(value)) return heaviest(members, leaf);\n sum += value * weight;\n total += weight;\n }\n return sum / total;\n};\n\ntype Rgba = [number, number, number, number];\n\nconst blendColor: PrefBlend = (members, leaf) => {\n let mixed: Rgba | undefined;\n let total = 0;\n for (const { value, weight } of members) {\n let next: Rgba;\n try {\n next = hexToRgba(value as string);\n } catch {\n return heaviest(members, leaf);\n }\n total += weight;\n if (!mixed) {\n mixed = next;\n continue;\n }\n const t = weight / total;\n const [r, g, b] = interpolateSrgb([mixed[0], mixed[1], mixed[2]], [next[0], next[1], next[2]], t, 'oklch');\n mixed = [r, g, b, mixed[3] + (next[3] - mixed[3]) * t];\n }\n return rgbaToHex(mixed!);\n};\n\n/** The blends of the built-in kinds that have one. Every other kind takes its heaviest member. */\nexport const PREF_BLENDS: Readonly<Record<string, PrefBlend>> = { number: blendNumber, color: blendColor };\n\n/**\n * The value `members` fold into for `leaf`: the member itself where one holds\n * all the weight, the leaf's default where none weighs anything, and otherwise\n * what the kind's blend makes of them. `blends` is keyed by `kind`, and one\n * given for a built-in kind replaces that kind's own.\n */\nexport function blendPref(leaf: PrefLeaf, members: readonly PrefWeighted[], blends?: Readonly<Record<string, PrefBlend>>): unknown {\n if (members.length === 0) return leaf.default;\n if (members.length === 1) return members[0]!.value;\n const blend = (blends && Object.hasOwn(blends, leaf.kind) ? blends[leaf.kind] : undefined)\n ?? (Object.hasOwn(PREF_BLENDS, leaf.kind) ? PREF_BLENDS[leaf.kind] : undefined)\n ?? heaviest;\n return blend(members, leaf);\n}\n","// Which leaves a schema lets a value be split by, and what is wrong with a\n// `splitBy` that names something else: what a store warns of.\n\nimport type { PrefGroup } from './groups';\nimport { prefHoldsValue, prefLeaves } from './helpers';\nimport { locusSelectors } from './locus';\nimport type { PrefEnum, PrefLeaf } from './schema';\n\n/** One thing wrong with a leaf's `splitBy`. */\nexport interface PrefSplitProblem {\n code: 'valueless' | 'no-leaf' | 'not-enum' | 'encoded' | 'clearable' | 'split' | 'twice' | 'default';\n /** The path of the leaf whose `splitBy` it is. */\n at: string;\n /** The entry of `splitBy` the problem is with, where it is with one. */\n path?: string;\n problem: string;\n}\n\nconst refusal = (leaf: PrefLeaf | undefined): [PrefSplitProblem['code'], string] | undefined => {\n if (!leaf) return ['no-leaf', 'names no leaf'];\n if (leaf.kind !== 'enum') return ['not-enum', `names a ${leaf.kind} leaf, and only an enum has options to split by`];\n const selector = leaf as PrefEnum;\n if (selector.encoding) return ['encoded', 'names an enum with an encoding, whose stored value is not its option'];\n if (selector.clearable) return ['clearable', 'names a clearable enum, which may hold none of its options'];\n if (selector.splitBy?.length) return ['split', 'names a leaf that may itself be split'];\n return undefined;\n};\n\n/** The options of the leaf at each path some leaf of `leaves` may be split by, for the paths that can be. */\nexport function prefSelectors(leaves: ReadonlyMap<string, PrefLeaf>): Map<string, readonly string[]> {\n const out = new Map<string, readonly string[]>();\n for (const leaf of leaves.values()) {\n for (const path of leaf.splitBy ?? []) {\n const selector = leaves.get(path);\n if (out.has(path) || refusal(selector)) continue;\n out.set(path, (selector as PrefEnum).options.map((option) => option.value));\n }\n }\n return out;\n}\n\n/** Everything wrong with the `splitBy` lists of `schema`'s leaves, in schema order. */\nexport function checkPrefSplits(schema: PrefGroup): PrefSplitProblem[] {\n const leaves = prefLeaves(schema);\n const out: PrefSplitProblem[] = [];\n for (const [at, leaf] of leaves) {\n for (const path of locusSelectors(leaf.defaultLocus)) {\n if (leaf.splitBy?.includes(path)) continue;\n out.push({ code: 'default', at, path, problem: `its defaultLocus is split by \"${path}\", which its splitBy does not list` });\n }\n if (!leaf.splitBy?.length) continue;\n if (!prefHoldsValue(leaf)) {\n out.push({ code: 'valueless', at, problem: `a ${leaf.kind} leaf holds no value to split` });\n continue;\n }\n leaf.splitBy.forEach((path, i) => {\n if (leaf.splitBy!.indexOf(path) !== i) {\n out.push({ code: 'twice', at, path, problem: `\"${path}\" is listed twice` });\n return;\n }\n const why = refusal(leaves.get(path));\n if (why) out.push({ code: why[0], at, path, problem: `\"${path}\" ${why[1]}` });\n });\n }\n return out;\n}\n","// A store's values as CSS custom properties: one block for what every choice\n// of the selectors shares, and one for each choice a split value tells apart.\n\nimport type { PrefGroup } from './groups';\nimport { prefHoldsValue, prefLeaves, prefValueAtPath } from './helpers';\nimport { isPrefLocus, type PrefLocus, type PrefSelection } from './locus';\nimport type { PrefEnum, PrefLeaf, PrefNumber } from './schema';\nimport { prefSelectors } from './splitCheck';\nimport { resolvePrefUnit } from './unit';\n\n/** How {@link prefsCss} names and writes things. */\nexport interface PrefsCssOptions {\n /** The selector of the element the properties are set on, and the selectors' attributes read from. Default `:root`;\n * `:host` matches the attributes the way a shadow root's sheet has to, as `:host([…])`. */\n root?: string;\n /** The custom property a leaf is written as, or `null` to leave the leaf out. Default: `--`, then the path with\n * each `.` and each capital turned into a `-` (`look.gridGap` is `--look-grid-gap`). */\n property?: (path: string, leaf: PrefLeaf) => string | null;\n /** The attribute a selector's option is read from. Default: `data-`, then the path as a property spells it. */\n attribute?: (selector: string) => string;\n /** The CSS text of a value, `null` to leave it out, or `undefined` for what its kind writes by itself. */\n value?: (value: unknown, leaf: PrefLeaf, path: string) => string | null | undefined;\n}\n\n/** What {@link prefsCss} reads of a store: any `PrefsStore` is one. */\nexport interface PrefsCssSource {\n schema: PrefGroup;\n values(read?: { at?: PrefSelection }): Record<string, unknown>;\n locus(path: string): PrefLocus | undefined;\n get(path: string): unknown;\n}\n\n/** A path as the default names spell it: `look.gridGap` is `look-grid-gap`. */\nexport const kebab = (path: string): string => path.replace(/\\./g, '-').replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n\n/** The CSS unit a number leaf's suffix names, for the suffixes that name one. */\nconst CSS_UNITS: Readonly<Record<string, string>> = {\n px: 'px', '%': '%', em: 'em', rem: 'rem', ch: 'ch', pt: 'pt', vw: 'vw', vh: 'vh',\n ms: 'ms', s: 's', '°': 'deg', deg: 'deg', rad: 'rad', turn: 'turn',\n};\n\nconst IDENT = /^-?[A-Za-z_][\\w-]*$/;\nconst quoted = (text: string): string => `'${text.replace(/[\\\\']/g, '\\\\$&')}'`;\n\n/** What a value of a built-in kind is written as, `null` for one with no CSS form. */\nfunction cssValue(leaf: PrefLeaf, value: unknown): string | null {\n switch (leaf.kind) {\n case 'number': {\n if (typeof value !== 'number' || !Number.isFinite(value)) return null;\n const { unit } = leaf as PrefNumber;\n const resolved = unit ? resolvePrefUnit(unit) : undefined;\n const shown = resolved ? resolved.toDisplay(value) : value;\n const suffix = resolved?.suffix !== undefined && Object.hasOwn(CSS_UNITS, resolved.suffix) ? CSS_UNITS[resolved.suffix] : '';\n return `${Number(shown.toFixed(6))}${suffix}`;\n }\n case 'boolean':\n return typeof value === 'boolean' ? (value ? '1' : '0') : null;\n case 'color':\n return typeof value === 'string' && value !== '' ? value : null;\n case 'enum':\n if (typeof value !== 'string' || (leaf as PrefEnum).encoding) return null;\n return IDENT.test(value) ? value : quoted(value);\n case 'string':\n return typeof value === 'string' ? quoted(value) : null;\n default:\n return null;\n }\n}\n\n/** One choice of options, a selector's path and its option per step, and the value read under it. */\ntype Told = { under: [selector: string, option: string][]; value: unknown };\n\n/** Every choice of options a held value tells apart, outermost selector first. */\nfunction toldApart(held: unknown, optionsOf: (selector: string) => readonly string[], absent: unknown): Told[] {\n const out: Told[] = [];\n const walk = (value: unknown, under: Told['under']): void => {\n if (!isPrefLocus(value)) {\n out.push({ under, value });\n return;\n }\n for (const option of optionsOf(value.$by)) {\n walk(Object.hasOwn(value.$of, option) ? value.$of[option] : absent, [...under, [value.$by, option]]);\n }\n };\n walk(held, []);\n return out;\n}\n\n/**\n * The store's values as CSS custom properties.\n *\n * The first block sets every leaf on `root`, a split one at the member the\n * selectors' defaults name, so a page that sets no attribute still has a\n * value for each. A block follows for each choice of options some value tells\n * apart, matched by an attribute per selector on that same element; a selector\n * is written under each of its own options too. Every block is inside\n * `:where()`, so none outranks another by how many attributes it names, and a\n * rule of the page's own wins. Blocks naming more selectors come later.\n *\n * A number is written in its display unit where the unit's suffix is a CSS\n * unit, and bare otherwise; a boolean as `1` or `0`; a color as it is held; an\n * enum's option as an identifier; a string quoted. A leaf of any other kind is\n * left out unless `value` writes it.\n */\nexport function prefsCss(store: PrefsCssSource, options: PrefsCssOptions = {}): string {\n const root = options.root ?? ':root';\n const property = options.property ?? ((path: string): string => `--${kebab(path)}`);\n const attribute = options.attribute ?? ((selector: string): string => `data-${kebab(selector)}`);\n const leaves = new Map([...prefLeaves(store.schema)].filter(([, leaf]) => prefHoldsValue(leaf)));\n const selectors = prefSelectors(leaves);\n const defaults = Object.fromEntries([...selectors.keys()].map((path) => [path, leaves.get(path)!.default as string]));\n const base = store.values({ at: defaults });\n\n const blocks = new Map<string, { under: Told['under']; lines: string[] }>();\n const declare = (under: Told['under'], path: string, leaf: PrefLeaf, value: unknown): void => {\n const name = property(path, leaf);\n if (name === null) return;\n const given = options.value?.(value, leaf, path);\n const text = given === undefined ? cssValue(leaf, value) : given;\n if (text === null) return;\n const key = under.map(([selector, option]) => `${selector}=${option}`).join('&');\n if (!blocks.has(key)) blocks.set(key, { under, lines: [] });\n blocks.get(key)!.lines.push(` ${name}: ${text};`);\n };\n\n for (const [path, leaf] of leaves) {\n declare([], path, leaf, prefValueAtPath(base, path));\n const own = selectors.get(path);\n if (own) for (const option of own) declare([[path, option]], path, leaf, option);\n const held = store.locus(path);\n if (!held) continue;\n for (const { under, value } of toldApart(held, (selector) => selectors.get(selector) ?? [], leaf.default)) {\n declare(under, path, leaf, value);\n }\n }\n\n return [...blocks.values()]\n .map((block, i) => ({ ...block, i }))\n .sort((a, b) => a.under.length - b.under.length || a.i - b.i)\n .map(({ under, lines }) => {\n const matched = under.map(([selector, option]) => `[${attribute(selector)}=${quoted(option)}]`).join('');\n const at = root === ':host' && matched !== '' ? `:host(${matched})` : `${root}${matched}`;\n return `:where(${at}) {\\n${lines.join('\\n')}\\n}`;\n })\n .join('\\n\\n');\n}\n\n/**\n * The attribute for each selector and the option it is set to: what to set\n * on the `root` element for the blocks of {@link prefsCss} to match the\n * store's own choice.\n */\nexport function prefsCssAttributes(store: Pick<PrefsCssSource, 'schema' | 'get'>, options: Pick<PrefsCssOptions, 'attribute'> = {}): Record<string, string> {\n const attribute = options.attribute ?? ((selector: string): string => `data-${kebab(selector)}`);\n const leaves = prefLeaves(store.schema);\n return Object.fromEntries([...prefSelectors(leaves).keys()].map((path) => [attribute(path), store.get(path) as string]));\n}\n","import type { PrefValueBase, PrefObject } from './schema';\n\n/**\n * A leaf whose value is one of several object shapes, told apart by the\n * string its `tag` field holds: `{ type: 'linear', angle: 90 }` or\n * `{ type: 'radial', radius: 1 }` under `tag: 'type'`.\n *\n * Each variant is an `object` leaf keyed by its tag value. Its `children`\n * are the fields beside the tag, its `name` is what a person chooses, and\n * its `default` (without the tag) is what the value becomes when they choose\n * it. A stored value whose tag names no variant reads as the leaf's default.\n */\nexport interface PrefUnion extends PrefValueBase<'union', unknown> {\n /** The field of the value that names its variant. Not one of `tags`. */\n tag: string;\n variants: Record<string, PrefObject>;\n}\n\n/** The variant `value` is, or `undefined` when its tag names none. */\nexport function prefVariantOf(leaf: PrefUnion, value: unknown): [key: string, variant: PrefObject] | undefined {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const key = (value as Record<string, unknown>)[leaf.tag];\n if (typeof key !== 'string' || !Object.hasOwn(leaf.variants, key)) return undefined;\n return [key, leaf.variants[key]!];\n}\n\n/** The value a union takes on switching to the variant at `key`: that variant's default, tagged. */\nexport function prefVariantDefault(leaf: PrefUnion, key: string): Record<string, unknown> {\n const held = leaf.variants[key]?.default;\n const fields = held !== null && typeof held === 'object' ? (held as Record<string, unknown>) : {};\n return { ...fields, [leaf.tag]: key };\n}\n","import { endlessAllows } from '@weasel-js/quantity';\nimport { isPlainObject } from '@weasel-js/registry';\nimport { prefClampNumber } from './bounds';\nimport { prefSectionLeaves } from './helpers';\nimport type { PrefList } from './list';\nimport type { PrefMap } from './map';\nimport { prefVariantOf, type PrefUnion } from './union';\nimport type { PrefBoolean, PrefEnum, PrefLeaf, PrefNumber, PrefObject } from './schema';\n\n/** Decides what a stored value reads as for one kind of leaf: the value to\n * read, or `undefined` for \"invalid, read the default\". */\nexport type PrefValidator = (stored: unknown, leaf: PrefLeaf) => unknown;\n\n/** What `stored` reads as for `leaf`. Never writes anything back: a schema\n * rolled back finds the original still in storage. */\nexport function repairPrefValue(\n leaf: PrefLeaf,\n stored: unknown,\n validators?: Readonly<Record<string, PrefValidator>>,\n): unknown {\n if (leaf.kind === 'number') {\n if (stored === 'Infinity') stored = Infinity;\n else if (stored === '-Infinity') stored = -Infinity;\n }\n const validate = validators?.[leaf.kind];\n if (validate) {\n try {\n const out = validate(stored, leaf);\n return out === undefined ? leaf.default : out;\n } catch {\n return leaf.default;\n }\n }\n switch (leaf.kind) {\n case 'number':\n return repairNumber(leaf as PrefNumber, stored);\n case 'boolean':\n return (leaf as PrefBoolean).encoding || typeof stored === 'boolean' ? stored : leaf.default;\n case 'string':\n case 'color':\n case 'field':\n return typeof stored === 'string' ? stored : leaf.default;\n case 'enum': {\n const e = leaf as PrefEnum;\n if (e.encoding) return stored;\n return e.options.some((o) => o.value === stored) ? stored : leaf.default;\n }\n case 'object':\n if (isPlainObject(stored)) return repairFields(leaf as PrefObject, stored as Record<string, unknown>, validators);\n return (leaf as PrefObject).fromScalar ? stored : leaf.default;\n case 'map':\n return repairMap(leaf as PrefMap, stored, validators);\n case 'union': {\n const variant = prefVariantOf(leaf as PrefUnion, stored);\n return variant ? repairFields(variant[1], stored as Record<string, unknown>, validators) : leaf.default;\n }\n case 'list':\n return repairList(leaf as PrefList, stored, validators);\n default:\n return stored;\n }\n}\n\ntype Validators = Readonly<Record<string, PrefValidator>> | undefined;\n\n/**\n * Each field the object holds reads as its own leaf would. A field it omits\n * stays omitted: absent is a state of its own (no dash, no shadow), and not\n * the field at its default. Fields no leaf describes pass through.\n */\nfunction repairFields(leaf: PrefObject, stored: Record<string, unknown>, validators: Validators): unknown {\n let out: Record<string, unknown> | undefined;\n for (const [key, field] of prefSectionLeaves(leaf.children)) {\n if (!Object.hasOwn(stored, key) || stored[key] === undefined) continue;\n const read = repairPrefValue(field, stored[key], validators);\n if (read !== stored[key]) (out ??= { ...stored })[key] = read;\n }\n return out ?? stored;\n}\n\n/** Each value reads as `item` would on its own, under the key it was stored at. */\nfunction repairMap(leaf: PrefMap, stored: unknown, validators: Validators): unknown {\n if (!isPlainObject(stored)) return leaf.default;\n const held = stored as Record<string, unknown>;\n let out: Record<string, unknown> | undefined;\n for (const [key, value] of Object.entries(held)) {\n const read = repairPrefValue(leaf.item, value, validators);\n if (read !== value) (out ??= { ...held })[key] = read;\n }\n return out ?? stored;\n}\n\n/** Each entry reads as `item` would on its own, so one bad entry costs that entry and not the list. */\nfunction repairList(\n leaf: PrefList,\n stored: unknown,\n validators?: Readonly<Record<string, PrefValidator>>,\n): unknown {\n if (!Array.isArray(stored)) return leaf.default;\n if (leaf.minItems !== undefined && stored.length < leaf.minItems) return leaf.default;\n const kept = leaf.maxItems !== undefined && stored.length > leaf.maxItems ? stored.slice(0, leaf.maxItems) : stored;\n const read = kept.map((entry) => repairPrefValue(leaf.item, entry, validators));\n return kept === stored && read.every((entry, i) => entry === stored[i]) ? stored : read;\n}\n\n\nfunction repairNumber(leaf: PrefNumber, stored: unknown): unknown {\n if (typeof stored !== 'number' || Number.isNaN(stored)) return leaf.default;\n if (endlessAllows(leaf.endless, stored)) return stored;\n const v = prefClampNumber(leaf, stored);\n return Number.isFinite(v) ? v : leaf.default;\n}\n","/**\n * How a pref is stored: its value, stamped with the schema version it was\n * written at. The stamp is what lets a record be migrated from its own\n * version, whatever the store's version record says by the time it is read.\n */\nexport interface StampedRecord {\n /** The schema version `value` is in the shape of. */\n $at: number;\n value: unknown;\n}\n\nconst isVersion = (v: unknown): v is number => typeof v === 'number' && Number.isInteger(v) && v >= 0;\n\nexport function stampRecord(value: unknown, at: number): StampedRecord {\n return { $at: at, value };\n}\n\nexport function isStampedRecord(record: unknown): record is StampedRecord {\n if (record === null || typeof record !== 'object') return false;\n const keys = Object.keys(record);\n return keys.length === 2 && Object.hasOwn(record, 'value') && isVersion((record as StampedRecord).$at);\n}\n\n/**\n * A stored record's value and the version it is in. One with no stamp was\n * written by a build from before records carried one, and is read as being\n * in `unstamped`, the version the store said it was at.\n */\nexport function readRecord(record: unknown, unstamped: number): { at: number; value: unknown; stamped: boolean } {\n return isStampedRecord(record)\n ? { at: record.$at, value: record.value, stamped: true }\n : { at: unstamped, value: record, stamped: false };\n}\n\n/** A stored record's value, whatever version it is in. */\nexport function recordValue(record: unknown): unknown {\n return isStampedRecord(record) ? record.value : record;\n}\n","// What a store reads at one moment: every leaf's stored value repaired, and\n// the value each resolves to under the selectors' own values. Rebuilt when a\n// record changes, reusing what it read from the records that did not.\n\nimport type { OwnedRecordCache } from '@weasel-js/storage';\nimport { blendPref, type PrefBlend } from './blend';\nimport { assignPrefValueAtPath } from './helpers';\nimport { isPrefLocus, locusSelectors, repairLocus, selectionWeights, weighLocus, type PrefLocus, type PrefSelection, type PrefWeights } from './locus';\nimport { type PrefValidator, repairPrefValue } from './repair';\nimport type { PrefLeaf } from './schema';\nimport { recordValue } from './stamp';\n\nexport interface Snapshot {\n /** Each leaf's value as read: a split one folded under `selection`. */\n byPath: Map<string, unknown>;\n /** Each leaf's stored value, repaired: a locus where it is split. */\n held: Map<string, unknown>;\n /** What each split leaf holds, by its path. */\n loci: ReadonlyMap<string, PrefLocus>;\n /** The option each selector is set to. */\n selection: PrefSelection;\n /** The leaves split by each selector, by the selector's path. */\n splitBy: Map<string, string[]>;\n tree: Record<string, unknown>;\n unset: ReadonlySet<string>;\n}\n\n/** What a store reads its snapshots from. */\nexport interface SnapshotSource {\n leaves: ReadonlyMap<string, PrefLeaf>;\n cache: OwnedRecordCache;\n /** The options of each leaf a value may be split by. */\n selectors: ReadonlyMap<string, readonly string[]>;\n validators?: Readonly<Record<string, PrefValidator>>;\n blends?: Readonly<Record<string, PrefBlend>>;\n}\n\n/** What `stored` reads as for `leaf`: a locus with each member repaired where the leaf may hold one, else the value repaired. */\nexport function readStored(source: Pick<SnapshotSource, 'selectors' | 'validators'>, leaf: PrefLeaf, stored: unknown): unknown {\n const repair = (value: unknown): unknown => repairPrefValue(leaf, value, source.validators);\n if (!leaf.splitBy?.length || !isPrefLocus(stored)) return repair(stored);\n const read = repairLocus(stored, leaf.splitBy, (path) => source.selectors.get(path), repair);\n return read === undefined ? leaf.default : read;\n}\n\n/** `held` folded under `weights`: itself where it is not split. */\nexport function resolveHeld(source: Pick<SnapshotSource, 'blends'>, leaf: PrefLeaf, held: unknown, weights: PrefWeights): unknown {\n return isPrefLocus(held) ? blendPref(leaf, weighLocus(held, weights, leaf.default), source.blends) : held;\n}\n\n/** The store's snapshots: `current` builds one when there is none, and `drop` discards it when a record changed. */\nexport function createSnapshots(source: SnapshotSource): { current: () => Snapshot; peek: () => Snapshot | null; drop: () => void } {\n const { leaves, cache, selectors } = source;\n let snapshot: Snapshot | null = null;\n let previous: { raw: Map<string, unknown>; held: Map<string, unknown> } | null = null;\n\n const unsetLoci = new Map<string, unknown>();\n /** What an unset leaf holds: its split default, repaired once, where it has one. */\n const unsetHeld = (path: string, leaf: PrefLeaf): unknown => {\n if (leaf.defaultLocus === undefined) return leaf.default;\n if (!unsetLoci.has(path)) unsetLoci.set(path, readStored(source, leaf, leaf.defaultLocus));\n return unsetLoci.get(path);\n };\n\n const build = (): Snapshot => {\n const held = new Map<string, unknown>();\n const raw = new Map<string, unknown>();\n const unset = new Set<string>();\n for (const [path, leaf] of leaves) {\n if (!cache.has(path)) {\n held.set(path, unsetHeld(path, leaf));\n unset.add(path);\n continue;\n }\n const record = cache.get(path);\n raw.set(path, record);\n const same = previous?.raw.has(path) && previous.raw.get(path) === record;\n held.set(path, same ? previous!.held.get(path) : readStored(source, leaf, recordValue(record)));\n }\n previous = { raw, held };\n\n const selection: Record<string, string> = {};\n for (const path of selectors.keys()) selection[path] = held.get(path) as string;\n const weights = selectionWeights(selection);\n const byPath = new Map<string, unknown>();\n const splitBy = new Map<string, string[]>();\n const loci = new Map<string, PrefLocus>();\n const tree: Record<string, unknown> = {};\n for (const [path, leaf] of leaves) {\n const value = held.get(path);\n if (isPrefLocus(value)) loci.set(path, value);\n for (const selector of locusSelectors(value)) splitBy.set(selector, [...(splitBy.get(selector) ?? []), path]);\n const read = resolveHeld(source, leaf, value, weights);\n byPath.set(path, read);\n assignPrefValueAtPath(tree, path, read);\n }\n return { byPath, held, loci, selection, splitBy, tree, unset };\n };\n\n return {\n current: () => (snapshot ??= build()),\n peek: () => snapshot,\n drop: () => {\n snapshot = null;\n },\n };\n}\n\n/**\n * The weights a read is made under: `given` for each selector it names, the\n * options in the selector's own order, and all of every other selector's on\n * the option `selection` has it at.\n */\nexport function weightsUnder(\n selectors: ReadonlyMap<string, readonly string[]>,\n selection: PrefSelection,\n given: PrefWeights,\n): PrefWeights {\n const out: Record<string, Record<string, number>> = {};\n for (const [path, options] of selectors) {\n const own = Object.hasOwn(given, path) ? given[path] : undefined;\n out[path] = own\n ? Object.fromEntries(options.filter((option) => (own[option] ?? 0) > 0).map((option) => [option, own[option]!]))\n : { [selection[path]!]: 1 };\n }\n return out;\n}\n\n/** `selection` with each selector `at` names set to the option it gives, where that is one of the selector's. */\nexport function selectionAt(\n selectors: ReadonlyMap<string, readonly string[]>,\n selection: PrefSelection,\n at: PrefSelection,\n): PrefSelection {\n const out: Record<string, string> = { ...selection };\n for (const [path, option] of Object.entries(at)) {\n if (selectors.get(path)?.includes(option)) out[path] = option;\n }\n return out;\n}\n"]}