vestjs-runtime 1.7.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/IsolateSerializer/package.json +12 -8
- package/README.md +3 -1
- package/dist/IsolateKeys-B21aPuBk.mjs +23 -0
- package/dist/IsolateKeys-B21aPuBk.mjs.map +1 -0
- package/dist/IsolateKeys-CCvALpZC.cjs +35 -0
- package/dist/IsolateKeys-CCvALpZC.cjs.map +1 -0
- package/dist/IsolateSerializer-B1hE3gmT.mjs +1004 -0
- package/dist/IsolateSerializer-B1hE3gmT.mjs.map +1 -0
- package/dist/IsolateSerializer-pbEf5gB2.cjs +1121 -0
- package/dist/IsolateSerializer-pbEf5gB2.cjs.map +1 -0
- package/dist/chunk-CLMFDpHK.mjs +18 -0
- package/dist/exports/IsolateSerializer.cjs +4 -0
- package/dist/exports/IsolateSerializer.mjs +4 -0
- package/dist/exports/test-utils.cjs +21 -0
- package/dist/exports/test-utils.cjs.map +1 -0
- package/dist/exports/test-utils.mjs +21 -0
- package/dist/exports/test-utils.mjs.map +1 -0
- package/dist/vestjs-runtime.cjs +153 -0
- package/dist/vestjs-runtime.cjs.map +1 -0
- package/dist/vestjs-runtime.mjs +117 -0
- package/dist/vestjs-runtime.mjs.map +1 -0
- package/docs/IsolateRegistry.docs.md +146 -0
- package/docs/Isolates.md +97 -0
- package/package.json +43 -88
- package/src/Bus.ts +46 -0
- package/src/Isolate/Isolate.ts +163 -0
- package/src/Isolate/IsolateFocused.ts +93 -0
- package/src/Isolate/IsolateIndexer.ts +42 -0
- package/src/Isolate/IsolateInspector.ts +93 -0
- package/src/Isolate/IsolateKeys.ts +18 -0
- package/src/Isolate/IsolateMutator.ts +165 -0
- package/src/Isolate/IsolateRegistry.ts +176 -0
- package/src/Isolate/IsolateReorderable.ts +11 -0
- package/src/Isolate/IsolateSelectors.ts +25 -0
- package/src/Isolate/IsolateStateMachine.ts +30 -0
- package/src/Isolate/IsolateStatus.ts +8 -0
- package/src/Isolate/IsolateTransient.ts +27 -0
- package/src/Isolate/IsolateTypes.ts +33 -0
- package/src/Isolate/__tests__/Isolate.test.ts +123 -0
- package/src/Isolate/__tests__/IsolateFocused.test.ts +199 -0
- package/src/Isolate/__tests__/IsolateInspector.test.ts +136 -0
- package/src/Isolate/__tests__/IsolateMutator.test.ts +164 -0
- package/src/Isolate/__tests__/IsolatePropagation.test.ts +170 -0
- package/src/Isolate/__tests__/IsolateReorderable.test.ts +111 -0
- package/src/Isolate/__tests__/IsolateSelectors.test.ts +72 -0
- package/src/Isolate/__tests__/IsolateStatus.test.ts +44 -0
- package/src/Isolate/__tests__/IsolateTransient.test.ts +58 -0
- package/src/Isolate/__tests__/__snapshots__/asyncIsolate.test.ts.snap +71 -0
- package/src/Isolate/__tests__/asyncIsolate.test.ts +85 -0
- package/src/IsolateWalker.ts +359 -0
- package/src/Orchestrator/RuntimeStates.ts +4 -0
- package/src/Reconciler.ts +178 -0
- package/src/RuntimeEvents.ts +9 -0
- package/src/VestRuntime.ts +421 -0
- package/src/__tests__/Bus.test.ts +57 -0
- package/src/__tests__/IsolateWalker.iterative.test.ts +77 -0
- package/src/__tests__/IsolateWalker.test.ts +418 -0
- package/src/__tests__/Reconciler.test.ts +193 -0
- package/src/__tests__/Reconciler.transient.test.ts +166 -0
- package/src/__tests__/VestRuntime.test.ts +212 -0
- package/src/__tests__/VestRuntimeStateMachine.test.ts +36 -0
- package/src/__tests__/vestjs-runtime.test.ts +19 -0
- package/src/errors/ErrorStrings.ts +6 -0
- package/src/exports/IsolateSerializer.ts +131 -0
- package/src/exports/__tests__/IsolateSerializer.test.ts +334 -0
- package/src/exports/__tests__/IsolateSerializer.transient.test.ts +101 -0
- package/src/exports/__tests__/__snapshots__/IsolateSerializer.test.ts.snap +5 -0
- package/src/exports/test-utils.ts +17 -0
- package/src/vestjs-runtime.ts +28 -0
- package/test-utils/package.json +12 -8
- package/types/Isolate-DChR7h5K.d.mts +58 -0
- package/types/Isolate-DChR7h5K.d.mts.map +1 -0
- package/types/Isolate-HYIh82M8.d.cts +58 -0
- package/types/Isolate-HYIh82M8.d.cts.map +1 -0
- package/types/IsolateSerializer-BCg01Px5.d.mts +13 -0
- package/types/IsolateSerializer-BCg01Px5.d.mts.map +1 -0
- package/types/IsolateSerializer-CQpP6A4m.d.cts +13 -0
- package/types/IsolateSerializer-CQpP6A4m.d.cts.map +1 -0
- package/types/exports/IsolateSerializer.d.cts +3 -0
- package/types/exports/IsolateSerializer.d.mts +3 -0
- package/types/exports/test-utils.d.cts +7 -0
- package/types/exports/test-utils.d.cts.map +1 -0
- package/types/exports/test-utils.d.mts +7 -0
- package/types/exports/test-utils.d.mts.map +1 -0
- package/types/vestjs-runtime.d.cts +372 -0
- package/types/vestjs-runtime.d.cts.map +1 -0
- package/types/vestjs-runtime.d.mts +370 -0
- package/types/vestjs-runtime.d.mts.map +1 -0
- package/types/vestjs-runtime.d.ts +351 -257
- package/vitest.config.ts +9 -17
- package/dist/cjs/IsolateSerializer.development.js +0 -135
- package/dist/cjs/IsolateSerializer.development.js.map +0 -1
- package/dist/cjs/IsolateSerializer.js +0 -6
- package/dist/cjs/IsolateSerializer.production.js +0 -2
- package/dist/cjs/IsolateSerializer.production.js.map +0 -1
- package/dist/cjs/package.json +0 -1
- package/dist/cjs/test-utils.development.js +0 -61
- package/dist/cjs/test-utils.development.js.map +0 -1
- package/dist/cjs/test-utils.js +0 -6
- package/dist/cjs/test-utils.production.js +0 -2
- package/dist/cjs/test-utils.production.js.map +0 -1
- package/dist/cjs/vestjs-runtime.development.js +0 -686
- package/dist/cjs/vestjs-runtime.development.js.map +0 -1
- package/dist/cjs/vestjs-runtime.js +0 -6
- package/dist/cjs/vestjs-runtime.production.js +0 -2
- package/dist/cjs/vestjs-runtime.production.js.map +0 -1
- package/dist/es/IsolateSerializer.development.js +0 -133
- package/dist/es/IsolateSerializer.development.js.map +0 -1
- package/dist/es/IsolateSerializer.production.js +0 -2
- package/dist/es/IsolateSerializer.production.js.map +0 -1
- package/dist/es/package.json +0 -1
- package/dist/es/test-utils.development.js +0 -59
- package/dist/es/test-utils.development.js.map +0 -1
- package/dist/es/test-utils.production.js +0 -2
- package/dist/es/test-utils.production.js.map +0 -1
- package/dist/es/vestjs-runtime.development.js +0 -675
- package/dist/es/vestjs-runtime.development.js.map +0 -1
- package/dist/es/vestjs-runtime.production.js +0 -2
- package/dist/es/vestjs-runtime.production.js.map +0 -1
- package/dist/umd/IsolateSerializer.development.js +0 -138
- package/dist/umd/IsolateSerializer.development.js.map +0 -1
- package/dist/umd/IsolateSerializer.production.js +0 -2
- package/dist/umd/IsolateSerializer.production.js.map +0 -1
- package/dist/umd/test-utils.development.js +0 -67
- package/dist/umd/test-utils.development.js.map +0 -1
- package/dist/umd/test-utils.production.js +0 -2
- package/dist/umd/test-utils.production.js.map +0 -1
- package/dist/umd/vestjs-runtime.development.js +0 -688
- package/dist/umd/vestjs-runtime.development.js.map +0 -1
- package/dist/umd/vestjs-runtime.production.js +0 -2
- package/dist/umd/vestjs-runtime.production.js.map +0 -1
- package/types/IsolateSerializer.d.ts +0 -42
- package/types/IsolateSerializer.d.ts.map +0 -1
- package/types/test-utils.d.ts +0 -37
- package/types/test-utils.d.ts.map +0 -1
- package/types/vestjs-runtime.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IsolateSerializer-B1hE3gmT.mjs","names":["machine: TStateMachine<IsolateStatus>","found: Nullable<TIsolate>","current: Nullable<TIsolate>","found: TIsolate[]","result: { value: T } | null","Walker.findClosest","VestRuntime.useHistoryIsolateAtCurrentPosition","VestRuntime.useReconciler","VestRuntime.useIsolate","VestRuntime.useHistoryIsolate","VestRuntime.useIsolate","VestRuntime.useHistoryIsolateAtCurrentPosition","VestRuntime.useRuntimeRoot","VestRuntime.Run","VestRuntime.persist"],"sources":["../src/Isolate/IsolateStatus.ts","../src/Isolate/IsolateInspector.ts","../src/Isolate/IsolateStateMachine.ts","../src/Isolate/IsolateMutator.ts","../src/IsolateWalker.ts","../src/Isolate/IsolateTransient.ts","../src/Isolate/IsolateFocused.ts","../src/errors/ErrorStrings.ts","../src/Orchestrator/RuntimeStates.ts","../src/VestRuntime.ts","../src/Bus.ts","../src/Isolate/IsolateIndexer.ts","../src/Isolate/IsolateSelectors.ts","../src/Reconciler.ts","../src/Isolate/Isolate.ts","../src/exports/IsolateSerializer.ts"],"sourcesContent":["export const IsolateStatus = {\n DONE: 'DONE',\n HAS_PENDING: 'HAS_PENDING',\n INITIAL: 'INITIAL',\n PENDING: 'PENDING',\n} as const;\n\nexport type IsolateStatus = (typeof IsolateStatus)[keyof typeof IsolateStatus];\n","import { Nullable, isNotNullish, isNullish } from 'vest-utils';\n\nimport { TIsolate } from './Isolate';\nimport { IsolateStatus } from './IsolateStatus';\n\nexport class IsolateInspector {\n static at(isolate: Nullable<TIsolate>, at: number): Nullable<TIsolate> {\n if (isNullish(isolate)) {\n return null;\n }\n return isolate.children?.[at] ?? null;\n }\n\n static cursor(isolate: Nullable<TIsolate>): number {\n if (isNullish(isolate)) {\n return 0;\n }\n return isolate.children?.length ?? 0;\n }\n\n static canReorder<I extends TIsolate>(isolate: Nullable<I>): boolean {\n if (isNullish(isolate)) {\n return false;\n }\n\n return IsolateInspector.allowsReorder(isolate.parent);\n }\n\n static allowsReorder<I extends Record<any, any>>(\n isolate: Nullable<I>,\n ): boolean {\n return isolate?.allowReorder === true;\n }\n\n static usesKey(isolate: Nullable<TIsolate>): boolean {\n if (isNullish(isolate)) {\n return false;\n }\n return isNotNullish(isolate.key);\n }\n\n static getChildByKey(\n isolate: Nullable<TIsolate>,\n key: string,\n ): Nullable<TIsolate> {\n if (isNullish(isolate)) {\n return null;\n }\n return isolate.keys?.[key] ?? null;\n }\n\n static getStatus(isolate: Nullable<TIsolate>): IsolateStatus {\n if (isNullish(isolate)) {\n return IsolateStatus.INITIAL;\n }\n return isolate.status ?? IsolateStatus.INITIAL;\n }\n\n static statusEquals(\n isolate: Nullable<TIsolate>,\n status: IsolateStatus,\n ): boolean {\n return IsolateInspector.getStatus(isolate) === status;\n }\n\n static isPending(isolate: Nullable<TIsolate>): boolean {\n return IsolateInspector.statusEquals(isolate, IsolateStatus.PENDING);\n }\n\n static isHasPending(isolate: Nullable<TIsolate>): boolean {\n return IsolateInspector.statusEquals(isolate, IsolateStatus.HAS_PENDING);\n }\n\n static hasPending(isolate: Nullable<TIsolate>): boolean {\n return (\n IsolateInspector.isPending(isolate) ||\n IsolateInspector.isHasPending(isolate)\n );\n }\n\n static hasActiveChildren(isolate: Nullable<TIsolate>): boolean {\n if (isNullish(isolate) || isNullish(isolate.children)) {\n return false;\n }\n\n // Check if ANY immediate child is currently PENDING or HAS_PENDING\n return isolate.children.some(child => IsolateInspector.hasPending(child));\n }\n\n static getParent(isolate: Nullable<TIsolate>): Nullable<TIsolate> {\n return isolate?.parent ?? null;\n }\n}\n","import { StateMachine, TStateMachine } from 'vest-utils';\n\nimport { TIsolate } from './Isolate';\nimport { IsolateInspector } from './IsolateInspector';\n\nimport { IsolateStatus } from './IsolateStatus';\n\nconst machine: TStateMachine<IsolateStatus> = {\n initial: IsolateStatus.INITIAL,\n states: {\n [IsolateStatus.DONE]: {},\n [IsolateStatus.INITIAL]: {\n [IsolateStatus.PENDING]: IsolateStatus.PENDING,\n [IsolateStatus.HAS_PENDING]: IsolateStatus.HAS_PENDING,\n [IsolateStatus.DONE]: IsolateStatus.DONE,\n },\n [IsolateStatus.PENDING]: {\n [IsolateStatus.DONE]: IsolateStatus.DONE,\n },\n [IsolateStatus.HAS_PENDING]: {\n [IsolateStatus.DONE]: [\n IsolateStatus.DONE,\n (isolate: TIsolate) => !IsolateInspector.hasActiveChildren(isolate),\n ],\n [IsolateStatus.PENDING]: IsolateStatus.PENDING,\n },\n },\n};\n\nexport const IsolateStateMachine = StateMachine(machine);\n","import {\n Nullable,\n invariant,\n isNullish,\n makeResult,\n Result,\n isFailure,\n} from 'vest-utils';\n\nimport { RuntimeApi } from '../VestRuntime';\n\nimport { IsolateStateMachine } from './IsolateStateMachine';\nimport { IsolateStatus } from './IsolateStatus';\nimport { IsolateInspector } from './IsolateInspector';\n\nimport { TIsolate } from './Isolate';\n\nfunction bubbleUpPending(isolate: Nullable<TIsolate>): void {\n if (isNullish(isolate)) {\n return;\n }\n // If parent is already HAS_PENDING, we can stop the upward traversal.\n if (IsolateInspector.isHasPending(isolate)) {\n return;\n }\n\n const result = IsolateMutator.setHasPending(isolate);\n\n if (isFailure(result)) {\n return;\n }\n\n bubbleUpPending(isolate.parent);\n}\n\nfunction bubbleUpDone(isolate: Nullable<TIsolate>): void {\n if (isNullish(isolate)) {\n return;\n }\n\n if (!IsolateInspector.isHasPending(isolate)) {\n return;\n }\n\n const result = IsolateMutator.setStatus(isolate, IsolateStatus.DONE, isolate);\n\n if (isFailure(result)) {\n return;\n }\n\n bubbleUpDone(isolate.parent);\n}\n\nexport class IsolateMutator {\n static setParent(isolate: TIsolate, parent: Nullable<TIsolate>): TIsolate {\n isolate.parent = parent;\n return isolate;\n }\n\n static saveOutput(isolate: TIsolate, output: any): TIsolate {\n isolate.output = output;\n return isolate;\n }\n\n static setKey(isolate: TIsolate, key: Nullable<string>): TIsolate {\n isolate.key = key;\n return isolate;\n }\n\n static addChild(isolate: TIsolate, child: TIsolate): void {\n invariant(isolate);\n\n isolate.children = isolate.children ?? [];\n\n isolate.children.push(child);\n IsolateMutator.setParent(child, isolate);\n\n if (IsolateInspector.hasPending(child)) {\n bubbleUpPending(isolate);\n }\n }\n\n static removeChild(isolate: TIsolate, node: TIsolate): void {\n isolate.children =\n isolate.children?.filter(child => child !== node) ?? null;\n }\n\n static addChildKey(isolate: TIsolate, key: string, node: TIsolate): void {\n invariant(isolate);\n\n isolate.keys = isolate.keys ?? {};\n\n isolate.keys[key] = node;\n }\n\n static slice(isolate: TIsolate, at: number): void {\n if (isNullish(isolate.children)) {\n return;\n }\n isolate.children.length = at;\n }\n\n static setData(isolate: TIsolate, data: any): void {\n isolate.data = data;\n }\n\n static abort(isolate: TIsolate, reason?: string): void {\n if (isNullish(isolate.abortController)) {\n return;\n }\n isolate.abortController.abort(reason);\n }\n\n static setStatus(\n isolate: TIsolate,\n status: IsolateStatus,\n payload?: any,\n ): Result<IsolateStatus, string> {\n if (isolate.status === status) {\n return makeResult.Err(`Isolate status is already ${status}`);\n }\n\n isolate.status = IsolateStateMachine.staticTransition(\n isolate.status ?? IsolateStatus.INITIAL,\n status,\n payload,\n ) as IsolateStatus;\n\n return makeResult.Ok(isolate.status);\n }\n\n static setPending(isolate: TIsolate): void {\n const result = IsolateMutator.setStatus(isolate, IsolateStatus.PENDING);\n\n if (isFailure(result)) {\n return;\n }\n\n RuntimeApi.registerPending(isolate);\n\n // Bubble up the HAS_PENDING status to all ancestors.\n bubbleUpPending(isolate.parent);\n }\n\n static setHasPending(isolate: TIsolate): Result<IsolateStatus, string> {\n return IsolateMutator.setStatus(isolate, IsolateStatus.HAS_PENDING);\n }\n\n static setDone(isolate: TIsolate): void {\n const result = IsolateMutator.setStatus(\n isolate,\n IsolateStatus.DONE,\n isolate,\n );\n\n if (isFailure(result)) {\n return;\n }\n\n // Bubble up the DONE status to ancestors if no other children are pending.\n bubbleUpDone(isolate.parent);\n\n RuntimeApi.removePending(isolate);\n }\n}\n","import {\n Nullable,\n isNullish,\n dynamicValue,\n Result,\n makeResult,\n isFailure,\n} from 'vest-utils';\n\nimport { IsolateInspector } from './Isolate/IsolateInspector';\nimport { type TIsolate } from './Isolate/Isolate';\nimport { IsolateMutator } from './Isolate/IsolateMutator';\n\ntype VisitOnlyPredicate = (isolate: TIsolate) => boolean;\n\n/**\n * Walks the isolate tree starting from the given node.\n * @param startNode - The starting node for the traversal.\n * @param callback - The callback function to be called for each visited node.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n */\nexport function walk(\n startNode: TIsolate,\n callback: (isolate: TIsolate) => Result<void>,\n visitOnly?: VisitOnlyPredicate,\n): Result<void> {\n if (!startNode) return makeResult.Ok(undefined);\n\n const stack = [startNode];\n\n while (stack.length > 0) {\n const node = stack.pop()!;\n\n const res = visit(node, visitOnly, callback);\n\n if (isFailure(res)) {\n return res;\n }\n\n if (node.children) {\n pushChildren(stack, node.children);\n }\n }\n\n return makeResult.Ok(undefined);\n}\n\nfunction visit(\n node: TIsolate,\n visitOnly: VisitOnlyPredicate | undefined,\n callback: (isolate: TIsolate) => Result<void>,\n): Result<void> {\n if (shouldVisit(node, visitOnly)) {\n return callback(node);\n }\n return makeResult.Ok(undefined);\n}\n\nfunction pushChildren(stack: TIsolate[], children: TIsolate[]): void {\n for (let i = children.length - 1; i >= 0; i--) {\n stack.push(children[i]);\n }\n}\n\nfunction shouldVisit(node: TIsolate, visitOnly?: VisitOnlyPredicate): boolean {\n return isNullish(visitOnly) || dynamicValue(visitOnly, node);\n}\n\n/**\n * Reduces the isolate tree to a single value.\n * @param startNode - The starting node for the traversal.\n * @param callback - The reducer function.\n * @param initialValue - The initial value for the accumulator.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n * @returns The final accumulated value.\n */\nexport function reduce<T>(\n startNode: TIsolate,\n callback: (acc: T, isolate: TIsolate) => Result<T>,\n initialValue: T,\n visitOnly?: VisitOnlyPredicate,\n): T {\n let acc = initialValue;\n\n walk(\n startNode,\n node => {\n const res = callback(acc, node);\n\n if (isFailure(res)) {\n return makeResult.Err(res.error);\n }\n acc = res.unwrap();\n return makeResult.Ok(undefined);\n },\n visitOnly,\n );\n\n return acc;\n}\n\n/**\n * Checks if any node in the tree satisfies the predicate.\n * @param startNode - The starting node for the traversal.\n * @param predicate - The predicate function to test each node.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n * @returns True if any node satisfies the predicate, false otherwise.\n */\nexport function some(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n visitOnly?: VisitOnlyPredicate,\n): boolean {\n let hasMatch = false;\n\n // Call the walk function with a callback function that sets hasMatch to true if the predicate is satisfied.\n walk(\n startNode,\n node => {\n if (predicate(node)) {\n hasMatch = true;\n return makeResult.Err(undefined);\n }\n return makeResult.Ok(undefined);\n },\n visitOnly,\n );\n\n return hasMatch;\n}\n\n/**\n * Checks if the tree contains a node that matches the predicate.\n * @param startNode - The starting node for the traversal.\n * @param match - The predicate function to match nodes.\n * @returns True if a matching node is found, false otherwise.\n */\nexport function has(startNode: TIsolate, match: VisitOnlyPredicate): boolean {\n return some(startNode, () => true, match);\n}\n\n/**\n * Traverses up the tree to find the closest ancestor that satisfies the predicate,\n * then returns the first direct descendant of that ancestor that satisfies the predicate.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match.\n * @returns The found node or null.\n */\nexport function findClosest<I extends TIsolate = TIsolate>(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n): Nullable<I> {\n let found: Nullable<TIsolate> = null;\n let current: Nullable<TIsolate> = startNode;\n\n while (current) {\n found = current.children?.find(predicate) ?? null;\n\n if (found) {\n break;\n }\n\n current = current.parent;\n }\n\n return found as Nullable<I>;\n}\n\n/**\n * Finds the first node in the tree that satisfies the predicate.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n * @returns The found node or null.\n */\nexport function find(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n visitOnly?: VisitOnlyPredicate,\n): Nullable<TIsolate> {\n let found = null;\n\n walk(\n startNode,\n node => {\n if (predicate(node)) {\n found = node;\n return makeResult.Err(undefined);\n }\n return makeResult.Ok(undefined);\n },\n visitOnly,\n );\n\n return found;\n}\n\n/**\n * Finds all nodes in the tree that satisfy the predicate.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n * @returns An array of found nodes.\n */\nexport function findAll(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n visitOnly?: VisitOnlyPredicate,\n): TIsolate[] {\n const found: TIsolate[] = [];\n\n walk(\n startNode,\n node => {\n if (predicate(node)) {\n found.push(node);\n }\n return makeResult.Ok(undefined);\n },\n visitOnly,\n );\n\n return found;\n}\n\n/**\n * Checks if every node in the tree satisfies the predicate.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n * @returns True if all nodes satisfy the predicate, false otherwise.\n */\nexport function every(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n visitOnly?: VisitOnlyPredicate,\n): boolean {\n let hasMatch = true;\n walk(\n startNode,\n node => {\n if (!predicate(node)) {\n hasMatch = false;\n return makeResult.Err(undefined);\n }\n return makeResult.Ok(undefined);\n },\n visitOnly,\n );\n\n return hasMatch;\n}\n\n/**\n * Removes nodes from the tree that satisfy the predicate.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match nodes to remove.\n * @param visitOnly - Optional predicate to filter which nodes to visit.\n */\nexport function pluck(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n visitOnly?: VisitOnlyPredicate,\n): void {\n walk(\n startNode,\n node => {\n if (predicate(node) && node.parent) {\n IsolateMutator.removeChild(node.parent, node);\n }\n return makeResult.Ok(undefined);\n },\n visitOnly,\n );\n}\n\n/**\n * Finds the closest ancestor of the startNode that satisfies the predicate.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match.\n * @returns The found ancestor or null.\n */\nexport function closest<I extends TIsolate = TIsolate>(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n): Nullable<I> {\n let current: Nullable<TIsolate> = startNode;\n do {\n if (predicate(current)) {\n return current as I;\n }\n current = current.parent;\n } while (current);\n return null;\n}\n\n/**\n * Checks if an ancestor satisfying the predicate exists.\n * @param startNode - The starting node.\n * @param predicate - The predicate to match.\n * @returns True if such an ancestor exists, false otherwise.\n */\nexport function closestExists(\n startNode: TIsolate,\n predicate: (node: TIsolate) => boolean,\n): boolean {\n return !!closest(startNode, predicate);\n}\n\n/**\n * Traverses the tree and returns the first non-nullish value returned by the callback.\n * It optimizes traversal by only visiting nodes that have pending isolates or are pending themselves.\n */\nexport function mapFirst<T>(\n startNode: TIsolate,\n callback: (isolate: TIsolate, breakout: (value: T) => void) => void,\n): T | null {\n const stack = [startNode];\n let result: { value: T } | null = null;\n const breakout = (value: T) => (result = { value });\n\n while (stack.length > 0) {\n if (result) {\n break;\n }\n\n const node = stack.pop()!;\n processNode(node, stack, callback, breakout);\n }\n\n return (result as { value: T } | null)?.value ?? null;\n}\n\nfunction processNode<T>(\n node: TIsolate,\n stack: TIsolate[],\n callback: (isolate: TIsolate, breakout: (value: T) => void) => void,\n breakout: (value: T) => void,\n): void {\n if (!IsolateInspector.hasPending(node)) {\n return;\n }\n\n runCallback(node, callback, breakout);\n\n if (node.children) {\n pushChildren(stack, node.children);\n }\n}\n\nfunction runCallback<T>(\n node: TIsolate,\n callback: (isolate: TIsolate, breakout: (value: T) => void) => void,\n breakout: (value: T) => void,\n): void {\n if (IsolateInspector.isPending(node)) {\n callback(node, breakout);\n }\n}\n","import { CB } from 'vest-utils';\n\nimport { Isolate } from './Isolate';\nimport type { IsolatePayload, TIsolate } from './IsolateTypes';\n\n/**\n * Creates a transient isolate.\n *\n * Transient isolates are isolates that:\n * 1. Do not persist in the history tree.\n * 2. Are not reconciled with previous runs.\n * 3. Do not appear in the serialized suite dump.\n * 4. Do not interfere with the index of their siblings (they are skipped by the reconciler).\n *\n * This is useful for \"structural\" isolates that are used for control flow or grouping\n * but do not hold state that needs to be preserved between runs, such as `focused` (skip/only) isolates.\n */\nexport function IsolateTransient<Payload extends IsolatePayload>(\n callback: CB,\n type = 'Transient',\n payload: Payload = {} as Payload,\n): TIsolate<Payload> {\n return Isolate.create<Payload>(type, callback, {\n ...payload,\n transient: true,\n });\n}\n","import {\n asArray,\n Maybe,\n Nullish,\n OneOrMoreOf,\n noop,\n isNotEmpty,\n isStringValue,\n} from 'vest-utils';\n\nimport { IsolateTransient } from './IsolateTransient';\nimport { TIsolate } from './Isolate';\nimport { IsolateKeys } from './IsolateKeys';\n\nexport const VestIsolateTypeFocused = 'Focused';\n\nexport enum FocusModes {\n SKIP = 'skip',\n ONLY = 'only',\n}\n\nexport type FocusMatchExclusion = Maybe<OneOrMoreOf<string>>;\n\nexport type TIsolateFocused = TIsolate<IsolateFocusedPayload>;\n\ntype IsolateFocusedPayload = {\n focusMode: FocusModes;\n match: FocusMatchExclusion;\n matchAll: boolean;\n};\n\n/**\n * Creates a focused isolate.\n * Focused isolates are transient because they only affect the current run\n * and do not need to be preserved in history or appearing in the suite result.\n */\nexport function IsolateFocused(\n focusMode: FocusModes,\n match?: true | FocusMatchExclusion,\n): TIsolateFocused | undefined {\n const matchedFields = asArray(match).filter(isStringValue).filter(isNotEmpty);\n\n const matchAll = match === true;\n\n // If there are no fields to match and matchAll is false,\n // skip creating the isolate entirely — it would be a no-op.\n if (!isNotEmpty(matchedFields) && !matchAll) {\n return undefined;\n }\n\n return IsolateTransient<IsolateFocusedPayload>(noop, VestIsolateTypeFocused, {\n focusMode,\n match: matchedFields,\n matchAll,\n });\n}\n\nexport class FocusSelectors {\n static isSkipFocused(\n focus: Nullish<TIsolateFocused>,\n fieldName?: string,\n ): boolean {\n if (!focus) return false;\n const data = focus.data;\n if (!data || data.focusMode !== FocusModes.SKIP) return false;\n if (data.matchAll) return true;\n return hasFocus(focus, fieldName);\n }\n static isOnlyFocused(\n focus: Nullish<TIsolateFocused>,\n fieldName?: string,\n ): boolean {\n if (!focus) return false;\n const data = focus.data;\n if (!data || data.focusMode !== FocusModes.ONLY) return false;\n if (data.matchAll) return true;\n return hasFocus(focus, fieldName);\n }\n\n static isIsolateFocused(isolate: TIsolate): isolate is TIsolateFocused {\n return isolate[IsolateKeys.Type] === VestIsolateTypeFocused;\n }\n}\n\nfunction hasFocus(\n focus: Nullish<TIsolateFocused>,\n fieldName?: string,\n): boolean {\n const match = asArray(focus?.data?.match);\n if (!match.length) return false;\n\n return !fieldName || match.includes(fieldName as string);\n}\n","export enum ErrorStrings {\n NO_ACTIVE_ISOLATE = 'Not within an active isolate',\n UNABLE_TO_PICK_NEXT_ISOLATE = 'Unable to pick next isolate. This is a bug, please report it to the Vest maintainers.',\n ENCOUNTERED_THE_SAME_KEY_TWICE = `Encountered the same key \"{key}\" twice. This may lead to inconsistent or overriding of results.`,\n INVALID_ISOLATE_CANNOT_PARSE = `Invalid isolate was passed to IsolateSerializer. Cannot proceed.`,\n}\n","export enum RuntimeState {\n PENDING = 'PENDING',\n STABLE = 'STABLE',\n}\n","import { createCascade } from 'context';\nimport { RuntimeEvents } from './RuntimeEvents';\nimport {\n invariant,\n deferThrow,\n isNullish,\n assign,\n TinyState,\n text,\n dynamicValue,\n tinyState,\n BusType,\n bus,\n Nullable,\n DynamicValue,\n asArray,\n} from 'vest-utils';\n\nimport * as Walker from './IsolateWalker';\nimport {\n TIsolateFocused,\n FocusSelectors,\n FocusModes,\n} from './Isolate/IsolateFocused';\nimport { TIsolate } from './Isolate/Isolate';\nimport { IsolateInspector } from './Isolate/IsolateInspector';\nimport { IsolateMutator } from './Isolate/IsolateMutator';\nimport { IReconciler } from './Reconciler';\nimport { ErrorStrings } from './errors/ErrorStrings';\nimport { RuntimeState } from './Orchestrator/RuntimeStates';\n\ntype CTXType = StateRefType & {\n historyNode: Nullable<TIsolate>;\n runtimeNode: Nullable<TIsolate>;\n runtimeRoot: Nullable<TIsolate>;\n stateRef: StateRefType;\n};\n\n/**\n * The state reference type for the Vest runtime.\n * Holds all mutable state for the runtime instance.\n */\nexport type StateRefType = {\n Bus: BusType<RuntimeEvents>;\n appData: Record<string, any>;\n historyRoot: TinyState<Nullable<TIsolate>>;\n Reconciler: IReconciler;\n implicitOnlyNodes: Set<TIsolate>;\n};\n\nconst PersistedContext = createCascade<CTXType>((stateRef, parentContext) => {\n if (parentContext) {\n return null;\n }\n\n invariant(stateRef.historyRoot);\n\n const ref = stateRef as StateRefType;\n\n const [historyRootNode] = ref.historyRoot();\n\n // Clear the implicit-only registry from any previous run.\n // The Set lives on stateRef (persisted across runs), so stale\n // entries would cause hasImplicitOnly() false positives.\n ref.implicitOnlyNodes.clear();\n\n const ctxRef = {} as CTXType;\n\n assign(ctxRef, {\n historyNode: historyRootNode,\n runtimeNode: null,\n runtimeRoot: null,\n stateRef,\n });\n\n return ctxRef;\n});\n\n/**\n * Runs a function within the Vest runtime context.\n * This is the main entry point for executing Vest suites.\n */\nexport const Run = PersistedContext.run;\n\n/**\n * Retrieves the current runtime state (e.g., STABLE, PENDING).\n */\nexport function useRuntimeState() {\n return useIsStable() ? RuntimeState.STABLE : RuntimeState.PENDING;\n}\n\n/**\n * Checks if the runtime is currently stable (no pending tests).\n */\nexport function useIsStable() {\n const root = useAvailableRoot();\n\n if (!root) {\n return true;\n }\n\n return !IsolateInspector.hasPending(root);\n}\n\n/**\n * Retrieves the application-specific data stored in the runtime.\n */\nexport function useXAppData<T = object>() {\n return useX().stateRef.appData as T;\n}\n\n/**\n * Creates a new state reference for such as the history root, pending isolates, and the current runtime state.\n */\nexport function createRef(\n Reconciler: IReconciler,\n setter: DynamicValue<Record<string, any>>,\n): StateRefType {\n const ref = Object.freeze({\n Bus: bus.createBus<RuntimeEvents>(),\n Reconciler,\n appData: dynamicValue(setter),\n historyRoot: tinyState.createTinyState<Nullable<TIsolate>>(null),\n implicitOnlyNodes: new Set<TIsolate>(),\n });\n\n return ref;\n}\n\n/**\n * Dispatches a runtime event to the internal Bus.\n * This is used to trigger state changes and notifications.\n */\nexport function dispatch<T extends keyof RuntimeEvents>(\n event: RuntimeEvents[T] extends void\n ? { type: T; payload?: void }\n : { type: T; payload: RuntimeEvents[T] },\n) {\n useX().stateRef.Bus.emit(event.type, event.payload as any);\n}\n\n/**\n * Registers an isolate as pending.\n * This is used to track async tests and other async operations.\n */\nexport function registerPending(isolate: TIsolate) {\n dispatch({ type: 'ISOLATE_PENDING', payload: isolate });\n}\n\n/**\n * Removes an isolate from the pending set.\n * This is used when an async test or operation completes.\n */\nexport function removePending(isolate: TIsolate) {\n dispatch({ type: 'ISOLATE_DONE', payload: isolate });\n}\n\n/**\n * Retrieves the Reconciler used by the current runtime.\n */\nexport function useReconciler() {\n return useX().stateRef.Reconciler;\n}\n\n/**\n * Persists the current runtime context to a callback function.\n * This allows the callback to be executed later (e.g. in an async operation)\n * while still having access to the correct runtime context.\n */\nexport function persist<T extends (...args: any[]) => any>(cb: T): T {\n const prev = PersistedContext.useX();\n\n return ((...args: Parameters<T>): ReturnType<T> => {\n const ctxToUse = PersistedContext.use() ?? prev;\n return PersistedContext.run(ctxToUse.stateRef, () => cb(...args));\n }) as T;\n}\n/**\n * Retrieves the current runtime context.\n * Throws if called outside of a Vest runtime.\n */\nexport function useX<T = object>(): CTXType & T {\n return PersistedContext.useX() as CTXType & T;\n}\n\n/**\n * Retrieves the history root state.\n */\nexport function useHistoryRoot() {\n return useX().stateRef.historyRoot();\n}\n\n/**\n * Retrieves the current history isolate (the one matching the current runtime isolate).\n */\nexport function useHistoryIsolate() {\n return useX().historyNode;\n}\n\n/**\n * Returns the history isolate at the current position.\n * If there is a parent isolate, it returns the history node from the parent's children.\n * Otherwise, it returns the history node.\n * @returns {Nullable<TIsolate>} The history isolate at the current position.\n */\nexport function useHistoryIsolateAtCurrentPosition() {\n const parent = useIsolate();\n const historyNode = useHistoryIsolate();\n\n if (!parent) {\n return historyNode;\n }\n\n if (isNullish(historyNode)) {\n return null;\n }\n\n const nonTransientIndex = countNonTransientBefore(\n parent.children || [],\n IsolateInspector.cursor(parent),\n );\n\n return findNthNonTransient(historyNode.children || [], nonTransientIndex);\n}\n\n/**\n * Counts non-transient children before the given cursor position.\n */\nfunction countNonTransientBefore(siblings: TIsolate[], cursor: number): number {\n let count = 0;\n for (let i = 0; i < cursor; i++) {\n if (!siblings[i]?.transient) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Finds the Nth non-transient child in a children array.\n * This is used to align the reconciler cursor, skipping over\n * transient nodes that should not affect the index of stateful nodes.\n */\nfunction findNthNonTransient(\n children: TIsolate[],\n n: number,\n): Nullable<TIsolate> {\n return children.filter(child => child && !child.transient)[n] ?? null;\n}\n\n/**\n * Sets the history root for the runtime.\n * This is used to hydrate the runtime with previous results.\n */\nexport function useSetHistoryRoot(history: TIsolate) {\n const [, setHistoryRoot] = useHistoryRoot();\n setHistoryRoot(history);\n}\n\n/**\n * Retrieves a child isolate from the history tree by its key.\n */\nexport function useHistoryKey(key?: Nullable<string>): Nullable<TIsolate> {\n if (isNullish(key)) {\n return null;\n }\n\n const historyNode = useX().historyNode;\n\n return IsolateInspector.getChildByKey(historyNode, key);\n}\n\n/**\n * Retrieves the currently active isolate in the runtime tree.\n */\nexport function useIsolate() {\n return useX().runtimeNode ?? null;\n}\n\n/**\n * Retrieves the current cursor position within the active isolate.\n */\nexport function useCurrentCursor() {\n const isolate = useIsolate();\n return isolate ? IsolateInspector.cursor(isolate) : 0;\n}\n\n/**\n * Retrieves the root of the current runtime tree.\n */\nexport function useRuntimeRoot() {\n return useX().runtimeRoot;\n}\n\n/**\n * Adds a child isolate to the current isolate and sets the parent-child relationship.\n */\nexport function useSetNextIsolateChild(child: TIsolate): void {\n const currentIsolate = useIsolate();\n\n invariant(currentIsolate, ErrorStrings.NO_ACTIVE_ISOLATE);\n\n IsolateMutator.addChild(currentIsolate, child);\n IsolateMutator.setParent(child, currentIsolate);\n\n if (\n FocusSelectors.isIsolateFocused(child) &&\n child.data?.focusMode === FocusModes.ONLY\n ) {\n useX().stateRef.implicitOnlyNodes.add(currentIsolate);\n }\n}\n\n/**\n * Sets a key for a child isolate within the current isolate.\n * Throws if the key is already taken.\n */\nexport function useSetIsolateKey(key: Nullable<string>, node: TIsolate): void {\n if (!key) {\n return;\n }\n\n const currentIsolate = useIsolate();\n\n invariant(currentIsolate, ErrorStrings.NO_ACTIVE_ISOLATE);\n\n if (isNullish(IsolateInspector.getChildByKey(currentIsolate, key))) {\n IsolateMutator.addChildKey(currentIsolate, key, node);\n\n return;\n }\n\n deferThrow(text(ErrorStrings.ENCOUNTERED_THE_SAME_KEY_TWICE, { key }));\n}\n/**\n * Returns the available root isolate.\n * If a runtime root exists (i.e. we are currently running a suite), it returns that.\n * Otherwise, it returns the history root (i.e. the result of the last run).\n */\nexport function useAvailableRoot<I extends TIsolate = TIsolate>(): I {\n const root = useRuntimeRoot();\n\n if (root) {\n return root as I;\n }\n\n const [historyRoot] = useHistoryRoot();\n\n return historyRoot as I;\n}\n\n/**\n * Checks whether a specific key is heavily focused out.\n */\nexport function useIsFocusedOut(key?: string): boolean {\n const current = useIsolate();\n if (!current) return false;\n\n const focusMatch = Walker.findClosest<TIsolateFocused>(\n current,\n (child: TIsolate): boolean => {\n if (!FocusSelectors.isIsolateFocused(child)) return false;\n const data = child.data;\n if (!data) return false;\n if (data.matchAll) return true;\n\n if (isNullish(key)) return false;\n return asArray(data.match).includes(key);\n },\n );\n\n if (focusMatch) {\n if (FocusSelectors.isSkipFocused(focusMatch, key)) return true;\n if (FocusSelectors.isOnlyFocused(focusMatch, key)) return false;\n }\n\n return hasImplicitOnly();\n}\n\nfunction hasImplicitOnly(): boolean {\n let current = useIsolate();\n const registry = useX().stateRef.implicitOnlyNodes;\n\n while (current) {\n if (registry.has(current)) {\n return true;\n }\n current = current.parent;\n }\n\n return false;\n}\n\n/**\n * Resets the history root.\n */\nexport function reset() {\n const [, , resetHistoryRoot] = useHistoryRoot();\n\n resetHistoryRoot();\n}\n\nexport const RuntimeApi = {\n Run,\n createRef,\n dispatch,\n hasImplicitOnly,\n persist,\n registerPending,\n removePending,\n reset,\n useAvailableRoot,\n useCurrentCursor,\n useHistoryRoot,\n useIsFocusedOut,\n useIsStable,\n useRuntimeState,\n useSetHistoryRoot,\n useSetNextIsolateChild,\n useXAppData,\n};\n","import { BusType, isNullish } from 'vest-utils';\n\nimport { persist, useX } from './VestRuntime';\nimport { RuntimeEvents } from './RuntimeEvents';\n\nexport function useBus<\n E extends Record<string, any> = RuntimeEvents,\n>(): BusType<E> {\n return useX().stateRef.Bus as unknown as BusType<E>;\n}\n\n/*\n Returns an emitter, but it also has a shortcut for emitting an event immediately\n by passing an event name.\n*/\n\nexport function useEmit<\n E extends Record<string, any> = RuntimeEvents,\n T extends keyof E = keyof E,\n>(\n event: T,\n ...args: E[T] extends void ? [payload?: E[T]] : [payload: E[T]]\n): void;\nexport function useEmit<_E extends Record<string, any> = RuntimeEvents>(): (\n event: string,\n data?: any,\n) => void;\nexport function useEmit(event?: string, data?: any): any {\n const emit = useBus().emit;\n\n if (!isNullish(event)) {\n // @ts-ignore - We're allowing any event name here because the bus might be extended\n emit(event, data);\n }\n\n return persist(emit);\n}\n\nexport function usePrepareEmitter<\n E extends Record<string, any> = RuntimeEvents,\n T extends keyof E = keyof E,\n>(event: T): (arg: E[T]) => void {\n const emit = useEmit<E>();\n\n return (arg: E[T]) => emit(event as string, arg);\n}\n","import { isNullish, Nullable } from 'vest-utils';\n\nimport { TIsolate } from './IsolateTypes';\n\nexport function createHistoryIndex(\n children: Nullable<TIsolate[]>,\n): Map<string, TIsolate | TIsolate[]> {\n const index = new Map<string, TIsolate | TIsolate[]>();\n\n if (!children) {\n return index;\n }\n\n for (const child of children) {\n addToIndex(index, child);\n }\n\n return index;\n}\n\nfunction addToIndex(\n index: Map<string, TIsolate | TIsolate[]>,\n isolate: TIsolate,\n): void {\n const { key } = isolate;\n\n if (isNullish(key)) {\n return;\n }\n\n const existing = index.get(key);\n\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(isolate);\n } else {\n index.set(key, [existing, isolate]);\n }\n } else {\n index.set(key, isolate);\n }\n}\n","import { Maybe } from 'vest-utils';\n\nimport { TIsolate } from './Isolate';\nimport { IsolateKeys } from './IsolateKeys';\n\nexport function isIsolateType<I extends TIsolate>(\n node: Maybe<TIsolate>,\n type: string,\n): node is I {\n return node?.[IsolateKeys.Type] === type;\n}\n\nexport function isSameIsolateType<A extends TIsolate, B extends TIsolate>(\n a: A,\n b: B,\n): boolean {\n return isIsolateType(a, b[IsolateKeys.Type]);\n}\n\nexport function isSameIsolateIdentity<A extends TIsolate, B extends TIsolate>(\n a: A,\n b: B,\n): boolean {\n return Object.is(a, b) || (isSameIsolateType(a, b) && a.key === b.key);\n}\n","import {\n Maybe,\n Nullable,\n invariant,\n isNullish,\n dynamicValue,\n} from 'vest-utils';\n\nimport { type TIsolate } from './Isolate/Isolate';\nimport { createHistoryIndex } from './Isolate/IsolateIndexer';\nimport { IsolateInspector } from './Isolate/IsolateInspector';\nimport { IsolateMutator } from './Isolate/IsolateMutator';\nimport { isSameIsolateType } from './Isolate/IsolateSelectors';\nimport * as VestRuntime from './VestRuntime';\nimport { ErrorStrings } from './errors/ErrorStrings';\n// import { isSameIsolateType } from 'IsolateSelectors';\n\n// I would rather not use `any` here, but instead use `Isolate`.\n// The problem is that it breaks the actual implementation of `Isolate` in `IsolateTest`\n// As it is not properly extending `Isolate`.\nexport interface IReconciler<I = any> {\n (currentNode: I, historyNode: I): Nullable<I>;\n}\n\nfunction BaseReconciler(\n currentNode: TIsolate,\n historyNode: TIsolate,\n): TIsolate {\n if (isNullish(historyNode)) {\n return currentNode;\n }\n return currentNode;\n}\n\nexport class Reconciler {\n /**\n * Reconciles the current isolate with the history isolate.\n * If the current isolate is of a different type than the history isolate,\n * the current isolate is returned.\n * Otherwise, the reconciler function is called to determine the next isolate.\n * If the reconciler function returns null or undefined, the base reconciler is used.\n * If no history isolate exists, the current isolate is returned.\n * @param node The current isolate to reconcile.\n * @returns The next isolate after reconciliation.\n */\n static reconcile(node: TIsolate): TIsolate {\n // If the node is transient, it should not be reconciled with history\n // and should not consume the history cursor.\n // This allows us to insert/remove transient nodes without affecting\n // the stable identity of their siblings.\n if (node.transient) {\n return node;\n }\n\n const localHistoryNode = VestRuntime.useHistoryIsolateAtCurrentPosition();\n\n const nextNodeResult = pickNextNode(node, localHistoryNode);\n\n invariant(nextNodeResult, ErrorStrings.UNABLE_TO_PICK_NEXT_ISOLATE);\n\n return nextNodeResult;\n }\n\n static dropNextNodesOnReorder<I extends TIsolate>(\n reorderLogic: (newNode: I, prevNode: Maybe<TIsolate>) => boolean,\n newNode: I,\n prevNode: Maybe<TIsolate>,\n ): boolean {\n const didReorder = reorderLogic(newNode, prevNode);\n\n if (didReorder) {\n removeAllNextNodesInIsolate();\n }\n\n return didReorder;\n }\n\n static handleIsolateNodeWithKey<I extends TIsolate>(\n node: TIsolate,\n\n // The revoke function allows the caller to revoke the previous node\n revoke: ((node: I) => boolean) | false,\n ): TIsolate {\n invariant(IsolateInspector.usesKey(node));\n\n const prevNodeByKey = getNodeByKey(node.key);\n let nextNode = node;\n\n if (!isNullish(prevNodeByKey) && !dynamicValue(revoke, prevNodeByKey)) {\n nextNode = prevNodeByKey;\n }\n\n VestRuntime.useSetIsolateKey(node.key, nextNode);\n\n return nextNode;\n }\n}\n\nfunction pickNextNode(\n currentNode: TIsolate,\n historyNode: Nullable<TIsolate>,\n): TIsolate {\n if (isNullish(historyNode)) {\n return handleNoHistoryNode(currentNode);\n }\n\n if (!isSameIsolateType(currentNode, historyNode)) {\n return currentNode;\n }\n\n const reconciler = VestRuntime.useReconciler();\n\n return (\n reconciler(currentNode, historyNode) ??\n BaseReconciler(currentNode, historyNode)\n );\n}\n\nfunction handleNoHistoryNode<I extends TIsolate>(newNode: I): I {\n if (IsolateInspector.usesKey(newNode)) {\n return Reconciler.handleIsolateNodeWithKey(newNode, false) as I;\n }\n\n return newNode;\n}\n\nfunction removeAllNextNodesInIsolate() {\n const currentNode = VestRuntime.useIsolate();\n const historyNode = VestRuntime.useHistoryIsolate();\n\n if (!historyNode || !currentNode) {\n // This is probably unreachable, but TS is not convinced.\n // Let's play it safe.\n /* istanbul ignore next */\n return;\n }\n\n IsolateMutator.slice(historyNode, IsolateInspector.cursor(currentNode));\n}\n\nconst historyIndexCache = new WeakMap<\n TIsolate,\n Map<string, TIsolate | TIsolate[]>\n>();\n\nfunction getNodeByKey(key: Nullable<string>): Nullable<TIsolate> {\n const historyParent = VestRuntime.useHistoryIsolate();\n\n if (isNullish(key) || !historyParent) {\n return null;\n }\n\n const index = getHistoryIndex(historyParent);\n const match = index.get(key);\n\n if (!match) {\n return null;\n }\n\n if (Array.isArray(match)) {\n return match[0];\n }\n\n return match;\n}\n\nfunction getHistoryIndex(\n historyParent: TIsolate,\n): Map<string, TIsolate | TIsolate[]> {\n let index = historyIndexCache.get(historyParent);\n\n if (!index) {\n index = createHistoryIndex(historyParent.children);\n historyIndexCache.set(historyParent, index);\n }\n\n return index;\n}\n","import { CB, Maybe, Nullable, isNotNullish, isPromise } from 'vest-utils';\n\nimport { useEmit } from '../Bus';\nimport { Reconciler } from '../Reconciler';\nimport * as VestRuntime from '../VestRuntime';\n\nimport { IsolateKeys } from './IsolateKeys';\nimport { IsolateMutator } from './IsolateMutator';\nimport { IsolateStatus } from './IsolateStatus';\nimport type { IsolateKey, IsolatePayload, TIsolate } from './IsolateTypes';\n\nexport { IsolateKey, TIsolate };\n\nexport class Isolate {\n // eslint-disable-next-line max-statements\n static create<Payload extends IsolatePayload>(\n type: string,\n callback: CB,\n payload: Maybe<Payload> = undefined,\n key?: IsolateKey,\n ): TIsolate<Payload> {\n const parent = VestRuntime.useIsolate();\n\n const newCreatedNode = IsolateMutator.setParent(\n baseIsolate(type, payload, key),\n parent,\n );\n\n const nextIsolateChild = Reconciler.reconcile(newCreatedNode);\n\n const localHistoryNode = VestRuntime.useHistoryIsolateAtCurrentPosition();\n\n const shouldRunNew = Object.is(nextIsolateChild, newCreatedNode);\n\n if (parent) {\n // We are within an isolate context. This means that\n // we need to set the new node to be the child of this parent node.\n VestRuntime.useSetNextIsolateChild(nextIsolateChild);\n }\n\n let output;\n\n if (shouldRunNew) {\n output = useRunAsNew(localHistoryNode, newCreatedNode, callback);\n } else {\n const emit = useEmit();\n output = nextIsolateChild.output;\n emit('ISOLATE_RECONCILED', nextIsolateChild);\n }\n\n IsolateMutator.saveOutput(nextIsolateChild, output);\n\n if (!parent) {\n // We're exiting the node, and there is no parent. This means\n // that we're at the top level and this node should be set\n // as the new root of the history tree.\n VestRuntime.useSetHistoryRoot(nextIsolateChild);\n }\n\n return nextIsolateChild as TIsolate<Payload>;\n }\n\n static isIsolate(node: any): node is TIsolate {\n return isNotNullish(node) && node[IsolateKeys.Type];\n }\n}\n\n/**\n * Creates a new child isolate context where the local history node is the current history node, thus advancing the history cursor.\n * Runs the callback function and returns its output.\n * @param localHistoryNode The local history node.\n * @param current The current isolate.\n * @param callback The callback function to execute.\n * @returns The output of the callback function.\n */\nfunction useRunAsNew<Callback extends CB = CB>(\n localHistoryNode: Nullable<TIsolate>,\n current: TIsolate,\n callback: CB,\n): ReturnType<Callback> {\n const runtimeRoot = VestRuntime.useRuntimeRoot();\n\n // We're creating a new child isolate context where the local history node\n // is the current history node, thus advancing the history cursor.\n const output = VestRuntime.Run(\n {\n historyNode: localHistoryNode,\n runtimeNode: current,\n ...(!runtimeRoot && { runtimeRoot: current }),\n },\n () => useRunAsNewCallback(current, callback),\n );\n\n current.output = output;\n return output;\n}\n\nfunction useRunAsNewCallback(current: TIsolate, callback: CB): any {\n const emit = useEmit();\n emit('ISOLATE_ENTER', current);\n const output = callback(current);\n\n if (isPromise(output)) {\n emit('ISOLATE_PENDING', current);\n IsolateMutator.setPending(current);\n output.then(\n VestRuntime.persist(iso => {\n if (Isolate.isIsolate(iso)) {\n IsolateMutator.addChild(current, iso);\n }\n\n IsolateMutator.setDone(current);\n emit('ASYNC_ISOLATE_DONE', current);\n }),\n VestRuntime.persist(() => {\n IsolateMutator.setDone(current);\n emit('ASYNC_ISOLATE_DONE', current);\n }),\n );\n } else {\n IsolateMutator.setDone(current);\n }\n\n return output;\n}\n\nclass IsolateInstance implements TIsolate {\n [IsolateKeys.Type]: string;\n children: Nullable<TIsolate[]> = null;\n [IsolateKeys.Keys]: Nullable<Record<string, TIsolate>> = null;\n [IsolateKeys.Parent]: Nullable<TIsolate> = null;\n output: any = null;\n key: IsolateKey = null;\n [IsolateKeys.AllowReorder]: Maybe<boolean> = undefined;\n [IsolateKeys.Transient]: Maybe<boolean> = undefined;\n [IsolateKeys.Status]: IsolateStatus = IsolateStatus.INITIAL;\n [IsolateKeys.AbortController]: Nullable<AbortController> = null;\n [IsolateKeys.Data]: Maybe<any>;\n\n constructor(\n type: string,\n payload: Maybe<IsolatePayload> = undefined,\n key: IsolateKey = null,\n ) {\n this[IsolateKeys.Type] = type;\n this.key = key;\n const { allowReorder, transient, status, ...data } = payload ?? {};\n this[IsolateKeys.AllowReorder] = allowReorder;\n this[IsolateKeys.Transient] = transient;\n if (status) {\n this[IsolateKeys.Status] = status;\n }\n this[IsolateKeys.Data] = data;\n }\n}\n\nfunction baseIsolate(\n type: string,\n payload: Maybe<IsolatePayload> = undefined,\n key: IsolateKey = null,\n): TIsolate {\n return new IsolateInstance(type, payload, key);\n}\n","import {\n Nullable,\n hasOwnProperty,\n isNullish,\n isStringValue,\n isFailure,\n text,\n makeResult,\n Result,\n isUnsafeKey,\n} from 'vest-utils';\nimport { expandObject, minifyObject } from 'vest-utils/minifyObject';\n\nimport { TIsolate } from '../Isolate/Isolate';\nimport { ExcludedFromDump, IsolateKeys } from '../Isolate/IsolateKeys';\nimport { IsolateMutator } from '../Isolate/IsolateMutator';\nimport { ErrorStrings } from '../errors/ErrorStrings';\n\nexport class IsolateSerializer {\n static safeDeserialize(\n node: Record<string, any> | TIsolate | string,\n ): Result<TIsolate, Error> {\n try {\n const expanded = expandNode(node);\n if (isFailure(IsolateSerializer.validateIsolate(expanded))) {\n return makeResult.Err(\n new Error(ErrorStrings.INVALID_ISOLATE_CANNOT_PARSE),\n );\n }\n return makeResult.Ok(hydrateIsolate(expanded));\n } catch (error) {\n return makeResult.Err(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n\n static deserialize(node: Record<string, any> | TIsolate | string): TIsolate {\n const result = IsolateSerializer.safeDeserialize(node);\n return result.unwrap();\n }\n\n static serialize(\n isolate: Nullable<TIsolate>,\n replacer?: (value: any, key: string) => any,\n ): string {\n if (isNullish(isolate)) {\n return '';\n }\n\n const minified = minifyObject(isolate, (value: any, key: string) => {\n if (ExcludedFromDump.has(key as any)) {\n return undefined;\n }\n\n // Drop transient nodes — returning undefined causes\n // minifyObject to skip the entry entirely.\n // Transient nodes are not part of the persistent state\n // and should not be serialized.\n if (value?.transient) {\n return undefined;\n }\n\n if (replacer) {\n return replacer(value, key);\n }\n return value;\n });\n\n return JSON.stringify(minified);\n }\n\n static validateIsolate(\n node: Record<string, any> | TIsolate,\n ): Result<TIsolate, string> {\n return hasOwnProperty(node, IsolateKeys.Type)\n ? makeResult.Ok(node as TIsolate)\n : makeResult.Err(text(ErrorStrings.INVALID_ISOLATE_CANNOT_PARSE));\n }\n}\n\nfunction processChildren(current: TIsolate, queue: TIsolate[]): void {\n const children = current.children;\n\n if (!children) {\n return;\n }\n\n current.children = children.map(child => {\n const nextChild = { ...child };\n\n IsolateMutator.setParent(nextChild, current);\n queue.push(nextChild);\n\n if (nextChild.key) {\n current.keys = current.keys ?? {};\n current.keys[nextChild.key] = nextChild;\n }\n\n return nextChild;\n });\n}\n\nfunction hydrateIsolate(root: TIsolate): TIsolate {\n const queue = [root];\n\n while (queue.length) {\n const current = queue.shift();\n if (current) {\n processChildren(current, queue);\n }\n }\n\n return root;\n}\n\nfunction expandNode(node: Record<string, any> | TIsolate | string): TIsolate {\n const parsed = isStringValue(node)\n ? JSON.parse(node, safeReviver)\n : ({ ...node } as TIsolate);\n const root = Array.isArray(parsed) ? parsed : [parsed, {}];\n const expanded = expandObject(root[0], root[1]);\n return expanded as TIsolate;\n}\n\nfunction safeReviver(key: string, value: any): any {\n if (isUnsafeKey(key)) {\n return;\n }\n return value;\n}\n"],"mappings":"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"}
|