@bgub/fig 0.1.0-alpha.0 → 0.1.0-alpha.2

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +517 -0
  2. package/README.md +50 -19
  3. package/dist/element-BVg1bKOz.d.ts +345 -0
  4. package/dist/element-DmbzNH0T.js +299 -0
  5. package/dist/element-DmbzNH0T.js.map +1 -0
  6. package/dist/hooks-B7BTQWiu.d.ts +158 -0
  7. package/dist/index.d.ts +3 -5
  8. package/dist/index.js +4 -4
  9. package/dist/internal.d.ts +215 -6
  10. package/dist/internal.js +15 -43
  11. package/dist/internal.js.map +1 -1
  12. package/dist/jsx-runtime.d.ts +1 -1
  13. package/dist/jsx-runtime.js +3 -3
  14. package/dist/jsx-runtime.js.map +1 -1
  15. package/dist/payload-format-KTNaSI4h.js +366 -0
  16. package/dist/payload-format-KTNaSI4h.js.map +1 -0
  17. package/dist/payload.d.ts +92 -0
  18. package/dist/payload.js +429 -0
  19. package/dist/payload.js.map +1 -0
  20. package/dist/{transition-DEqcImne.js → resource-DskjKeuM.js} +144 -83
  21. package/dist/resource-DskjKeuM.js.map +1 -0
  22. package/dist/{data-store-CRnNAT9-.js → transition-CC4kjjrU.js} +165 -54
  23. package/dist/transition-CC4kjjrU.js.map +1 -0
  24. package/package.json +5 -6
  25. package/dist/data-CHJh_xU9.d.ts +0 -79
  26. package/dist/data-h46EcMnE.js +0 -37
  27. package/dist/data-h46EcMnE.js.map +0 -1
  28. package/dist/data-store-CRnNAT9-.js.map +0 -1
  29. package/dist/data-store-EQOLQsW4.d.ts +0 -32
  30. package/dist/element-Bh_k9c3N.js +0 -179
  31. package/dist/element-Bh_k9c3N.js.map +0 -1
  32. package/dist/element-CCOOi4Ka.d.ts +0 -209
  33. package/dist/server.browser.d.ts +0 -9
  34. package/dist/server.browser.js +0 -8
  35. package/dist/server.browser.js.map +0 -1
  36. package/dist/server.d.ts +0 -9
  37. package/dist/server.js +0 -9
  38. package/dist/server.js.map +0 -1
  39. package/dist/transition-Cl6mAPcx.d.ts +0 -96
  40. package/dist/transition-DEqcImne.js.map +0 -1
@@ -1,79 +0,0 @@
1
- //#region src/data.d.ts
2
- type DataResourceKeyInput = string | number | boolean | null | readonly DataResourceKeyInput[] | {
3
- readonly [key: string]: DataResourceKeyInput;
4
- };
5
- type DataResourceKey = readonly [string, ...DataResourceKeyInput[]];
6
- interface DataResourceLoadContext {
7
- signal: AbortSignal;
8
- }
9
- interface DataResource<TArgs extends unknown[] = unknown[], TValue = unknown> {
10
- readonly $$typeof: symbol;
11
- readonly debugArgs?: (...args: TArgs) => DataResourceKeyInput;
12
- readonly key: (...args: TArgs) => DataResourceKey;
13
- readonly load?: (...argsAndContext: [...TArgs, DataResourceLoadContext]) => TValue | PromiseLike<TValue>;
14
- }
15
- type DataRefreshResult<T> = {
16
- status: "fulfilled";
17
- value: T;
18
- } | {
19
- status: "rejected";
20
- error: unknown;
21
- staleValue?: T;
22
- } | {
23
- status: "aborted";
24
- reason: "superseded" | "store-disposed" | "evicted";
25
- staleValue?: T;
26
- } | {
27
- status: "unsupported";
28
- reason: "no-client-loader";
29
- staleValue?: T;
30
- };
31
- interface FigDataHydrationEntry {
32
- key: DataResourceKey;
33
- value: unknown;
34
- }
35
- type FigDataEntryStatus = "pending" | "fulfilled" | "rejected" | "refreshing";
36
- interface DataStoreEntrySnapshot {
37
- canonicalKey: string;
38
- error?: unknown;
39
- hasValue: boolean;
40
- key: DataResourceKey;
41
- pending: boolean;
42
- refreshError?: unknown;
43
- stale: boolean;
44
- status: FigDataEntryStatus;
45
- subscriberCount: number;
46
- value?: unknown;
47
- }
48
- interface FigDataStoreHandle {
49
- hydrate(entries: readonly FigDataHydrationEntry[]): void;
50
- invalidateData<TArgs extends unknown[], TValue>(resource: DataResource<TArgs, TValue>, ...args: TArgs): void;
51
- invalidateDataError(error: unknown): boolean;
52
- invalidateDataKey(key: DataResourceKey): void;
53
- invalidateDataPrefix(prefix: DataResourceKey): void;
54
- preloadData<TArgs extends unknown[], TValue>(resource: DataResource<TArgs, TValue>, ...args: TArgs): void;
55
- refreshData<TArgs extends unknown[], TValue>(resource: DataResource<TArgs, TValue>, ...args: TArgs): Promise<DataRefreshResult<TValue>>;
56
- run<T>(callback: () => T): T;
57
- }
58
- interface FigDataStore extends FigDataStoreHandle {
59
- commitDataDependencies(owner: object, previousOwner: object | null): void;
60
- deleteDataOwner(owner: object): void;
61
- releaseDataOwner(owner: object): void;
62
- resetDataDependencies(owner: object): void;
63
- dispose(): void;
64
- inspectDataEntries(): DataStoreEntrySnapshot[];
65
- snapshot(): FigDataHydrationEntry[];
66
- readData<TArgs extends unknown[], TValue>(resource: DataResource<TArgs, TValue>, args: TArgs, owner: object): TValue;
67
- }
68
- interface FigDataStoreHost {
69
- getLane(): unknown;
70
- partition?: DataResourceKeyInput;
71
- schedule(owner: object, lane: unknown): void;
72
- }
73
- type FigDataStoreFactory = (host: FigDataStoreHost) => FigDataStore;
74
- declare function resolveCurrentDataStore(message?: string): FigDataStore;
75
- declare function setCurrentDataStore(store: FigDataStore | null): FigDataStore | null;
76
- declare function markDataResourceError(error: unknown, key: DataResourceKey): void;
77
- declare function dataResourceKeysForError(error: unknown): DataResourceKey[] | undefined;
78
- //#endregion
79
- export { DataResourceLoadContext as a, FigDataHydrationEntry as c, FigDataStoreHandle as d, FigDataStoreHost as f, setCurrentDataStore as g, resolveCurrentDataStore as h, DataResourceKeyInput as i, FigDataStore as l, markDataResourceError as m, DataResource as n, DataStoreEntrySnapshot as o, dataResourceKeysForError as p, DataResourceKey as r, FigDataEntryStatus as s, DataRefreshResult as t, FigDataStoreFactory as u };
@@ -1,37 +0,0 @@
1
- //#region src/data.ts
2
- const objectDataErrors = /* @__PURE__ */ new WeakMap();
3
- let currentDataStore = null;
4
- function resolveCurrentDataStore(message = "Data resource APIs require a Fig data store.") {
5
- if (currentDataStore === null) throw new Error(message);
6
- return currentDataStore;
7
- }
8
- function setCurrentDataStore(store) {
9
- const previousStore = currentDataStore;
10
- currentDataStore = store;
11
- return previousStore;
12
- }
13
- function markDataResourceError(error, key) {
14
- if (!isObjectKey(error)) return;
15
- let keys = objectDataErrors.get(error);
16
- if (keys === void 0) {
17
- keys = [];
18
- objectDataErrors.set(error, keys);
19
- }
20
- if (keys.some((existing) => sameDataResourceKey(existing, key))) return;
21
- keys.push(key);
22
- }
23
- function dataResourceKeysForError(error) {
24
- if (!isObjectKey(error)) return void 0;
25
- const keys = objectDataErrors.get(error);
26
- return keys === void 0 || keys.length === 0 ? void 0 : [...keys];
27
- }
28
- function sameDataResourceKey(a, b) {
29
- return a.length === b.length && a.every((value, index) => Object.is(value, b[index]));
30
- }
31
- function isObjectKey(value) {
32
- return (typeof value === "object" || typeof value === "function") && value !== null;
33
- }
34
- //#endregion
35
- export { setCurrentDataStore as i, markDataResourceError as n, resolveCurrentDataStore as r, dataResourceKeysForError as t };
36
-
37
- //# sourceMappingURL=data-h46EcMnE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-h46EcMnE.js","names":[],"sources":["../src/data.ts"],"sourcesContent":["export type DataResourceKeyInput =\n | string\n | number\n | boolean\n | null\n | readonly DataResourceKeyInput[]\n | { readonly [key: string]: DataResourceKeyInput };\n\nexport type DataResourceKey = readonly [string, ...DataResourceKeyInput[]];\n\nexport interface DataResourceLoadContext {\n signal: AbortSignal;\n}\n\nexport interface DataResource<\n TArgs extends unknown[] = unknown[],\n TValue = unknown,\n> {\n readonly $$typeof: symbol;\n readonly debugArgs?: (...args: TArgs) => DataResourceKeyInput;\n readonly key: (...args: TArgs) => DataResourceKey;\n readonly load?: (\n ...argsAndContext: [...TArgs, DataResourceLoadContext]\n ) => TValue | PromiseLike<TValue>;\n}\n\nexport type DataRefreshResult<T> =\n | { status: \"fulfilled\"; value: T }\n | { status: \"rejected\"; error: unknown; staleValue?: T }\n | {\n status: \"aborted\";\n reason: \"superseded\" | \"store-disposed\" | \"evicted\";\n staleValue?: T;\n }\n | {\n status: \"unsupported\";\n reason: \"no-client-loader\";\n staleValue?: T;\n };\n\nexport interface FigDataHydrationEntry {\n key: DataResourceKey;\n value: unknown;\n}\n\nexport type FigDataEntryStatus =\n | \"pending\"\n | \"fulfilled\"\n | \"rejected\"\n | \"refreshing\";\n\nexport interface DataStoreEntrySnapshot {\n canonicalKey: string;\n error?: unknown;\n hasValue: boolean;\n key: DataResourceKey;\n pending: boolean;\n refreshError?: unknown;\n stale: boolean;\n status: FigDataEntryStatus;\n subscriberCount: number;\n value?: unknown;\n}\n\n// The explicit, app-facing store surface (FigRoot.data, readDataStore()).\n// The free functions in @bgub/fig resolve the ambient store slot, which\n// is only set while Fig executes synchronously — render, event handlers, the\n// synchronous prefix of actions and transitions, and effects. After an\n// `await` the slot is gone, so async flows capture this handle first and call\n// its methods instead.\nexport interface FigDataStoreHandle {\n hydrate(entries: readonly FigDataHydrationEntry[]): void;\n invalidateData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n ): void;\n invalidateDataError(error: unknown): boolean;\n invalidateDataKey(key: DataResourceKey): void;\n invalidateDataPrefix(prefix: DataResourceKey): void;\n preloadData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n ): void;\n refreshData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n ): Promise<DataRefreshResult<TValue>>;\n run<T>(callback: () => T): T;\n}\n\nexport interface FigDataStore extends FigDataStoreHandle {\n commitDataDependencies(owner: object, previousOwner: object | null): void;\n deleteDataOwner(owner: object): void;\n releaseDataOwner(owner: object): void;\n resetDataDependencies(owner: object): void;\n dispose(): void;\n inspectDataEntries(): DataStoreEntrySnapshot[];\n snapshot(): FigDataHydrationEntry[];\n // Renderer plumbing, not handle surface: args stay an array because the\n // subscribing owner trails them.\n readData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n owner: object,\n ): TValue;\n}\n\n// The host callbacks a renderer hands to the data-store factory. Structurally\n// compatible with @bgub/fig's DataStoreHost so its createDataStore can\n// register directly.\nexport interface FigDataStoreHost {\n getLane(): unknown;\n partition?: DataResourceKeyInput;\n schedule(owner: object, lane: unknown): void;\n}\n\nexport type FigDataStoreFactory = (host: FigDataStoreHost) => FigDataStore;\n\nconst objectDataErrors = new WeakMap<object, DataResourceKey[]>();\n\nlet currentDataStore: FigDataStore | null = null;\n\nexport function resolveCurrentDataStore(\n message = \"Data resource APIs require a Fig data store.\",\n): FigDataStore {\n if (currentDataStore === null) throw new Error(message);\n return currentDataStore;\n}\n\nexport function setCurrentDataStore(\n store: FigDataStore | null,\n): FigDataStore | null {\n const previousStore = currentDataStore;\n currentDataStore = store;\n return previousStore;\n}\n\nexport function markDataResourceError(\n error: unknown,\n key: DataResourceKey,\n): void {\n // Only object errors are attributed: the WeakMap keys them by identity, so the\n // registry is GC-safe and cannot cross-attribute. Primitive rejection values\n // would collide by value and accumulate forever in a plain Map, so a thrown\n // primitive simply carries no resource-key metadata.\n if (!isObjectKey(error)) return;\n\n let keys = objectDataErrors.get(error);\n if (keys === undefined) {\n keys = [];\n objectDataErrors.set(error, keys);\n }\n\n if (keys.some((existing) => sameDataResourceKey(existing, key))) return;\n\n keys.push(key);\n}\n\nexport function dataResourceKeysForError(\n error: unknown,\n): DataResourceKey[] | undefined {\n if (!isObjectKey(error)) return undefined;\n\n const keys = objectDataErrors.get(error);\n return keys === undefined || keys.length === 0 ? undefined : [...keys];\n}\n\nfunction sameDataResourceKey(a: DataResourceKey, b: DataResourceKey): boolean {\n return (\n a.length === b.length &&\n a.every((value, index) => Object.is(value, b[index]))\n );\n}\n\nfunction isObjectKey(value: unknown): value is object {\n return (\n (typeof value === \"object\" || typeof value === \"function\") && value !== null\n );\n}\n"],"mappings":";AAsHA,MAAM,mCAAmB,IAAI,QAAmC;AAEhE,IAAI,mBAAwC;AAE5C,SAAgB,wBACd,UAAU,gDACI;CACd,IAAI,qBAAqB,MAAM,MAAM,IAAI,MAAM,OAAO;CACtD,OAAO;AACT;AAEA,SAAgB,oBACd,OACqB;CACrB,MAAM,gBAAgB;CACtB,mBAAmB;CACnB,OAAO;AACT;AAEA,SAAgB,sBACd,OACA,KACM;CAKN,IAAI,CAAC,YAAY,KAAK,GAAG;CAEzB,IAAI,OAAO,iBAAiB,IAAI,KAAK;CACrC,IAAI,SAAS,KAAA,GAAW;EACtB,OAAO,CAAC;EACR,iBAAiB,IAAI,OAAO,IAAI;CAClC;CAEA,IAAI,KAAK,MAAM,aAAa,oBAAoB,UAAU,GAAG,CAAC,GAAG;CAEjE,KAAK,KAAK,GAAG;AACf;AAEA,SAAgB,yBACd,OAC+B;CAC/B,IAAI,CAAC,YAAY,KAAK,GAAG,OAAO,KAAA;CAEhC,MAAM,OAAO,iBAAiB,IAAI,KAAK;CACvC,OAAO,SAAS,KAAA,KAAa,KAAK,WAAW,IAAI,KAAA,IAAY,CAAC,GAAG,IAAI;AACvE;AAEA,SAAS,oBAAoB,GAAoB,GAA6B;CAC5E,OACE,EAAE,WAAW,EAAE,UACf,EAAE,OAAO,OAAO,UAAU,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC;AAExD;AAEA,SAAS,YAAY,OAAiC;CACpD,QACG,OAAO,UAAU,YAAY,OAAO,UAAU,eAAe,UAAU;AAE5E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-store-CRnNAT9-.js","names":[],"sources":["../src/data-store.ts"],"sourcesContent":["import {\n type DataRefreshResult,\n type DataResource,\n type DataResourceKey,\n type DataResourceKeyInput,\n type DataResourceLoadContext,\n type DataStoreEntrySnapshot,\n dataResourceKeysForError,\n type FigDataEntryStatus,\n type FigDataHydrationEntry,\n type FigDataStore,\n type FigDataStoreFactory,\n type FigDataStoreHandle,\n markDataResourceError,\n resolveCurrentDataStore,\n setCurrentDataStore,\n} from \"./data.ts\";\n\ndeclare const __FIG_DEV__: boolean | undefined;\n\nexport interface DataResourceOptions<TArgs extends unknown[], TValue> {\n key: (...args: TArgs) => DataResourceKey;\n debugArgs?: (...args: TArgs) => DataResourceKeyInput;\n load?: (\n ...argsAndContext: [...TArgs, DataResourceLoadContext]\n ) => TValue | PromiseLike<TValue>;\n}\n\nexport interface DataStoreHost<Owner extends object, Lane> {\n getLane(): Lane;\n inactiveRetentionMs?: number;\n onEntryChange?: (entry: DataStoreEntrySnapshot) => void;\n onEntryEvict?: (entry: DataStoreEntrySnapshot) => void;\n partition?: DataResourceKeyInput;\n preloadRetentionMs?: number;\n schedule(owner: Owner, lane: Lane): void;\n}\n\nexport interface DataStore<\n Owner extends object = object,\n Lane = unknown,\n> extends FigDataStore {\n readonly host: DataStoreHost<Owner, Lane>;\n}\n\ninterface Entry<Owner extends object, Lane> {\n canonicalKey: string;\n controller: AbortController | null;\n error: unknown;\n fingerprint: string | null;\n generation: number;\n invalidationVersion: number;\n inactiveTimer: TimerHandle | null;\n key: DataResourceKey;\n lane: Lane | null;\n pending: PendingResult<unknown> | null;\n preloadTimer: TimerHandle | null;\n refreshError: unknown;\n resource: DataResource<unknown[], unknown> | null;\n stale: boolean;\n status: FigDataEntryStatus;\n storeKey: string;\n subscribers: Set<Owner>;\n value: unknown;\n}\n\ninterface PendingResult<T> {\n promise: Promise<DataRefreshResult<T>>;\n resolve: (result: DataRefreshResult<T>) => void;\n}\n\ninterface NormalizedKey {\n canonical: string;\n key: DataResourceKey;\n}\n\ninterface EncodePath {\n root: string;\n segments: Array<string | number>;\n}\n\ninterface LoadOptions<Lane> {\n lane: Lane;\n refresh: boolean;\n}\n\n// Why an in-flight load was aborted: \"superseded\" by a newer load, the store was\n// \"store-disposed\", or the entry was \"evicted\" from a live store because nothing\n// retained it (retention window elapsed, or last subscriber released).\ntype AbortReason = \"superseded\" | \"store-disposed\" | \"evicted\";\n\nconst DataResourceSymbol = Symbol.for(\"fig.data-resource\");\nconst DataStoreFactorySymbol = Symbol.for(\"fig.data-store-factory\");\nconst DEFAULT_INACTIVE_RETENTION_MS = 5 * 60 * 1000;\nconst DEFAULT_PRELOAD_RETENTION_MS = 30 * 1000;\nconst __DEV__ = typeof __FIG_DEV__ === \"boolean\" ? __FIG_DEV__ : false;\n\ntype TimerHandle = ReturnType<typeof setTimeout>;\n\nconst dataStoreFactory = createDataStore as FigDataStoreFactory;\n\nexport function dataResource<TArgs extends unknown[], TValue>(\n options: DataResourceOptions<TArgs, TValue>,\n): DataResource<TArgs, TValue> {\n const resource = {\n $$typeof: DataResourceSymbol,\n debugArgs: options.debugArgs,\n key: options.key,\n load: options.load,\n };\n (\n resource as DataResource<TArgs, TValue> &\n Record<symbol, FigDataStoreFactory>\n )[DataStoreFactorySymbol] = dataStoreFactory;\n return resource;\n}\n\nexport function invalidateData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n): void {\n resolveDataMutationStore(\"invalidateData\").invalidateData(resource, ...args);\n}\n\nexport function invalidateDataError(error: unknown): boolean {\n return resolveDataMutationStore(\"invalidateDataError\").invalidateDataError(\n error,\n );\n}\n\nexport function invalidateDataKey(key: DataResourceKey): void {\n resolveDataMutationStore(\"invalidateDataKey\").invalidateDataKey(key);\n}\n\nexport function invalidateDataPrefix(prefix: DataResourceKey): void {\n resolveDataMutationStore(\"invalidateDataPrefix\").invalidateDataPrefix(prefix);\n}\n\nexport function refreshData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n): Promise<DataRefreshResult<TValue>> {\n return resolveDataMutationStore(\"refreshData\").refreshData(resource, ...args);\n}\n\n// Captures the ambient store as an explicit handle. Call it synchronously\n// wherever Fig is executing — render, event handlers, actions, effects — and\n// keep the reference: unlike the free functions above, the handle's methods\n// still work after an `await`, where the ambient slot is gone.\nexport function readDataStore(): FigDataStoreHandle {\n return resolveCurrentDataStore(\n \"readDataStore() must be called synchronously while Fig is executing — \" +\n \"during render, an event handler, an action, or an effect. Capture \" +\n \"the handle there and use it after awaits.\",\n );\n}\n\nfunction resolveDataMutationStore(name: string): FigDataStore {\n return resolveCurrentDataStore(\n `${name}() must be called synchronously while Fig is executing — ` +\n \"during render, an event handler, an action, or an effect. Capture \" +\n \"readDataStore() (or root.data) synchronously and call the handle instead.\",\n );\n}\n\nexport function createDataStore<Owner extends object, Lane>(\n host: DataStoreHost<Owner, Lane>,\n): DataStore<Owner, Lane> {\n return new DefaultDataStore(host);\n}\n\nexport function normalizeDataResourceKey(key: DataResourceKey): string {\n return normalizeKey(key).canonical;\n}\n\nclass DefaultDataStore<Owner extends object, Lane> implements DataStore<\n Owner,\n Lane\n> {\n private readonly entries = new Map<string, Entry<Owner, Lane>>();\n private readonly inactiveRetentionMs: number;\n private readonly ownerKeys = new WeakMap<object, Set<string>>();\n private readonly pendingOwnerKeys = new WeakMap<object, Set<string>>();\n private readonly partitionKey: string;\n private readonly preloadRetentionMs: number;\n private disposed = false;\n\n constructor(readonly host: DataStoreHost<Owner, Lane>) {\n this.inactiveRetentionMs =\n host.inactiveRetentionMs ?? DEFAULT_INACTIVE_RETENTION_MS;\n this.partitionKey =\n host.partition === undefined\n ? \"\"\n : encodeValue(host.partition, createEncodePath(\"partition\"));\n this.preloadRetentionMs =\n host.preloadRetentionMs ?? DEFAULT_PRELOAD_RETENTION_MS;\n }\n\n commitDataDependencies(owner: Owner, previousOwner: object | null): void {\n const nextKeys = this.pendingOwnerKeys.get(owner) ?? null;\n const ownerKeys = this.ownerKeys.get(owner) ?? null;\n const previousOwnerKeys =\n previousOwner === null\n ? null\n : (this.ownerKeys.get(previousOwner) ?? null);\n this.pendingOwnerKeys.delete(owner);\n\n if (\n (nextKeys === null || nextKeys.size === 0) &&\n ownerKeys === null &&\n previousOwnerKeys === null\n ) {\n return;\n }\n\n // Capture the entries this fiber's generations subscribed to before the\n // delete, then abort any that end up with no retainer once the new owner has\n // re-subscribed. Keys the owner still reads keep at least one subscriber, so\n // only genuinely dropped keys are orphaned.\n let orphanCandidates: Set<Entry<Owner, Lane>> | null = null;\n orphanCandidates = this.collectSubscribedEntries(\n ownerKeys,\n orphanCandidates,\n );\n orphanCandidates = this.collectSubscribedEntries(\n previousOwnerKeys,\n orphanCandidates,\n );\n\n this.deleteDataOwner(owner, nextKeys);\n if (previousOwner !== null) this.deleteDataOwner(previousOwner, nextKeys);\n\n if (nextKeys !== null && nextKeys.size > 0) {\n this.ownerKeys.set(owner, nextKeys);\n\n for (const key of nextKeys) {\n const entry = this.entries.get(key);\n if (entry !== undefined) {\n this.clearInactiveTimer(entry);\n entry.subscribers.add(owner);\n this.notifyEntryChange(entry);\n }\n }\n }\n\n if (orphanCandidates !== null) {\n for (const entry of orphanCandidates) this.abortOrphanedLoad(entry);\n }\n }\n\n releaseDataOwner(owner: object): void {\n // The genuine-deletion path (fiber unmount). Unlike deleteDataOwner, which\n // is also used for transient commit churn, this aborts in-flight loads left\n // with no retainer so an unmounted subtree does not keep fetching.\n const orphanCandidates = this.collectSubscribedEntries(\n this.ownerKeys.get(owner) ?? null,\n null,\n );\n this.deleteDataOwner(owner);\n if (orphanCandidates !== null) {\n for (const entry of orphanCandidates) this.abortOrphanedLoad(entry);\n }\n }\n\n resetDataDependencies(owner: object): void {\n // Reads accumulate into pendingOwnerKeys as a render runs. A render attempt\n // can be abandoned before commit (suspense retry, concurrent interruption,\n // the strict shadow pass), and the work-in-progress fiber object is reused\n // across attempts, so the keys must be cleared at the start of each render\n // or stale dependencies from a discarded attempt would be committed.\n this.pendingOwnerKeys.delete(owner);\n }\n\n deleteDataOwner(\n owner: object,\n retainedKeys: ReadonlySet<string> | null = null,\n ): void {\n this.pendingOwnerKeys.delete(owner);\n const keys = this.ownerKeys.get(owner);\n if (keys === undefined) return;\n\n this.ownerKeys.delete(owner);\n for (const key of keys) {\n const entry = this.entries.get(key);\n if (entry === undefined) continue;\n\n entry.subscribers.delete(owner as Owner);\n this.notifyEntryChange(entry);\n if (retainedKeys?.has(key) !== true) this.scheduleInactiveCleanup(entry);\n }\n }\n\n private collectSubscribedEntries(\n keys: ReadonlySet<string> | null,\n into: Set<Entry<Owner, Lane>> | null,\n ): Set<Entry<Owner, Lane>> | null {\n if (keys === null) return into;\n\n for (const key of keys) {\n const entry = this.entries.get(key);\n if (entry !== undefined) {\n into ??= new Set();\n into.add(entry);\n }\n }\n\n return into;\n }\n\n private abortOrphanedLoad(entry: Entry<Owner, Lane>): void {\n // Only a value-less in-flight load (a cache-miss \"pending\" entry) with no\n // committed subscriber and no preload retainer is safe to drop: it has no\n // value to lose, and any reader of such a key suspends rather than commits,\n // so it cannot be handed off to a sibling mid-commit. Value-bearing entries\n // are left alone — a \"refreshing\" entry still serves a usable value, and its\n // refresh settles into the normal inactive-retention path. Evicting those\n // would discard a live value or strand a sibling that read it without\n // suspending.\n if (this.entries.get(entry.storeKey) !== entry) return;\n if (\n entry.subscribers.size > 0 ||\n entry.preloadTimer !== null ||\n entry.pending === null ||\n entryHasValue(entry)\n ) {\n return;\n }\n\n this.evictEntry(entry, \"evicted\");\n }\n\n dispose(): void {\n this.disposed = true;\n\n for (const entry of this.entries.values()) {\n this.clearInactiveTimer(entry);\n this.clearPreloadTimer(entry);\n this.abortActiveLoad(entry, \"store-disposed\");\n this.notifyEntryChange(entry);\n }\n }\n\n hydrate(entries: readonly FigDataHydrationEntry[]): void {\n if (this.disposed) return;\n\n for (const hydrated of entries) {\n const normalized = normalizeKey(hydrated.key);\n const storeKey = this.storeKey(normalized.canonical);\n const current = this.entries.get(storeKey);\n\n if (current !== undefined) {\n this.hydrateEntry(current, normalized.key, hydrated.value);\n this.publish(current);\n continue;\n }\n\n const entry = this.createEntry(\n normalized,\n storeKey,\n null,\n null,\n \"fulfilled\",\n hydrated.value,\n );\n this.entries.set(storeKey, entry);\n this.notifyEntryChange(entry);\n }\n }\n\n snapshot(): FigDataHydrationEntry[] {\n const entries: FigDataHydrationEntry[] = [];\n\n for (const entry of this.entries.values()) {\n if (entryHasValue(entry))\n entries.push({ key: entry.key, value: entry.value });\n }\n\n return entries;\n }\n\n inspectDataEntries(): DataStoreEntrySnapshot[] {\n return Array.from(this.entries.values(), (entry) =>\n this.snapshotEntry(entry),\n );\n }\n\n invalidateData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n ): void {\n if (this.disposed) return;\n\n const { entry } = this.entryFor(resource, args, false);\n if (entry === null) return;\n\n this.invalidateEntry(entry, this.host.getLane());\n }\n\n invalidateDataError(error: unknown): boolean {\n if (this.disposed) return false;\n\n const keys = dataResourceKeysForError(error);\n if (keys === undefined || keys.length === 0) return false;\n\n const entries: Entry<Owner, Lane>[] = [];\n for (const key of keys) {\n const entry = this.entryForKey(key);\n if (entry !== null) entries.push(entry);\n }\n\n this.invalidateEntries(entries);\n return true;\n }\n\n invalidateDataKey(key: DataResourceKey): void {\n if (this.disposed) return;\n\n const entry = this.entryForKey(key);\n if (entry === null) return;\n\n this.invalidateEntry(entry, this.host.getLane());\n }\n\n invalidateDataPrefix(prefix: DataResourceKey): void {\n if (this.disposed) return;\n\n const prefixCanonical = normalizeKey(prefix).canonical;\n const entries: Entry<Owner, Lane>[] = [];\n for (const entry of this.entries.values()) {\n if (canonicalKeyStartsWith(entry.canonicalKey, prefixCanonical)) {\n entries.push(entry);\n }\n }\n\n this.invalidateEntries(entries);\n }\n\n preloadData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n ): void {\n if (this.disposed || resource.load === undefined) return;\n\n const { entry } = this.entryFor(resource, args, true);\n this.clearInactiveTimer(entry);\n this.retainPreload(entry);\n if (entry.pending !== null) return;\n if (entry.status === \"fulfilled\" && !entry.stale) return;\n\n void this.startLoad(entry, resource, args, {\n lane: this.host.getLane(),\n refresh: entry.status === \"fulfilled\",\n });\n }\n\n readData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n owner: Owner,\n ): TValue {\n const { entry, key } = this.entryFor(resource, args, true);\n this.clearInactiveTimer(entry);\n this.clearPreloadTimer(entry);\n this.addOwnerKey(owner, key);\n\n if (\n entry.status === \"fulfilled\" &&\n entry.stale &&\n entry.pending === null &&\n entry.refreshError === undefined &&\n resource.load !== undefined\n ) {\n // A failed background refresh keeps the stale value and records\n // refreshError; do not auto-retry on every subsequent read or a\n // persistently-failing loader becomes a render/fetch storm. An explicit\n // invalidateData/refreshData clears refreshError to retry.\n void this.startLoad(entry, resource, args, {\n lane: this.host.getLane(),\n refresh: true,\n });\n }\n\n if (entry.status === \"pending\" && entry.pending === null) {\n void this.startLoad(entry, resource, args, {\n lane: this.host.getLane(),\n refresh: false,\n });\n }\n\n return this.readCurrentValue(entry);\n }\n\n refreshData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n ): Promise<DataRefreshResult<TValue>> {\n if (this.disposed) {\n return Promise.resolve({\n reason: \"store-disposed\",\n staleValue: undefined,\n status: \"aborted\",\n });\n }\n\n if (resource.load === undefined) {\n const { entry } = this.entryFor(resource, args, false);\n if (entry === null) {\n return Promise.resolve(unsupportedRefreshResult<TValue>());\n }\n\n this.clearInactiveTimer(entry);\n return Promise.resolve(unsupportedRefreshResult<TValue>(entry));\n }\n\n const { entry } = this.entryFor(resource, args, true);\n this.clearInactiveTimer(entry);\n\n if (entry.pending !== null && entry.status !== \"refreshing\") {\n return entry.pending.promise as Promise<DataRefreshResult<TValue>>;\n }\n\n return this.startLoad(entry, resource, args, {\n lane: this.host.getLane(),\n refresh: entry.status === \"fulfilled\" || entry.status === \"refreshing\",\n }) as Promise<DataRefreshResult<TValue>>;\n }\n\n run<T>(callback: () => T): T {\n const previousStore = setCurrentDataStore(this);\n try {\n return callback();\n } finally {\n setCurrentDataStore(previousStore);\n }\n }\n\n private addOwnerKey(owner: Owner, key: string): void {\n let keys = this.pendingOwnerKeys.get(owner);\n if (keys === undefined) {\n keys = new Set();\n this.pendingOwnerKeys.set(owner, keys);\n }\n\n keys.add(key);\n }\n\n private entryFor<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n create: true,\n ): { entry: Entry<Owner, Lane>; key: string };\n private entryFor<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n create: false,\n ): { entry: Entry<Owner, Lane> | null; key: string };\n private entryFor<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n create: boolean,\n ): { entry: Entry<Owner, Lane> | null; key: string } {\n const normalized = normalizeKey(resource.key(...args));\n // The fingerprint feeds only the dev drift diagnostics below, so\n // production never pays for encoding the args on every read.\n const fingerprint = __DEV__ ? fingerprintFor(resource, args) : null;\n const key = this.storeKey(normalized.canonical);\n const current = this.entries.get(key);\n\n if (current !== undefined) {\n if (__DEV__) {\n diagnoseEntryDrift(\n current,\n resource,\n normalized.canonical,\n fingerprint,\n );\n }\n return { entry: current, key };\n }\n\n if (!create) return { entry: null, key };\n\n const entry = this.createEntry(\n normalized,\n key,\n resource as DataResource<unknown[], unknown>,\n fingerprint,\n \"pending\",\n undefined,\n );\n // A disposed store is terminal: hand back a transient entry but never\n // register it, so post-dispose reads cannot resurrect the cache.\n if (this.disposed) return { entry, key };\n\n this.entries.set(key, entry);\n this.notifyEntryChange(entry);\n return { entry, key };\n }\n\n private entryForKey(key: DataResourceKey): Entry<Owner, Lane> | null {\n const normalized = normalizeKey(key);\n return this.entries.get(this.storeKey(normalized.canonical)) ?? null;\n }\n\n private createEntry(\n normalized: NormalizedKey,\n storeKey: string,\n resource: DataResource<unknown[], unknown> | null,\n fingerprint: string | null,\n status: FigDataEntryStatus,\n value: unknown,\n ): Entry<Owner, Lane> {\n return {\n canonicalKey: normalized.canonical,\n controller: null,\n error: undefined,\n fingerprint,\n generation: 0,\n invalidationVersion: 0,\n inactiveTimer: null,\n key: normalized.key,\n lane: null,\n pending: null,\n preloadTimer: null,\n refreshError: undefined,\n resource,\n stale: false,\n status,\n storeKey,\n subscribers: new Set(),\n value,\n };\n }\n\n private hydrateEntry(\n entry: Entry<Owner, Lane>,\n key: DataResourceKey,\n value: unknown,\n ): void {\n this.clearInactiveTimer(entry);\n this.abortActiveLoad(entry, \"superseded\");\n entry.error = undefined;\n entry.generation += 1;\n entry.invalidationVersion = 0;\n entry.key = key;\n entry.lane = null;\n entry.refreshError = undefined;\n entry.stale = false;\n entry.status = \"fulfilled\";\n entry.value = value;\n }\n\n private storeKey(canonicalKey: string): string {\n return this.partitionKey === \"\"\n ? canonicalKey\n : `${this.partitionKey}:${canonicalKey}`;\n }\n\n private startLoad<TArgs extends unknown[], TValue>(\n entry: Entry<Owner, Lane>,\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n options: LoadOptions<Lane>,\n ): Promise<DataRefreshResult<TValue>> {\n const hadValue = entryHasValue(entry);\n const load = resource.load;\n\n if (this.disposed) {\n return Promise.resolve(abortedRefreshResult(entry, \"store-disposed\"));\n }\n\n if (load === undefined) {\n const error = new Error(\n `Data resource \"${entry.canonicalKey}\" has no loader and no hydrated value.`,\n );\n entry.error = error;\n entry.status = \"rejected\";\n markDataResourceError(error, entry.key);\n this.notifyEntryChange(entry);\n return Promise.resolve(unsupportedRefreshResult<TValue>(entry));\n }\n\n this.abortActiveLoad(entry, \"superseded\");\n const controller = new AbortController();\n const generation = entry.generation + 1;\n const invalidationVersion = entry.invalidationVersion;\n const pending = createPendingResult<TValue>();\n\n entry.controller = controller;\n entry.generation = generation;\n entry.lane = options.lane;\n entry.pending = pending as PendingResult<unknown>;\n entry.status = options.refresh && hadValue ? \"refreshing\" : \"pending\";\n this.notifyEntryChange(entry);\n\n let loaded: TValue | PromiseLike<TValue>;\n try {\n loaded = load(...args, { signal: controller.signal });\n } catch (error) {\n loaded = Promise.reject(error);\n }\n\n const settleAborted = (): DataRefreshResult<TValue> => {\n const result = abortedRefreshResult<TValue, Owner, Lane>(\n entry,\n \"superseded\",\n );\n pending.resolve(result);\n return result;\n };\n const fulfill = (value: TValue): DataRefreshResult<TValue> => {\n if (entry.generation !== generation || controller.signal.aborted) {\n return settleAborted();\n }\n\n entry.controller = null;\n entry.error = undefined;\n entry.pending = null;\n entry.refreshError = undefined;\n entry.stale = entry.invalidationVersion !== invalidationVersion;\n entry.status = \"fulfilled\";\n entry.value = value;\n this.publish(entry);\n const result: DataRefreshResult<TValue> = { status: \"fulfilled\", value };\n pending.resolve(result);\n return result;\n };\n const reject = (error: unknown): DataRefreshResult<TValue> => {\n if (entry.generation !== generation || controller.signal.aborted) {\n return settleAborted();\n }\n\n entry.controller = null;\n entry.pending = null;\n\n if (hadValue) {\n entry.refreshError = error;\n entry.stale = true;\n entry.status = \"fulfilled\";\n this.publish(entry);\n const result: DataRefreshResult<TValue> = {\n error,\n staleValue: entry.value as TValue,\n status: \"rejected\",\n };\n pending.resolve(result);\n return result;\n }\n\n entry.error = error;\n entry.status = \"rejected\";\n markDataResourceError(error, entry.key);\n this.publish(entry);\n const result: DataRefreshResult<TValue> = { error, status: \"rejected\" };\n pending.resolve(result);\n return result;\n };\n\n if (!isThenable(loaded)) {\n fulfill(loaded);\n return pending.promise;\n }\n\n void Promise.resolve(loaded).then(fulfill, reject);\n\n return pending.promise;\n }\n\n private publish(entry: Entry<Owner, Lane>): void {\n this.notifyEntryChange(entry);\n this.scheduleInactiveCleanup(entry);\n\n this.scheduleSubscribers(entry, entry.lane ?? this.host.getLane());\n }\n\n private scheduleSubscribers(entry: Entry<Owner, Lane>, lane: Lane): void {\n for (const subscriber of entry.subscribers) {\n this.host.schedule(subscriber, lane);\n }\n }\n\n private abortActiveLoad(\n entry: Entry<Owner, Lane>,\n reason: AbortReason,\n ): void {\n const pending = entry.pending;\n if (pending === null) return;\n\n entry.controller?.abort();\n entry.controller = null;\n entry.pending = null;\n pending.resolve(abortedRefreshResult(entry, reason));\n }\n\n private retainPreload(entry: Entry<Owner, Lane>): void {\n this.clearPreloadTimer(entry);\n if (this.disposed || !Number.isFinite(this.preloadRetentionMs)) return;\n\n entry.preloadTimer = scheduleStoreTimer(\n () => {\n entry.preloadTimer = null;\n if (\n entry.subscribers.size === 0 &&\n entry.pending !== null &&\n !entryHasValue(entry)\n ) {\n this.evictEntry(entry, \"evicted\");\n return;\n }\n this.scheduleInactiveCleanup(entry);\n },\n Math.max(0, this.preloadRetentionMs),\n );\n }\n\n private scheduleInactiveCleanup(entry: Entry<Owner, Lane>): void {\n if (\n this.disposed ||\n entry.subscribers.size > 0 ||\n entry.pending !== null ||\n entry.preloadTimer !== null ||\n !Number.isFinite(this.inactiveRetentionMs)\n ) {\n return;\n }\n\n this.clearInactiveTimer(entry);\n entry.inactiveTimer = scheduleStoreTimer(\n () => {\n entry.inactiveTimer = null;\n if (\n entry.subscribers.size > 0 ||\n entry.pending !== null ||\n entry.preloadTimer !== null\n ) {\n return;\n }\n this.evictEntry(entry, \"evicted\");\n },\n Math.max(0, this.inactiveRetentionMs),\n );\n }\n\n private evictEntry(entry: Entry<Owner, Lane>, reason: AbortReason): void {\n if (this.entries.get(entry.storeKey) !== entry) return;\n\n this.clearInactiveTimer(entry);\n this.clearPreloadTimer(entry);\n this.abortActiveLoad(entry, reason);\n this.entries.delete(entry.storeKey);\n this.host.onEntryEvict?.(this.snapshotEntry(entry));\n }\n\n private clearInactiveTimer(entry: Entry<Owner, Lane>): void {\n if (entry.inactiveTimer === null) return;\n\n clearTimeout(entry.inactiveTimer);\n entry.inactiveTimer = null;\n }\n\n private clearPreloadTimer(entry: Entry<Owner, Lane>): void {\n if (entry.preloadTimer === null) return;\n\n clearTimeout(entry.preloadTimer);\n entry.preloadTimer = null;\n }\n\n private notifyEntryChange(entry: Entry<Owner, Lane>): void {\n this.host.onEntryChange?.(this.snapshotEntry(entry));\n }\n\n private snapshotEntry(entry: Entry<Owner, Lane>): DataStoreEntrySnapshot {\n const hasValue = entryHasValue(entry);\n return {\n canonicalKey: entry.canonicalKey,\n error: entry.status === \"rejected\" ? entry.error : undefined,\n hasValue,\n key: entry.key,\n pending: entry.pending !== null,\n refreshError: entry.refreshError,\n stale: entry.stale,\n status: entry.status,\n subscriberCount: entry.subscribers.size,\n value: hasValue ? entry.value : undefined,\n };\n }\n\n private readCurrentValue<TValue>(entry: Entry<Owner, Lane>): TValue {\n if (entryHasValue(entry)) {\n return entry.value as TValue;\n }\n\n if (entry.status === \"rejected\") throwDataResourceError(entry);\n\n if (entry.pending === null) {\n throw new Error(\n `Data resource \"${entry.canonicalKey}\" has no pending load.`,\n );\n }\n\n throw entry.pending.promise;\n }\n\n private invalidateEntry(entry: Entry<Owner, Lane>, lane: Lane): void {\n entry.invalidationVersion += 1;\n entry.stale = true;\n // Clearing the prior refresh failure re-enables auto-refresh-on-read; an\n // explicit invalidation is a fresh \"this is stale, fetch again\" intent.\n entry.refreshError = undefined;\n if (entry.status === \"rejected\") {\n // The same intent applies to a cached rejection: without this, every\n // read rethrows the old error forever — remounting an ErrorBoundary\n // could never recover. Back to pending, so the next read loads afresh.\n entry.error = undefined;\n entry.status = \"pending\";\n }\n this.notifyEntryChange(entry);\n if (entry.subscribers.size === 0) return;\n\n this.scheduleSubscribers(entry, lane);\n }\n\n private invalidateEntries(entries: readonly Entry<Owner, Lane>[]): void {\n if (entries.length === 0) return;\n\n const lane = this.host.getLane();\n for (const entry of entries) this.invalidateEntry(entry, lane);\n }\n}\n\nfunction normalizeKey(key: DataResourceKey): NormalizedKey {\n if (!Array.isArray(key) || typeof key[0] !== \"string\") {\n throw new Error(\n \"Data resource keys must be arrays starting with a string.\",\n );\n }\n\n return {\n canonical: encodeArray(key, createEncodePath(\"key\")),\n key,\n };\n}\n\nfunction canonicalKeyStartsWith(key: string, prefix: string): boolean {\n if (key === prefix) return true;\n\n const arrayPrefix = prefix.slice(0, -1);\n return key.startsWith(arrayPrefix) && key[arrayPrefix.length] === \",\";\n}\n\nfunction entryHasValue<Owner extends object, Lane>(\n entry: Entry<Owner, Lane>,\n): boolean {\n return entry.status === \"fulfilled\" || entry.status === \"refreshing\";\n}\n\nfunction throwDataResourceError<Owner extends object, Lane>(\n entry: Entry<Owner, Lane>,\n): never {\n markDataResourceError(entry.error, entry.key);\n throw entry.error;\n}\n\nfunction abortedRefreshResult<T, Owner extends object, Lane>(\n entry: Entry<Owner, Lane>,\n reason: AbortReason,\n): DataRefreshResult<T> {\n return {\n reason,\n staleValue: entryHasValue(entry) ? (entry.value as T) : undefined,\n status: \"aborted\",\n };\n}\n\nfunction unsupportedRefreshResult<\n T,\n Owner extends object = object,\n Lane = unknown,\n>(entry?: Entry<Owner, Lane>): DataRefreshResult<T> {\n const result: DataRefreshResult<T> = {\n reason: \"no-client-loader\",\n status: \"unsupported\",\n };\n\n if (entry !== undefined) {\n result.staleValue = entryHasValue(entry) ? (entry.value as T) : undefined;\n }\n\n return result;\n}\n\nfunction fingerprintFor<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n): string | null {\n if (resource.debugArgs !== undefined) {\n return encodeValue(\n resource.debugArgs(...args),\n createEncodePath(\"debugArgs\"),\n );\n }\n\n try {\n return encodeArray(args, createEncodePath(\"args\"));\n } catch {\n return null;\n }\n}\n\nfunction diagnoseEntryDrift<\n Owner extends object,\n Lane,\n TArgs extends unknown[],\n TValue,\n>(\n entry: Entry<Owner, Lane>,\n resource: DataResource<TArgs, TValue>,\n key: string,\n fingerprint: string | null,\n): void {\n if (!__DEV__) return;\n\n if (entry.resource === null) {\n entry.resource = resource as DataResource<unknown[], unknown>;\n } else if (entry.resource !== resource) {\n warn(`Data resource key ${key} was read by multiple resource definitions.`);\n }\n\n if (\n entry.fingerprint !== null &&\n fingerprint !== null &&\n entry.fingerprint !== fingerprint\n ) {\n warn(\n `Data resource key ${key} was read with different argument fingerprints.`,\n );\n }\n}\n\nfunction warn(message: string): void {\n if (typeof console === \"undefined\") return;\n console.warn(message);\n}\n\nfunction createEncodePath(root: string): EncodePath {\n return { root, segments: [] };\n}\n\nfunction formatEncodePath(path: EncodePath): string {\n let text = path.root;\n for (const segment of path.segments) {\n text += typeof segment === \"number\" ? `[${segment}]` : `.${segment}`;\n }\n return text;\n}\n\nfunction encodeArray(values: readonly unknown[], path: EncodePath): string {\n const parts: string[] = [];\n for (let index = 0; index < values.length; index += 1) {\n path.segments.push(index);\n parts.push(encodeValue(values[index], path));\n path.segments.pop();\n }\n return `[${parts.join(\",\")}]`;\n}\n\nfunction encodeObject(value: object, path: EncodePath): string {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\n `Invalid data resource key value at ${formatEncodePath(path)}.`,\n );\n }\n\n const record = value as Record<string, unknown>;\n const keys = Object.keys(record).sort();\n const parts: string[] = [];\n\n for (const key of keys) {\n const child = record[key];\n if (child === undefined) {\n throw new Error(\n `Invalid undefined data resource key value at ${formatEncodePath(path)}.`,\n );\n }\n path.segments.push(key);\n parts.push(`${JSON.stringify(key)}:${encodeValue(child, path)}`);\n path.segments.pop();\n }\n\n return `{${parts.join(\",\")}}`;\n}\n\nfunction encodeValue(value: unknown, path: EncodePath): string {\n if (value === null) return \"null\";\n\n switch (typeof value) {\n case \"string\":\n return JSON.stringify(value);\n case \"boolean\":\n return value ? \"true\" : \"false\";\n case \"number\":\n if (!Number.isFinite(value)) {\n throw new Error(\n `Invalid number in data resource key at ${formatEncodePath(path)}.`,\n );\n }\n return Object.is(value, -0) ? \"0\" : JSON.stringify(value);\n case \"object\":\n if (Array.isArray(value)) return encodeArray(value, path);\n return encodeObject(value, path);\n default:\n throw new Error(\n `Invalid data resource key value at ${formatEncodePath(path)}.`,\n );\n }\n}\n\nfunction isThenable<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n typeof (value as PromiseLike<T>).then === \"function\"\n );\n}\n\nfunction createPendingResult<T>(): PendingResult<T> {\n let resolve: (result: DataRefreshResult<T>) => void = () => undefined;\n const promise = new Promise<DataRefreshResult<T>>((settle) => {\n resolve = settle;\n });\n\n return {\n promise,\n resolve,\n };\n}\n\nfunction scheduleStoreTimer(callback: () => void, delay: number): TimerHandle {\n const timer = setTimeout(callback, delay);\n const unref = (timer as { unref?: () => void }).unref;\n if (unref !== undefined) unref.call(timer);\n return timer;\n}\n\nexport function runWithDataStore<T>(store: FigDataStore, callback: () => T): T {\n return store.run(callback);\n}\n\nexport function currentDataStore(): FigDataStore {\n return resolveCurrentDataStore();\n}\n"],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- import { a as DataResourceLoadContext, d as FigDataStoreHandle, i as DataResourceKeyInput, l as FigDataStore, n as DataResource, o as DataStoreEntrySnapshot, r as DataResourceKey, t as DataRefreshResult } from "./data-CHJh_xU9.js";
2
- //#region src/data-store.d.ts
3
- interface DataResourceOptions<TArgs extends unknown[], TValue> {
4
- key: (...args: TArgs) => DataResourceKey;
5
- debugArgs?: (...args: TArgs) => DataResourceKeyInput;
6
- load?: (...argsAndContext: [...TArgs, DataResourceLoadContext]) => TValue | PromiseLike<TValue>;
7
- }
8
- interface DataStoreHost<Owner extends object, Lane> {
9
- getLane(): Lane;
10
- inactiveRetentionMs?: number;
11
- onEntryChange?: (entry: DataStoreEntrySnapshot) => void;
12
- onEntryEvict?: (entry: DataStoreEntrySnapshot) => void;
13
- partition?: DataResourceKeyInput;
14
- preloadRetentionMs?: number;
15
- schedule(owner: Owner, lane: Lane): void;
16
- }
17
- interface DataStore<Owner extends object = object, Lane = unknown> extends FigDataStore {
18
- readonly host: DataStoreHost<Owner, Lane>;
19
- }
20
- declare function dataResource<TArgs extends unknown[], TValue>(options: DataResourceOptions<TArgs, TValue>): DataResource<TArgs, TValue>;
21
- declare function invalidateData<TArgs extends unknown[], TValue>(resource: DataResource<TArgs, TValue>, ...args: TArgs): void;
22
- declare function invalidateDataError(error: unknown): boolean;
23
- declare function invalidateDataKey(key: DataResourceKey): void;
24
- declare function invalidateDataPrefix(prefix: DataResourceKey): void;
25
- declare function refreshData<TArgs extends unknown[], TValue>(resource: DataResource<TArgs, TValue>, ...args: TArgs): Promise<DataRefreshResult<TValue>>;
26
- declare function readDataStore(): FigDataStoreHandle;
27
- declare function createDataStore<Owner extends object, Lane>(host: DataStoreHost<Owner, Lane>): DataStore<Owner, Lane>;
28
- declare function normalizeDataResourceKey(key: DataResourceKey): string;
29
- declare function runWithDataStore<T>(store: FigDataStore, callback: () => T): T;
30
- declare function currentDataStore(): FigDataStore;
31
- //#endregion
32
- export { currentDataStore as a, invalidateDataError as c, normalizeDataResourceKey as d, readDataStore as f, createDataStore as i, invalidateDataKey as l, runWithDataStore as m, DataStore as n, dataResource as o, refreshData as p, DataStoreHost as r, invalidateData as s, DataResourceOptions as t, invalidateDataPrefix as u };
@@ -1,179 +0,0 @@
1
- import { r as resolveCurrentDataStore } from "./data-h46EcMnE.js";
2
- //#region src/hooks.ts
3
- let currentDispatcher = null;
4
- function useState(initialState) {
5
- return resolveDispatcher().useState(initialState);
6
- }
7
- /**
8
- * Tracks state returned by a client-side action. The action receives the
9
- * previous committed state first, then the runner's arguments, then an
10
- * `AbortSignal` Fig appends (declare the trailing signal parameter — it also
11
- * drives `Args` inference). Async actions run in a transition priority scope
12
- * and keep `isPending` true until they settle.
13
- *
14
- * Runs are last-run-wins: starting a new run aborts the previous one's
15
- * signal and retires it — a retired run's settlement (value or rejection)
16
- * never touches state or pending. The signal also aborts on unmount and
17
- * when an enclosing Activity hides.
18
- */
19
- function useActionState(action, initialState) {
20
- return resolveDispatcher().useActionState(action, initialState);
21
- }
22
- function useId() {
23
- return resolveDispatcher().useId();
24
- }
25
- function useDeferredValue(value, initialValue) {
26
- return resolveDispatcher().useDeferredValue(value, initialValue, arguments.length > 1);
27
- }
28
- function useMemo(calculate, deps) {
29
- return resolveDispatcher().useMemo(calculate, deps);
30
- }
31
- function useTransition() {
32
- return resolveDispatcher().useTransition();
33
- }
34
- function useCallback(callback, deps) {
35
- return resolveDispatcher().useMemo(() => callback, deps);
36
- }
37
- function useReactive(effect, deps) {
38
- resolveDispatcher().useReactive(effect, deps);
39
- }
40
- function useBeforePaint(effect, deps) {
41
- resolveDispatcher().useBeforePaint(effect, deps);
42
- }
43
- function useBeforeLayout(effect, deps) {
44
- resolveDispatcher().useBeforeLayout(effect, deps);
45
- }
46
- function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
47
- return resolveDispatcher().useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
48
- }
49
- function useStableEvent(handler) {
50
- return resolveDispatcher().useStableEvent(handler);
51
- }
52
- function readContext(context) {
53
- return resolveDispatcher("readContext can only be called while rendering a component.").readContext(context);
54
- }
55
- function readPromise(promise) {
56
- return resolveDispatcher("readPromise can only be called while rendering a component.").readPromise(promise);
57
- }
58
- function readData(resource, ...args) {
59
- return resolveDispatcher("readData can only be called while rendering a component.").readData(resource, args);
60
- }
61
- function preloadData(resource, ...args) {
62
- if (currentDispatcher !== null) {
63
- currentDispatcher.preloadData(resource, args);
64
- return;
65
- }
66
- resolveDataStore().preloadData(resource, ...args);
67
- }
68
- function setCurrentDispatcher(dispatcher) {
69
- const previousDispatcher = currentDispatcher;
70
- currentDispatcher = dispatcher;
71
- return previousDispatcher;
72
- }
73
- function resolveDispatcher(message = "Hooks can only be called while rendering a component.") {
74
- if (currentDispatcher === null) throw new Error(message);
75
- return currentDispatcher;
76
- }
77
- function resolveDataStore() {
78
- return resolveCurrentDataStore("No ambient Fig data store. Data APIs work synchronously during render, event handlers, actions, and effects — not after an await. Capture readDataStore() (or root.data) synchronously and call the handle instead.");
79
- }
80
- //#endregion
81
- //#region src/element.ts
82
- const Fragment = Symbol.for("fig.fragment");
83
- const FigElementSymbol = Symbol.for("fig.element");
84
- const FigClientReferenceSymbol = Symbol.for("fig.client-reference");
85
- const FigActivitySymbol = Symbol.for("fig.activity");
86
- const FigErrorBoundarySymbol = Symbol.for("fig.error-boundary");
87
- const FigPortalSymbol = Symbol.for("fig.portal");
88
- const FigAssetsSymbol = Symbol.for("fig.assets");
89
- const FigSuspenseSymbol = Symbol.for("fig.suspense");
90
- const FigViewTransitionSymbol = Symbol.for("fig.view-transition");
91
- const Assets = Object.assign((props) => props.children, { $$typeof: FigAssetsSymbol });
92
- const ErrorBoundary = Object.assign((props) => props.children, { $$typeof: FigErrorBoundarySymbol });
93
- const Suspense = Object.assign((props) => props.children, { $$typeof: FigSuspenseSymbol });
94
- const Activity = Object.assign((props) => props.children, { $$typeof: FigActivitySymbol });
95
- const ViewTransition = Object.assign((props) => props.children, { $$typeof: FigViewTransitionSymbol });
96
- function createElement(type, config, ...children) {
97
- const props = { ...config };
98
- const key = props.key ?? null;
99
- delete props.key;
100
- if (children.length === 1) props.children = children[0];
101
- else if (children.length > 1) props.children = children;
102
- return {
103
- $$typeof: FigElementSymbol,
104
- type,
105
- key,
106
- props
107
- };
108
- }
109
- function isValidElement(value) {
110
- return typeof value === "object" && value !== null && value.$$typeof === FigElementSymbol;
111
- }
112
- function createPortalNode(children, target, key = null) {
113
- return {
114
- $$typeof: FigPortalSymbol,
115
- children,
116
- key,
117
- target
118
- };
119
- }
120
- function isPortal(value) {
121
- return typeof value === "object" && value !== null && value.$$typeof === FigPortalSymbol;
122
- }
123
- function clientReference(options) {
124
- const reference = (() => {
125
- throw new Error(`Client reference "${options.id}" cannot be rendered on the server directly.`);
126
- });
127
- return Object.assign(reference, {
128
- $$typeof: FigClientReferenceSymbol,
129
- assets: options.assets,
130
- id: options.id,
131
- load: options.load,
132
- ssr: options.ssr
133
- });
134
- }
135
- function lazy(load) {
136
- let promise = null;
137
- let rejected = false;
138
- return function Lazy(props) {
139
- if (promise === null) {
140
- rejected = false;
141
- const next = Promise.resolve(load()).then((value) => value, (error) => {
142
- if (promise === next) rejected = true;
143
- throw error;
144
- });
145
- promise = next;
146
- }
147
- try {
148
- return createElement(readPromise(promise), props);
149
- } catch (error) {
150
- if (rejected) {
151
- promise = null;
152
- rejected = false;
153
- }
154
- throw error;
155
- }
156
- };
157
- }
158
- function isClientReference(value) {
159
- return typeof value === "function" && value.$$typeof === FigClientReferenceSymbol;
160
- }
161
- function isSuspense(value) {
162
- return typeof value === "function" && value.$$typeof === FigSuspenseSymbol;
163
- }
164
- function isActivity(value) {
165
- return typeof value === "function" && value.$$typeof === FigActivitySymbol;
166
- }
167
- function isErrorBoundary(value) {
168
- return typeof value === "function" && value.$$typeof === FigErrorBoundarySymbol;
169
- }
170
- function isViewTransition(value) {
171
- return typeof value === "function" && value.$$typeof === FigViewTransitionSymbol;
172
- }
173
- function isAssets(value) {
174
- return typeof value === "function" && value.$$typeof === FigAssetsSymbol;
175
- }
176
- //#endregion
177
- export { readPromise as A, useStableEvent as B, isSuspense as C, preloadData as D, lazy as E, useCallback as F, useSyncExternalStore as H, useDeferredValue as I, useId as L, useActionState as M, useBeforeLayout as N, readContext as O, useBeforePaint as P, useMemo as R, isPortal as S, isViewTransition as T, useTransition as U, useState as V, createPortalNode as _, FigAssetsSymbol as a, isClientReference as b, FigErrorBoundarySymbol as c, FigViewTransitionSymbol as d, Fragment as f, createElement as g, clientReference as h, FigActivitySymbol as i, setCurrentDispatcher as j, readData as k, FigPortalSymbol as l, ViewTransition as m, Assets as n, FigClientReferenceSymbol as o, Suspense as p, ErrorBoundary as r, FigElementSymbol as s, Activity as t, FigSuspenseSymbol as u, isActivity as v, isValidElement as w, isErrorBoundary as x, isAssets as y, useReactive as z };
178
-
179
- //# sourceMappingURL=element-Bh_k9c3N.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"element-Bh_k9c3N.js","names":[],"sources":["../src/hooks.ts","../src/element.ts"],"sourcesContent":["import type { FigContext } from \"./context.ts\";\nimport type { DataResource, FigDataStore } from \"./data.ts\";\nimport { resolveCurrentDataStore } from \"./data.ts\";\n\n// The useState updater: accepts the next state, or an updater function of\n// the previous state for stale-closure safety.\nexport type StateSetter<S> = (next: S | ((previous: S) => S)) => void;\nexport type ExternalStoreSubscribe = (callback: () => void) => () => void;\n// Fig appends the AbortSignal after the runner's args (the data-loader\n// shape). The signal aborts when a newer run supersedes this one, when the\n// owning component unmounts, and when an enclosing Activity hides.\nexport type ActionStateAction<S, Args extends unknown[]> = (\n previousState: S,\n ...argsAndSignal: [...Args, AbortSignal]\n) => S | PromiseLike<S>;\nexport type ActionStateRunner<Args extends unknown[]> = (...args: Args) => void;\n\n/**\n * Runs state updates scheduled by `callback` at transition priority. If\n * `callback` returns a thenable, `useTransition` keeps `isPending` true until\n * it settles and updates after an `await` remain in the transition priority\n * scope.\n *\n * The callback receives an `AbortSignal` that aborts when a newer transition\n * starts from the same hook, when the owning component unmounts, and when an\n * enclosing Activity hides. Each `useTransition` hook is one cancellation\n * domain — use separate hooks for independently cancellable workflows. An\n * aborted run is retired: its pending slot is released immediately and its\n * settlement (including an aborted fetch's rejection) is inert.\n */\nexport type StartTransition = (\n callback: (signal: AbortSignal) => void | PromiseLike<void>,\n) => void;\ntype Callback = (...args: never[]) => unknown;\n\nexport interface RenderDispatcher {\n useState<S>(initialState: S | (() => S)): [S, StateSetter<S>];\n useActionState<S, Args extends unknown[]>(\n action: ActionStateAction<S, Args>,\n initialState: S,\n ): [S, ActionStateRunner<Args>, boolean];\n useId(): string;\n useDeferredValue<T>(\n value: T,\n initialValue: T | undefined,\n hasInitialValue: boolean,\n ): T;\n useMemo<T>(calculate: () => T, deps: DependencyList): T;\n useTransition(): [boolean, StartTransition];\n useReactive(effect: EffectCallback, deps?: DependencyList): void;\n useBeforePaint(effect: EffectCallback, deps?: DependencyList): void;\n useBeforeLayout(effect: EffectCallback, deps?: DependencyList): void;\n useSyncExternalStore<T>(\n subscribe: ExternalStoreSubscribe,\n getSnapshot: () => T,\n getServerSnapshot?: () => T,\n ): T;\n useStableEvent<Args extends unknown[], Result>(\n handler: (...args: Args) => Result,\n ): (...args: StableEventArgs<Args>) => Result;\n readContext<T>(context: FigContext<T>): T;\n readData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n ): TValue;\n preloadData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n args: TArgs,\n ): void;\n readPromise<T>(promise: PromiseLike<T>): T;\n}\n\nexport type EffectCallback = (signal: AbortSignal) => undefined;\nexport type DependencyList = readonly unknown[];\n\n// Fig appends the AbortSignal when invoking the handler; callers never pass\n// it, so a declared trailing signal is stripped from the callable signature.\nexport type StableEventArgs<Args extends unknown[]> = Args extends [\n ...infer Rest,\n AbortSignal,\n]\n ? Rest\n : Args;\n\nlet currentDispatcher: RenderDispatcher | null = null;\n\nexport function useState<S>(initialState: S | (() => S)): [S, StateSetter<S>] {\n return resolveDispatcher().useState(initialState);\n}\n\n/**\n * Tracks state returned by a client-side action. The action receives the\n * previous committed state first, then the runner's arguments, then an\n * `AbortSignal` Fig appends (declare the trailing signal parameter — it also\n * drives `Args` inference). Async actions run in a transition priority scope\n * and keep `isPending` true until they settle.\n *\n * Runs are last-run-wins: starting a new run aborts the previous one's\n * signal and retires it — a retired run's settlement (value or rejection)\n * never touches state or pending. The signal also aborts on unmount and\n * when an enclosing Activity hides.\n */\nexport function useActionState<S, Args extends unknown[]>(\n action: ActionStateAction<S, Args>,\n initialState: S,\n): [S, ActionStateRunner<Args>, boolean] {\n return resolveDispatcher().useActionState(action, initialState);\n}\n\nexport function useId(): string {\n return resolveDispatcher().useId();\n}\n\nexport function useDeferredValue<T>(value: T, initialValue?: T): T {\n return resolveDispatcher().useDeferredValue(\n value,\n initialValue,\n arguments.length > 1,\n );\n}\n\nexport function useMemo<T>(calculate: () => T, deps: DependencyList): T {\n return resolveDispatcher().useMemo(calculate, deps);\n}\n\nexport function useTransition(): [boolean, StartTransition] {\n return resolveDispatcher().useTransition();\n}\n\nexport function useCallback<T extends Callback>(\n callback: T,\n deps: DependencyList,\n): T {\n return resolveDispatcher().useMemo(() => callback, deps);\n}\n\nexport function useReactive(\n effect: EffectCallback,\n deps?: DependencyList,\n): void {\n resolveDispatcher().useReactive(effect, deps);\n}\n\nexport function useBeforePaint(\n effect: EffectCallback,\n deps?: DependencyList,\n): void {\n resolveDispatcher().useBeforePaint(effect, deps);\n}\n\nexport function useBeforeLayout(\n effect: EffectCallback,\n deps?: DependencyList,\n): void {\n resolveDispatcher().useBeforeLayout(effect, deps);\n}\n\nexport function useSyncExternalStore<T>(\n subscribe: ExternalStoreSubscribe,\n getSnapshot: () => T,\n getServerSnapshot?: () => T,\n): T {\n return resolveDispatcher().useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n}\n\nexport function useStableEvent<Args extends unknown[], Result>(\n handler: (...args: Args) => Result,\n): (...args: StableEventArgs<Args>) => Result {\n return resolveDispatcher().useStableEvent(handler);\n}\n\nexport function readContext<T>(context: FigContext<T>): T {\n return resolveDispatcher(\n \"readContext can only be called while rendering a component.\",\n ).readContext(context);\n}\n\nexport function readPromise<T>(promise: PromiseLike<T>): T {\n return resolveDispatcher(\n \"readPromise can only be called while rendering a component.\",\n ).readPromise(promise);\n}\n\nexport function readData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n): TValue {\n return resolveDispatcher(\n \"readData can only be called while rendering a component.\",\n ).readData(resource, args);\n}\n\nexport function preloadData<TArgs extends unknown[], TValue>(\n resource: DataResource<TArgs, TValue>,\n ...args: TArgs\n): void {\n if (currentDispatcher !== null) {\n currentDispatcher.preloadData(resource, args);\n return;\n }\n\n resolveDataStore().preloadData(resource, ...args);\n}\n\nexport function setCurrentDispatcher(\n dispatcher: RenderDispatcher | null,\n): RenderDispatcher | null {\n const previousDispatcher = currentDispatcher;\n currentDispatcher = dispatcher;\n return previousDispatcher;\n}\n\nfunction resolveDispatcher(\n message = \"Hooks can only be called while rendering a component.\",\n): RenderDispatcher {\n if (currentDispatcher === null) {\n throw new Error(message);\n }\n\n return currentDispatcher;\n}\n\nfunction resolveDataStore(): FigDataStore {\n return resolveCurrentDataStore(\n \"No ambient Fig data store. Data APIs work synchronously during render, \" +\n \"event handlers, actions, and effects — not after an await. Capture \" +\n \"readDataStore() (or root.data) synchronously and call the handle \" +\n \"instead.\",\n );\n}\n","import type { DataResourceKey } from \"./data.ts\";\nimport { readPromise } from \"./hooks.ts\";\nimport type { ClientReferenceAssets } from \"./resource.ts\";\n\nexport type Key = string | number;\nexport type Props = Record<string, any>;\nexport type ElementType<P = Props> =\n | string\n | typeof Fragment\n | FigAssets\n | FigClientReference<P>\n | FigErrorBoundary\n | FigSuspense\n | FigActivity\n | FigViewTransition\n | ((props: P & { children?: FigNode }) => FigNode);\nexport type FigText = string | number;\nexport type FigNode =\n | FigElement<any>\n | FigPortal<any>\n | FigText\n | boolean\n | null\n | undefined\n | FigNode[];\n\nexport interface FigElement<P = Props> {\n readonly $$typeof: symbol;\n readonly type: ElementType<any>;\n readonly key: Key | null;\n readonly props: P & { children?: FigNode };\n}\n\nexport interface FigPortal<Target = unknown> {\n readonly $$typeof: symbol;\n readonly children: FigNode;\n readonly key: Key | null;\n readonly target: Target;\n}\n\nexport interface ClientReferenceOptions {\n assets?: ClientReferenceAssets;\n id: string;\n load: () => Promise<unknown>;\n ssr?: ElementType;\n}\n\nexport interface FigClientReference<P = Props> {\n (props: P & { children?: FigNode }): FigNode;\n readonly $$typeof: symbol;\n readonly assets?: ClientReferenceAssets;\n readonly id: string;\n readonly load: () => Promise<unknown>;\n readonly ssr?: ElementType;\n}\n\nexport type LazyLoader<P = Props> = () => PromiseLike<ElementType<P>>;\n\nexport interface SuspenseProps {\n fallback?: FigNode;\n children?: FigNode;\n}\n\nexport interface FigSuspense {\n (props: SuspenseProps): FigNode;\n readonly $$typeof: symbol;\n}\n\nexport type ActivityMode = \"visible\" | \"hidden\";\n\nexport interface ActivityProps {\n mode: ActivityMode;\n children?: FigNode;\n}\n\nexport interface FigActivity {\n (props: ActivityProps): FigNode;\n readonly $$typeof: symbol;\n}\n\nexport type ViewTransitionClass = \"auto\" | \"none\" | (string & {});\n\nexport interface ViewTransitionProps {\n name?: string;\n children?: FigNode;\n default?: ViewTransitionClass;\n enter?: ViewTransitionClass;\n exit?: ViewTransitionClass;\n share?: ViewTransitionClass;\n update?: ViewTransitionClass;\n}\n\nexport interface FigViewTransition {\n (props: ViewTransitionProps): FigNode;\n readonly $$typeof: symbol;\n}\n\nexport interface ErrorBoundaryProps {\n // A function fallback receives the caught error so error UIs can render\n // it (message, retry affordance) without smuggling state above the\n // boundary through onError. A bare function is never a valid FigNode, so\n // the two shapes cannot collide.\n fallback?: FigNode | ((error: unknown, info: ErrorInfo) => FigNode);\n onError?: (error: unknown, info: ErrorInfo) => void;\n children?: FigNode;\n}\n\nexport interface ErrorInfo {\n componentStack: string;\n dataResourceKeys?: DataResourceKey[];\n}\n\nexport interface FigErrorBoundary {\n (props: ErrorBoundaryProps): FigNode;\n readonly $$typeof: symbol;\n}\n\nexport interface FigAssets {\n (props: Props & { children?: FigNode }): FigNode;\n readonly $$typeof: symbol;\n}\n\nexport const Fragment = Symbol.for(\"fig.fragment\");\nexport const FigElementSymbol = Symbol.for(\"fig.element\");\nexport const FigClientReferenceSymbol = Symbol.for(\"fig.client-reference\");\nexport const FigActivitySymbol = Symbol.for(\"fig.activity\");\nexport const FigErrorBoundarySymbol = Symbol.for(\"fig.error-boundary\");\nexport const FigPortalSymbol = Symbol.for(\"fig.portal\");\nexport const FigAssetsSymbol = Symbol.for(\"fig.assets\");\nexport const FigSuspenseSymbol = Symbol.for(\"fig.suspense\");\nexport const FigViewTransitionSymbol = Symbol.for(\"fig.view-transition\");\n\nexport const Assets: FigAssets = Object.assign(\n (props: Props & { children?: FigNode }) => props.children,\n { $$typeof: FigAssetsSymbol },\n);\n\nexport const ErrorBoundary: FigErrorBoundary = Object.assign(\n (props: ErrorBoundaryProps) => props.children,\n { $$typeof: FigErrorBoundarySymbol },\n);\n\nexport const Suspense: FigSuspense = Object.assign(\n (props: SuspenseProps) => props.children,\n { $$typeof: FigSuspenseSymbol },\n);\n\nexport const Activity: FigActivity = Object.assign(\n (props: ActivityProps) => props.children,\n { $$typeof: FigActivitySymbol },\n);\n\nexport const ViewTransition: FigViewTransition = Object.assign(\n (props: ViewTransitionProps) => props.children,\n { $$typeof: FigViewTransitionSymbol },\n);\n\nexport function createElement<P extends Props>(\n type: ElementType<P>,\n config?: (P & { key?: Key | null }) | null,\n ...children: FigNode[]\n): FigElement<P> {\n const props = { ...config } as P & {\n children?: FigNode;\n key?: Key | null;\n };\n const key = props.key ?? null;\n delete props.key;\n\n if (children.length === 1) props.children = children[0];\n else if (children.length > 1) props.children = children;\n\n return { $$typeof: FigElementSymbol, type, key, props };\n}\n\nexport function isValidElement(value: unknown): value is FigElement {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as FigElement).$$typeof === FigElementSymbol\n );\n}\n\nexport function createPortalNode<Target>(\n children: FigNode,\n target: Target,\n key: Key | null = null,\n): FigPortal<Target> {\n return { $$typeof: FigPortalSymbol, children, key, target };\n}\n\nexport function isPortal(value: unknown): value is FigPortal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as FigPortal).$$typeof === FigPortalSymbol\n );\n}\n\nexport function clientReference<P extends Props>(\n options: ClientReferenceOptions,\n): FigClientReference<P> {\n const reference = (() => {\n throw new Error(\n `Client reference \"${options.id}\" cannot be rendered on the server directly.`,\n );\n }) as unknown as FigClientReference<P>;\n\n return Object.assign(reference, {\n $$typeof: FigClientReferenceSymbol,\n assets: options.assets,\n id: options.id,\n load: options.load,\n ssr: options.ssr,\n });\n}\n\nexport function lazy<P extends Props>(\n load: LazyLoader<P>,\n): (props: P & { children?: FigNode }) => FigNode {\n let promise: PromiseLike<ElementType<P>> | null = null;\n let rejected = false;\n\n return function Lazy(props: P & { children?: FigNode }) {\n if (promise === null) {\n rejected = false;\n const next = Promise.resolve(load()).then(\n (value) => value,\n (error) => {\n if (promise === next) rejected = true;\n throw error;\n },\n );\n promise = next;\n }\n\n try {\n return createElement(readPromise(promise), props);\n } catch (error) {\n if (rejected) {\n promise = null;\n rejected = false;\n }\n throw error;\n }\n };\n}\n\nexport function isClientReference(value: unknown): value is FigClientReference {\n return (\n typeof value === \"function\" &&\n (value as FigClientReference).$$typeof === FigClientReferenceSymbol\n );\n}\n\nexport function isSuspense(value: unknown): value is FigSuspense {\n return (\n typeof value === \"function\" &&\n (value as FigSuspense).$$typeof === FigSuspenseSymbol\n );\n}\n\nexport function isActivity(value: unknown): value is FigActivity {\n return (\n typeof value === \"function\" &&\n (value as FigActivity).$$typeof === FigActivitySymbol\n );\n}\n\nexport function isErrorBoundary(value: unknown): value is FigErrorBoundary {\n return (\n typeof value === \"function\" &&\n (value as FigErrorBoundary).$$typeof === FigErrorBoundarySymbol\n );\n}\n\nexport function isViewTransition(value: unknown): value is FigViewTransition {\n return (\n typeof value === \"function\" &&\n (value as FigViewTransition).$$typeof === FigViewTransitionSymbol\n );\n}\n\nexport function isAssets(value: unknown): value is FigAssets {\n return (\n typeof value === \"function\" &&\n (value as FigAssets).$$typeof === FigAssetsSymbol\n );\n}\n"],"mappings":"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"}