@rxova/journey-core 0.7.0 → 1.0.0-rc.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 (99) hide show
  1. package/README.md +236 -105
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.cjs.map +4 -4
  4. package/dist/index.d.cts +5 -4
  5. package/dist/index.d.ts +5 -4
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +4 -4
  8. package/dist/journey-builder/index.d.cts +5 -0
  9. package/dist/journey-builder/index.d.ts +5 -0
  10. package/dist/journey-builder/types.d.cts +126 -0
  11. package/dist/journey-builder/types.d.ts +126 -0
  12. package/dist/journey-machine/async-state.d.cts +12 -0
  13. package/dist/journey-machine/async-state.d.ts +12 -0
  14. package/dist/journey-machine/computed.d.cts +2 -0
  15. package/dist/journey-machine/computed.d.ts +2 -0
  16. package/dist/journey-machine/controls.d.cts +17 -0
  17. package/dist/journey-machine/controls.d.ts +17 -0
  18. package/dist/journey-machine/helpers.d.cts +52 -0
  19. package/dist/journey-machine/helpers.d.ts +52 -0
  20. package/dist/journey-machine/index.d.cts +3 -0
  21. package/dist/journey-machine/index.d.ts +3 -0
  22. package/dist/journey-machine/navigation.d.cts +32 -0
  23. package/dist/journey-machine/navigation.d.ts +32 -0
  24. package/dist/journey-machine/plugin-controller.d.cts +15 -0
  25. package/dist/journey-machine/plugin-controller.d.ts +15 -0
  26. package/dist/journey-machine/resolve-journey-definition.d.cts +2 -0
  27. package/dist/journey-machine/resolve-journey-definition.d.ts +2 -0
  28. package/dist/journey-machine/runtime.d.cts +33 -0
  29. package/dist/journey-machine/runtime.d.ts +33 -0
  30. package/dist/journey-machine/send.d.cts +9 -0
  31. package/dist/journey-machine/send.d.ts +9 -0
  32. package/dist/plugins/analytics/index.cjs +2 -0
  33. package/dist/plugins/analytics/index.cjs.map +7 -0
  34. package/dist/plugins/analytics/index.d.cts +25 -0
  35. package/dist/plugins/analytics/index.d.ts +25 -0
  36. package/dist/plugins/analytics/index.js +2 -0
  37. package/dist/plugins/analytics/index.js.map +7 -0
  38. package/dist/plugins/autosave/index.cjs +2 -0
  39. package/dist/plugins/autosave/index.cjs.map +7 -0
  40. package/dist/plugins/autosave/index.d.cts +17 -0
  41. package/dist/plugins/autosave/index.d.ts +17 -0
  42. package/dist/plugins/autosave/index.js +2 -0
  43. package/dist/plugins/autosave/index.js.map +7 -0
  44. package/dist/plugins/diagnostics/diagnostics.d.cts +3 -0
  45. package/dist/plugins/diagnostics/diagnostics.d.ts +3 -0
  46. package/dist/plugins/diagnostics/index.cjs +2 -0
  47. package/dist/plugins/diagnostics/index.cjs.map +7 -0
  48. package/dist/plugins/diagnostics/index.d.cts +15 -0
  49. package/dist/plugins/diagnostics/index.d.ts +15 -0
  50. package/dist/plugins/diagnostics/index.js +2 -0
  51. package/dist/plugins/diagnostics/index.js.map +7 -0
  52. package/dist/plugins/execution-paths/execution-paths.d.cts +6 -0
  53. package/dist/plugins/execution-paths/execution-paths.d.ts +6 -0
  54. package/dist/plugins/execution-paths/index.cjs +2 -0
  55. package/dist/plugins/execution-paths/index.cjs.map +7 -0
  56. package/dist/plugins/execution-paths/index.d.cts +18 -0
  57. package/dist/plugins/execution-paths/index.d.ts +18 -0
  58. package/dist/plugins/execution-paths/index.js +2 -0
  59. package/dist/plugins/execution-paths/index.js.map +7 -0
  60. package/dist/plugins/persistence/controller.d.cts +17 -0
  61. package/dist/plugins/persistence/controller.d.ts +17 -0
  62. package/dist/plugins/persistence/index.cjs +2 -0
  63. package/dist/plugins/persistence/index.cjs.map +7 -0
  64. package/dist/plugins/persistence/index.d.cts +12 -0
  65. package/dist/plugins/persistence/index.d.ts +12 -0
  66. package/dist/plugins/persistence/index.js +2 -0
  67. package/dist/plugins/persistence/index.js.map +7 -0
  68. package/dist/plugins/replay/index.cjs +2 -0
  69. package/dist/plugins/replay/index.cjs.map +7 -0
  70. package/dist/plugins/replay/index.d.cts +27 -0
  71. package/dist/plugins/replay/index.d.ts +27 -0
  72. package/dist/plugins/replay/index.js +2 -0
  73. package/dist/plugins/replay/index.js.map +7 -0
  74. package/dist/types/analytics.types.d.cts +33 -0
  75. package/dist/types/analytics.types.d.ts +33 -0
  76. package/dist/types/autosave.types.d.cts +23 -0
  77. package/dist/types/autosave.types.d.ts +23 -0
  78. package/dist/types/diagnostics.types.d.cts +38 -0
  79. package/dist/types/diagnostics.types.d.ts +38 -0
  80. package/dist/types/index.d.cts +9 -0
  81. package/dist/types/index.d.ts +9 -4
  82. package/dist/types/journey.types.d.cts +191 -0
  83. package/dist/types/journey.types.d.ts +140 -167
  84. package/dist/types/machine.types.d.cts +104 -0
  85. package/dist/types/machine.types.d.ts +104 -0
  86. package/dist/types/observation.types.d.cts +83 -0
  87. package/dist/types/observation.types.d.ts +83 -0
  88. package/dist/types/persistence.types.d.cts +34 -0
  89. package/dist/types/persistence.types.d.ts +13 -20
  90. package/dist/types/replay.types.d.cts +35 -0
  91. package/dist/types/replay.types.d.ts +35 -0
  92. package/dist/types/transitions.types.d.cts +122 -0
  93. package/dist/types/transitions.types.d.ts +100 -57
  94. package/package.json +92 -2
  95. package/dist/machine-helpers.d.ts +0 -23
  96. package/dist/machine.d.ts +0 -11
  97. package/dist/persistence.d.ts +0 -17
  98. package/dist/transitions.d.ts +0 -62
  99. package/dist/types.d.ts +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/types/journey.types.ts", "../src/machine-helpers.ts", "../src/persistence.ts", "../src/machine.ts", "../src/transitions.ts"],
4
- "sourcesContent": ["export { createJourneyMachine } from \"./machine\";\nexport { createPersistenceController } from \"./persistence\";\nexport { createTransitions, tx } from \"./transitions\";\nexport {\n JOURNEY_EVENT,\n JOURNEY_ASYNC_PHASE,\n JOURNEY_STATUS,\n JOURNEY_WILDCARD,\n type JourneyBuiltInEvent,\n type JourneyBuiltInFrom,\n type JourneyDefaultEventType,\n type JourneyAsyncPhase,\n type JourneyStatus,\n type JourneyAsyncState,\n type JourneyStepAsyncState,\n type JourneyEvent,\n type JourneyEventPayloadMap,\n type JourneyMachineEventType,\n type JourneyMachinePayloadMap,\n type JourneyDefinition,\n type JourneyMachineOptions,\n type JourneyGoToEvent,\n type JourneyGoToStepByIdEventType,\n type JourneyMachine,\n type JourneyObservationEvent,\n type JourneyPayloadFor,\n type JourneySendEvent,\n type JourneyPersistedSnapshot,\n type JourneyPersistedState,\n type JourneyPersistenceOptions,\n type JourneyStepDefinition,\n type JourneyStorage,\n type JourneySendResult,\n type JourneySnapshot,\n type JourneySelector,\n type JourneyEqualityFn,\n type JourneyTerminal,\n type JourneyTransition,\n type JourneyTransitionArgs,\n type JourneyTransitionTarget\n} from \"./types\";\n", "import type { JourneyPersistenceOptions } from \"./persistence.types\";\nimport type { JourneyTransition } from \"./transitions.types\";\n\n/** Terminal outcomes reached when a journey completes or is explicitly terminated. */\nexport type JourneyTerminal = \"COMPLETE\" | \"TERMINATED\";\n\n/** Runtime machine status constants. */\nexport const JOURNEY_STATUS = {\n RUNNING: \"running\",\n COMPLETE: \"complete\",\n TERMINATED: \"terminated\"\n} as const;\n\n/** Union of possible runtime machine statuses. */\nexport type JourneyStatus = (typeof JOURNEY_STATUS)[keyof typeof JOURNEY_STATUS];\n\n/** Wildcard step identifier used by transitions that match from any step. */\nexport const JOURNEY_WILDCARD = \"*\" as const;\n\n/** Built-in event constants that are part of core machine behavior. */\nexport const JOURNEY_EVENT = {\n GO_TO_STEP_BY_ID: \"goToStepById\"\n} as const;\n\n/** Machine event types that are always recognized by core. */\nexport type JourneyBuiltInEvent = (typeof JOURNEY_EVENT)[keyof typeof JOURNEY_EVENT];\n/** Event literal type for the built-in go-to-step command. */\nexport type JourneyGoToStepByIdEventType = typeof JOURNEY_EVENT.GO_TO_STEP_BY_ID;\n/** Wildcard origin marker for transitions. */\nexport type JourneyBuiltInFrom = typeof JOURNEY_WILDCARD;\n/** Default transition event names supported by machine convenience APIs. */\nexport type JourneyDefaultEventType =\n | \"goToNextStep\"\n | \"goToPreviousStep\"\n | \"terminateJourney\"\n | \"completeJourney\";\n\n/** Async lifecycle phases tracked per step while guards/effects run. */\nexport const JOURNEY_ASYNC_PHASE = {\n IDLE: \"idle\",\n EVALUATING_WHEN: \"evaluating-when\",\n RUNNING_EFFECT: \"running-effect\",\n ERROR: \"error\"\n} as const;\n\n/** Union of supported async lifecycle phases. */\nexport type JourneyAsyncPhase = (typeof JOURNEY_ASYNC_PHASE)[keyof typeof JOURNEY_ASYNC_PHASE];\n\n/** Async execution state for a single step. */\nexport type JourneyStepAsyncState = {\n phase: JourneyAsyncPhase;\n eventType: string | null;\n transitionId: string | null;\n error: unknown | null;\n};\n\n/** Aggregated async state for the machine, keyed by step id. */\nexport type JourneyAsyncState<TStepId extends string> = {\n isLoading: boolean;\n byStep: Record<TStepId, JourneyStepAsyncState>;\n};\n\n/** Minimal event shape used across runtime boundaries. */\nexport type JourneyBaseEvent = {\n type: string;\n payload?: unknown;\n};\n\n/** Optional event payload map by event type. */\nexport type JourneyEventPayloadMap<TEventType extends string> = Partial<\n Record<TEventType | JourneyBuiltInEvent, unknown>\n>;\n\n/** Resolves payload type for a specific event type from the provided payload map. */\nexport type JourneyPayloadFor<\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>,\n TEvent extends TEventType | JourneyBuiltInEvent\n> = TEvent extends keyof TPayloadMap ? TPayloadMap[TEvent] : unknown;\n\n/** Event-type union accepted by machine `.send()`, including built-in convenience events. */\nexport type JourneyMachineEventType<TEventType extends string> =\n | TEventType\n | JourneyDefaultEventType;\n\n/** Payload map available to machine `.send()`, including built-in convenience events. */\nexport type JourneyMachinePayloadMap<\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n> = TPayloadMap & JourneyEventPayloadMap<JourneyDefaultEventType>;\n\ntype JourneyPayloadForDefaultEvent<\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>,\n TDefaultEvent extends JourneyDefaultEventType\n> = JourneyPayloadFor<\n JourneyMachineEventType<TEventType>,\n JourneyMachinePayloadMap<TEventType, TPayloadMap>,\n TDefaultEvent\n>;\n\n/** Built-in direct-navigation event that targets a specific step id. */\nexport type JourneyGoToEvent<TStepId extends string, TPayload = unknown> = {\n type: JourneyGoToStepByIdEventType;\n stepId: TStepId;\n payload?: TPayload;\n};\n\n/** Event union available to transitions and guards for the declared event type set. */\nexport type JourneyEvent<\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>\n> =\n | JourneyGoToEvent<\n TStepId,\n JourneyPayloadFor<TEventType, TPayloadMap, JourneyGoToStepByIdEventType>\n >\n | {\n [TType in TEventType]: {\n type: TType;\n payload?: JourneyPayloadFor<TEventType, TPayloadMap, TType>;\n };\n }[TEventType];\n\ntype JourneyDefaultMachineEvent<\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n> = {\n [TType in JourneyDefaultEventType]: {\n type: TType;\n payload?: JourneyPayloadFor<\n JourneyMachineEventType<TEventType>,\n JourneyMachinePayloadMap<TEventType, TPayloadMap>,\n TType\n >;\n };\n}[JourneyDefaultEventType];\n\ntype JourneyCustomMachineEvent<\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n> = {\n [TType in TEventType]: {\n type: TType;\n payload?: JourneyPayloadFor<TEventType, TPayloadMap, TType>;\n };\n}[TEventType];\n\n/** Event union accepted by `JourneyMachine.send`. */\nexport type JourneySendEvent<\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>\n> =\n | JourneyGoToEvent<\n TStepId,\n JourneyPayloadFor<\n JourneyMachineEventType<TEventType>,\n JourneyMachinePayloadMap<TEventType, TPayloadMap>,\n JourneyGoToStepByIdEventType\n >\n >\n | JourneyDefaultMachineEvent<TEventType, TPayloadMap>\n | JourneyCustomMachineEvent<TEventType, TPayloadMap>;\n\n/**\n * Step definition with optional metadata and optional typed extension fields.\n * Use `TStepExtra` to explicitly model additional per-step properties.\n */\nexport type JourneyStepDefinition<\n TStepMeta = unknown,\n TStepExtra extends object = Record<never, never>\n> = {\n meta?: TStepMeta;\n} & TStepExtra;\n\n/** Serializable runtime snapshot of the journey state. */\nexport type JourneySnapshot<TContext, TStepId extends string, TStepMeta = unknown> = {\n currentStepId: TStepId;\n history: {\n timeline: readonly TStepId[];\n index: number;\n };\n context: TContext;\n visited: Record<TStepId, boolean>;\n stepMeta: Record<TStepId, TStepMeta>;\n status: JourneyStatus;\n async: JourneyAsyncState<TStepId>;\n};\n\n/** Selector function that derives a value from a machine snapshot. */\nexport type JourneySelector<\n TContext,\n TStepId extends string,\n TStepMeta = unknown,\n TSelected = unknown\n> = (snapshot: JourneySnapshot<TContext, TStepId, TStepMeta>) => TSelected;\n\n/** Equality function used to compare selected values between snapshot updates. */\nexport type JourneyEqualityFn<TValue> = (previous: TValue, next: TValue) => boolean;\n\n/** Full machine definition used to create a journey machine instance. */\nexport type JourneyDefinition<\n TContext,\n TStepId extends string = string,\n TEventType extends string = JourneyDefaultEventType,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>,\n TStepMeta = unknown,\n TStepExtra extends object = Record<never, never>\n> = {\n initial: TStepId;\n context: TContext;\n steps: Record<TStepId, JourneyStepDefinition<TStepMeta, TStepExtra>>;\n transitions: readonly JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>[];\n};\n\n/** Optional machine features (for example, persistence configuration). */\nexport type JourneyMachineOptions<TContext, TStepId extends string, TStepMeta = unknown> = {\n persistence?: JourneyPersistenceOptions<TContext, TStepId, TStepMeta>;\n completeOnNoNextStep?: boolean;\n};\n\n/** Result returned from send/navigation APIs. */\nexport type JourneySendResult<TContext, TStepId extends string, TStepMeta = unknown> = {\n transitioned: boolean;\n transitionId?: string;\n error?: unknown;\n snapshot: JourneySnapshot<TContext, TStepId, TStepMeta>;\n};\n\n/** Observation events emitted by the machine lifecycle/event stream. */\nexport type JourneyObservationEvent<\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>,\n TStepMeta = unknown\n> =\n | {\n type: \"journey.start\";\n stepId: TStepId;\n timestamp: number;\n }\n | {\n type: \"transition.start\";\n from: TStepId;\n event: JourneySendEvent<TStepId, TEventType, TPayloadMap>;\n timestamp: number;\n }\n | {\n type: \"transition.success\";\n from: TStepId;\n to: TStepId | JourneyTerminal;\n eventType: string;\n transitionId: string | null;\n timestamp: number;\n }\n | {\n type: \"transition.error\";\n from: TStepId;\n eventType: string;\n transitionId: string | null;\n error: unknown;\n timestamp: number;\n }\n | {\n type: \"step.exit\";\n stepId: TStepId;\n timestamp: number;\n }\n | {\n type: \"step.enter\";\n stepId: TStepId;\n timestamp: number;\n }\n | {\n type: \"journey.complete\";\n stepId: TStepId;\n timestamp: number;\n }\n | {\n type: \"journey.close\";\n stepId: TStepId;\n timestamp: number;\n }\n | {\n type: \"navigation.previous\";\n from: TStepId;\n to: TStepId;\n requestedSteps: number;\n appliedSteps: number;\n timestamp: number;\n }\n | {\n type: \"navigation.lastVisited\";\n from: TStepId;\n to: TStepId;\n timestamp: number;\n }\n | {\n type: \"metadata.updated\";\n stepId: TStepId;\n previous: TStepMeta;\n next: TStepMeta;\n timestamp: number;\n };\n\n/** Runtime machine API for reading snapshots, sending events, and controlling flow. */\nexport type JourneyMachine<\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>,\n TStepMeta = unknown\n> = {\n getSnapshot: () => JourneySnapshot<TContext, TStepId, TStepMeta>;\n send: (\n event: JourneySendEvent<TStepId, TEventType, TPayloadMap>\n ) => Promise<JourneySendResult<TContext, TStepId, TStepMeta>>;\n goToNextStep: () => Promise<JourneySendResult<TContext, TStepId, TStepMeta>>;\n terminateJourney: (\n payload?: JourneyPayloadForDefaultEvent<TEventType, TPayloadMap, \"terminateJourney\">\n ) => Promise<JourneySendResult<TContext, TStepId, TStepMeta>>;\n completeJourney: (\n payload?: JourneyPayloadForDefaultEvent<TEventType, TPayloadMap, \"completeJourney\">\n ) => Promise<JourneySendResult<TContext, TStepId, TStepMeta>>;\n goToPreviousStep: (steps?: number) => Promise<JourneySendResult<TContext, TStepId, TStepMeta>>;\n goToLastVisitedStep: () => Promise<JourneySendResult<TContext, TStepId, TStepMeta>>;\n updateContext: (\n updater: (context: TContext) => TContext\n ) => JourneySnapshot<TContext, TStepId, TStepMeta>;\n updateStepMetadata: (\n stepId: TStepId,\n updater: (metadata: TStepMeta) => TStepMeta\n ) => JourneySnapshot<TContext, TStepId, TStepMeta>;\n clearStepError: (stepId?: TStepId) => JourneySnapshot<TContext, TStepId, TStepMeta>;\n resetMachine: () => JourneySnapshot<TContext, TStepId, TStepMeta>;\n dispose: () => void;\n subscribe: (listener: () => void) => () => void;\n subscribeSelector: <TSelected>(\n selector: JourneySelector<TContext, TStepId, TStepMeta, TSelected>,\n listener: (next: TSelected, previous: TSelected) => void,\n equalityFn?: JourneyEqualityFn<TSelected>\n ) => () => void;\n subscribeEvent: (\n listener: (event: JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta>) => void\n ) => () => void;\n subscribeStart: (\n listener: (\n event: Extract<\n JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta>,\n { type: \"journey.start\" }\n >\n ) => void\n ) => () => void;\n subscribeComplete: (\n listener: (\n event: Extract<\n JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta>,\n { type: \"journey.complete\" }\n >\n ) => void\n ) => () => void;\n subscribeTerminate: (\n listener: (\n event: Extract<\n JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta>,\n { type: \"journey.close\" }\n >\n ) => void\n ) => () => void;\n};\n", "import { JOURNEY_ASYNC_PHASE, JOURNEY_EVENT, JOURNEY_WILDCARD } from \"./types\";\nimport type {\n JourneyAsyncState,\n JourneyEvent,\n JourneyEventPayloadMap,\n JourneyGoToEvent,\n JourneyGoToStepByIdEventType,\n JourneyMachineEventType,\n JourneyMachinePayloadMap,\n JourneyPayloadFor,\n JourneySendEvent,\n JourneySendResult,\n JourneySnapshot,\n JourneyStatus,\n JourneyStepAsyncState,\n JourneyTerminal,\n JourneyTransitionArgs,\n JourneyTransition\n} from \"./types\";\n\nexport const assertStepExists = <TStepId extends string>(\n steps: Record<TStepId, unknown>,\n stepId: TStepId,\n message: string\n) => {\n if (!(stepId in steps)) {\n throw new Error(message);\n }\n};\n\nexport const normalizeStepCount = (steps?: number): number => {\n if (typeof steps !== \"number\" || !Number.isFinite(steps)) {\n return 1;\n }\n return Math.max(1, Math.trunc(steps));\n};\n\nexport const now = (): number => Date.now();\n\nconst unique = <T>(items: readonly T[]): T[] => [...new Set(items)];\n\nconst normalizeVisited = <TStepId extends string>(\n visited: Record<TStepId, boolean>,\n stepIds: readonly TStepId[]\n): Record<TStepId, boolean> =>\n Object.fromEntries(stepIds.map((stepId) => [stepId, visited[stepId] === true])) as Record<\n TStepId,\n boolean\n >;\n\nexport const buildVisitedFromTimeline = <TStepId extends string>(\n timeline: readonly TStepId[],\n stepIds?: readonly TStepId[]\n): Record<TStepId, boolean> => {\n const resolvedStepIds = stepIds ?? unique(timeline);\n const visited = Object.fromEntries(resolvedStepIds.map((stepId) => [stepId, false])) as Record<\n TStepId,\n boolean\n >;\n\n for (const stepId of timeline) {\n visited[stepId] = true;\n }\n\n return visited;\n};\n\nexport const appendVisited = <TStepId extends string>(\n visited: Record<TStepId, boolean>,\n current: TStepId\n): Record<TStepId, boolean> => ({\n ...visited,\n [current]: true\n});\n\nexport const isPromiseLike = <T>(value: T | PromiseLike<T>): value is PromiseLike<T> =>\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then: unknown }).then === \"function\";\n\nexport const buildIdleStepAsyncState = (): JourneyStepAsyncState => ({\n phase: JOURNEY_ASYNC_PHASE.IDLE,\n eventType: null,\n transitionId: null,\n error: null\n});\n\nexport const buildInitialAsyncState = <TStepId extends string>(\n steps: Record<TStepId, unknown>\n): JourneyAsyncState<TStepId> => {\n const byStep = Object.fromEntries(\n Object.keys(steps).map((stepId) => [stepId, buildIdleStepAsyncState()])\n ) as Record<TStepId, JourneyStepAsyncState>;\n\n return {\n isLoading: false,\n byStep\n };\n};\n\nexport const isGoToStepByIdEvent = <\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n>(\n event: JourneySendEvent<TStepId, TEventType, TPayloadMap>\n): event is JourneyGoToEvent<\n TStepId,\n JourneyPayloadFor<\n JourneyMachineEventType<TEventType>,\n JourneyMachinePayloadMap<TEventType, TPayloadMap>,\n JourneyGoToStepByIdEventType\n >\n> => event.type === JOURNEY_EVENT.GO_TO_STEP_BY_ID && \"stepId\" in event;\n\nexport const isTerminalTarget = <TStepId extends string>(\n target: TStepId | JourneyTerminal\n): target is JourneyTerminal => target === \"COMPLETE\" || target === \"TERMINATED\";\n\nexport const validateJourneyTransitions = <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n>(\n transitions: readonly JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>[],\n steps: Record<TStepId, unknown>\n) => {\n const stepRegistry = steps as Record<string, unknown>;\n\n for (const [index, transition] of transitions.entries()) {\n if (!transition || typeof transition !== \"object\") {\n throw new Error(`Journey transition at index ${index} must be an object.`);\n }\n\n if (typeof transition.from !== \"string\" || typeof transition.event !== \"string\") {\n throw new Error(\n `Journey transition at index ${index} must define string \"from\" and \"event\".`\n );\n }\n\n if (transition.from !== JOURNEY_WILDCARD && !(transition.from in stepRegistry)) {\n throw new Error(\n `Journey transition at index ${index} references unknown from step \"${transition.from}\".`\n );\n }\n\n if (transition.event === \"completeJourney\" || transition.event === \"terminateJourney\") {\n if (\"to\" in transition && transition.to !== undefined) {\n throw new Error(\n `Journey transition at index ${index} with event \"${transition.event}\" cannot define \"to\".`\n );\n }\n continue;\n }\n\n if (typeof transition.to !== \"string\") {\n throw new Error(\n `Journey transition at index ${index} with event \"${transition.event}\" must define string \"to\".`\n );\n }\n\n if (!isTerminalTarget(transition.to) && !(transition.to in stepRegistry)) {\n throw new Error(\n `Journey transition at index ${index} points to unknown step \"${transition.to}\".`\n );\n }\n }\n};\n\nexport const buildSendResult = <TContext, TStepId extends string, TStepMeta>(\n snapshot: JourneySnapshot<TContext, TStepId, TStepMeta>,\n transitioned: boolean,\n options: {\n transitionId?: string;\n error?: unknown;\n } = {}\n): JourneySendResult<TContext, TStepId, TStepMeta> => ({\n transitioned,\n ...(options.transitionId !== undefined ? { transitionId: options.transitionId } : {}),\n ...(\"error\" in options ? { error: options.error } : {}),\n snapshot\n});\n\nexport const buildSnapshot = <TContext, TStepId extends string, TStepMeta>(\n timeline: readonly TStepId[],\n index: number,\n context: TContext,\n status: JourneyStatus,\n asyncState: JourneyAsyncState<TStepId>,\n stepMeta: Record<TStepId, TStepMeta>,\n visited?: Record<TStepId, boolean>\n): JourneySnapshot<TContext, TStepId, TStepMeta> => {\n if (timeline.length === 0) {\n throw new Error(\"Journey timeline cannot be empty.\");\n }\n const safeIndex = Math.max(0, Math.min(Math.trunc(index), timeline.length - 1));\n const currentStepId = timeline[safeIndex] as TStepId;\n const stepIds = Object.keys(stepMeta) as TStepId[];\n return {\n status,\n currentStepId,\n history: {\n timeline: [...timeline],\n index: safeIndex\n },\n context,\n visited: visited\n ? normalizeVisited(visited, stepIds)\n : buildVisitedFromTimeline(timeline, stepIds),\n stepMeta: { ...stepMeta },\n async: asyncState\n };\n};\n\nexport const selectTransition = async <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>,\n TStepMeta\n>(\n transitions: readonly JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>[],\n snapshot: JourneySnapshot<TContext, TStepId, TStepMeta>,\n event: JourneyEvent<TStepId, TEventType, TPayloadMap>,\n hooks?: {\n onAsyncGuardStart?: (\n transition: JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>\n ) => void;\n onAsyncGuardSuccess?: (\n transition: JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>\n ) => void;\n onAsyncGuardError?: (\n transition: JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>,\n error: unknown\n ) => void;\n }\n): Promise<JourneyTransition<TContext, TStepId, TEventType, TPayloadMap> | null> => {\n for (const transition of transitions) {\n const fromMatches =\n transition.from === JOURNEY_WILDCARD || transition.from === snapshot.currentStepId;\n const eventMatches = transition.event === event.type;\n\n if (!fromMatches || !eventMatches) {\n continue;\n }\n\n if (!transition.when) {\n return transition;\n }\n\n const guardResult = (\n transition.when as (\n args: JourneyTransitionArgs<TContext, TStepId, TEventType, TPayloadMap>\n ) => boolean | Promise<boolean>\n )({\n context: snapshot.context,\n from: snapshot.currentStepId,\n timeline: snapshot.history.timeline,\n index: snapshot.history.index,\n event\n });\n const asyncGuard = isPromiseLike(guardResult);\n if (asyncGuard) {\n hooks?.onAsyncGuardStart?.(transition);\n }\n\n let allowed: boolean;\n try {\n allowed = await guardResult;\n } catch (error) {\n if (asyncGuard) {\n hooks?.onAsyncGuardError?.(transition, error);\n }\n throw error;\n }\n\n if (asyncGuard) {\n hooks?.onAsyncGuardSuccess?.(transition);\n }\n\n if (allowed) {\n return transition;\n }\n }\n\n return null;\n};\n\nexport const transitionSnapshot = <TContext, TStepId extends string, TStepMeta>(\n snapshot: JourneySnapshot<TContext, TStepId, TStepMeta>,\n nextCurrent: TStepId,\n nextContext: TContext\n): JourneySnapshot<TContext, TStepId, TStepMeta> => {\n const baseTimeline = snapshot.history.timeline.slice(0, snapshot.history.index + 1);\n let nextTimeline = baseTimeline;\n if (nextCurrent !== snapshot.currentStepId) {\n nextTimeline = [...baseTimeline, nextCurrent];\n }\n\n const nextIndex = nextTimeline.length - 1;\n const visited = appendVisited(snapshot.visited, nextCurrent);\n\n return buildSnapshot(\n nextTimeline,\n nextIndex,\n nextContext,\n snapshot.status,\n snapshot.async,\n snapshot.stepMeta,\n visited\n );\n};\n", "import { JOURNEY_STATUS } from \"./types/journey.types\";\nimport type {\n JourneyPersistedSnapshot,\n JourneyPersistedState,\n JourneyStorage,\n ResolvedPersistence\n} from \"./types/persistence.types\";\nimport type { JourneyMachineOptions, JourneySnapshot, JourneyStatus } from \"./types/journey.types\";\nimport { buildInitialAsyncState, buildSnapshot, buildVisitedFromTimeline } from \"./machine-helpers\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isStatusValue = (value: unknown): value is JourneyStatus =>\n value === JOURNEY_STATUS.RUNNING ||\n value === JOURNEY_STATUS.COMPLETE ||\n value === JOURNEY_STATUS.TERMINATED;\n\nconst resolveDefaultStorage = (): JourneyStorage | null => {\n const localStorageCandidate = (globalThis as { localStorage?: Partial<JourneyStorage> })\n .localStorage;\n\n if (\n !localStorageCandidate ||\n typeof localStorageCandidate.getItem !== \"function\" ||\n typeof localStorageCandidate.setItem !== \"function\" ||\n typeof localStorageCandidate.removeItem !== \"function\"\n ) {\n return null;\n }\n\n return localStorageCandidate as JourneyStorage;\n};\n\nconst resolvePersistence = <TContext, TStepId extends string, TStepMeta>(\n options?: JourneyMachineOptions<TContext, TStepId, TStepMeta>[\"persistence\"]\n): ResolvedPersistence<TContext, TStepId, TStepMeta> | null => {\n if (!options) {\n return null;\n }\n\n let storage: JourneyStorage | null | undefined = options.storage;\n if (storage == null) {\n try {\n storage = resolveDefaultStorage();\n } catch (error) {\n options.onError?.(error);\n return null;\n }\n }\n\n if (!storage) {\n return null;\n }\n\n return {\n key: options.key,\n storage,\n version: options.version ?? 1,\n clearOnReset: options.clearOnReset ?? true,\n serialize: options.serialize ?? JSON.stringify,\n deserialize: options.deserialize ?? JSON.parse,\n ...(options.migrate ? { migrate: options.migrate } : {}),\n ...(options.onError ? { onError: options.onError } : {})\n };\n};\n\nconst resolveVisitedFromPersistence = <TStepId extends string>(\n visitedSource: unknown,\n timeline: readonly TStepId[],\n stepIds: readonly TStepId[]\n): {\n visited: Record<TStepId, boolean>;\n needsRewrite: boolean;\n} => {\n const visitedFromTimeline = buildVisitedFromTimeline(timeline, stepIds);\n\n if (isRecord(visitedSource)) {\n let needsRewrite = false;\n const visited = { ...visitedFromTimeline };\n\n for (const stepId of stepIds) {\n const persistedValue = visitedSource[stepId];\n\n if (persistedValue === true) {\n visited[stepId] = true;\n continue;\n }\n\n if (persistedValue === false) {\n if (visitedFromTimeline[stepId]) {\n needsRewrite = true;\n }\n continue;\n }\n\n needsRewrite = true;\n }\n\n return { visited, needsRewrite };\n }\n\n if (Array.isArray(visitedSource)) {\n const visitedFromArray = buildVisitedFromTimeline(\n visitedSource.filter(\n (step): step is TStepId => typeof step === \"string\" && stepIds.includes(step as TStepId)\n ) as TStepId[],\n stepIds\n );\n const visited = Object.fromEntries(\n stepIds.map((stepId) => [stepId, visitedFromTimeline[stepId] || visitedFromArray[stepId]])\n ) as Record<TStepId, boolean>;\n\n return { visited, needsRewrite: true };\n }\n\n return { visited: visitedFromTimeline, needsRewrite: true };\n};\n\nconst coercePersistedSnapshot = <TContext, TStepId extends string, TStepMeta>(\n value: unknown,\n steps: Record<TStepId, unknown>,\n fallbackContext: TContext,\n fallbackStepMeta: Record<TStepId, TStepMeta>\n): {\n snapshot: JourneyPersistedSnapshot<TContext, TStepId, TStepMeta>;\n needsRewrite: boolean;\n} | null => {\n if (!isRecord(value)) {\n return null;\n }\n\n let needsRewrite = false;\n\n const rawHistory = isRecord(value.history) ? value.history : null;\n if (!rawHistory) {\n needsRewrite = true;\n }\n\n const rawTimeline = rawHistory?.timeline ?? value.timeline;\n const timeline = Array.isArray(rawTimeline)\n ? (rawTimeline.filter(\n (step): step is TStepId => typeof step === \"string\" && step in steps\n ) as TStepId[])\n : [];\n\n const currentStepIdValue =\n typeof value.currentStepId === \"string\" && value.currentStepId in steps\n ? (value.currentStepId as TStepId)\n : typeof value.current === \"string\" && value.current in steps\n ? (value.current as TStepId)\n : null;\n\n if (timeline.length === 0) {\n if (!currentStepIdValue) {\n return null;\n }\n timeline.push(currentStepIdValue);\n needsRewrite = true;\n }\n\n let index = timeline.length - 1;\n const rawIndex = rawHistory?.index ?? value.index;\n if (typeof rawIndex === \"number\" && Number.isFinite(rawIndex)) {\n index = Math.max(0, Math.min(Math.trunc(rawIndex), timeline.length - 1));\n if (index !== rawIndex) {\n needsRewrite = true;\n }\n } else if (currentStepIdValue) {\n const inferredIndex = timeline.lastIndexOf(currentStepIdValue);\n if (inferredIndex >= 0) {\n index = inferredIndex;\n needsRewrite = true;\n }\n }\n\n const status = isStatusValue(value.status) ? value.status : JOURNEY_STATUS.RUNNING;\n if (!isStatusValue(value.status)) {\n needsRewrite = true;\n }\n\n const stepIds = Object.keys(steps) as TStepId[];\n const { visited, needsRewrite: visitedNeedsRewrite } = resolveVisitedFromPersistence(\n value.visited,\n timeline,\n stepIds\n );\n if (visitedNeedsRewrite) {\n needsRewrite = true;\n }\n\n const rawStepMeta = isRecord(value.stepMeta) ? value.stepMeta : null;\n if (!rawStepMeta) {\n needsRewrite = true;\n }\n\n const stepMeta = Object.fromEntries(\n Object.keys(steps).map((stepId) => {\n const typedStepId = stepId as TStepId;\n const rawValue = rawStepMeta ? rawStepMeta[stepId] : undefined;\n if (rawValue === undefined) {\n return [typedStepId, fallbackStepMeta[typedStepId]];\n }\n return [typedStepId, rawValue as TStepMeta];\n })\n ) as Record<TStepId, TStepMeta>;\n\n return {\n snapshot: {\n currentStepId: timeline[index] as TStepId,\n history: {\n timeline,\n index\n },\n context: (\"context\" in value ? value.context : fallbackContext) as TContext,\n status,\n visited,\n stepMeta\n },\n needsRewrite\n };\n};\n\n/**\n * Creates a persistence controller for snapshots, including hydration,\n * serialization, and storage error handling.\n */\nexport const createPersistenceController = <TContext, TStepId extends string, TStepMeta>(args: {\n initial: TStepId;\n context: TContext;\n stepMeta: Record<TStepId, TStepMeta>;\n steps: Record<TStepId, unknown>;\n options?: JourneyMachineOptions<TContext, TStepId, TStepMeta>;\n}) => {\n const { initial, context, stepMeta, steps, options } = args;\n const persistence = resolvePersistence(options?.persistence);\n\n const reportPersistenceError = (error: unknown) => {\n persistence?.onError?.(error);\n };\n\n const persistSnapshot = (snapshot: JourneySnapshot<TContext, TStepId, TStepMeta>) => {\n if (!persistence) {\n return;\n }\n\n try {\n const persistedState: JourneyPersistedState<TContext, TStepId, TStepMeta> = {\n version: persistence.version,\n snapshot: {\n currentStepId: snapshot.currentStepId,\n history: {\n timeline: [...snapshot.history.timeline],\n index: snapshot.history.index\n },\n context: snapshot.context,\n status: snapshot.status,\n visited: { ...snapshot.visited },\n stepMeta: { ...snapshot.stepMeta }\n }\n };\n persistence.storage.setItem(persistence.key, persistence.serialize(persistedState));\n } catch (error) {\n reportPersistenceError(error);\n }\n };\n\n const removePersistedSnapshot = () => {\n if (!persistence) {\n return;\n }\n\n try {\n persistence.storage.removeItem(persistence.key);\n } catch (error) {\n reportPersistenceError(error);\n }\n };\n\n const hydrateSnapshot = (): JourneySnapshot<TContext, TStepId, TStepMeta> => {\n const initialSnapshot = buildSnapshot(\n [initial],\n 0,\n context,\n JOURNEY_STATUS.RUNNING,\n buildInitialAsyncState(steps),\n stepMeta\n );\n if (!persistence) {\n return initialSnapshot;\n }\n\n try {\n const rawPersisted = persistence.storage.getItem(persistence.key);\n if (!rawPersisted) {\n return initialSnapshot;\n }\n\n const parsed = persistence.deserialize(rawPersisted);\n if (!isRecord(parsed)) {\n return initialSnapshot;\n }\n\n const persistedVersion = parsed.version;\n if (typeof persistedVersion !== \"number\") {\n return initialSnapshot;\n }\n\n let persistedSnapshot: JourneyPersistedSnapshot<TContext, TStepId, TStepMeta> | null = null;\n let shouldRewritePersisted = false;\n\n if (persistedVersion === persistence.version) {\n const coerced = coercePersistedSnapshot(parsed.snapshot, steps, context, stepMeta);\n persistedSnapshot = coerced?.snapshot ?? null;\n shouldRewritePersisted = Boolean(coerced?.needsRewrite);\n } else if (persistence.migrate) {\n const migrated = persistence.migrate(parsed.snapshot, persistedVersion);\n const coerced = coercePersistedSnapshot(migrated, steps, context, stepMeta);\n persistedSnapshot = coerced?.snapshot ?? null;\n shouldRewritePersisted = persistedSnapshot !== null;\n }\n\n if (!persistedSnapshot) {\n return initialSnapshot;\n }\n\n const hydratedSnapshot = buildSnapshot(\n persistedSnapshot.history.timeline,\n persistedSnapshot.history.index,\n persistedSnapshot.context,\n persistedSnapshot.status,\n buildInitialAsyncState(steps),\n persistedSnapshot.stepMeta,\n persistedSnapshot.visited\n );\n\n if (shouldRewritePersisted) {\n persistSnapshot(hydratedSnapshot);\n }\n\n return hydratedSnapshot;\n } catch (error) {\n reportPersistenceError(error);\n return initialSnapshot;\n }\n };\n\n return {\n clearOnReset: persistence?.clearOnReset ?? true,\n hydrateSnapshot,\n persistSnapshot,\n removePersistedSnapshot\n };\n};\n", "import { JOURNEY_ASYNC_PHASE, JOURNEY_EVENT, JOURNEY_STATUS } from \"./types\";\nimport type {\n JourneyEqualityFn,\n JourneyAsyncState,\n JourneyAsyncPhase,\n JourneyDefaultEventType,\n JourneyDefinition,\n JourneyEvent,\n JourneyEventPayloadMap,\n JourneyMachine,\n JourneyMachineOptions,\n JourneyObservationEvent,\n JourneySelector,\n JourneySendEvent,\n JourneySendResult,\n JourneyStepDefinition,\n JourneyTransitionArgs,\n JourneyTransition,\n JourneyTerminal\n} from \"./types\";\nimport {\n assertStepExists,\n buildIdleStepAsyncState,\n buildInitialAsyncState,\n buildSendResult,\n buildSnapshot,\n isGoToStepByIdEvent,\n isPromiseLike,\n isTerminalTarget,\n normalizeStepCount,\n now,\n selectTransition,\n transitionSnapshot,\n validateJourneyTransitions\n} from \"./machine-helpers\";\nimport { createPersistenceController } from \"./persistence\";\n\n/**\n * Creates a journey machine from a journey definition.\n * Validates steps/transitions, hydrates persisted state (if configured),\n * and returns an API for sending events and reading snapshots.\n */\nexport function createJourneyMachine<\n TContext,\n TStepMeta = unknown,\n TSteps extends Record<string, JourneyStepDefinition<TStepMeta>> = Record<\n string,\n JourneyStepDefinition<TStepMeta>\n >,\n TPayloadMap extends JourneyEventPayloadMap<JourneyDefaultEventType> = Record<never, never>\n>(\n journey: JourneyDefinition<\n TContext,\n Extract<keyof TSteps, string>,\n JourneyDefaultEventType,\n TPayloadMap,\n TStepMeta\n > & {\n steps: TSteps;\n transitions: readonly JourneyTransition<\n TContext,\n Extract<keyof TSteps, string>,\n JourneyDefaultEventType,\n TPayloadMap\n >[];\n },\n options?: JourneyMachineOptions<TContext, Extract<keyof TSteps, string>, TStepMeta>\n): JourneyMachine<\n TContext,\n Extract<keyof TSteps, string>,\n JourneyDefaultEventType,\n TPayloadMap,\n TStepMeta\n>;\n// eslint-disable-next-line no-redeclare\nexport function createJourneyMachine<\n TContext,\n TStepId extends string,\n TEventType extends string = JourneyDefaultEventType,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>,\n TStepMeta = unknown\n>(\n journey: JourneyDefinition<TContext, TStepId, TEventType, TPayloadMap, TStepMeta>,\n options?: JourneyMachineOptions<TContext, TStepId, TStepMeta>\n): JourneyMachine<TContext, TStepId, TEventType, TPayloadMap, TStepMeta>;\n// eslint-disable-next-line no-redeclare\nexport function createJourneyMachine<\n TContext,\n TStepId extends string,\n TEventType extends string = JourneyDefaultEventType,\n TPayloadMap extends JourneyEventPayloadMap<TEventType> = Record<never, never>,\n TStepMeta = unknown\n>(\n journey: JourneyDefinition<TContext, TStepId, TEventType, TPayloadMap, TStepMeta>,\n options?: JourneyMachineOptions<TContext, TStepId, TStepMeta>\n): JourneyMachine<TContext, TStepId, TEventType, TPayloadMap, TStepMeta> {\n if (!journey.steps || typeof journey.steps !== \"object\") {\n throw new Error(\"Journey steps must be a record object.\");\n }\n\n if (!Array.isArray(journey.transitions)) {\n throw new Error(\"Journey transitions must be an array.\");\n }\n\n for (const stepId of Object.keys(journey.steps)) {\n if (stepId === \"*\") {\n throw new Error('Step id \"*\" is reserved as a wildcard and cannot be used as a step name.');\n }\n }\n\n assertStepExists(\n journey.steps,\n journey.initial,\n `Journey initial step \"${journey.initial}\" does not exist in steps registry.`\n );\n\n validateJourneyTransitions(journey.transitions, journey.steps);\n\n const buildStepMeta = (): Record<TStepId, TStepMeta> => {\n const stepMeta = {} as Record<TStepId, TStepMeta>;\n for (const stepId of Object.keys(journey.steps) as TStepId[]) {\n stepMeta[stepId] = journey.steps[stepId].meta as TStepMeta;\n }\n return stepMeta;\n };\n\n const { clearOnReset, hydrateSnapshot, persistSnapshot, removePersistedSnapshot } =\n createPersistenceController({\n initial: journey.initial,\n context: journey.context,\n stepMeta: buildStepMeta(),\n steps: journey.steps,\n ...(options ? { options } : {})\n });\n\n let snapshot = hydrateSnapshot();\n snapshot = {\n ...snapshot,\n async: buildInitialAsyncState(journey.steps)\n };\n const completeOnNoNextStep = options?.completeOnNoNextStep ?? true;\n const startupEvent: JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta> = {\n type: \"journey.start\",\n stepId: snapshot.currentStepId,\n timestamp: now()\n };\n\n const listeners = new Set<() => void>();\n const eventListeners = new Set<\n (event: JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta>) => void\n >();\n let actionQueue: Promise<void> = Promise.resolve();\n let lifecycleVersion = 0;\n let isDisposed = false;\n\n const isRunActive = (runVersion: number): boolean =>\n !isDisposed && runVersion === lifecycleVersion;\n\n const cancelInFlight = () => {\n lifecycleVersion += 1;\n actionQueue = Promise.resolve();\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n const emit = (event: JourneyObservationEvent<TStepId, TEventType, TPayloadMap, TStepMeta>) => {\n for (const listener of eventListeners) {\n listener(event);\n }\n };\n\n const queue = <T>(\n runner: (runVersion: number) => Promise<T>,\n onCanceled: () => T\n ): Promise<T> => {\n const runVersion = lifecycleVersion;\n const createQueuedRunner = async () => {\n if (!isRunActive(runVersion)) {\n return onCanceled();\n }\n return runner(runVersion);\n };\n\n const settleQueue = (resultPromise: Promise<T>) => {\n actionQueue = resultPromise.then(\n () => undefined,\n () => undefined\n );\n };\n\n const resultPromise = actionQueue.then(createQueuedRunner, createQueuedRunner);\n settleQueue(resultPromise);\n return resultPromise;\n };\n\n const isAsyncLoadingPhase = (phase: JourneyAsyncPhase): boolean =>\n phase === JOURNEY_ASYNC_PHASE.EVALUATING_WHEN || phase === JOURNEY_ASYNC_PHASE.RUNNING_EFFECT;\n\n const updateStepAsync = (\n stepId: TStepId,\n updater: (\n current: JourneyAsyncState<TStepId>[\"byStep\"][TStepId]\n ) => JourneyAsyncState<TStepId>[\"byStep\"][TStepId],\n runVersion?: number\n ) => {\n if (runVersion !== undefined && !isRunActive(runVersion)) {\n return;\n }\n\n const current = snapshot.async.byStep[stepId] ?? buildIdleStepAsyncState();\n const next = updater(current);\n if (\n current.phase === next.phase &&\n current.eventType === next.eventType &&\n current.transitionId === next.transitionId &&\n current.error === next.error\n ) {\n return;\n }\n\n const nextByStep = {\n ...snapshot.async.byStep,\n [stepId]: next\n };\n const isLoading = Object.values(nextByStep).some((state) => isAsyncLoadingPhase(state.phase));\n snapshot = {\n ...snapshot,\n async: {\n isLoading,\n byStep: nextByStep\n }\n };\n notify();\n };\n\n const setStepLoading = (\n stepId: TStepId,\n phase: JourneyAsyncPhase,\n eventType: string,\n transitionId?: string,\n runVersion?: number\n ) => {\n updateStepAsync(\n stepId,\n () => ({\n phase,\n eventType,\n transitionId: transitionId ?? null,\n error: null\n }),\n runVersion\n );\n };\n\n const setStepIdle = (stepId: TStepId, runVersion?: number) => {\n updateStepAsync(stepId, () => buildIdleStepAsyncState(), runVersion);\n };\n\n const setStepError = (\n stepId: TStepId,\n eventType: string,\n error: unknown,\n transitionId?: string,\n runVersion?: number\n ) => {\n updateStepAsync(\n stepId,\n () => ({\n phase: JOURNEY_ASYNC_PHASE.ERROR,\n eventType,\n transitionId: transitionId ?? null,\n error\n }),\n runVersion\n );\n };\n\n const applyPreviousNavigation = (\n requestedSteps?: number,\n transitionId?: string\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n if (snapshot.status !== JOURNEY_STATUS.RUNNING) {\n return buildSendResult(snapshot, false);\n }\n\n const steps = normalizeStepCount(requestedSteps);\n if (snapshot.history.index === 0) {\n return buildSendResult(snapshot, false);\n }\n\n const from = snapshot.currentStepId;\n const nextIndex = Math.max(0, snapshot.history.index - steps);\n const appliedSteps = snapshot.history.index - nextIndex;\n if (appliedSteps <= 0) {\n return buildSendResult(snapshot, false);\n }\n\n emit({ type: \"step.exit\", stepId: from, timestamp: now() });\n snapshot = buildSnapshot(\n snapshot.history.timeline,\n nextIndex,\n snapshot.context,\n snapshot.status,\n snapshot.async,\n snapshot.stepMeta,\n snapshot.visited\n );\n persistSnapshot(snapshot);\n notify();\n\n emit({\n type: \"navigation.previous\",\n from,\n to: snapshot.currentStepId,\n requestedSteps: steps,\n appliedSteps,\n timestamp: now()\n });\n emit({ type: \"step.enter\", stepId: snapshot.currentStepId, timestamp: now() });\n return buildSendResult(snapshot, true, {\n ...(transitionId !== undefined ? { transitionId } : {})\n });\n };\n\n const applyLastVisitedNavigation = (\n transitionId?: string\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n if (snapshot.status !== JOURNEY_STATUS.RUNNING) {\n return buildSendResult(snapshot, false);\n }\n\n const targetIndex = snapshot.history.timeline.length - 1;\n if (snapshot.history.index >= targetIndex) {\n return buildSendResult(snapshot, false);\n }\n\n const from = snapshot.currentStepId;\n emit({ type: \"step.exit\", stepId: from, timestamp: now() });\n snapshot = buildSnapshot(\n snapshot.history.timeline,\n targetIndex,\n snapshot.context,\n snapshot.status,\n snapshot.async,\n snapshot.stepMeta,\n snapshot.visited\n );\n persistSnapshot(snapshot);\n notify();\n\n emit({ type: \"navigation.lastVisited\", from, to: snapshot.currentStepId, timestamp: now() });\n emit({ type: \"step.enter\", stepId: snapshot.currentStepId, timestamp: now() });\n return buildSendResult(snapshot, true, {\n ...(transitionId !== undefined ? { transitionId } : {})\n });\n };\n\n type RuntimeSendEvent = JourneySendEvent<TStepId, TEventType, TPayloadMap>;\n type RuntimeTransitionEvent = JourneyEvent<TStepId, TEventType, TPayloadMap>;\n type RuntimeTransition = JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>;\n\n const buildCanceledSendResult = (): JourneySendResult<TContext, TStepId, TStepMeta> =>\n buildSendResult(snapshot, false);\n\n const buildErroredSendResult = (\n error: unknown,\n transitionId?: string\n ): JourneySendResult<TContext, TStepId, TStepMeta> =>\n buildSendResult(snapshot, false, {\n ...(transitionId !== undefined ? { transitionId } : {}),\n error\n });\n\n const buildTransitionErrorResult = (\n fromStep: TStepId,\n eventType: string,\n error: unknown,\n transitionId: string | null,\n runVersion: number\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n setStepError(fromStep, eventType, error, transitionId ?? undefined, runVersion);\n emit({\n type: \"transition.error\",\n from: fromStep,\n eventType,\n transitionId,\n error,\n timestamp: now()\n });\n return buildErroredSendResult(error, transitionId ?? undefined);\n };\n\n const applyDirectGoToStepById = (\n stepId: TStepId,\n fromStep: TStepId,\n runVersion: number\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n setStepIdle(fromStep, runVersion);\n\n const beforeCurrent = snapshot.currentStepId;\n const nextSnapshot = transitionSnapshot(snapshot, stepId, snapshot.context);\n if (nextSnapshot.currentStepId !== beforeCurrent) {\n emit({ type: \"step.exit\", stepId: beforeCurrent, timestamp: now() });\n }\n\n snapshot = nextSnapshot;\n persistSnapshot(snapshot);\n notify();\n\n emit({\n type: \"transition.success\",\n from: fromStep,\n to: snapshot.currentStepId,\n eventType: JOURNEY_EVENT.GO_TO_STEP_BY_ID,\n transitionId: JOURNEY_EVENT.GO_TO_STEP_BY_ID,\n timestamp: now()\n });\n\n if (nextSnapshot.currentStepId !== beforeCurrent) {\n emit({ type: \"step.enter\", stepId: snapshot.currentStepId, timestamp: now() });\n }\n\n return buildSendResult(snapshot, true, { transitionId: JOURNEY_EVENT.GO_TO_STEP_BY_ID });\n };\n\n const resolveTransitionsForSend = (\n event: RuntimeSendEvent,\n fromStep: TStepId,\n runVersion: number\n ): {\n transitionsToEvaluate: readonly RuntimeTransition[];\n earlyResult: JourneySendResult<TContext, TStepId, TStepMeta> | null;\n } => {\n if (!isGoToStepByIdEvent(event)) {\n return { transitionsToEvaluate: journey.transitions, earlyResult: null };\n }\n\n assertStepExists(\n journey.steps,\n event.stepId,\n `Cannot goToStepById unknown step \"${event.stepId}\".`\n );\n\n const goToStepTransitions = journey.transitions.filter((transition) => {\n const fromMatches = transition.from === \"*\" || transition.from === fromStep;\n return (\n fromMatches &&\n transition.event === JOURNEY_EVENT.GO_TO_STEP_BY_ID &&\n \"to\" in transition &&\n transition.to === event.stepId\n );\n });\n\n if (goToStepTransitions.length === 0) {\n return {\n transitionsToEvaluate: journey.transitions,\n earlyResult: applyDirectGoToStepById(event.stepId, fromStep, runVersion)\n };\n }\n\n return { transitionsToEvaluate: goToStepTransitions, earlyResult: null };\n };\n\n const selectTransitionForSend = async (\n transitionsToEvaluate: readonly RuntimeTransition[],\n transitionEvent: RuntimeTransitionEvent,\n fromStep: TStepId,\n runVersion: number\n ): Promise<\n | { transition: RuntimeTransition | null; earlyResult: null }\n | { transition: null; earlyResult: JourneySendResult<TContext, TStepId, TStepMeta> }\n > => {\n let transition;\n try {\n transition = await selectTransition(transitionsToEvaluate, snapshot, transitionEvent, {\n onAsyncGuardStart: (currentTransition) => {\n setStepLoading(\n fromStep,\n JOURNEY_ASYNC_PHASE.EVALUATING_WHEN,\n transitionEvent.type,\n currentTransition.id,\n runVersion\n );\n },\n onAsyncGuardSuccess: () => {\n setStepIdle(fromStep, runVersion);\n },\n onAsyncGuardError: (currentTransition, error) => {\n setStepError(fromStep, transitionEvent.type, error, currentTransition.id, runVersion);\n }\n });\n } catch (error) {\n if (!isRunActive(runVersion)) {\n return { transition: null, earlyResult: buildCanceledSendResult() };\n }\n\n return {\n transition: null,\n earlyResult: buildTransitionErrorResult(\n fromStep,\n transitionEvent.type,\n error,\n null,\n runVersion\n )\n };\n }\n\n return { transition, earlyResult: null };\n };\n\n const handleNoTransitionMatch = (\n event: RuntimeSendEvent,\n fromStep: TStepId\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n if (isGoToStepByIdEvent(event)) {\n return buildCanceledSendResult();\n }\n\n if (event.type === \"goToPreviousStep\" || event.type === \"back\") {\n const fallbackResult = applyPreviousNavigation(1, event.type);\n if (fallbackResult.transitioned) {\n emit({\n type: \"transition.success\",\n from: fromStep,\n to: fallbackResult.snapshot.currentStepId,\n eventType: event.type,\n transitionId: null,\n timestamp: now()\n });\n }\n return fallbackResult;\n }\n\n if (\n event.type === \"goToNextStep\" &&\n completeOnNoNextStep &&\n !hasDeclaredTransitionForEvent(fromStep, \"goToNextStep\")\n ) {\n return commitTerminalTransition(fromStep, \"COMPLETE\", event, null, snapshot.context);\n }\n\n return buildCanceledSendResult();\n };\n\n const resolveNextContext = async (\n transition: RuntimeTransition,\n transitionEvent: RuntimeTransitionEvent,\n fromStep: TStepId,\n runVersion: number\n ): Promise<\n | { nextContext: TContext; earlyResult: null }\n | { nextContext: null; earlyResult: JourneySendResult<TContext, TStepId, TStepMeta> }\n > => {\n let nextContext = snapshot.context;\n if (!transition.effect) {\n return { nextContext, earlyResult: null };\n }\n\n let effectResultPromise: TContext | void | Promise<TContext | void>;\n try {\n effectResultPromise = (\n transition.effect as (\n args: JourneyTransitionArgs<TContext, TStepId, TEventType, TPayloadMap>\n ) => TContext | void | Promise<TContext | void>\n )({\n context: snapshot.context,\n from: snapshot.currentStepId,\n timeline: snapshot.history.timeline,\n index: snapshot.history.index,\n event: transitionEvent\n });\n } catch (error) {\n if (!isRunActive(runVersion)) {\n return { nextContext: null, earlyResult: buildCanceledSendResult() };\n }\n\n return {\n nextContext: null,\n earlyResult: buildTransitionErrorResult(\n fromStep,\n transitionEvent.type,\n error,\n transition.id ?? null,\n runVersion\n )\n };\n }\n\n if (isPromiseLike(effectResultPromise)) {\n setStepLoading(\n fromStep,\n JOURNEY_ASYNC_PHASE.RUNNING_EFFECT,\n transitionEvent.type,\n transition.id,\n runVersion\n );\n }\n\n let effectResult: TContext | void;\n try {\n effectResult = await effectResultPromise;\n } catch (error) {\n if (!isRunActive(runVersion)) {\n return { nextContext: null, earlyResult: buildCanceledSendResult() };\n }\n\n return {\n nextContext: null,\n earlyResult: buildTransitionErrorResult(\n fromStep,\n transitionEvent.type,\n error,\n transition.id ?? null,\n runVersion\n )\n };\n }\n\n if (!isRunActive(runVersion)) {\n return { nextContext: null, earlyResult: buildCanceledSendResult() };\n }\n\n if (effectResult !== undefined) {\n nextContext = effectResult;\n }\n\n return { nextContext, earlyResult: null };\n };\n\n const resolveTransitionTarget = (transition: RuntimeTransition): TStepId | JourneyTerminal =>\n transition.event === \"completeJourney\"\n ? \"COMPLETE\"\n : transition.event === \"terminateJourney\"\n ? \"TERMINATED\"\n : (transition.to as TStepId | JourneyTerminal);\n\n const hasDeclaredTransitionForEvent = (fromStep: TStepId, eventType: string): boolean =>\n journey.transitions.some((transition) => {\n const fromMatches = transition.from === \"*\" || transition.from === fromStep;\n return fromMatches && transition.event === eventType;\n });\n\n const commitTerminalTransition = (\n fromStep: TStepId,\n target: JourneyTerminal,\n transitionEvent: RuntimeSendEvent,\n transitionId: string | null,\n nextContext: TContext\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n const normalizedTimeline = snapshot.history.timeline.slice(0, snapshot.history.index + 1);\n snapshot = {\n ...snapshot,\n history: {\n timeline: normalizedTimeline,\n index: normalizedTimeline.length - 1\n },\n context: nextContext,\n status: target === \"COMPLETE\" ? JOURNEY_STATUS.COMPLETE : JOURNEY_STATUS.TERMINATED\n };\n persistSnapshot(snapshot);\n notify();\n\n emit({\n type: \"transition.success\",\n from: fromStep,\n to: target,\n eventType: transitionEvent.type,\n transitionId,\n timestamp: now()\n });\n emit({\n type: target === \"COMPLETE\" ? \"journey.complete\" : \"journey.close\",\n stepId: snapshot.currentStepId,\n timestamp: now()\n });\n\n return buildSendResult(snapshot, true, {\n ...(transitionId !== null ? { transitionId } : {})\n });\n };\n\n const commitStepTransition = (\n fromStep: TStepId,\n target: TStepId,\n transitionEvent: RuntimeTransitionEvent,\n transition: RuntimeTransition,\n nextContext: TContext\n ): JourneySendResult<TContext, TStepId, TStepMeta> => {\n assertStepExists(journey.steps, target, `Transition points to unknown step \"${target}\".`);\n\n const beforeCurrent = snapshot.currentStepId;\n if (beforeCurrent !== target) {\n emit({ type: \"step.exit\", stepId: beforeCurrent, timestamp: now() });\n }\n snapshot = transitionSnapshot(snapshot, target, nextContext);\n persistSnapshot(snapshot);\n notify();\n\n emit({\n type: \"transition.success\",\n from: fromStep,\n to: snapshot.currentStepId,\n eventType: transitionEvent.type,\n transitionId: transition.id ?? null,\n timestamp: now()\n });\n if (beforeCurrent !== snapshot.currentStepId) {\n emit({ type: \"step.enter\", stepId: snapshot.currentStepId, timestamp: now() });\n }\n\n return buildSendResult(snapshot, true, {\n ...(transition.id !== undefined ? { transitionId: transition.id } : {})\n });\n };\n\n const executeSend = async (\n event: RuntimeSendEvent,\n runVersion: number\n ): Promise<JourneySendResult<TContext, TStepId, TStepMeta>> => {\n if (snapshot.status !== JOURNEY_STATUS.RUNNING) {\n return buildCanceledSendResult();\n }\n\n const fromStep = snapshot.currentStepId;\n const transitionEvent = event as RuntimeTransitionEvent;\n emit({ type: \"transition.start\", from: fromStep, event, timestamp: now() });\n\n const transitionResolution = resolveTransitionsForSend(event, fromStep, runVersion);\n if (transitionResolution.earlyResult) {\n return transitionResolution.earlyResult;\n }\n\n const selectionResolution = await selectTransitionForSend(\n transitionResolution.transitionsToEvaluate,\n transitionEvent,\n fromStep,\n runVersion\n );\n if (selectionResolution.earlyResult) {\n return selectionResolution.earlyResult;\n }\n\n if (!isRunActive(runVersion)) {\n return buildCanceledSendResult();\n }\n\n const { transition } = selectionResolution;\n if (!transition) {\n return handleNoTransitionMatch(event, fromStep);\n }\n\n const contextResolution = await resolveNextContext(\n transition,\n transitionEvent,\n fromStep,\n runVersion\n );\n if (contextResolution.earlyResult) {\n return contextResolution.earlyResult;\n }\n\n setStepIdle(fromStep, runVersion);\n\n const target = resolveTransitionTarget(transition);\n if (isTerminalTarget(target)) {\n return commitTerminalTransition(\n fromStep,\n target,\n transitionEvent,\n transition.id ?? null,\n contextResolution.nextContext\n );\n }\n\n return commitStepTransition(\n fromStep,\n target,\n transitionEvent,\n transition,\n contextResolution.nextContext\n );\n };\n\n const machine: JourneyMachine<TContext, TStepId, TEventType, TPayloadMap, TStepMeta> = {\n getSnapshot: () => snapshot,\n subscribe: (listener) => {\n if (isDisposed) {\n return () => undefined;\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n subscribeSelector: <TSelected>(\n selector: JourneySelector<TContext, TStepId, TStepMeta, TSelected>,\n listener: (next: TSelected, previous: TSelected) => void,\n equalityFn?: JourneyEqualityFn<TSelected>\n ) => {\n if (isDisposed) {\n return () => undefined;\n }\n\n const isEqual = equalityFn ?? Object.is;\n let selected = selector(snapshot);\n\n return machine.subscribe(() => {\n const nextSelected = selector(snapshot);\n if (isEqual(selected, nextSelected)) {\n return;\n }\n\n const previous = selected;\n selected = nextSelected;\n listener(nextSelected, previous);\n });\n },\n subscribeEvent: (listener) => {\n if (isDisposed) {\n return () => undefined;\n }\n eventListeners.add(listener);\n try {\n listener(startupEvent);\n } catch (error) {\n eventListeners.delete(listener);\n throw error;\n }\n return () => {\n eventListeners.delete(listener);\n };\n },\n subscribeStart: (listener) =>\n machine.subscribeEvent((event) => {\n if (event.type === \"journey.start\") {\n listener(event);\n }\n }),\n subscribeComplete: (listener) =>\n machine.subscribeEvent((event) => {\n if (event.type === \"journey.complete\") {\n listener(event);\n }\n }),\n subscribeTerminate: (listener) =>\n machine.subscribeEvent((event) => {\n if (event.type === \"journey.close\") {\n listener(event);\n }\n }),\n resetMachine: () => {\n if (isDisposed) {\n return snapshot;\n }\n\n cancelInFlight();\n snapshot = buildSnapshot(\n [journey.initial],\n 0,\n journey.context,\n JOURNEY_STATUS.RUNNING,\n buildInitialAsyncState(journey.steps),\n buildStepMeta()\n );\n if (clearOnReset) {\n removePersistedSnapshot();\n } else {\n persistSnapshot(snapshot);\n }\n notify();\n return snapshot;\n },\n updateContext: (updater) => {\n if (isDisposed) {\n return snapshot;\n }\n\n snapshot = {\n ...snapshot,\n context: updater(snapshot.context)\n };\n persistSnapshot(snapshot);\n notify();\n return snapshot;\n },\n updateStepMetadata: (stepId, updater) => {\n if (isDisposed) {\n return snapshot;\n }\n\n if (!(stepId in journey.steps)) {\n return snapshot;\n }\n\n const previousMeta = snapshot.stepMeta[stepId];\n const nextMeta = updater(previousMeta);\n if (Object.is(previousMeta, nextMeta)) {\n return snapshot;\n }\n\n snapshot = {\n ...snapshot,\n stepMeta: {\n ...snapshot.stepMeta,\n [stepId]: nextMeta\n }\n };\n persistSnapshot(snapshot);\n notify();\n emit({\n type: \"metadata.updated\",\n stepId,\n previous: previousMeta,\n next: nextMeta,\n timestamp: now()\n });\n return snapshot;\n },\n clearStepError: (stepId) => {\n if (isDisposed) {\n return snapshot;\n }\n\n const resolvedStep = stepId ?? snapshot.currentStepId;\n if (!(resolvedStep in journey.steps)) {\n return snapshot;\n }\n\n setStepIdle(resolvedStep);\n return snapshot;\n },\n dispose: () => {\n if (isDisposed) {\n return;\n }\n\n isDisposed = true;\n cancelInFlight();\n listeners.clear();\n eventListeners.clear();\n },\n goToPreviousStep: (steps) =>\n queue(\n async () => {\n const result = applyPreviousNavigation(steps, \"goToPreviousStep\");\n return result;\n },\n () => buildSendResult(snapshot, false)\n ),\n goToLastVisitedStep: () =>\n queue(\n async () => {\n const result = applyLastVisitedNavigation(\"goToLastVisitedStep\");\n return result;\n },\n () => buildSendResult(snapshot, false)\n ),\n goToNextStep: () => machine.send({ type: \"goToNextStep\" }),\n terminateJourney: (payload) =>\n payload === undefined\n ? machine.send({ type: \"terminateJourney\" })\n : machine.send({ type: \"terminateJourney\", payload }),\n completeJourney: (payload) =>\n payload === undefined\n ? machine.send({ type: \"completeJourney\" })\n : machine.send({ type: \"completeJourney\", payload }),\n send: (event) =>\n queue(async (runVersion) => executeSend(event, runVersion), buildCanceledSendResult)\n };\n\n return machine;\n}\n", "import { JOURNEY_WILDCARD } from \"./types/journey.types\";\nimport type { JourneyEventPayloadMap } from \"./types/journey.types\";\nimport type {\n EventBuilder,\n JourneyEventTransition,\n JourneyTransition,\n JourneySelectedTransitionArgs,\n JourneyTransitionTarget,\n TransitionBranch,\n TransitionBranchBuilder,\n TransitionConfig\n} from \"./types/transitions.types\";\n\ntype TransitionPayloadMap = Partial<Record<string, unknown>>;\ntype SelectedPayloadMap<\n TEventType extends string,\n TPayloadMap extends TransitionPayloadMap\n> = TPayloadMap & JourneyEventPayloadMap<TEventType>;\n\nconst createBranchBuilder = <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n>(\n predicate?: (\n args: JourneySelectedTransitionArgs<TContext, TStepId, TEventType, TPayloadMap>\n ) => boolean | Promise<boolean>\n): TransitionBranchBuilder<TContext, TStepId, TEventType, TPayloadMap> => ({\n to: (\n to: JourneyTransitionTarget<TStepId>,\n config: TransitionConfig<TContext, TStepId, TEventType, TPayloadMap> = {}\n ): TransitionBranch<TContext, TStepId, TEventType, TPayloadMap> => ({\n ...config,\n to,\n ...(predicate ? { when: predicate } : {})\n })\n});\n\nconst createEventBuilder = <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n>(\n from: TStepId | typeof JOURNEY_WILDCARD,\n event: TEventType\n): EventBuilder<TContext, TStepId, TEventType, TPayloadMap> => {\n if (event === \"completeJourney\") {\n return {\n complete: (\n config: TransitionConfig<TContext, TStepId, TEventType, TPayloadMap> = {}\n ): JourneyTransition<TContext, TStepId, TEventType, TPayloadMap> =>\n ({\n ...config,\n from,\n event: event as Extract<TEventType, \"completeJourney\">\n }) as JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>\n } as EventBuilder<TContext, TStepId, TEventType, TPayloadMap>;\n }\n\n if (event === \"terminateJourney\") {\n return {\n terminate: (\n config: TransitionConfig<TContext, TStepId, TEventType, TPayloadMap> = {}\n ): JourneyTransition<TContext, TStepId, TEventType, TPayloadMap> =>\n ({\n ...config,\n from,\n event: event as Extract<TEventType, \"terminateJourney\">\n }) as JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>\n } as EventBuilder<TContext, TStepId, TEventType, TPayloadMap>;\n }\n\n return {\n to: (\n to: JourneyTransitionTarget<TStepId>,\n config: TransitionConfig<TContext, TStepId, TEventType, TPayloadMap> = {}\n ): JourneyTransition<TContext, TStepId, TEventType, TPayloadMap> =>\n ({\n ...config,\n from,\n event: event as Exclude<TEventType, \"completeJourney\" | \"terminateJourney\">,\n to\n }) as JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>,\n choose: (\n ...branches: Array<TransitionBranch<TContext, TStepId, TEventType, TPayloadMap>>\n ): JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>[] =>\n branches.map(\n (branch) =>\n ({\n ...branch,\n from,\n event: event as Exclude<TEventType, \"completeJourney\" | \"terminateJourney\">\n }) as JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>\n ),\n when: (\n predicate: (\n args: JourneySelectedTransitionArgs<TContext, TStepId, TEventType, TPayloadMap>\n ) => boolean | Promise<boolean>\n ) => createBranchBuilder(predicate),\n otherwise: () => createBranchBuilder()\n } as unknown as EventBuilder<TContext, TStepId, TEventType, TPayloadMap>;\n};\n\nconst buildTerminalTransition = <\n TContext,\n TStepId extends string,\n TEventType extends \"completeJourney\" | \"terminateJourney\",\n TPayloadMap extends TransitionPayloadMap = Record<never, never>\n>(\n from: TStepId | typeof JOURNEY_WILDCARD,\n event: TEventType,\n config: TransitionConfig<\n TContext,\n TStepId,\n TEventType,\n SelectedPayloadMap<TEventType, TPayloadMap>\n > = {}\n): JourneyEventTransition<\n TContext,\n TStepId,\n TEventType,\n SelectedPayloadMap<TEventType, TPayloadMap>\n> =>\n ({\n ...config,\n from,\n event\n }) as JourneyEventTransition<\n TContext,\n TStepId,\n TEventType,\n SelectedPayloadMap<TEventType, TPayloadMap>\n >;\n\n/**\n * Fluent helpers for building journey transitions with type-safe branches.\n */\nexport const tx = {\n from: <\n TStepId extends string,\n TContext = unknown,\n TPayloadMap extends TransitionPayloadMap = Record<never, never>\n >(\n from: TStepId\n ) => ({\n on: <TEventType extends string>(event: TEventType) =>\n createEventBuilder<\n TContext,\n TStepId,\n TEventType,\n SelectedPayloadMap<TEventType, TPayloadMap>\n >(from, event),\n toComplete: (\n config: TransitionConfig<\n TContext,\n TStepId,\n \"completeJourney\",\n SelectedPayloadMap<\"completeJourney\", TPayloadMap>\n > = {}\n ) =>\n buildTerminalTransition<TContext, TStepId, \"completeJourney\", TPayloadMap>(\n from,\n \"completeJourney\",\n config\n ),\n toTerminate: (\n config: TransitionConfig<\n TContext,\n TStepId,\n \"terminateJourney\",\n SelectedPayloadMap<\"terminateJourney\", TPayloadMap>\n > = {}\n ) =>\n buildTerminalTransition<TContext, TStepId, \"terminateJourney\", TPayloadMap>(\n from,\n \"terminateJourney\",\n config\n )\n }),\n any: <\n TContext = unknown,\n TStepId extends string = string,\n TPayloadMap extends TransitionPayloadMap = Record<never, never>\n >() => ({\n on: <TEventType extends string>(event: TEventType) =>\n createEventBuilder<\n TContext,\n TStepId,\n TEventType,\n SelectedPayloadMap<TEventType, TPayloadMap>\n >(JOURNEY_WILDCARD, event),\n toComplete: (\n config: TransitionConfig<\n TContext,\n TStepId,\n \"completeJourney\",\n SelectedPayloadMap<\"completeJourney\", TPayloadMap>\n > = {}\n ) =>\n buildTerminalTransition<TContext, TStepId, \"completeJourney\", TPayloadMap>(\n JOURNEY_WILDCARD,\n \"completeJourney\",\n config\n ),\n toTerminate: (\n config: TransitionConfig<\n TContext,\n TStepId,\n \"terminateJourney\",\n SelectedPayloadMap<\"terminateJourney\", TPayloadMap>\n > = {}\n ) =>\n buildTerminalTransition<TContext, TStepId, \"terminateJourney\", TPayloadMap>(\n JOURNEY_WILDCARD,\n \"terminateJourney\",\n config\n )\n }),\n when: <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n >(\n predicate: (\n args: JourneySelectedTransitionArgs<TContext, TStepId, TEventType, TPayloadMap>\n ) => boolean | Promise<boolean>\n ) => ({\n to: (\n to: JourneyTransitionTarget<TStepId>,\n config: TransitionConfig<TContext, TStepId, TEventType, TPayloadMap> = {}\n ): TransitionBranch<TContext, TStepId, TEventType, TPayloadMap> => ({\n ...config,\n to,\n when: predicate\n })\n }),\n otherwise: <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n >() => ({\n to: (\n to: JourneyTransitionTarget<TStepId>,\n config: TransitionConfig<TContext, TStepId, TEventType, TPayloadMap> = {}\n ): TransitionBranch<TContext, TStepId, TEventType, TPayloadMap> => ({\n ...config,\n to\n })\n })\n};\n\n/**\n * Flattens transition items and transition arrays into a single transition list.\n */\nexport const createTransitions = <\n TContext,\n TStepId extends string,\n TEventType extends string,\n TPayloadMap extends JourneyEventPayloadMap<TEventType>\n>(\n ...items: Array<\n | JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>\n | readonly JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>[]\n >\n): JourneyTransition<TContext, TStepId, TEventType, TPayloadMap>[] =>\n items.flatMap((item) => (Array.isArray(item) ? [...item] : [item]));\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "JOURNEY_ASYNC_PHASE", "JOURNEY_EVENT", "JOURNEY_STATUS", "JOURNEY_WILDCARD", "createJourneyMachine", "createPersistenceController", "createTransitions", "tx", "__toCommonJS", "JOURNEY_STATUS", "JOURNEY_WILDCARD", "JOURNEY_EVENT", "JOURNEY_ASYNC_PHASE", "assertStepExists", "steps", "stepId", "message", "normalizeStepCount", "now", "unique", "items", "normalizeVisited", "visited", "stepIds", "buildVisitedFromTimeline", "timeline", "resolvedStepIds", "appendVisited", "current", "isPromiseLike", "value", "buildIdleStepAsyncState", "JOURNEY_ASYNC_PHASE", "buildInitialAsyncState", "isGoToStepByIdEvent", "event", "JOURNEY_EVENT", "isTerminalTarget", "target", "validateJourneyTransitions", "transitions", "stepRegistry", "index", "transition", "JOURNEY_WILDCARD", "buildSendResult", "snapshot", "transitioned", "options", "buildSnapshot", "context", "status", "asyncState", "stepMeta", "safeIndex", "currentStepId", "selectTransition", "hooks", "fromMatches", "eventMatches", "guardResult", "asyncGuard", "allowed", "error", "transitionSnapshot", "nextCurrent", "nextContext", "baseTimeline", "nextTimeline", "nextIndex", "isRecord", "value", "isStatusValue", "JOURNEY_STATUS", "resolveDefaultStorage", "localStorageCandidate", "resolvePersistence", "options", "storage", "error", "resolveVisitedFromPersistence", "visitedSource", "timeline", "stepIds", "visitedFromTimeline", "buildVisitedFromTimeline", "needsRewrite", "visited", "stepId", "persistedValue", "visitedFromArray", "step", "coercePersistedSnapshot", "steps", "fallbackContext", "fallbackStepMeta", "rawHistory", "rawTimeline", "currentStepIdValue", "index", "rawIndex", "inferredIndex", "status", "visitedNeedsRewrite", "rawStepMeta", "stepMeta", "typedStepId", "rawValue", "createPersistenceController", "args", "initial", "context", "persistence", "reportPersistenceError", "persistSnapshot", "snapshot", "persistedState", "removePersistedSnapshot", "hydrateSnapshot", "initialSnapshot", "buildSnapshot", "buildInitialAsyncState", "rawPersisted", "parsed", "persistedVersion", "persistedSnapshot", "shouldRewritePersisted", "coerced", "migrated", "hydratedSnapshot", "createJourneyMachine", "journey", "options", "stepId", "assertStepExists", "validateJourneyTransitions", "buildStepMeta", "stepMeta", "clearOnReset", "hydrateSnapshot", "persistSnapshot", "removePersistedSnapshot", "createPersistenceController", "snapshot", "buildInitialAsyncState", "completeOnNoNextStep", "startupEvent", "now", "listeners", "eventListeners", "actionQueue", "lifecycleVersion", "isDisposed", "isRunActive", "runVersion", "cancelInFlight", "notify", "listener", "emit", "event", "queue", "runner", "onCanceled", "createQueuedRunner", "settleQueue", "resultPromise", "isAsyncLoadingPhase", "phase", "JOURNEY_ASYNC_PHASE", "updateStepAsync", "updater", "current", "buildIdleStepAsyncState", "next", "nextByStep", "isLoading", "state", "setStepLoading", "eventType", "transitionId", "setStepIdle", "setStepError", "error", "applyPreviousNavigation", "requestedSteps", "JOURNEY_STATUS", "buildSendResult", "steps", "normalizeStepCount", "from", "nextIndex", "appliedSteps", "buildSnapshot", "applyLastVisitedNavigation", "targetIndex", "buildCanceledSendResult", "buildErroredSendResult", "buildTransitionErrorResult", "fromStep", "applyDirectGoToStepById", "beforeCurrent", "nextSnapshot", "transitionSnapshot", "JOURNEY_EVENT", "resolveTransitionsForSend", "isGoToStepByIdEvent", "goToStepTransitions", "transition", "selectTransitionForSend", "transitionsToEvaluate", "transitionEvent", "selectTransition", "currentTransition", "handleNoTransitionMatch", "fallbackResult", "hasDeclaredTransitionForEvent", "commitTerminalTransition", "resolveNextContext", "nextContext", "effectResultPromise", "isPromiseLike", "effectResult", "resolveTransitionTarget", "target", "normalizedTimeline", "commitStepTransition", "executeSend", "transitionResolution", "selectionResolution", "contextResolution", "isTerminalTarget", "machine", "selector", "equalityFn", "isEqual", "selected", "nextSelected", "previous", "previousMeta", "nextMeta", "resolvedStep", "payload", "createBranchBuilder", "predicate", "to", "config", "createEventBuilder", "from", "event", "branches", "branch", "buildTerminalTransition", "tx", "JOURNEY_WILDCARD", "createTransitions", "items", "item"]
3
+ "sources": ["../src/index.ts", "../src/journey-machine/helpers.ts", "../src/journey-machine/async-state.ts", "../src/journey-machine/computed.ts", "../src/journey-machine/controls.ts", "../src/journey-machine/navigation.ts", "../src/journey-machine/plugin-controller.ts", "../src/journey-machine/runtime.ts", "../src/journey-machine/send.ts", "../src/journey-machine/resolve-journey-definition.ts", "../src/journey-machine/index.ts", "../src/journey-builder/index.ts"],
4
+ "sourcesContent": ["export { createJourneyMachine } from \"./journey-machine\";\nexport { createJourneyBuilder } from \"./journey-builder\";\nexport { JourneyDisposedError } from \"./journey-machine/helpers\";\nexport type {\n JourneyBuilder,\n JourneyBuilderCustomEventKey,\n JourneyBuilderDefinition,\n JourneyBuilderDefinitionMetadata,\n JourneyBuilderGuard,\n JourneyBuilderOnEntry,\n JourneyBuilderTerminalCandidate,\n JourneyBuilderTerminalEntry,\n JourneyStepBuilder,\n JourneyToBuilder\n} from \"./journey-builder\";\nexport {\n type JourneyAnalyticsEventName,\n type JourneyAnalyticsEventPayload,\n type JourneyAnalyticsPluginOptions,\n type JourneyAnalyticsTrackedEvent,\n type JourneyAutosavePluginOptions,\n type JourneyAutosaveState,\n type JourneyAutosaveStatus,\n type JourneyComputed,\n type JourneyCompleteObservationEvent,\n type JourneyDiagnosticsIssue,\n type JourneyDiagnosticsIssueCode,\n type JourneyDiagnosticsIssueSeverity,\n type JourneyDiagnosticsOptions,\n type JourneyDiagnosticsResult,\n type JourneyDiagnosticsSummary,\n type JourneyDefaultEventType,\n type JourneyDefinition,\n type JourneyEqualityFn,\n type JourneyExecutionPathOptions,\n type JourneyExecutionPathsResult,\n type JourneyFullEventType,\n type JourneyJsonObject,\n type JourneyJsonValue,\n type JourneyLinearStep,\n type JourneyLifecycleErrorContext,\n type JourneyLifecycleErrorObservationEvent,\n type JourneyLifecycleErrorPhase,\n type JourneyLifecycleArgs,\n type JourneyMachine,\n type JourneyMachineOptions,\n type JourneyMachinePlugin,\n type JourneyMachineWithPlugins,\n type JourneyObservationEvent,\n type JourneyPayloadFor,\n type JourneyResolvedTransition,\n type JourneyResetObservationEvent,\n type JourneyReplayEntry,\n type JourneyReplayEventEntry,\n type JourneyReplayExportOptions,\n type JourneyReplayPluginOptions,\n type JourneyReplaySession,\n type JourneyReplaySnapshotEntry,\n type JourneySelector,\n type JourneySendEvent,\n type JourneySendResult,\n type JourneySnapshot,\n type JourneyStartObservationEvent,\n type JourneyStepAsyncState,\n type JourneyStepDefinition,\n type JourneyStepLifecycleCallback,\n type JourneyTerminateObservationEvent,\n type JourneyTransitionArgsForEvent,\n type JourneyTransitionUpdateContextArgsForEvent\n} from \"./types\";\n", "import type {\n JourneyAsyncState,\n JourneyEvent,\n JourneyGoToEvent,\n JourneyJsonObject,\n JourneyJsonValue,\n JourneyPayloadFor,\n JourneyResolvedTransition,\n JourneySendEvent,\n JourneySendResult,\n JourneySnapshot,\n JourneyStatus,\n JourneyStepAsyncState,\n JourneyTerminal,\n JourneyTransition,\n JourneyTransitionArgs\n} from \"../types\";\n\nexport const assertStepExists = <TStepId extends string>(\n steps: Record<TStepId, unknown>,\n stepId: TStepId,\n message: string\n) => {\n if (!(stepId in steps)) {\n throw new Error(message);\n }\n};\n\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);\n\nconst cloneSerializableValue = <T extends JourneyJsonValue>(value: T): T => {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneSerializableValue(entry)) as T;\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entryValue]) => [\n key,\n cloneSerializableValue(entryValue as JourneyJsonValue)\n ])\n ) as T;\n }\n\n return value;\n};\n\ntype SerializableCheckState = {\n readonly seen: WeakSet<object>;\n};\n\nconst describeValue = (value: unknown): string => {\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"object\") {\n const constructorName = (value as { constructor?: { name?: string } }).constructor?.name;\n return constructorName && constructorName !== \"Object\" ? constructorName : \"object\";\n }\n\n return typeof value;\n};\n\nfunction assertSerializableValue(\n value: unknown,\n label: string,\n state: SerializableCheckState,\n path: readonly string[] = []\n): asserts value is JourneyJsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return;\n }\n\n const pathLabel = path.length === 0 ? label : `${label}.${path.join(\".\")}`;\n\n if (value === undefined) {\n throw new Error(`${pathLabel} must be JSON-serializable. Received undefined.`);\n }\n\n if (typeof value === \"bigint\" || typeof value === \"symbol\" || typeof value === \"function\") {\n throw new Error(`${pathLabel} must be JSON-serializable. Received ${typeof value}.`);\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`${pathLabel} must be JSON-serializable. Received ${describeValue(value)}.`);\n }\n\n if (state.seen.has(value)) {\n throw new Error(\n `${pathLabel} must be JSON-serializable. Circular references are not supported.`\n );\n }\n\n state.seen.add(value);\n\n if (Array.isArray(value)) {\n for (const [index, entryValue] of value.entries()) {\n assertSerializableValue(entryValue, label, state, [...path, String(index)]);\n }\n return;\n }\n\n if (!isPlainObject(value)) {\n throw new Error(\n `${pathLabel} must be JSON-serializable. Received non-plain ${describeValue(value)}.`\n );\n }\n\n for (const [key, entryValue] of Object.entries(value)) {\n assertSerializableValue(entryValue, label, state, [...path, key]);\n }\n}\n\nexport function assertSerializableContext<TContext extends JourneyJsonObject>(\n context: TContext,\n label = \"Journey context\"\n): TContext {\n assertSerializableValue(context, label, { seen: new WeakSet() });\n return context;\n}\n\nexport const cloneContext = <TContext extends JourneyJsonObject>(context: TContext): TContext =>\n cloneSerializableValue(assertSerializableContext(context));\n\nconst cloneDefinitionValueFallback = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneDefinitionValueFallback(entry));\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n\n if (value instanceof Map) {\n return new Map(\n [...value.entries()].map(([key, entryValue]) => [\n cloneDefinitionValueFallback(key),\n cloneDefinitionValueFallback(entryValue)\n ])\n );\n }\n\n if (value instanceof Set) {\n return new Set([...value].map((entry) => cloneDefinitionValueFallback(entry)));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entryValue]) => [\n key,\n cloneDefinitionValueFallback(entryValue)\n ])\n );\n }\n\n return value;\n};\n\nexport const cloneMetaValue = <T>(value: T): T => {\n if ((typeof value !== \"object\" && typeof value !== \"function\") || value === null) {\n return value;\n }\n\n if (typeof structuredClone === \"function\") {\n try {\n return structuredClone(value);\n } catch {\n return cloneDefinitionValueFallback(value) as T;\n }\n } else {\n return cloneDefinitionValueFallback(value) as T;\n }\n};\n\nconst freezeSnapshotValue = (value: unknown) => {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n freezeSnapshotValue(item);\n }\n Object.freeze(value);\n return;\n }\n\n if (!isPlainObject(value)) {\n return;\n }\n\n for (const entryValue of Object.values(value)) {\n freezeSnapshotValue(entryValue);\n }\n Object.freeze(value);\n};\n\nexport const normalizeStepCount = (steps?: number): number => {\n if (typeof steps !== \"number\" || !Number.isFinite(steps)) {\n return 1;\n }\n return Math.max(1, Math.trunc(steps));\n};\n\nexport const now = (): number => Date.now();\n\nconst unique = <T>(items: readonly T[]): T[] => [...new Set(items)];\n\nconst normalizeVisited = <TStepId extends string>(\n visited: Record<TStepId, boolean>,\n stepIds: readonly TStepId[]\n): Record<TStepId, boolean> =>\n Object.fromEntries(stepIds.map((stepId) => [stepId, visited[stepId] === true])) as Record<\n TStepId,\n boolean\n >;\n\nexport const buildVisitedFromTimeline = <TStepId extends string>(\n timeline: readonly TStepId[],\n stepIds?: readonly TStepId[]\n): Record<TStepId, boolean> => {\n const resolvedStepIds = stepIds ?? unique(timeline);\n const visited = Object.fromEntries(resolvedStepIds.map((stepId) => [stepId, false])) as Record<\n TStepId,\n boolean\n >;\n\n for (const stepId of timeline) {\n visited[stepId] = true;\n }\n\n return visited;\n};\n\nexport const appendVisited = <TStepId extends string>(\n visited: Record<TStepId, boolean>,\n current: TStepId\n): Record<TStepId, boolean> => ({\n ...visited,\n [current]: true\n});\n\nexport const isPromiseLike = <T>(value: T | PromiseLike<T>): value is PromiseLike<T> =>\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then: unknown }).then === \"function\";\n\nconst isFiniteNumber = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nexport const validateFiniteTimeout = (timeoutMs: unknown, label: string) => {\n if (timeoutMs !== undefined && !isFiniteNumber(timeoutMs)) {\n throw new Error(`${label} must define a finite numeric \"timeoutMs\" when provided.`);\n }\n};\n\nexport class JourneyTimeoutError extends Error {\n override name = \"JourneyTimeoutError\";\n\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class JourneyDisposedError extends Error {\n override name = \"JourneyDisposedError\";\n readonly operation: string;\n\n constructor(operation: string) {\n super(`Journey machine has been disposed; \"${operation}\" can no longer be used.`);\n this.operation = operation;\n }\n}\n\ntype DiagnosticGlobal = typeof globalThis & {\n __DEV__?: unknown;\n process?: {\n env?: {\n NODE_ENV?: string;\n };\n };\n};\n\nexport const isDevelopmentEnvironment = (): boolean => {\n const diagnosticGlobal = globalThis as DiagnosticGlobal;\n if (typeof diagnosticGlobal.__DEV__ === \"boolean\") {\n return diagnosticGlobal.__DEV__;\n }\n\n const nodeEnv = diagnosticGlobal.process?.env?.NODE_ENV;\n return nodeEnv === undefined || nodeEnv === \"development\";\n};\n\nexport const warnInDevelopment = (message: string, detail?: unknown) => {\n if (!isDevelopmentEnvironment() || typeof console === \"undefined\") {\n return;\n }\n\n if (detail === undefined) {\n console.warn(message);\n return;\n }\n\n console.warn(message, detail);\n};\n\nexport const errorInDevelopment = (message: string, detail?: unknown) => {\n if (!isDevelopmentEnvironment() || typeof console === \"undefined\") {\n return;\n }\n\n if (detail === undefined) {\n console.error(message);\n return;\n }\n\n console.error(message, detail);\n};\n\nexport const withTimeout = async <T>(\n promise: PromiseLike<T>,\n timeoutMs: number | undefined,\n buildError: () => Error\n): Promise<T> => {\n if (!isFiniteNumber(timeoutMs) || timeoutMs <= 0) {\n return await promise;\n }\n\n return await new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(buildError());\n }, timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n }\n );\n });\n};\n\nexport const withAbortSignal = async <T>(\n promise: PromiseLike<T>,\n signal: AbortSignal\n): Promise<T> => {\n if (signal.aborted) {\n throw signal.reason;\n }\n\n return await new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(signal.reason);\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n }\n );\n });\n};\n\nexport const buildIdleStepAsyncState = (): JourneyStepAsyncState => ({\n phase: \"idle\",\n eventType: null,\n transitionId: null,\n error: null\n});\n\nexport const buildInitialAsyncState = <TStepId extends string>(\n steps: Record<TStepId, unknown>\n): JourneyAsyncState<TStepId> => {\n const byStep = Object.fromEntries(\n Object.keys(steps).map((stepId) => [stepId, buildIdleStepAsyncState()])\n ) as Record<TStepId, JourneyStepAsyncState>;\n\n return {\n isLoading: false,\n byStep\n };\n};\n\nexport const isGoToStepByIdEvent = <\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n>(\n event: JourneySendEvent<TStepId, TEventMap>\n): event is JourneyGoToEvent<TStepId, JourneyPayloadFor<TEventMap, \"goToStepById\">> =>\n event.type === \"goToStepById\" && \"stepId\" in event;\n\nexport const isTerminalTarget = <TStepId extends string>(\n target: TStepId | JourneyTerminal\n): target is JourneyTerminal => target === \"COMPLETE\" || target === \"TERMINATED\";\n\nexport const resolveTransitionTarget = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n>(\n transition: JourneyTransition<TContext, TStepId, TEventMap, THandlers>\n): TStepId | JourneyTerminal =>\n transition.event === \"completeJourney\"\n ? \"COMPLETE\"\n : transition.event === \"terminateJourney\"\n ? \"TERMINATED\"\n : (transition.to as TStepId | JourneyTerminal);\n\nexport const validateJourneyTransitions = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n>(\n transitions: readonly JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>[],\n steps: Record<TStepId, unknown>\n) => {\n const stepRegistry = steps as Record<string, unknown>;\n const allowedKeys = new Set([\n \"from\",\n \"event\",\n \"to\",\n \"when\",\n \"updateContext\",\n \"onEnter\",\n \"onLeave\",\n \"id\",\n \"label\",\n \"timeoutMs\"\n ]);\n\n for (const [index, transition] of transitions.entries()) {\n if (!transition || typeof transition !== \"object\") {\n throw new Error(`Journey transition at index ${index} must be an object.`);\n }\n\n for (const key of Object.keys(transition)) {\n if (!allowedKeys.has(key)) {\n throw new Error(\n `Journey transition at index ${index} contains unsupported field \"${key}\".`\n );\n }\n }\n\n if (typeof transition.from !== \"string\" || typeof transition.event !== \"string\") {\n throw new Error(\n `Journey transition at index ${index} must define string \"from\" and \"event\".`\n );\n }\n\n if (transition.from !== \"*\" && !(transition.from in stepRegistry)) {\n throw new Error(\n `Journey transition at index ${index} references unknown from step \"${transition.from}\".`\n );\n }\n\n validateFiniteTimeout(transition.timeoutMs, `Journey transition at index ${index}`);\n\n if (transition.when !== undefined && typeof transition.when !== \"function\") {\n throw new Error(\n `Journey transition at index ${index} must define \"when\" as a function when provided.`\n );\n }\n\n if (transition.updateContext !== undefined && typeof transition.updateContext !== \"function\") {\n throw new Error(\n `Journey transition at index ${index} must define \"updateContext\" as a function when provided.`\n );\n }\n\n if (transition.onEnter !== undefined && typeof transition.onEnter !== \"function\") {\n throw new Error(\n `Journey transition at index ${index} must define \"onEnter\" as a function when provided.`\n );\n }\n\n if (transition.onLeave !== undefined && typeof transition.onLeave !== \"function\") {\n throw new Error(\n `Journey transition at index ${index} must define \"onLeave\" as a function when provided.`\n );\n }\n\n if (transition.id !== undefined && typeof transition.id !== \"string\") {\n throw new Error(\n `Journey transition at index ${index} must define \"id\" as a string when provided.`\n );\n }\n\n if (transition.label !== undefined && typeof transition.label !== \"string\") {\n throw new Error(\n `Journey transition at index ${index} must define \"label\" as a string when provided.`\n );\n }\n\n if (transition.event === \"completeJourney\" || transition.event === \"terminateJourney\") {\n if (\"to\" in transition && transition.to !== undefined) {\n throw new Error(\n `Journey transition at index ${index} with event \"${transition.event}\" cannot define \"to\".`\n );\n }\n continue;\n }\n\n if (typeof transition.to !== \"string\") {\n throw new Error(\n `Journey transition at index ${index} with event \"${transition.event}\" must define string \"to\".`\n );\n }\n\n if (!isTerminalTarget(transition.to) && !(transition.to in stepRegistry)) {\n throw new Error(\n `Journey transition at index ${index} points to unknown step \"${transition.to}\".`\n );\n }\n }\n};\n\nexport const buildSendResult = <TContext extends JourneyJsonObject, TStepId extends string>(\n snapshot: JourneySnapshot<TContext, TStepId>,\n transitioned: boolean,\n options: {\n transitionId?: string;\n label?: string;\n error?: unknown;\n } = {}\n): JourneySendResult<TContext, TStepId> => ({\n transitioned,\n ...(options.transitionId !== undefined ? { transitionId: options.transitionId } : {}),\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(\"error\" in options ? { error: options.error } : {}),\n snapshot\n});\n\nexport const buildSnapshot = <TContext extends JourneyJsonObject, TStepId extends string>(\n timeline: readonly TStepId[],\n index: number,\n context: TContext,\n status: JourneyStatus,\n asyncState: JourneyAsyncState<TStepId>,\n visited?: Record<TStepId, boolean>\n): JourneySnapshot<TContext, TStepId> => {\n if (timeline.length === 0) {\n throw new Error(\"Journey timeline cannot be empty.\");\n }\n\n const safeIndex = Math.max(0, Math.min(Math.trunc(index), timeline.length - 1));\n const currentStepId = timeline[safeIndex] as TStepId;\n const stepIds = unique(\n visited ? ([...(Object.keys(visited) as TStepId[]), ...timeline] as const) : timeline\n );\n\n return {\n status,\n currentStepId,\n history: {\n timeline: [...timeline],\n index: safeIndex\n },\n context: cloneContext(context),\n visited: visited\n ? normalizeVisited(visited, stepIds)\n : buildVisitedFromTimeline(timeline, stepIds),\n async: cloneSerializableValue(\n asyncState as unknown as JourneyJsonValue\n ) as JourneyAsyncState<TStepId>\n };\n};\n\nexport const stabilizeSnapshot = <TContext extends JourneyJsonObject, TStepId extends string>(\n snapshot: JourneySnapshot<TContext, TStepId>\n): JourneySnapshot<TContext, TStepId> => {\n const stableSnapshot: JourneySnapshot<TContext, TStepId> = {\n ...snapshot,\n history: {\n timeline: [...snapshot.history.timeline],\n index: snapshot.history.index\n },\n context: cloneContext(snapshot.context),\n visited: { ...snapshot.visited },\n async: cloneSerializableValue(\n snapshot.async as unknown as JourneyJsonValue\n ) as JourneyAsyncState<TStepId>\n };\n\n freezeSnapshotValue(stableSnapshot);\n return stableSnapshot;\n};\n\nexport const selectTransition = async <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>,\n TTransition extends {\n from: TStepId | \"*\";\n event: string;\n when?: (\n args: JourneyTransitionArgs<TContext, TStepId, TEventMap, THandlers>\n ) => boolean | Promise<boolean>;\n timeoutMs?: number;\n id?: string;\n label?: string;\n }\n>(\n transitions: readonly TTransition[],\n snapshot: JourneySnapshot<TContext, TStepId>,\n event: JourneyEvent<TStepId, TEventMap>,\n signal: AbortSignal,\n handlers: THandlers,\n hooks?: {\n onAsyncGuardStart?: (transition: TTransition) => void;\n onAsyncGuardSuccess?: (transition: TTransition) => void;\n onAsyncGuardError?: (transition: TTransition, error: unknown) => void;\n },\n defaultTimeoutMs?: number\n): Promise<TTransition | null> => {\n for (const transition of transitions) {\n const fromMatches = transition.from === \"*\" || transition.from === snapshot.currentStepId;\n const eventMatches = transition.event === event.type;\n\n if (!fromMatches || !eventMatches) {\n continue;\n }\n\n if (!transition.when) {\n return transition;\n }\n\n let guardResult: boolean | Promise<boolean>;\n if (signal.aborted) {\n throw signal.reason;\n }\n\n guardResult = (\n transition.when as (\n args: JourneyTransitionArgs<TContext, TStepId, TEventMap, THandlers>\n ) => boolean | Promise<boolean>\n )({\n snapshot,\n context: snapshot.context,\n from: snapshot.currentStepId,\n timeline: snapshot.history.timeline,\n index: snapshot.history.index,\n event,\n signal,\n handlers\n });\n\n const asyncGuard = isPromiseLike(guardResult);\n const asyncGuardPromise = asyncGuard ? (guardResult as PromiseLike<boolean>) : null;\n\n let allowed: boolean;\n try {\n if (asyncGuard) {\n hooks?.onAsyncGuardStart?.(transition);\n allowed = await withTimeout(\n withAbortSignal(asyncGuardPromise as PromiseLike<boolean>, signal),\n transition.timeoutMs ?? defaultTimeoutMs,\n () =>\n new JourneyTimeoutError(\n `Transition guard timed out after ${transition.timeoutMs ?? defaultTimeoutMs}ms (event: ${event.type}, transition: ${transition.id ?? \"<anonymous>\"}).`\n )\n );\n } else {\n allowed = guardResult as boolean;\n }\n } catch (error) {\n if (asyncGuard) {\n hooks?.onAsyncGuardError?.(transition, error);\n }\n throw error;\n }\n\n if (asyncGuard) {\n hooks?.onAsyncGuardSuccess?.(transition);\n }\n\n if (allowed) {\n return transition;\n }\n }\n\n return null;\n};\n\nexport const transitionSnapshot = <TContext extends JourneyJsonObject, TStepId extends string>(\n snapshot: JourneySnapshot<TContext, TStepId>,\n nextCurrent: TStepId,\n nextContext: TContext\n): JourneySnapshot<TContext, TStepId> => {\n const baseTimeline = snapshot.history.timeline.slice(0, snapshot.history.index + 1);\n let nextTimeline = baseTimeline;\n if (nextCurrent !== snapshot.currentStepId) {\n nextTimeline = [...baseTimeline, nextCurrent];\n }\n\n const nextIndex = nextTimeline.length - 1;\n const visited = appendVisited(snapshot.visited, nextCurrent);\n\n return buildSnapshot(\n nextTimeline,\n nextIndex,\n nextContext,\n snapshot.status,\n snapshot.async,\n visited\n );\n};\n", "import { buildIdleStepAsyncState } from \"./helpers\";\n\nimport type {\n JourneyAsyncPhase,\n JourneyAsyncState,\n JourneyJsonObject,\n JourneyStepAsyncState\n} from \"../types\";\nimport type { JourneyMachineRuntime } from \"./runtime\";\n\nexport type JourneyMachineAsyncStateController<TStepId extends string> = {\n syncState: (asyncState: JourneyAsyncState<TStepId>) => void;\n updateStepAsync: (\n stepId: TStepId,\n updater: (\n current: JourneyAsyncState<TStepId>[\"byStep\"][TStepId]\n ) => JourneyAsyncState<TStepId>[\"byStep\"][TStepId],\n runVersion?: number\n ) => void;\n setStepLoading: (\n stepId: TStepId,\n phase: JourneyAsyncPhase,\n eventType: string,\n transitionId?: string,\n runVersion?: number\n ) => void;\n setStepIdle: (stepId: TStepId, runVersion?: number) => void;\n setStepError: (\n stepId: TStepId,\n eventType: string,\n error: unknown,\n transitionId?: string,\n runVersion?: number\n ) => void;\n};\n\nexport const createJourneyMachineAsyncStateController = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n>({\n runtime\n}: {\n runtime: JourneyMachineRuntime<TContext, TStepId, TEventMap>;\n}): JourneyMachineAsyncStateController<TStepId> => {\n const isAsyncLoadingPhase = (phase: JourneyAsyncPhase): boolean => phase === \"evaluating-when\";\n\n const countLoadingSteps = (asyncState: JourneyAsyncState<TStepId>): number =>\n (Object.values(asyncState.byStep) as JourneyStepAsyncState[]).reduce(\n (count, state) => count + (isAsyncLoadingPhase(state.phase) ? 1 : 0),\n 0\n );\n\n let loadingCount = countLoadingSteps(runtime.peekSnapshot().async);\n\n const syncState = (asyncState: JourneyAsyncState<TStepId>) => {\n loadingCount = countLoadingSteps(asyncState);\n };\n\n const updateStepAsync = (\n stepId: TStepId,\n updater: (\n current: JourneyAsyncState<TStepId>[\"byStep\"][TStepId]\n ) => JourneyAsyncState<TStepId>[\"byStep\"][TStepId],\n runVersion?: number\n ) => {\n if (runVersion !== undefined && !runtime.isRunActive(runVersion)) {\n return;\n }\n\n const snapshot = runtime.peekSnapshot();\n const current = snapshot.async.byStep[stepId] ?? buildIdleStepAsyncState();\n const next = updater(current);\n if (\n current.phase === next.phase &&\n current.eventType === next.eventType &&\n current.transitionId === next.transitionId &&\n current.error === next.error\n ) {\n return;\n }\n\n const nextByStep = {\n ...snapshot.async.byStep,\n [stepId]: next\n };\n const wasLoading = isAsyncLoadingPhase(current.phase);\n const willBeLoading = isAsyncLoadingPhase(next.phase);\n const nextLoadingCount =\n wasLoading === willBeLoading ? loadingCount : loadingCount + (willBeLoading ? 1 : -1);\n runtime.setSnapshot(\n {\n ...snapshot,\n async: {\n isLoading: nextLoadingCount > 0,\n byStep: nextByStep\n }\n },\n { notify: true, reason: \"async\" }\n );\n loadingCount = nextLoadingCount;\n };\n\n return {\n syncState,\n updateStepAsync,\n setStepLoading: (\n stepId: TStepId,\n phase: JourneyAsyncPhase,\n eventType: string,\n transitionId?: string,\n runVersion?: number\n ) => {\n updateStepAsync(\n stepId,\n () => ({\n phase,\n eventType,\n transitionId: transitionId ?? null,\n error: null\n }),\n runVersion\n );\n },\n setStepIdle: (stepId: TStepId, runVersion?: number) => {\n updateStepAsync(stepId, () => buildIdleStepAsyncState(), runVersion);\n },\n setStepError: (\n stepId: TStepId,\n eventType: string,\n error: unknown,\n transitionId?: string,\n runVersion?: number\n ) => {\n updateStepAsync(\n stepId,\n () => ({\n phase: \"error\",\n eventType,\n transitionId: transitionId ?? null,\n error\n }),\n runVersion\n );\n }\n };\n};\n", "import type {\n JourneyComputed,\n JourneyDefinition,\n JourneyJsonObject,\n JourneyLinearTransitions,\n JourneyMode,\n JourneyResolvedDefinition,\n JourneySnapshot\n} from \"../types\";\n\nconst resolveLinearStepOrder = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n>(\n transitions: JourneyLinearTransitions<TContext, TStepId, TEventMap, THandlers>\n): readonly TStepId[] =>\n transitions.map((entry) =>\n typeof entry === \"string\" ? entry : entry.step\n ) as readonly TStepId[];\n\nconst countVisitedSteps = <TStepId extends string>(visited: Record<TStepId, boolean>): number => {\n let count = 0;\n for (const stepId in visited) {\n if (visited[stepId]) {\n count += 1;\n }\n }\n return count;\n};\n\nexport const createJourneyMachineComputedGetter = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n TStepMeta,\n THandlers extends Record<string, unknown>\n>(\n journey: JourneyDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>,\n resolvedJourney: JourneyResolvedDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>,\n getSnapshot: () => JourneySnapshot<TContext, TStepId>\n): (() => JourneyComputed<TStepId>) => {\n const mode: JourneyMode =\n journey.transitions === undefined\n ? \"headless\"\n : Array.isArray(journey.transitions)\n ? \"linear\"\n : \"graph\";\n const linearStepOrder =\n mode === \"linear\"\n ? resolveLinearStepOrder(\n journey.transitions as JourneyLinearTransitions<\n TContext,\n TStepId,\n Record<never, never>,\n THandlers\n >\n )\n : null;\n\n return () => {\n const snapshot = getSnapshot();\n const activeStepIndex = snapshot.history.index;\n const base = {\n activeStepId: snapshot.currentStepId,\n activeStepIndex,\n visitedStepCount: countVisitedSteps(snapshot.visited),\n isLoading: snapshot.async.isLoading,\n isIdle: snapshot.status === \"idled\",\n isRunning: snapshot.status === \"running\",\n isComplete: snapshot.status === \"completed\",\n isTerminated: snapshot.status === \"terminated\",\n isInitialStep: snapshot.currentStepId === resolvedJourney.initial\n } as const;\n\n if (mode === \"linear\" && linearStepOrder !== null) {\n const stepCount = linearStepOrder.length;\n const linearIndex = linearStepOrder.indexOf(snapshot.currentStepId);\n\n return {\n ...base,\n activeStepIndex: linearIndex === -1 ? activeStepIndex : linearIndex,\n mode: \"linear\",\n stepCount,\n journeyLength: stepCount,\n isFirstStep: linearIndex === 0,\n isLastStep: linearIndex === stepCount - 1,\n stepOrder: linearStepOrder\n };\n }\n\n if (mode === \"graph\") {\n return {\n ...base,\n mode: \"graph\"\n };\n }\n\n return {\n ...base,\n mode: \"headless\"\n };\n };\n};\n", "import {\n assertSerializableContext,\n buildInitialAsyncState,\n buildSnapshot,\n cloneContext,\n now,\n warnInDevelopment\n} from \"./helpers\";\n\nimport type { JourneyJsonObject, JourneySnapshot } from \"../types\";\nimport type { JourneyMachineAsyncStateController } from \"./async-state\";\nimport type { JourneyMachineRuntime } from \"./runtime\";\n\nexport type JourneyMachineControls<TContext extends JourneyJsonObject, TStepId extends string> = {\n startJourney: () => Promise<JourneySnapshot<TContext, TStepId>>;\n resetJourney: () => Promise<JourneySnapshot<TContext, TStepId>>;\n updateContext: (\n updater: (context: TContext) => TContext\n ) => Promise<JourneySnapshot<TContext, TStepId>>;\n clearStepError: (stepId?: TStepId) => Promise<JourneySnapshot<TContext, TStepId>>;\n dispose: () => void;\n};\n\nexport const createJourneyMachineControls = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n>({\n runtime,\n asyncState,\n initial,\n initialContext,\n steps\n}: {\n runtime: JourneyMachineRuntime<TContext, TStepId, TEventMap>;\n asyncState: JourneyMachineAsyncStateController<TStepId>;\n initial: TStepId;\n initialContext: TContext;\n steps: Record<TStepId, unknown>;\n}): JourneyMachineControls<TContext, TStepId> => {\n const warnDisposedNoop = (operation: string) => {\n warnInDevelopment(`Journey machine has been disposed; \"${operation}\" is a no-op.`);\n };\n\n const buildResetSnapshot = () =>\n buildSnapshot(\n [initial],\n 0,\n cloneContext(initialContext),\n \"idled\",\n buildInitialAsyncState(steps)\n );\n\n return {\n startJourney: () => {\n if (runtime.isDisposed()) {\n warnDisposedNoop(\"startJourney\");\n return Promise.resolve(runtime.getSnapshot());\n }\n\n return runtime.queue(\n async () => {\n const snapshot = runtime.peekSnapshot();\n if (snapshot.status !== \"idled\") {\n return runtime.getSnapshot();\n }\n\n const committedSnapshot = runtime.setSnapshot(\n {\n ...snapshot,\n status: \"running\"\n },\n { notify: true, reason: \"start\" }\n );\n runtime.emit({\n type: \"journey.start\",\n stepId: committedSnapshot.currentStepId,\n timestamp: now()\n });\n return runtime.getSnapshot();\n },\n () => runtime.getSnapshot()\n );\n },\n resetJourney: () => {\n if (runtime.isDisposed()) {\n warnDisposedNoop(\"resetJourney\");\n return Promise.resolve(runtime.getSnapshot());\n }\n\n runtime.cancelInFlight();\n return runtime.queue(\n async () => {\n const committedSnapshot = runtime.setSnapshot(buildResetSnapshot(), {\n notify: true,\n reason: \"reset\"\n });\n runtime.emit({\n type: \"journey.reset\",\n stepId: committedSnapshot.currentStepId,\n timestamp: now()\n });\n asyncState.syncState(committedSnapshot.async);\n return runtime.getSnapshot();\n },\n () => runtime.getSnapshot()\n );\n },\n updateContext: (updater) => {\n if (runtime.isDisposed()) {\n warnDisposedNoop(\"updateContext\");\n return Promise.resolve(runtime.getSnapshot());\n }\n\n return runtime.queue(\n async () => {\n const snapshot = runtime.peekSnapshot();\n const nextContext = assertSerializableContext(updater(cloneContext(snapshot.context)));\n const committedSnapshot = runtime.setSnapshot(\n {\n ...snapshot,\n context: nextContext\n },\n { notify: true, reason: \"context\" }\n );\n return committedSnapshot;\n },\n () => runtime.getSnapshot()\n );\n },\n clearStepError: (stepId?: TStepId) => {\n if (runtime.isDisposed()) {\n warnDisposedNoop(\"clearStepError\");\n return Promise.resolve(runtime.getSnapshot());\n }\n\n return runtime.queue(\n async () => {\n const snapshot = runtime.peekSnapshot();\n const resolvedStep = stepId ?? snapshot.currentStepId;\n if (!(resolvedStep in steps)) {\n return runtime.getSnapshot();\n }\n\n asyncState.setStepIdle(resolvedStep);\n return runtime.getSnapshot();\n },\n () => runtime.getSnapshot()\n );\n },\n dispose: () => {\n runtime.dispose();\n }\n };\n};\n", "import {\n assertStepExists,\n buildSendResult,\n buildSnapshot,\n normalizeStepCount,\n now,\n transitionSnapshot\n} from \"./helpers\";\n\nimport type {\n JourneyEvent,\n JourneyJsonObject,\n JourneyResolvedTransition,\n JourneySendResult,\n JourneySnapshot,\n JourneyTerminal\n} from \"../types\";\nimport type { JourneyMachineRuntime } from \"./runtime\";\n\nexport type JourneyLifecycleScheduler<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n> = (args: {\n previousSnapshot: JourneySnapshot<TContext, TStepId>;\n snapshot: JourneySnapshot<TContext, TStepId>;\n from: TStepId;\n to: TStepId | JourneyTerminal;\n event:\n | JourneyEvent<TStepId, TEventMap>\n | { type: \"goToLastVisitedStep\" }\n | { type: \"goToPreviousStep\" };\n transitionId: string | null;\n label?: string;\n runVersion: number;\n transition?: JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>;\n}) => void;\n\nexport type JourneyMachineNavigationController<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n> = {\n applyPreviousNavigation: (\n requestedSteps?: number,\n transitionId?: string,\n runVersion?: number\n ) => JourneySendResult<TContext, TStepId>;\n applyLastVisitedNavigation: (\n transitionId?: string,\n runVersion?: number\n ) => JourneySendResult<TContext, TStepId>;\n hasDeclaredTransitionForEvent: (fromStep: TStepId, eventType: string) => boolean;\n commitTerminalTransition: (\n fromStep: TStepId,\n target: JourneyTerminal,\n transitionEvent: { type: string },\n transitionId: string | null,\n transition: JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers> | undefined,\n nextContext: TContext,\n runVersion?: number\n ) => JourneySendResult<TContext, TStepId>;\n commitStepTransition: (\n fromStep: TStepId,\n target: TStepId,\n transitionEvent: JourneyEvent<TStepId, TEventMap>,\n transition: JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>,\n nextContext: TContext,\n runVersion?: number\n ) => JourneySendResult<TContext, TStepId>;\n};\n\nexport const createJourneyMachineNavigationController = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n>({\n runtime,\n steps,\n transitions,\n scheduleLifecycle\n}: {\n runtime: JourneyMachineRuntime<TContext, TStepId, TEventMap>;\n steps: Record<TStepId, unknown>;\n transitions: readonly JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>[];\n scheduleLifecycle: JourneyLifecycleScheduler<TContext, TStepId, TEventMap, THandlers>;\n}): JourneyMachineNavigationController<TContext, TStepId, TEventMap, THandlers> => ({\n applyPreviousNavigation: (requestedSteps?: number, transitionId?: string, runVersion = 0) => {\n const snapshot = runtime.peekSnapshot();\n if (snapshot.status !== \"running\") {\n return buildSendResult(runtime.getSnapshot(), false);\n }\n\n const stepsToGoBack = normalizeStepCount(requestedSteps);\n if (snapshot.history.index === 0) {\n return buildSendResult(runtime.getSnapshot(), false);\n }\n\n const from = snapshot.currentStepId;\n const nextIndex = Math.max(0, snapshot.history.index - stepsToGoBack);\n const appliedSteps = snapshot.history.index - nextIndex;\n if (appliedSteps <= 0) {\n return buildSendResult(runtime.getSnapshot(), false);\n }\n\n runtime.emit({ type: \"step.exit\", stepId: from, timestamp: now() });\n const committedSnapshot = runtime.setSnapshot(\n buildSnapshot(\n snapshot.history.timeline,\n nextIndex,\n snapshot.context,\n snapshot.status,\n snapshot.async,\n snapshot.visited\n ),\n {\n notify: true,\n reason: \"navigation\"\n }\n );\n\n runtime.emit({\n type: \"navigation.previous\",\n from,\n to: committedSnapshot.currentStepId,\n requestedSteps: stepsToGoBack,\n appliedSteps,\n timestamp: now()\n });\n runtime.emit({ type: \"step.enter\", stepId: committedSnapshot.currentStepId, timestamp: now() });\n scheduleLifecycle({\n previousSnapshot: snapshot,\n snapshot: committedSnapshot,\n from,\n to: committedSnapshot.currentStepId,\n event: { type: \"goToPreviousStep\" },\n transitionId: transitionId ?? null,\n runVersion\n });\n\n return buildSendResult(committedSnapshot, true, {\n ...(transitionId !== undefined ? { transitionId } : {})\n });\n },\n applyLastVisitedNavigation: (transitionId?: string, runVersion = 0) => {\n const snapshot = runtime.peekSnapshot();\n if (snapshot.status !== \"running\") {\n return buildSendResult(runtime.getSnapshot(), false);\n }\n\n const targetIndex = snapshot.history.timeline.length - 1;\n if (snapshot.history.index >= targetIndex) {\n return buildSendResult(runtime.getSnapshot(), false);\n }\n\n const from = snapshot.currentStepId;\n runtime.emit({ type: \"step.exit\", stepId: from, timestamp: now() });\n const committedSnapshot = runtime.setSnapshot(\n buildSnapshot(\n snapshot.history.timeline,\n targetIndex,\n snapshot.context,\n snapshot.status,\n snapshot.async,\n snapshot.visited\n ),\n {\n notify: true,\n reason: \"navigation\"\n }\n );\n\n runtime.emit({\n type: \"navigation.lastVisited\",\n from,\n to: committedSnapshot.currentStepId,\n timestamp: now()\n });\n runtime.emit({ type: \"step.enter\", stepId: committedSnapshot.currentStepId, timestamp: now() });\n scheduleLifecycle({\n previousSnapshot: snapshot,\n snapshot: committedSnapshot,\n from,\n to: committedSnapshot.currentStepId,\n event: { type: \"goToLastVisitedStep\" },\n transitionId: transitionId ?? null,\n runVersion\n });\n\n return buildSendResult(committedSnapshot, true, {\n ...(transitionId !== undefined ? { transitionId } : {})\n });\n },\n hasDeclaredTransitionForEvent: (fromStep: TStepId, eventType: string) =>\n transitions.some((transition) => {\n const fromMatches = transition.from === \"*\" || transition.from === fromStep;\n return fromMatches && transition.event === eventType;\n }),\n commitTerminalTransition: (\n fromStep: TStepId,\n target: JourneyTerminal,\n transitionEvent: { type: string },\n transitionId: string | null,\n transition: JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers> | undefined,\n nextContext: TContext,\n runVersion = 0\n ) => {\n const snapshot = runtime.peekSnapshot();\n const normalizedTimeline = snapshot.history.timeline.slice(0, snapshot.history.index + 1);\n const committedSnapshot = runtime.setSnapshot(\n {\n ...snapshot,\n history: {\n timeline: normalizedTimeline,\n index: normalizedTimeline.length - 1\n },\n context: nextContext,\n status: target === \"COMPLETE\" ? \"completed\" : \"terminated\"\n },\n {\n notify: true,\n reason: \"transition\"\n }\n );\n\n runtime.emit({\n type: \"transition.success\",\n from: fromStep,\n to: target,\n eventType: transitionEvent.type,\n transitionId,\n ...(transition?.label !== undefined ? { label: transition.label } : {}),\n timestamp: now()\n });\n runtime.emit({\n type: target === \"COMPLETE\" ? \"journey.completed\" : \"journey.terminated\",\n stepId: committedSnapshot.currentStepId,\n timestamp: now()\n });\n scheduleLifecycle({\n previousSnapshot: snapshot,\n snapshot: committedSnapshot,\n from: fromStep,\n to: target,\n event: transitionEvent as JourneyEvent<TStepId, TEventMap>,\n transitionId,\n ...(transition?.label !== undefined ? { label: transition.label } : {}),\n runVersion,\n ...(transition !== undefined ? { transition } : {})\n });\n\n return buildSendResult(committedSnapshot, true, {\n ...(transitionId !== null ? { transitionId } : {}),\n ...(transition?.label !== undefined ? { label: transition.label } : {})\n });\n },\n commitStepTransition: (\n fromStep: TStepId,\n target: TStepId,\n transitionEvent: JourneyEvent<TStepId, TEventMap>,\n transition: JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>,\n nextContext: TContext,\n runVersion = 0\n ) => {\n assertStepExists(steps, target, `Transition points to unknown step \"${target}\".`);\n\n const snapshot = runtime.peekSnapshot();\n const beforeCurrent = snapshot.currentStepId;\n if (beforeCurrent !== target) {\n runtime.emit({ type: \"step.exit\", stepId: beforeCurrent, timestamp: now() });\n }\n\n const committedSnapshot = runtime.setSnapshot(\n transitionSnapshot(snapshot, target, nextContext),\n {\n notify: true,\n reason: \"transition\"\n }\n );\n\n runtime.emit({\n type: \"transition.success\",\n from: fromStep,\n to: committedSnapshot.currentStepId,\n eventType: transitionEvent.type,\n transitionId: transition.id,\n ...(transition.label !== undefined ? { label: transition.label } : {}),\n timestamp: now()\n });\n if (beforeCurrent !== committedSnapshot.currentStepId) {\n runtime.emit({\n type: \"step.enter\",\n stepId: committedSnapshot.currentStepId,\n timestamp: now()\n });\n }\n scheduleLifecycle({\n previousSnapshot: snapshot,\n snapshot: committedSnapshot,\n from: fromStep,\n to: committedSnapshot.currentStepId,\n event: transitionEvent,\n transitionId: transition.id,\n ...(transition.label !== undefined ? { label: transition.label } : {}),\n runVersion,\n transition\n });\n\n return buildSendResult(committedSnapshot, true, {\n transitionId: transition.id,\n ...(transition.label !== undefined ? { label: transition.label } : {})\n });\n }\n});\n", "import { isPromiseLike, warnInDevelopment } from \"./helpers\";\n\nimport type {\n JourneyDefinition,\n JourneyJsonObject,\n JourneyMachine,\n JourneyMachinePlugin,\n JourneyMachinePluginHooks,\n JourneyMachinePluginSetupContext,\n JourneyMachineSnapshotReason,\n JourneyResolvedDefinition,\n JourneySnapshot\n} from \"../types\";\n\nexport type JourneyMachinePluginController<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n TStepMeta,\n THandlers extends Record<string, unknown>\n> = {\n hydrateSnapshot: (\n snapshot: JourneySnapshot<TContext, TStepId>\n ) => JourneySnapshot<TContext, TStepId>;\n onSnapshotChange: (args: {\n previousSnapshot: JourneySnapshot<TContext, TStepId>;\n snapshot: JourneySnapshot<TContext, TStepId>;\n reason: JourneyMachineSnapshotReason;\n }) => void;\n extendMachine: (\n machine: JourneyMachine<TContext, TStepId, TEventMap, TStepMeta, THandlers>\n ) => JourneyMachine<TContext, TStepId, TEventMap, TStepMeta, THandlers>;\n dispose: () => void;\n};\n\nexport const createJourneyMachinePluginController = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n TStepMeta,\n THandlers extends Record<string, unknown> = Record<never, never>\n>({\n plugins,\n setupContext\n}: {\n plugins: readonly JourneyMachinePlugin[];\n setupContext: JourneyMachinePluginSetupContext<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers\n >;\n}): JourneyMachinePluginController<TContext, TStepId, TEventMap, TStepMeta, THandlers> => {\n const hooks: {\n name: string;\n hooks: JourneyMachinePluginHooks<TContext, TStepId, TEventMap, TStepMeta, THandlers>;\n }[] = [];\n\n for (const plugin of plugins) {\n try {\n hooks.push({\n name: plugin.name,\n hooks: plugin.setup(setupContext) as JourneyMachinePluginHooks<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers\n >\n });\n } catch (error) {\n for (const initializedPlugin of [...hooks].reverse()) {\n try {\n initializedPlugin.hooks.dispose?.();\n } catch {\n // Preserve the original setup error; cleanup failures are secondary.\n }\n }\n\n const message = error instanceof Error ? error.message : String(error);\n const pluginError = new Error(`Journey plugin \"${plugin.name}\" setup failed: ${message}`);\n Object.assign(pluginError, { cause: error });\n throw pluginError;\n }\n }\n\n return {\n hydrateSnapshot: (snapshot) =>\n hooks.reduce(\n (currentSnapshot, plugin) =>\n plugin.hooks.hydrateSnapshot?.(currentSnapshot) ?? currentSnapshot,\n snapshot\n ),\n onSnapshotChange: ({ previousSnapshot, snapshot, reason }) => {\n let firstError: unknown;\n for (const plugin of hooks) {\n try {\n const result = plugin.hooks.onSnapshotChange?.({\n previousSnapshot,\n snapshot,\n reason\n });\n if (isPromiseLike(result)) {\n warnInDevelopment(\n `Journey plugin \"${plugin.name}\" returned a Promise from onSnapshotChange. ` +\n \"This hook must be synchronous; returning a Promise blocks the machine and the await is dropped.\"\n );\n }\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError !== undefined) {\n throw firstError;\n }\n },\n extendMachine: (machine) => {\n const extensionTarget = machine as JourneyMachine<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers\n >;\n const writableExtensionTarget = machine as Record<string, unknown>;\n const pluginExtensionKeys = new Map<string, string>();\n\n for (const plugin of hooks) {\n const extension = plugin.hooks.augmentMachine?.({\n machine,\n journey: setupContext.journey as JourneyDefinition<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers\n >,\n resolvedJourney: setupContext.resolvedJourney as JourneyResolvedDefinition<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers\n >\n });\n\n if (!extension) {\n continue;\n }\n\n for (const [key, value] of Object.entries(extension)) {\n const existingPlugin = pluginExtensionKeys.get(key);\n if (existingPlugin) {\n throw new Error(\n `Journey plugin \"${plugin.name}\" cannot add \"${key}\" \u2014 already provided by plugin \"${existingPlugin}\".`\n );\n }\n if (key in extensionTarget) {\n throw new Error(\n `Journey plugin \"${plugin.name}\" cannot override machine property \"${key}\".`\n );\n }\n pluginExtensionKeys.set(key, plugin.name);\n writableExtensionTarget[key] = value;\n }\n }\n\n return extensionTarget;\n },\n dispose: () => {\n let firstError: unknown;\n for (const plugin of hooks) {\n try {\n plugin.hooks.dispose?.();\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError !== undefined) {\n throw firstError;\n }\n }\n };\n};\n", "import { errorInDevelopment, stabilizeSnapshot } from \"./helpers\";\n\nimport type {\n JourneyEqualityFn,\n JourneyJsonObject,\n JourneyMachineSnapshotReason,\n JourneyObservationEvent,\n JourneySelector,\n JourneySnapshot\n} from \"../types\";\n\ntype SnapshotOptions = {\n notify?: boolean;\n reason?: JourneyMachineSnapshotReason;\n};\n\nexport type JourneyMachineRuntime<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n> = {\n getSnapshot: () => JourneySnapshot<TContext, TStepId>;\n peekSnapshot: () => JourneySnapshot<TContext, TStepId>;\n setSnapshot: (\n nextSnapshot: JourneySnapshot<TContext, TStepId>,\n options?: SnapshotOptions\n ) => JourneySnapshot<TContext, TStepId>;\n isDisposed: () => boolean;\n isRunActive: (runVersion: number) => boolean;\n cancelInFlight: () => void;\n openLifecycle: (runVersion: number) => AbortController | null;\n closeLifecycle: (controller: AbortController) => void;\n queue: <T>(\n runner: (runVersion: number, signal: AbortSignal) => Promise<T>,\n onCanceled: () => T\n ) => Promise<T>;\n notify: () => void;\n emit: (event: JourneyObservationEvent<TStepId, TEventMap>) => void;\n subscribe: (listener: () => void) => () => void;\n subscribeSelector: <TSelected>(\n selector: JourneySelector<TContext, TStepId, TSelected>,\n listener: (next: TSelected, previous: TSelected) => void,\n equalityFn?: JourneyEqualityFn<TSelected>\n ) => () => void;\n subscribeEvent: (\n listener: (event: JourneyObservationEvent<TStepId, TEventMap>) => void\n ) => () => void;\n dispose: () => void;\n};\n\nexport const createJourneyMachineRuntime = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n>({\n snapshot: initialSnapshot,\n onSnapshotChange,\n onDispose,\n onListenerError\n}: {\n snapshot: JourneySnapshot<TContext, TStepId>;\n onSnapshotChange?: (args: {\n previousSnapshot: JourneySnapshot<TContext, TStepId>;\n snapshot: JourneySnapshot<TContext, TStepId>;\n reason: JourneyMachineSnapshotReason;\n }) => void;\n onDispose?: () => void;\n onListenerError?: (error: unknown, context: \"snapshot\" | \"event\") => void;\n}): JourneyMachineRuntime<TContext, TStepId, TEventMap> => {\n let snapshot = stabilizeSnapshot(initialSnapshot);\n let exposedSnapshot = stabilizeSnapshot(snapshot);\n const listeners = new Set<() => void>();\n const eventListeners = new Set<(event: JourneyObservationEvent<TStepId, TEventMap>) => void>();\n let actionQueue: Promise<void> = Promise.resolve();\n let lifecycleVersion = 0;\n let isDisposed = false;\n let activeAbortController: AbortController | null = null;\n const lifecycleAbortControllers = new Set<AbortController>();\n const reportListenerError =\n onListenerError ??\n ((error: unknown, context: \"snapshot\" | \"event\") => {\n errorInDevelopment(`Journey ${context} listener threw an error.`, error);\n });\n\n const notify = () => {\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n // Individual listener failure must not block other listeners.\n reportListenerError(error, \"snapshot\");\n }\n }\n };\n\n const emit = (event: JourneyObservationEvent<TStepId, TEventMap>) => {\n for (const listener of eventListeners) {\n try {\n listener(event);\n } catch (error) {\n // Individual listener failure must not block other listeners.\n reportListenerError(error, \"event\");\n }\n }\n };\n\n const setSnapshot = (\n nextSnapshot: JourneySnapshot<TContext, TStepId>,\n options: SnapshotOptions = {}\n ) => {\n const previousExposedSnapshot = exposedSnapshot;\n const stableSnapshot = stabilizeSnapshot(nextSnapshot);\n const nextExposedSnapshot = stabilizeSnapshot(stableSnapshot);\n onSnapshotChange?.({\n previousSnapshot: stabilizeSnapshot(previousExposedSnapshot),\n snapshot: stabilizeSnapshot(nextExposedSnapshot),\n reason: options.reason ?? \"transition\"\n });\n snapshot = stableSnapshot;\n exposedSnapshot = nextExposedSnapshot;\n if (options.notify) {\n notify();\n }\n return nextExposedSnapshot;\n };\n\n const isRunActive = (runVersion: number): boolean =>\n !isDisposed && runVersion === lifecycleVersion;\n\n const cancelInFlight = () => {\n lifecycleVersion += 1;\n if (activeAbortController && !activeAbortController.signal.aborted) {\n activeAbortController.abort();\n }\n activeAbortController = null;\n for (const controller of lifecycleAbortControllers) {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n }\n lifecycleAbortControllers.clear();\n actionQueue = Promise.resolve();\n };\n\n const openLifecycle = (runVersion: number): AbortController | null => {\n if (!isRunActive(runVersion)) {\n return null;\n }\n\n const controller = new AbortController();\n if (!isRunActive(runVersion)) {\n controller.abort();\n return null;\n }\n\n lifecycleAbortControllers.add(controller);\n return controller;\n };\n\n const closeLifecycle = (controller: AbortController) => {\n lifecycleAbortControllers.delete(controller);\n };\n\n const queue = <T>(\n runner: (runVersion: number, signal: AbortSignal) => Promise<T>,\n onCanceled: () => T\n ): Promise<T> => {\n const runVersion = lifecycleVersion;\n const createQueuedRunner = async () => {\n if (!isRunActive(runVersion)) {\n return onCanceled();\n }\n const abortController = new AbortController();\n activeAbortController = abortController;\n\n try {\n if (!isRunActive(runVersion)) {\n abortController.abort();\n return onCanceled();\n }\n\n return await runner(runVersion, abortController.signal);\n } finally {\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n }\n };\n\n const resultPromise = actionQueue.then(createQueuedRunner, createQueuedRunner);\n // Both handlers map to `undefined` intentionally: a failed operation must\n // not block subsequent queued operations \u2014 each entry runs independently.\n actionQueue = resultPromise.then(\n () => undefined,\n () => undefined\n );\n return resultPromise;\n };\n\n const subscribe = (listener: () => void) => {\n if (isDisposed) {\n return () => undefined;\n }\n\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n };\n\n const subscribeSelector = <TSelected>(\n selector: JourneySelector<TContext, TStepId, TSelected>,\n listener: (next: TSelected, previous: TSelected) => void,\n equalityFn?: JourneyEqualityFn<TSelected>\n ) => {\n if (isDisposed) {\n return () => undefined;\n }\n\n const isEqual = equalityFn ?? Object.is;\n let selected = selector(exposedSnapshot);\n\n return subscribe(() => {\n const nextSelected = selector(exposedSnapshot);\n if (isEqual(selected, nextSelected)) {\n return;\n }\n\n const previous = selected;\n selected = nextSelected;\n listener(nextSelected, previous);\n });\n };\n\n const subscribeEvent = (\n listener: (event: JourneyObservationEvent<TStepId, TEventMap>) => void\n ) => {\n if (isDisposed) {\n return () => undefined;\n }\n\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n };\n\n const dispose = () => {\n if (isDisposed) {\n return;\n }\n\n isDisposed = true;\n cancelInFlight();\n listeners.clear();\n eventListeners.clear();\n onDispose?.();\n };\n\n return {\n getSnapshot: () => exposedSnapshot,\n peekSnapshot: () => snapshot,\n setSnapshot,\n isDisposed: () => isDisposed,\n isRunActive,\n cancelInFlight,\n openLifecycle,\n closeLifecycle,\n queue,\n notify,\n emit,\n subscribe,\n subscribeSelector,\n subscribeEvent,\n dispose\n };\n};\n", "import {\n assertSerializableContext,\n assertStepExists,\n buildSendResult,\n JourneyDisposedError,\n isGoToStepByIdEvent,\n isTerminalTarget,\n now,\n resolveTransitionTarget,\n selectTransition,\n stabilizeSnapshot\n} from \"./helpers\";\n\nimport type {\n JourneyEvent,\n JourneyJsonObject,\n JourneyResolvedTransition,\n JourneySendEvent,\n JourneySendResult,\n JourneyTransitionArgsForEvent,\n JourneyTransitionUpdateContextArgsForEvent\n} from \"../types\";\nimport type { JourneyMachineAsyncStateController } from \"./async-state\";\nimport type { JourneyMachineNavigationController } from \"./navigation\";\nimport type { JourneyMachineRuntime } from \"./runtime\";\n\ntype RuntimeSendEvent<\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n> = JourneySendEvent<TStepId, TEventMap>;\n\ntype RuntimeTransitionEvent<\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n> = JourneyEvent<TStepId, TEventMap>;\n\ntype RuntimeTransition<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n> = JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>;\n\nexport type JourneyMachineSendController<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>\n> = {\n executeSend: (\n event: JourneySendEvent<TStepId, TEventMap>,\n runVersion: number,\n signal: AbortSignal\n ) => Promise<JourneySendResult<TContext, TStepId>>;\n buildCanceledSendResult: (operation?: string) => JourneySendResult<TContext, TStepId>;\n};\n\nexport const createJourneyMachineSendController = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n>(\n runtime: JourneyMachineRuntime<TContext, TStepId, TEventMap>,\n asyncState: JourneyMachineAsyncStateController<TStepId>,\n navigation: JourneyMachineNavigationController<TContext, TStepId, TEventMap, THandlers>,\n headless: boolean,\n steps: Record<TStepId, unknown>,\n transitions: readonly JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>[],\n handlers: THandlers,\n requireExplicitCompletion: boolean,\n defaultTimeoutMs: number | undefined\n): JourneyMachineSendController<TContext, TStepId, TEventMap> => {\n const buildCanceledSendResult = (operation = \"send\"): JourneySendResult<TContext, TStepId> =>\n buildSendResult(runtime.getSnapshot(), false, {\n ...(runtime.isDisposed() ? { error: new JourneyDisposedError(operation) } : {})\n });\n\n const buildErroredSendResult = (\n error: unknown,\n transitionId?: string,\n label?: string\n ): JourneySendResult<TContext, TStepId> =>\n buildSendResult(runtime.getSnapshot(), false, {\n ...(transitionId !== undefined ? { transitionId } : {}),\n ...(label !== undefined ? { label } : {}),\n error\n });\n\n const buildTransitionErrorResult = (\n fromStep: TStepId,\n eventType: string,\n error: unknown,\n transitionId: string | null,\n label: string | undefined,\n runVersion: number,\n skipAsyncStateUpdate = false\n ): JourneySendResult<TContext, TStepId> => {\n if (!skipAsyncStateUpdate) {\n asyncState.setStepError(fromStep, eventType, error, transitionId ?? undefined, runVersion);\n }\n runtime.emit({\n type: \"transition.error\",\n from: fromStep,\n eventType,\n transitionId,\n ...(label !== undefined ? { label } : {}),\n error,\n timestamp: now()\n });\n return buildErroredSendResult(error, transitionId ?? undefined, label);\n };\n\n const resolveTransitionsForSend = (\n event: RuntimeSendEvent<TStepId, TEventMap>,\n fromStep: TStepId\n ): {\n transitionsToEvaluate: readonly RuntimeTransition<TContext, TStepId, TEventMap, THandlers>[];\n earlyResult: JourneySendResult<TContext, TStepId> | null;\n } => {\n if (!isGoToStepByIdEvent(event)) {\n return { transitionsToEvaluate: transitions, earlyResult: null };\n }\n\n assertStepExists(steps, event.stepId, `Cannot goToStepById unknown step \"${event.stepId}\".`);\n\n return {\n transitionsToEvaluate: transitions.filter((transition) => {\n const fromMatches = transition.from === \"*\" || transition.from === fromStep;\n return (\n fromMatches &&\n transition.event === \"goToStepById\" &&\n \"to\" in transition &&\n transition.to === event.stepId\n );\n }),\n earlyResult: null\n };\n };\n\n const selectTransitionForSend = async (\n transitionsToEvaluate: readonly RuntimeTransition<TContext, TStepId, TEventMap, THandlers>[],\n transitionEvent: RuntimeTransitionEvent<TStepId, TEventMap>,\n fromStep: TStepId,\n runVersion: number,\n signal: AbortSignal\n ): Promise<\n | {\n transition: RuntimeTransition<TContext, TStepId, TEventMap, THandlers> | null;\n earlyResult: null;\n }\n | { transition: null; earlyResult: JourneySendResult<TContext, TStepId> }\n > => {\n let transition;\n let asyncGuardErrorTransitionId: string | null = null;\n let asyncGuardErrorLabel: string | undefined;\n let asyncGuardErrorHandled = false;\n try {\n transition = (await selectTransition(\n transitionsToEvaluate as unknown as never,\n stabilizeSnapshot(runtime.peekSnapshot()),\n transitionEvent,\n signal,\n handlers,\n {\n onAsyncGuardStart: (currentTransition) => {\n asyncState.setStepLoading(\n fromStep,\n \"evaluating-when\",\n transitionEvent.type,\n currentTransition.id,\n runVersion\n );\n },\n onAsyncGuardSuccess: () => {\n asyncState.setStepIdle(fromStep, runVersion);\n },\n onAsyncGuardError: (currentTransition, error) => {\n asyncGuardErrorTransitionId = currentTransition.id ?? null;\n asyncGuardErrorLabel = currentTransition.label;\n asyncGuardErrorHandled = true;\n asyncState.setStepError(\n fromStep,\n transitionEvent.type,\n error,\n currentTransition.id,\n runVersion\n );\n }\n },\n defaultTimeoutMs\n )) as RuntimeTransition<TContext, TStepId, TEventMap, THandlers> | null;\n } catch (error) {\n if (!runtime.isRunActive(runVersion)) {\n return { transition: null, earlyResult: buildCanceledSendResult(transitionEvent.type) };\n }\n\n return {\n transition: null,\n earlyResult: buildTransitionErrorResult(\n fromStep,\n transitionEvent.type,\n error,\n asyncGuardErrorTransitionId,\n asyncGuardErrorLabel,\n runVersion,\n asyncGuardErrorHandled\n )\n };\n }\n\n return { transition, earlyResult: null };\n };\n\n const handleNoTransitionMatch = (\n event: RuntimeSendEvent<TStepId, TEventMap>,\n fromStep: TStepId,\n runVersion: number\n ): JourneySendResult<TContext, TStepId> => {\n if (isGoToStepByIdEvent(event)) {\n return buildCanceledSendResult(event.type);\n }\n\n if (event.type === \"goToPreviousStep\") {\n const fallbackResult = navigation.applyPreviousNavigation(1, event.type, runVersion);\n if (fallbackResult.transitioned) {\n runtime.emit({\n type: \"transition.success\",\n from: fromStep,\n to: fallbackResult.snapshot.currentStepId,\n eventType: event.type,\n transitionId: null,\n timestamp: now()\n });\n }\n return fallbackResult;\n }\n\n if (\n event.type === \"goToNextStep\" &&\n !requireExplicitCompletion &&\n !navigation.hasDeclaredTransitionForEvent(fromStep, \"goToNextStep\")\n ) {\n return navigation.commitTerminalTransition(\n fromStep,\n \"COMPLETE\",\n event,\n null,\n undefined,\n runtime.peekSnapshot().context,\n runVersion\n );\n }\n\n if (\n event.type === \"completeJourney\" &&\n !navigation.hasDeclaredTransitionForEvent(fromStep, \"completeJourney\")\n ) {\n return navigation.commitTerminalTransition(\n fromStep,\n \"COMPLETE\",\n event,\n null,\n undefined,\n runtime.peekSnapshot().context,\n runVersion\n );\n }\n\n if (\n event.type === \"terminateJourney\" &&\n !navigation.hasDeclaredTransitionForEvent(fromStep, \"terminateJourney\")\n ) {\n return navigation.commitTerminalTransition(\n fromStep,\n \"TERMINATED\",\n event,\n null,\n undefined,\n runtime.peekSnapshot().context,\n runVersion\n );\n }\n\n return buildCanceledSendResult(event.type);\n };\n\n const resolveNextContext = (\n transition: RuntimeTransition<TContext, TStepId, TEventMap, THandlers>,\n transitionEvent: RuntimeTransitionEvent<TStepId, TEventMap>,\n fromStep: TStepId,\n runVersion: number\n ):\n | { nextContext: TContext; earlyResult: null }\n | { nextContext: null; earlyResult: JourneySendResult<TContext, TStepId> } => {\n const snapshot = runtime.peekSnapshot();\n if (!transition.updateContext) {\n return { nextContext: snapshot.context, earlyResult: null };\n }\n\n try {\n const nextContext = (\n transition.updateContext as (\n args: JourneyTransitionUpdateContextArgsForEvent<\n TContext,\n TStepId,\n TEventMap,\n typeof transitionEvent.type\n >\n ) => TContext\n )({\n snapshot: stabilizeSnapshot(snapshot),\n context: snapshot.context,\n from: snapshot.currentStepId,\n timeline: snapshot.history.timeline,\n index: snapshot.history.index,\n event: transitionEvent as JourneyTransitionArgsForEvent<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n typeof transitionEvent.type\n >[\"event\"]\n });\n\n return {\n nextContext: assertSerializableContext(nextContext),\n earlyResult: null\n };\n } catch (error) {\n if (!runtime.isRunActive(runVersion)) {\n return { nextContext: null, earlyResult: buildCanceledSendResult(transitionEvent.type) };\n }\n\n return {\n nextContext: null,\n earlyResult: buildTransitionErrorResult(\n fromStep,\n transitionEvent.type,\n error,\n transition.id,\n transition.label,\n runVersion\n )\n };\n }\n };\n\n return {\n buildCanceledSendResult,\n executeSend: async (\n event: RuntimeSendEvent<TStepId, TEventMap>,\n runVersion: number,\n signal: AbortSignal\n ): Promise<JourneySendResult<TContext, TStepId>> => {\n if (runtime.peekSnapshot().status !== \"running\") {\n return buildCanceledSendResult(event.type);\n }\n\n const fromStep = runtime.peekSnapshot().currentStepId;\n const transitionEvent = event as RuntimeTransitionEvent<TStepId, TEventMap>;\n runtime.emit({ type: \"transition.start\", from: fromStep, event, timestamp: now() });\n\n if (headless) {\n if (isGoToStepByIdEvent(event)) {\n return navigation.commitStepTransition(\n fromStep,\n event.stepId,\n transitionEvent,\n {\n from: fromStep,\n event: \"goToStepById\",\n to: event.stepId\n } as RuntimeTransition<TContext, TStepId, TEventMap, THandlers>,\n runtime.peekSnapshot().context,\n runVersion\n );\n }\n\n if (\n event.type !== \"completeJourney\" &&\n event.type !== \"terminateJourney\" &&\n event.type !== \"goToPreviousStep\"\n ) {\n return buildCanceledSendResult(event.type);\n }\n }\n\n const transitionResolution = resolveTransitionsForSend(event, fromStep);\n if (transitionResolution.earlyResult) {\n return transitionResolution.earlyResult;\n }\n\n const selectionResolution = await selectTransitionForSend(\n transitionResolution.transitionsToEvaluate,\n transitionEvent,\n fromStep,\n runVersion,\n signal\n );\n if (selectionResolution.earlyResult) {\n return selectionResolution.earlyResult;\n }\n\n if (!runtime.isRunActive(runVersion)) {\n return buildCanceledSendResult(event.type);\n }\n\n const { transition } = selectionResolution;\n if (!transition) {\n return handleNoTransitionMatch(event, fromStep, runVersion);\n }\n\n asyncState.setStepIdle(fromStep, runVersion);\n\n const contextResolution = resolveNextContext(\n transition,\n transitionEvent,\n fromStep,\n runVersion\n );\n if (contextResolution.earlyResult) {\n return contextResolution.earlyResult;\n }\n\n const target = resolveTransitionTarget(transition);\n if (isTerminalTarget(target)) {\n return navigation.commitTerminalTransition(\n fromStep,\n target,\n transitionEvent,\n transition.id ?? null,\n transition,\n contextResolution.nextContext,\n runVersion\n );\n }\n\n return navigation.commitStepTransition(\n fromStep,\n target,\n transitionEvent,\n transition,\n contextResolution.nextContext,\n runVersion\n );\n }\n };\n};\n", "import { validateFiniteTimeout } from \"./helpers\";\n\nimport type {\n JourneyDefinition,\n JourneyJsonObject,\n JourneyResolvedDefinition,\n JourneyResolvedTransition,\n JourneyTransition,\n JourneyTransitionGraph\n} from \"../types\";\n\nconst hashTransitionDescriptor = (value: string) => {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n};\n\nconst buildResolvedTransitions = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>\n>(\n transitions: readonly JourneyTransition<TContext, TStepId, TEventMap, THandlers>[]\n): JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>[] => {\n const transitionRouteCounts = new Map<string, number>();\n const usedIds = new Set<string>();\n\n return transitions.map((transition) => {\n const target =\n transition.event === \"completeJourney\"\n ? \"COMPLETE\"\n : transition.event === \"terminateJourney\"\n ? \"TERMINATED\"\n : String(transition.to);\n const routeKey = JSON.stringify({\n from: transition.from,\n event: transition.event,\n target\n });\n const ordinal = (transitionRouteCounts.get(routeKey) ?? 0) + 1;\n transitionRouteCounts.set(routeKey, ordinal);\n\n const descriptor = JSON.stringify({\n from: transition.from,\n event: transition.event,\n target,\n ordinal\n });\n\n let suffix = 0;\n const id = (() => {\n let candidate = hashTransitionDescriptor(descriptor);\n while (usedIds.has(candidate)) {\n suffix += 1;\n candidate = hashTransitionDescriptor(`${descriptor}:${suffix}`);\n }\n return candidate;\n })();\n usedIds.add(id);\n\n return {\n ...transition,\n id,\n ...(transition.label !== undefined ? { label: transition.label } : {})\n } as JourneyResolvedTransition<TContext, TStepId, TEventMap, THandlers>;\n });\n};\n\nexport const resolveJourneyDefinition = <\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n TStepMeta = unknown,\n THandlers extends Record<string, unknown> = Record<never, never>\n>(\n journey: JourneyDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>\n): JourneyResolvedDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers> => {\n type TEventType = string;\n const resolvedTransitions: JourneyTransition<TContext, TStepId, TEventMap, THandlers>[] = [];\n const { transitions } = journey;\n\n if (transitions === undefined) {\n return {\n ...journey,\n transitions: buildResolvedTransitions(resolvedTransitions)\n } as JourneyResolvedDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>;\n }\n\n if (Array.isArray(transitions)) {\n if (transitions.length === 0) {\n throw new Error(\n \"Journey linear transitions must include the initial step as the first item.\"\n );\n }\n\n const [initialStep, ...linearEntries] = transitions;\n if (typeof initialStep !== \"string\") {\n throw new Error(\"Journey linear transitions at index 0 must be a step id string.\");\n }\n\n if (!(initialStep in journey.steps)) {\n throw new Error(`Journey linear transitions reference unknown step \"${initialStep}\".`);\n }\n\n // Resolve initial: use journey.initial if provided (start from middle), otherwise array[0]\n const resolvedInitial = (journey.initial ?? initialStep) as TStepId;\n\n if (journey.initial !== undefined) {\n const allStepIds = transitions.map((entry) =>\n typeof entry === \"string\" ? entry : entry.step\n );\n if (!allStepIds.includes(journey.initial)) {\n throw new Error(\n `Journey initial step \"${journey.initial}\" does not exist in linear transitions.`\n );\n }\n }\n\n let previousStep = initialStep as TStepId;\n const seenSteps = new Set<string>([initialStep]);\n for (const [offset, entry] of linearEntries.entries()) {\n const index = offset + 1;\n if (typeof entry === \"string\") {\n if (!(entry in journey.steps)) {\n throw new Error(`Journey linear transitions reference unknown step \"${entry}\".`);\n }\n\n if (seenSteps.has(entry)) {\n throw new Error(\n `Journey linear transitions contain duplicate step \"${entry}\" at index ${index}.`\n );\n }\n seenSteps.add(entry);\n\n resolvedTransitions.push({\n from: previousStep,\n event: \"goToNextStep\" as TEventType,\n to: entry as TStepId\n } as JourneyTransition<TContext, TStepId, TEventMap, THandlers>);\n previousStep = entry as TStepId;\n continue;\n }\n\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(\n `Journey linear transitions at index ${index} must be a step id string or step config object.`\n );\n }\n\n const allowedKeys = new Set([\n \"step\",\n \"label\",\n \"updateContext\",\n \"onEnter\",\n \"onLeave\",\n \"timeoutMs\"\n ]);\n for (const key of Object.keys(entry)) {\n if (!allowedKeys.has(key)) {\n throw new Error(\n `Journey linear transition object at index ${index} contains unsupported field \"${key}\". Allowed fields are \"step\", \"label\", \"updateContext\", \"onEnter\", \"onLeave\", and \"timeoutMs\".`\n );\n }\n }\n\n if (typeof entry.step !== \"string\") {\n throw new Error(\n `Journey linear transition object at index ${index} must define string \"step\".`\n );\n }\n\n if (!(entry.step in journey.steps)) {\n throw new Error(`Journey linear transitions reference unknown step \"${entry.step}\".`);\n }\n\n if (seenSteps.has(entry.step)) {\n throw new Error(\n `Journey linear transitions contain duplicate step \"${entry.step}\" at index ${index}.`\n );\n }\n seenSteps.add(entry.step);\n\n if (entry.updateContext !== undefined && typeof entry.updateContext !== \"function\") {\n throw new Error(\n `Journey linear transition object at index ${index} must define \"updateContext\" as a function when provided.`\n );\n }\n\n if (entry.onEnter !== undefined && typeof entry.onEnter !== \"function\") {\n throw new Error(\n `Journey linear transition object at index ${index} must define \"onEnter\" as a function when provided.`\n );\n }\n\n if (entry.onLeave !== undefined && typeof entry.onLeave !== \"function\") {\n throw new Error(\n `Journey linear transition object at index ${index} must define \"onLeave\" as a function when provided.`\n );\n }\n\n validateFiniteTimeout(entry.timeoutMs, `Journey linear transition object at index ${index}`);\n\n resolvedTransitions.push({\n ...(entry.label !== undefined ? { label: entry.label } : {}),\n ...(entry.timeoutMs !== undefined ? { timeoutMs: entry.timeoutMs } : {}),\n ...(entry.updateContext !== undefined ? { updateContext: entry.updateContext } : {}),\n ...(entry.onEnter !== undefined ? { onEnter: entry.onEnter } : {}),\n ...(entry.onLeave !== undefined ? { onLeave: entry.onLeave } : {}),\n from: previousStep,\n event: \"goToNextStep\" as TEventType,\n to: entry.step as TStepId\n } as JourneyTransition<TContext, TStepId, TEventMap, THandlers>);\n previousStep = entry.step as TStepId;\n }\n\n return {\n ...journey,\n initial: resolvedInitial,\n transitions: buildResolvedTransitions(resolvedTransitions)\n };\n }\n\n if (!transitions || typeof transitions !== \"object\") {\n throw new Error(\"Journey transitions must be an array or an object map when provided.\");\n }\n\n const transitionGraph = transitions as JourneyTransitionGraph<\n TContext,\n TStepId,\n TEventMap,\n THandlers\n >;\n\n const orderedGraphEntries = [\n ...Object.entries(transitionGraph).filter(([fromKey]) => fromKey !== \"global\"),\n ...(transitionGraph.global ? ([[\"global\", transitionGraph.global]] as const) : [])\n ];\n\n for (const [fromKey, eventMap] of orderedGraphEntries) {\n if (fromKey !== \"global\" && !(fromKey in journey.steps)) {\n throw new Error(`Journey transitions reference unknown step \"${fromKey}\".`);\n }\n\n if (!eventMap || typeof eventMap !== \"object\" || Array.isArray(eventMap)) {\n throw new Error(`Journey transitions for \"${fromKey}\" must be an event map object.`);\n }\n\n for (const [event, rawEdges] of Object.entries(eventMap) as Array<\n [TEventType, (typeof eventMap)[TEventType] | true]\n >) {\n const isTerminal = event === \"completeJourney\" || event === \"terminateJourney\";\n const edges =\n isTerminal && (rawEdges === true || (Array.isArray(rawEdges) && rawEdges.length === 0))\n ? [{}]\n : rawEdges;\n\n if (!Array.isArray(edges)) {\n throw new Error(`Journey transitions for \"${fromKey}.${event}\" must be an array.`);\n }\n\n for (const [index, edge] of edges.entries()) {\n if (!edge || typeof edge !== \"object\") {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must be an object.`\n );\n }\n\n const allowedKeys = new Set(\n isTerminal\n ? [\"when\", \"updateContext\", \"onEnter\", \"onLeave\", \"label\", \"timeoutMs\"]\n : [\"to\", \"when\", \"updateContext\", \"onEnter\", \"onLeave\", \"label\", \"timeoutMs\"]\n );\n for (const key of Object.keys(edge)) {\n if (!allowedKeys.has(key)) {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" contains unsupported field \"${key}\".`\n );\n }\n }\n\n if (!isTerminal && typeof (edge as { to?: unknown }).to !== \"string\") {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must define string \"to\".`\n );\n }\n\n if ((edge as { when?: unknown }).when !== undefined && typeof edge.when !== \"function\") {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must define \"when\" as a function when provided.`\n );\n }\n\n if (\n (edge as { updateContext?: unknown }).updateContext !== undefined &&\n typeof edge.updateContext !== \"function\"\n ) {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must define \"updateContext\" as a function when provided.`\n );\n }\n\n if (\n (edge as { onEnter?: unknown }).onEnter !== undefined &&\n typeof edge.onEnter !== \"function\"\n ) {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must define \"onEnter\" as a function when provided.`\n );\n }\n\n if (\n (edge as { onLeave?: unknown }).onLeave !== undefined &&\n typeof edge.onLeave !== \"function\"\n ) {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must define \"onLeave\" as a function when provided.`\n );\n }\n\n if ((edge as { label?: unknown }).label !== undefined && typeof edge.label !== \"string\") {\n throw new Error(\n `Journey transition at \"${fromKey}.${event}[${index}]\" must define \"label\" as a string when provided.`\n );\n }\n\n validateFiniteTimeout(\n (edge as { timeoutMs?: unknown }).timeoutMs,\n `Journey transition at \"${fromKey}.${event}[${index}]\"`\n );\n\n resolvedTransitions.push({\n ...edge,\n from: (fromKey === \"global\" ? \"*\" : fromKey) as TStepId | \"*\",\n event\n } as JourneyTransition<TContext, TStepId, TEventMap, THandlers>);\n }\n }\n }\n\n return {\n ...journey,\n transitions: buildResolvedTransitions(resolvedTransitions)\n } as JourneyResolvedDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>;\n};\n", "import { createJourneyMachineAsyncStateController } from \"./async-state\";\nimport { createJourneyMachineComputedGetter } from \"./computed\";\nimport { createJourneyMachineControls } from \"./controls\";\nimport {\n createJourneyMachineNavigationController,\n type JourneyLifecycleScheduler\n} from \"./navigation\";\nimport { createJourneyMachinePluginController } from \"./plugin-controller\";\nimport { createJourneyMachineRuntime } from \"./runtime\";\nimport { createJourneyMachineSendController } from \"./send\";\nimport {\n assertSerializableContext,\n assertStepExists,\n buildInitialAsyncState,\n buildSendResult,\n buildSnapshot,\n cloneContext,\n cloneMetaValue,\n isTerminalTarget,\n now,\n validateFiniteTimeout,\n validateJourneyTransitions\n} from \"./helpers\";\nimport { resolveJourneyDefinition } from \"./resolve-journey-definition\";\n\nimport type {\n JourneyDefinition,\n JourneyJsonObject,\n JourneyMachine,\n JourneyMachinePlugin,\n JourneyMachineOptions,\n JourneyMachineWithPlugins,\n JourneySendEvent,\n JourneySendResult\n} from \"../types\";\n\n/** Creates a journey machine from a definition and optional runtime/plugin options. */\nexport function createJourneyMachine<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown> = Record<never, never>,\n TStepMeta = unknown,\n THandlers extends Record<string, unknown> = Record<never, never>,\n TPlugins extends readonly JourneyMachinePlugin[] = []\n>(\n journey: JourneyDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>,\n options?: JourneyMachineOptions<TPlugins>\n): JourneyMachineWithPlugins<TContext, TStepId, TEventMap, TStepMeta, THandlers, TPlugins> {\n if (!journey.steps || typeof journey.steps !== \"object\") {\n throw new Error(\"Journey steps must be a record object.\");\n }\n\n if (\n journey.transitions !== undefined &&\n (journey.transitions === null ||\n (typeof journey.transitions !== \"object\" && !Array.isArray(journey.transitions)))\n ) {\n throw new Error(\"Journey transitions must be an array or an object map when provided.\");\n }\n\n for (const stepId of Object.keys(journey.steps)) {\n if (stepId === \"*\" || stepId === \"global\" || stepId === \"COMPLETE\" || stepId === \"TERMINATED\") {\n throw new Error(`Step id \"${stepId}\" is reserved and cannot be used as a step name.`);\n }\n }\n\n if (journey.initial === undefined && !Array.isArray(journey.transitions)) {\n throw new Error(\n 'Journey \"initial\" is required for graph and headless definitions. ' +\n \"For linear transitions, initial defaults to the first array element.\"\n );\n }\n\n assertSerializableContext(journey.context);\n const resolvedJourney = resolveJourneyDefinition(journey);\n\n assertStepExists(\n resolvedJourney.steps,\n resolvedJourney.initial,\n `Journey initial step \"${resolvedJourney.initial}\" does not exist in steps registry.`\n );\n validateJourneyTransitions(resolvedJourney.transitions, resolvedJourney.steps);\n\n const requireExplicitCompletion = options?.requireExplicitCompletion ?? false;\n validateFiniteTimeout(options?.defaultTimeoutMs, \"Journey machine options\");\n const defaultTimeoutMs = options?.defaultTimeoutMs;\n const initialContextTemplate = cloneContext(resolvedJourney.context);\n const stepMeta = Object.fromEntries(\n (Object.keys(resolvedJourney.steps) as TStepId[]).map((stepId) => [\n stepId,\n cloneMetaValue(resolvedJourney.steps[stepId].meta)\n ])\n ) as Record<TStepId, TStepMeta>;\n\n const buildInitialSnapshot = () =>\n buildSnapshot(\n [resolvedJourney.initial],\n 0,\n cloneContext(initialContextTemplate),\n \"idled\",\n buildInitialAsyncState(resolvedJourney.steps)\n );\n\n const pluginController = createJourneyMachinePluginController<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers\n >({\n plugins: options?.plugins ?? [],\n setupContext: {\n journey,\n resolvedJourney,\n options: {\n requireExplicitCompletion,\n defaultTimeoutMs\n },\n buildInitialSnapshot\n }\n });\n\n const initialSnapshot = pluginController.hydrateSnapshot(buildInitialSnapshot());\n assertSerializableContext(initialSnapshot.context, \"Journey hydrated context\");\n\n const onListenerError = options?.onListenerError;\n const onLifecycleError = options?.onLifecycleError;\n const runtime = createJourneyMachineRuntime<TContext, TStepId, TEventMap>({\n snapshot: initialSnapshot,\n onSnapshotChange: pluginController.onSnapshotChange,\n onDispose: pluginController.dispose,\n ...(onListenerError !== undefined ? { onListenerError } : {})\n });\n const asyncState = createJourneyMachineAsyncStateController<TContext, TStepId, TEventMap>({\n runtime\n });\n\n let dispatchSend: (\n event: JourneySendEvent<TStepId, TEventMap>\n ) => Promise<JourneySendResult<TContext, TStepId>> = () =>\n Promise.resolve(buildSendResult(runtime.getSnapshot(), false));\n\n const scheduleLifecycle: JourneyLifecycleScheduler<TContext, TStepId, TEventMap, THandlers> = ({\n previousSnapshot,\n snapshot,\n from,\n to,\n event,\n transitionId,\n label,\n runVersion,\n transition\n }) => {\n const sourceStep = resolvedJourney.steps[from];\n const targetStep = isTerminalTarget(to) ? null : resolvedJourney.steps[to];\n const handlers = (resolvedJourney.handlers ?? {}) as THandlers;\n const dispatch = (nextEvent: JourneySendEvent<TStepId, TEventMap>) => {\n if (!runtime.isRunActive(runVersion) || runtime.isDisposed()) {\n return Promise.resolve(buildSendResult(runtime.getSnapshot(), false));\n }\n return dispatchSend(nextEvent);\n };\n const lifecycleAbortController = runtime.openLifecycle(runVersion);\n if (!lifecycleAbortController) {\n return;\n }\n const { signal } = lifecycleAbortController;\n const reportLifecycleError = (\n error: unknown,\n phase: \"step.onLeave\" | \"transition.onLeave\" | \"step.onEnter\" | \"transition.onEnter\"\n ) => {\n const context = {\n phase,\n from,\n to,\n eventType: event.type,\n transitionId,\n ...(label !== undefined ? { label } : {})\n } as const;\n runtime.emit({\n type: \"lifecycle.error\",\n ...context,\n error,\n timestamp: now()\n });\n onLifecycleError?.(error, context);\n };\n\n void (async () => {\n try {\n if (sourceStep?.onLeave) {\n try {\n await sourceStep.onLeave({\n snapshot: previousSnapshot,\n context: previousSnapshot.context,\n from,\n to,\n event,\n transitionId,\n ...(label !== undefined ? { label } : {}),\n handlers,\n signal,\n dispatch\n });\n } catch (error) {\n if (signal.aborted || !runtime.isRunActive(runVersion)) {\n return;\n }\n reportLifecycleError(error, \"step.onLeave\");\n return;\n }\n }\n\n if (!runtime.isRunActive(runVersion)) {\n return;\n }\n\n if (transition?.onLeave) {\n try {\n await transition.onLeave({\n snapshot: previousSnapshot,\n context: previousSnapshot.context,\n from,\n to,\n event,\n transitionId,\n ...(transition.label !== undefined ? { label: transition.label } : {}),\n handlers,\n signal,\n dispatch\n });\n } catch (error) {\n if (signal.aborted || !runtime.isRunActive(runVersion)) {\n return;\n }\n reportLifecycleError(error, \"transition.onLeave\");\n return;\n }\n }\n\n if (!runtime.isRunActive(runVersion)) {\n return;\n }\n\n if (targetStep?.onEnter) {\n try {\n await targetStep.onEnter({\n snapshot,\n context: snapshot.context,\n from,\n to,\n event,\n transitionId,\n ...(label !== undefined ? { label } : {}),\n handlers,\n signal,\n dispatch\n });\n } catch (error) {\n if (signal.aborted || !runtime.isRunActive(runVersion)) {\n return;\n }\n reportLifecycleError(error, \"step.onEnter\");\n return;\n }\n }\n\n if (!runtime.isRunActive(runVersion)) {\n return;\n }\n\n if (transition?.onEnter) {\n try {\n await transition.onEnter({\n snapshot,\n context: snapshot.context,\n from,\n to,\n event,\n transitionId,\n ...(transition.label !== undefined ? { label: transition.label } : {}),\n handlers,\n signal,\n dispatch\n });\n } catch (error) {\n if (signal.aborted || !runtime.isRunActive(runVersion)) {\n return;\n }\n reportLifecycleError(error, \"transition.onEnter\");\n return;\n }\n }\n } finally {\n runtime.closeLifecycle(lifecycleAbortController);\n }\n })();\n };\n\n const navigation = createJourneyMachineNavigationController<\n TContext,\n TStepId,\n TEventMap,\n THandlers\n >({\n runtime,\n steps: resolvedJourney.steps,\n transitions: resolvedJourney.transitions,\n scheduleLifecycle\n });\n\n const sendController = createJourneyMachineSendController<\n TContext,\n TStepId,\n TEventMap,\n THandlers\n >(\n runtime,\n asyncState,\n navigation,\n journey.transitions === undefined,\n resolvedJourney.steps,\n resolvedJourney.transitions,\n (resolvedJourney.handlers ?? {}) as THandlers,\n requireExplicitCompletion,\n defaultTimeoutMs\n );\n\n const controls = createJourneyMachineControls<TContext, TStepId, TEventMap>({\n runtime,\n asyncState,\n initial: resolvedJourney.initial,\n initialContext: initialContextTemplate,\n steps: resolvedJourney.steps\n });\n\n const getComputed = createJourneyMachineComputedGetter(\n journey,\n resolvedJourney,\n runtime.getSnapshot\n );\n\n const machine: JourneyMachine<TContext, TStepId, TEventMap, TStepMeta, THandlers> = {\n getSnapshot: runtime.getSnapshot,\n getStepMeta: (stepId) => cloneMetaValue(stepMeta[stepId]),\n getComputed,\n startJourney: controls.startJourney,\n subscribe: runtime.subscribe,\n subscribeSelector: runtime.subscribeSelector,\n subscribeEvent: runtime.subscribeEvent,\n subscribeStart: (listener) =>\n runtime.subscribeEvent((event) => {\n if (event.type === \"journey.start\") {\n listener(event);\n }\n }),\n subscribeReset: (listener) =>\n runtime.subscribeEvent((event) => {\n if (event.type === \"journey.reset\") {\n listener(event);\n }\n }),\n subscribeComplete: (listener) =>\n runtime.subscribeEvent((event) => {\n if (event.type === \"journey.completed\") {\n listener(event);\n }\n }),\n subscribeTerminate: (listener) =>\n runtime.subscribeEvent((event) => {\n if (event.type === \"journey.terminated\") {\n listener(event);\n }\n }),\n resetJourney: controls.resetJourney,\n updateContext: controls.updateContext,\n clearStepError: controls.clearStepError,\n dispose: controls.dispose,\n goToPreviousStep: (steps) =>\n runtime.queue(\n async (runVersion) =>\n navigation.applyPreviousNavigation(steps, \"goToPreviousStep\", runVersion),\n () => sendController.buildCanceledSendResult(\"goToPreviousStep\")\n ),\n goToLastVisitedStep: () =>\n runtime.queue(\n async (runVersion) =>\n navigation.applyLastVisitedNavigation(\"goToLastVisitedStep\", runVersion),\n () => sendController.buildCanceledSendResult(\"goToLastVisitedStep\")\n ),\n goToNextStep: () =>\n machine.send({ type: \"goToNextStep\" } as JourneySendEvent<TStepId, TEventMap>),\n goToStepById: (stepId: TStepId) =>\n machine.send({ type: \"goToStepById\", stepId } as JourneySendEvent<TStepId, TEventMap>),\n terminateJourney: (payload) =>\n payload === undefined\n ? machine.send({ type: \"terminateJourney\" } as JourneySendEvent<TStepId, TEventMap>)\n : machine.send({\n type: \"terminateJourney\",\n payload\n } as JourneySendEvent<TStepId, TEventMap>),\n completeJourney: (payload) =>\n payload === undefined\n ? machine.send({ type: \"completeJourney\" } as JourneySendEvent<TStepId, TEventMap>)\n : machine.send({\n type: \"completeJourney\",\n payload\n } as JourneySendEvent<TStepId, TEventMap>),\n send: (event) =>\n runtime.queue(\n (runVersion, signal) => sendController.executeSend(event, runVersion, signal),\n () => sendController.buildCanceledSendResult(event.type)\n )\n };\n\n dispatchSend = machine.send;\n\n return pluginController.extendMachine(machine) as JourneyMachineWithPlugins<\n TContext,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers,\n TPlugins\n >;\n}\n", "import type {\n JourneyFullEventType,\n JourneyJsonObject,\n JourneyStepDefinition,\n JourneyTransitionGraph\n} from \"../types\";\nimport type {\n JourneyBuilder,\n JourneyBuilderCustomEventKey,\n JourneyBuilderDefinition,\n JourneyBuilderCandidate,\n JourneyBuilderGuard,\n JourneyBuilderLifecycle,\n JourneyBuilderOnEntry,\n JourneyBuilderTerminalCandidate,\n JourneyBuilderTerminalEntry,\n JourneyBuilderTerminalEventKey,\n JourneyBuilderUpdateContext,\n JourneyBuilderStepEventKey,\n JourneyStepBuilder,\n JourneyToBuilder,\n JourneyToBuilderUnused,\n JourneyToBuilderUsage\n} from \"./types\";\n\nexport type {\n JourneyBuilder,\n JourneyBuilderCustomEventKey,\n JourneyBuilderDefinition,\n JourneyBuilderDefinitionMetadata,\n JourneyBuilderGuard,\n JourneyBuilderLifecycle,\n JourneyBuilderOnEntry,\n JourneyBuilderTerminalCandidate,\n JourneyBuilderTerminalEntry,\n JourneyBuilderUpdateContext,\n JourneyStepBuilder,\n JourneyToBuilder\n} from \"./types\";\n\ntype RawCandidate = {\n readonly _to: string;\n readonly _when?: unknown;\n readonly _updateContext?: unknown;\n readonly _onEnter?: unknown;\n readonly _onLeave?: unknown;\n readonly _label?: string | undefined;\n readonly _timeoutMs?: number | undefined;\n};\n\ntype RawTerminalCandidate = {\n readonly when?: unknown;\n readonly updateContext?: unknown;\n readonly onEnter?: unknown;\n readonly onLeave?: unknown;\n readonly label?: string | undefined;\n readonly timeoutMs?: number | undefined;\n};\n\nfunction makeToBuilder<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown>,\n THandlers extends Record<string, unknown>,\n TEventType extends JourneyFullEventType<TEventMap>,\n TUsed extends JourneyToBuilderUsage = JourneyToBuilderUnused\n>(\n candidate: JourneyBuilderCandidate<TContext, TStepId, TEventMap, THandlers, TEventType>\n): JourneyToBuilder<TContext, TStepId, TEventMap, THandlers, TEventType, TUsed> {\n return {\n _candidate: candidate,\n when(guard: JourneyBuilderGuard<TContext, TStepId, TEventMap, THandlers, TEventType>) {\n return makeToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n TEventType,\n Omit<TUsed, \"when\"> & { readonly when: true }\n >({ ...candidate, _when: guard });\n },\n updateContext(fn: JourneyBuilderUpdateContext<TContext, TStepId, TEventMap, TEventType>) {\n return makeToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n TEventType,\n Omit<TUsed, \"updateContext\"> & { readonly updateContext: true }\n >({ ...candidate, _updateContext: fn });\n },\n onEnter(fn: JourneyBuilderLifecycle<TContext, TStepId, TEventMap, THandlers>) {\n return makeToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n TEventType,\n Omit<TUsed, \"onEnter\"> & { readonly onEnter: true }\n >({ ...candidate, _onEnter: fn });\n },\n onLeave(fn: JourneyBuilderLifecycle<TContext, TStepId, TEventMap, THandlers>) {\n return makeToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n TEventType,\n Omit<TUsed, \"onLeave\"> & { readonly onLeave: true }\n >({ ...candidate, _onLeave: fn });\n },\n label(label: string) {\n return makeToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n TEventType,\n Omit<TUsed, \"label\"> & { readonly label: true }\n >({ ...candidate, _label: label });\n },\n timeoutMs(ms: number) {\n return makeToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n TEventType,\n Omit<TUsed, \"timeoutMs\"> & { readonly timeoutMs: true }\n >({ ...candidate, _timeoutMs: ms });\n }\n } as JourneyToBuilder<TContext, TStepId, TEventMap, THandlers, TEventType, TUsed>;\n}\n\nfunction candidateToEdge(c: RawCandidate): Record<string, unknown> {\n const edge: Record<string, unknown> = { to: c._to };\n if (c._when !== undefined) edge.when = c._when;\n if (c._updateContext !== undefined) edge.updateContext = c._updateContext;\n if (c._onEnter !== undefined) edge.onEnter = c._onEnter;\n if (c._onLeave !== undefined) edge.onLeave = c._onLeave;\n if (c._label !== undefined) edge.label = c._label;\n if (c._timeoutMs !== undefined) edge.timeoutMs = c._timeoutMs;\n return edge;\n}\n\nfunction terminalCandidateToEdge(c: RawTerminalCandidate): Record<string, unknown> {\n const edge: Record<string, unknown> = {};\n if (c.when !== undefined) edge.when = c.when;\n if (c.updateContext !== undefined) edge.updateContext = c.updateContext;\n if (c.onEnter !== undefined) edge.onEnter = c.onEnter;\n if (c.onLeave !== undefined) edge.onLeave = c.onLeave;\n if (c.label !== undefined) edge.label = c.label;\n if (c.timeoutMs !== undefined) edge.timeoutMs = c.timeoutMs;\n return edge;\n}\n\n/** Creates a typed builder for authoring journey definitions with `createStep`, `to`, and `build` helpers. */\nexport function createJourneyBuilder<\n TContext extends JourneyJsonObject,\n TStepId extends string,\n TEventMap extends Record<string, unknown> = Record<never, never>,\n TStepMeta = unknown,\n THandlers extends Record<string, unknown> = Record<never, never>\n>(): JourneyBuilder<TContext, TStepId, TEventMap, TStepMeta, THandlers> {\n type WideNonTerminalEntry = JourneyBuilderOnEntry<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n JourneyBuilderStepEventKey<TEventMap>\n >;\n type WideTerminalEntry = JourneyBuilderTerminalEntry<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n JourneyBuilderTerminalEventKey<TEventMap>\n >;\n type BuilderWithCandidate = { readonly _candidate: RawCandidate };\n\n function to(stepId: TStepId): JourneyToBuilder<TContext, TStepId, TEventMap, THandlers> {\n return makeToBuilder({\n _to: stepId,\n _when: undefined,\n _updateContext: undefined,\n _onEnter: undefined,\n _onLeave: undefined,\n _label: undefined,\n _timeoutMs: undefined\n });\n }\n\n function resolveEntry(entry: WideNonTerminalEntry): readonly BuilderWithCandidate[] {\n if (typeof entry === \"function\") {\n const scopedTo = to as (\n stepId: TStepId\n ) => JourneyToBuilder<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n JourneyBuilderStepEventKey<TEventMap>\n >;\n return entry({ to: scopedTo });\n }\n\n return entry as readonly BuilderWithCandidate[];\n }\n\n function resolveTerminalEntry(entry: WideTerminalEntry): true | readonly unknown[] {\n if (entry === true || entry.length === 0) {\n return entry;\n }\n\n return (\n entry as readonly JourneyBuilderTerminalCandidate<\n TContext,\n TStepId,\n TEventMap,\n THandlers,\n JourneyBuilderTerminalEventKey<TEventMap>\n >[]\n ).map((candidate) => terminalCandidateToEdge(candidate));\n }\n\n function createStep<TStepKey extends TStepId>(\n id: TStepKey,\n config?: {\n meta?: TStepMeta;\n onEnter?: unknown;\n onLeave?: unknown;\n on?: Record<string, unknown>;\n }\n ) {\n return {\n id,\n _meta: config?.meta,\n _onEnter: config?.onEnter,\n _onLeave: config?.onLeave,\n _on: config?.on\n } as JourneyStepBuilder<\n TContext,\n TStepId,\n TStepKey,\n TEventMap,\n TStepMeta,\n THandlers,\n JourneyBuilderCustomEventKey<TEventMap>\n >;\n }\n\n function build(input: {\n initial: TStepId;\n context: TContext;\n handlers?: THandlers;\n steps: readonly JourneyStepBuilder<\n TContext,\n TStepId,\n TStepId,\n TEventMap,\n TStepMeta,\n THandlers,\n JourneyBuilderCustomEventKey<TEventMap>\n >[];\n global?: {\n [key: string]: unknown;\n };\n }): JourneyBuilderDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers> {\n const stepsRecord = {} as Record<\n TStepId,\n JourneyStepDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>\n >;\n const transitionGraph = {} as Record<string, unknown>;\n\n for (const stepBuilder of input.steps) {\n stepsRecord[stepBuilder.id] = {\n ...(stepBuilder._meta !== undefined ? { meta: stepBuilder._meta } : {}),\n ...(stepBuilder._onEnter !== undefined ? { onEnter: stepBuilder._onEnter } : {}),\n ...(stepBuilder._onLeave !== undefined ? { onLeave: stepBuilder._onLeave } : {})\n };\n\n if (stepBuilder._on) {\n const stepTransitions: Record<string, unknown> = {};\n\n for (const [eventType, entry] of Object.entries(stepBuilder._on)) {\n if (!entry) continue;\n\n if (eventType === \"completeJourney\" || eventType === \"terminateJourney\") {\n stepTransitions[eventType] = resolveTerminalEntry(entry as WideTerminalEntry);\n continue;\n }\n\n const builders = resolveEntry(entry as WideNonTerminalEntry);\n stepTransitions[eventType] = builders.map((builder) =>\n candidateToEdge(builder._candidate)\n );\n }\n\n transitionGraph[stepBuilder.id] = stepTransitions;\n }\n }\n\n if (input.global) {\n const globalTransitions: Record<string, unknown> = {};\n\n for (const [eventType, value] of Object.entries(input.global)) {\n if (value === undefined) continue;\n\n if (eventType === \"completeJourney\" || eventType === \"terminateJourney\") {\n globalTransitions[eventType] = resolveTerminalEntry(value as WideTerminalEntry);\n } else if (Array.isArray(value)) {\n globalTransitions[eventType] = (\n value as readonly JourneyToBuilder<TContext, TStepId, TEventMap, THandlers>[]\n ).map((builder) => candidateToEdge(builder._candidate));\n }\n }\n\n transitionGraph.global = globalTransitions;\n }\n\n return {\n initial: input.initial,\n context: input.context,\n ...(input.handlers !== undefined ? { handlers: input.handlers } : {}),\n steps: stepsRecord,\n transitions: transitionGraph as JourneyTransitionGraph<\n TContext,\n TStepId,\n TEventMap,\n THandlers\n >\n } as JourneyBuilderDefinition<TContext, TStepId, TEventMap, TStepMeta, THandlers>;\n }\n\n return {\n createStep,\n to,\n build\n } as unknown as JourneyBuilder<TContext, TStepId, TEventMap, TStepMeta, THandlers>;\n}\n"],
5
+ "mappings": "ubAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,0BAAAE,EAAA,yBAAAC,GAAA,yBAAAC,KAAA,eAAAC,GAAAL,ICkBO,IAAMM,EAAmB,CAC9BC,EACAC,EACAC,IACG,CACH,GAAI,EAAED,KAAUD,GACd,MAAM,IAAI,MAAME,CAAO,CAE3B,EAEaC,EAAiBC,GAC5B,OAAOA,GAAU,UACjBA,IAAU,MACV,CAAC,MAAM,QAAQA,CAAK,IACnB,OAAO,eAAeA,CAAK,IAAM,OAAO,WAAa,OAAO,eAAeA,CAAK,IAAM,MAEnFC,EAAsDD,GACtD,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAKE,GAAUD,EAAuBC,CAAK,CAAC,EAGvDH,EAAcC,CAAK,EACd,OAAO,YACZ,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACG,EAAKC,CAAU,IAAM,CAC/CD,EACAF,EAAuBG,CAA8B,CACvD,CAAC,CACH,EAGKJ,EAOHK,GAAiBL,GAA2B,CAChD,GAAIA,IAAU,KACZ,MAAO,OAGT,GAAI,MAAM,QAAQA,CAAK,EACrB,MAAO,QAGT,GAAI,OAAOA,GAAU,SAAU,CAC7B,IAAMM,EAAmBN,EAA8C,aAAa,KACpF,OAAOM,GAAmBA,IAAoB,SAAWA,EAAkB,QAC7E,CAEA,OAAO,OAAON,CAChB,EAEA,SAASO,GACPP,EACAQ,EACAC,EACAC,EAA0B,CAAC,EACQ,CACnC,GACEV,IAAU,MACV,OAAOA,GAAU,UACjB,OAAOA,GAAU,UACjB,OAAOA,GAAU,UAEjB,OAGF,IAAMW,EAAYD,EAAK,SAAW,EAAIF,EAAQ,GAAGA,CAAK,IAAIE,EAAK,KAAK,GAAG,CAAC,GAExE,GAAIV,IAAU,OACZ,MAAM,IAAI,MAAM,GAAGW,CAAS,iDAAiD,EAG/E,GAAI,OAAOX,GAAU,UAAY,OAAOA,GAAU,UAAY,OAAOA,GAAU,WAC7E,MAAM,IAAI,MAAM,GAAGW,CAAS,wCAAwC,OAAOX,CAAK,GAAG,EAGrF,GAAI,OAAOA,GAAU,SACnB,MAAM,IAAI,MAAM,GAAGW,CAAS,wCAAwCN,GAAcL,CAAK,CAAC,GAAG,EAG7F,GAAIS,EAAM,KAAK,IAAIT,CAAK,EACtB,MAAM,IAAI,MACR,GAAGW,CAAS,oEACd,EAKF,GAFAF,EAAM,KAAK,IAAIT,CAAK,EAEhB,MAAM,QAAQA,CAAK,EAAG,CACxB,OAAW,CAACY,EAAOR,CAAU,IAAKJ,EAAM,QAAQ,EAC9CO,GAAwBH,EAAYI,EAAOC,EAAO,CAAC,GAAGC,EAAM,OAAOE,CAAK,CAAC,CAAC,EAE5E,MACF,CAEA,GAAI,CAACb,EAAcC,CAAK,EACtB,MAAM,IAAI,MACR,GAAGW,CAAS,kDAAkDN,GAAcL,CAAK,CAAC,GACpF,EAGF,OAAW,CAACG,EAAKC,CAAU,IAAK,OAAO,QAAQJ,CAAK,EAClDO,GAAwBH,EAAYI,EAAOC,EAAO,CAAC,GAAGC,EAAMP,CAAG,CAAC,CAEpE,CAEO,SAASU,EACdC,EACAN,EAAQ,kBACE,CACV,OAAAD,GAAwBO,EAASN,EAAO,CAAE,KAAM,IAAI,OAAU,CAAC,EACxDM,CACT,CAEO,IAAMC,EAAoDD,GAC/Db,EAAuBY,EAA0BC,CAAO,CAAC,EAErDE,EAAgChB,GAChC,MAAM,QAAQA,CAAK,EACdA,EAAM,IAAKE,GAAUc,EAA6Bd,CAAK,CAAC,EAG7DF,aAAiB,KACZ,IAAI,KAAKA,EAAM,QAAQ,CAAC,EAG7BA,aAAiB,IACZ,IAAI,IACT,CAAC,GAAGA,EAAM,QAAQ,CAAC,EAAE,IAAI,CAAC,CAACG,EAAKC,CAAU,IAAM,CAC9CY,EAA6Bb,CAAG,EAChCa,EAA6BZ,CAAU,CACzC,CAAC,CACH,EAGEJ,aAAiB,IACZ,IAAI,IAAI,CAAC,GAAGA,CAAK,EAAE,IAAKE,GAAUc,EAA6Bd,CAAK,CAAC,CAAC,EAG3EH,EAAcC,CAAK,EACd,OAAO,YACZ,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACG,EAAKC,CAAU,IAAM,CAC/CD,EACAa,EAA6BZ,CAAU,CACzC,CAAC,CACH,EAGKJ,EAGIiB,GAAqBjB,GAAgB,CAChD,GAAK,OAAOA,GAAU,UAAY,OAAOA,GAAU,YAAeA,IAAU,KAC1E,OAAOA,EAGT,GAAI,OAAO,iBAAoB,WAC7B,GAAI,CACF,OAAO,gBAAgBA,CAAK,CAC9B,MAAQ,CACN,OAAOgB,EAA6BhB,CAAK,CAC3C,KAEA,QAAOgB,EAA6BhB,CAAK,CAE7C,EAEMkB,GAAuBlB,GAAmB,CAC9C,GAAI,SAAOA,GAAU,UAAYA,IAAU,MAAQ,OAAO,SAASA,CAAK,GAIxE,IAAI,MAAM,QAAQA,CAAK,EAAG,CACxB,QAAWmB,KAAQnB,EACjBkB,GAAoBC,CAAI,EAE1B,OAAO,OAAOnB,CAAK,EACnB,MACF,CAEA,GAAKD,EAAcC,CAAK,EAIxB,SAAWI,KAAc,OAAO,OAAOJ,CAAK,EAC1CkB,GAAoBd,CAAU,EAEhC,OAAO,OAAOJ,CAAK,GACrB,EAEaoB,GAAsBxB,GAC7B,OAAOA,GAAU,UAAY,CAAC,OAAO,SAASA,CAAK,EAC9C,EAEF,KAAK,IAAI,EAAG,KAAK,MAAMA,CAAK,CAAC,EAGzByB,EAAM,IAAc,KAAK,IAAI,EAEpCC,GAAaC,GAA6B,CAAC,GAAG,IAAI,IAAIA,CAAK,CAAC,EAE5DC,GAAmB,CACvBC,EACAC,IAEA,OAAO,YAAYA,EAAQ,IAAK7B,GAAW,CAACA,EAAQ4B,EAAQ5B,CAAM,IAAM,EAAI,CAAC,CAAC,EAKnE8B,GAA2B,CACtCC,EACAF,IAC6B,CAC7B,IAAMG,EAAkBH,GAAWJ,GAAOM,CAAQ,EAC5CH,EAAU,OAAO,YAAYI,EAAgB,IAAKhC,GAAW,CAACA,EAAQ,EAAK,CAAC,CAAC,EAKnF,QAAWA,KAAU+B,EACnBH,EAAQ5B,CAAM,EAAI,GAGpB,OAAO4B,CACT,EAEaK,GAAgB,CAC3BL,EACAM,KAC8B,CAC9B,GAAGN,EACH,CAACM,CAAO,EAAG,EACb,GAEaC,GAAoBhC,GAC/B,OAAOA,GAAU,UACjBA,IAAU,MACV,SAAUA,GACV,OAAQA,EAA4B,MAAS,WAEzCiC,GAAkBjC,GACtB,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,EAEvCkC,EAAwB,CAACC,EAAoB3B,IAAkB,CAC1E,GAAI2B,IAAc,QAAa,CAACF,GAAeE,CAAS,EACtD,MAAM,IAAI,MAAM,GAAG3B,CAAK,0DAA0D,CAEtF,EAEa4B,GAAN,cAAkC,KAAM,CAG7C,YAAYtC,EAAiB,CAC3B,MAAMA,CAAO,EAHf,KAAS,KAAO,qBAIhB,CACF,EAEauC,EAAN,cAAmC,KAAM,CAI9C,YAAYC,EAAmB,CAC7B,MAAM,uCAAuCA,CAAS,0BAA0B,EAJlF,KAAS,KAAO,uBAKd,KAAK,UAAYA,CACnB,CACF,EAWaC,GAA2B,IAAe,CACrD,IAAMC,EAAmB,WACzB,GAAI,OAAOA,EAAiB,SAAY,UACtC,OAAOA,EAAiB,QAG1B,IAAMC,EAAUD,EAAiB,SAAS,KAAK,SAC/C,OAAOC,IAAY,QAAaA,IAAY,aAC9C,EAEaC,EAAoB,CAAC5C,EAAiB6C,IAAqB,CACtE,GAAI,GAACJ,GAAyB,GAAK,OAAO,QAAY,KAItD,IAAII,IAAW,OAAW,CACxB,QAAQ,KAAK7C,CAAO,EACpB,MACF,CAEA,QAAQ,KAAKA,EAAS6C,CAAM,EAC9B,EAEaC,GAAqB,CAAC9C,EAAiB6C,IAAqB,CACvE,GAAI,GAACJ,GAAyB,GAAK,OAAO,QAAY,KAItD,IAAII,IAAW,OAAW,CACxB,QAAQ,MAAM7C,CAAO,EACrB,MACF,CAEA,QAAQ,MAAMA,EAAS6C,CAAM,EAC/B,EAEaE,GAAc,MACzBC,EACAX,EACAY,IAEI,CAACd,GAAeE,CAAS,GAAKA,GAAa,EACtC,MAAMW,EAGR,MAAM,IAAI,QAAW,CAACE,EAASC,IAAW,CAC/C,IAAMC,EAAQ,WAAW,IAAM,CAC7BD,EAAOF,EAAW,CAAC,CACrB,EAAGZ,CAAS,EAEZW,EAAQ,KACL9C,GAAU,CACT,aAAakD,CAAK,EAClBF,EAAQhD,CAAK,CACf,EACCmD,GAAU,CACT,aAAaD,CAAK,EAClBD,EAAOE,CAAK,CACd,CACF,CACF,CAAC,EAGUC,GAAkB,MAC7BN,EACAO,IACe,CACf,GAAIA,EAAO,QACT,MAAMA,EAAO,OAGf,OAAO,MAAM,IAAI,QAAW,CAACL,EAASC,IAAW,CAC/C,IAAMK,EAAU,IAAM,CACpBD,EAAO,oBAAoB,QAASC,CAAO,EAC3CL,EAAOI,EAAO,MAAM,CACtB,EAEAA,EAAO,iBAAiB,QAASC,EAAS,CAAE,KAAM,EAAK,CAAC,EACxDR,EAAQ,KACL9C,GAAU,CACTqD,EAAO,oBAAoB,QAASC,CAAO,EAC3CN,EAAQhD,CAAK,CACf,EACCmD,GAAU,CACTE,EAAO,oBAAoB,QAASC,CAAO,EAC3CL,EAAOE,CAAK,CACd,CACF,CACF,CAAC,CACH,EAEaI,EAA0B,KAA8B,CACnE,MAAO,OACP,UAAW,KACX,aAAc,KACd,MAAO,IACT,GAEaC,EACX5D,IAMO,CACL,UAAW,GACX,OANa,OAAO,YACpB,OAAO,KAAKA,CAAK,EAAE,IAAKC,GAAW,CAACA,EAAQ0D,EAAwB,CAAC,CAAC,CACxE,CAKA,GAGWE,GAIXC,GAEAA,EAAM,OAAS,gBAAkB,WAAYA,EAElCC,EACXC,GAC8BA,IAAW,YAAcA,IAAW,aAEvDC,GAMXC,GAEAA,EAAW,QAAU,kBACjB,WACAA,EAAW,QAAU,mBACnB,aACCA,EAAW,GAEPC,GAA6B,CAMxCC,EACApE,IACG,CACH,IAAMqE,EAAerE,EACfsE,EAAc,IAAI,IAAI,CAC1B,OACA,QACA,KACA,OACA,gBACA,UACA,UACA,KACA,QACA,WACF,CAAC,EAED,OAAW,CAACtD,EAAOkD,CAAU,IAAKE,EAAY,QAAQ,EAAG,CACvD,GAAI,CAACF,GAAc,OAAOA,GAAe,SACvC,MAAM,IAAI,MAAM,+BAA+BlD,CAAK,qBAAqB,EAG3E,QAAWT,KAAO,OAAO,KAAK2D,CAAU,EACtC,GAAI,CAACI,EAAY,IAAI/D,CAAG,EACtB,MAAM,IAAI,MACR,+BAA+BS,CAAK,gCAAgCT,CAAG,IACzE,EAIJ,GAAI,OAAO2D,EAAW,MAAS,UAAY,OAAOA,EAAW,OAAU,SACrE,MAAM,IAAI,MACR,+BAA+BlD,CAAK,yCACtC,EAGF,GAAIkD,EAAW,OAAS,KAAO,EAAEA,EAAW,QAAQG,GAClD,MAAM,IAAI,MACR,+BAA+BrD,CAAK,kCAAkCkD,EAAW,IAAI,IACvF,EAKF,GAFA5B,EAAsB4B,EAAW,UAAW,+BAA+BlD,CAAK,EAAE,EAE9EkD,EAAW,OAAS,QAAa,OAAOA,EAAW,MAAS,WAC9D,MAAM,IAAI,MACR,+BAA+BlD,CAAK,kDACtC,EAGF,GAAIkD,EAAW,gBAAkB,QAAa,OAAOA,EAAW,eAAkB,WAChF,MAAM,IAAI,MACR,+BAA+BlD,CAAK,2DACtC,EAGF,GAAIkD,EAAW,UAAY,QAAa,OAAOA,EAAW,SAAY,WACpE,MAAM,IAAI,MACR,+BAA+BlD,CAAK,qDACtC,EAGF,GAAIkD,EAAW,UAAY,QAAa,OAAOA,EAAW,SAAY,WACpE,MAAM,IAAI,MACR,+BAA+BlD,CAAK,qDACtC,EAGF,GAAIkD,EAAW,KAAO,QAAa,OAAOA,EAAW,IAAO,SAC1D,MAAM,IAAI,MACR,+BAA+BlD,CAAK,8CACtC,EAGF,GAAIkD,EAAW,QAAU,QAAa,OAAOA,EAAW,OAAU,SAChE,MAAM,IAAI,MACR,+BAA+BlD,CAAK,iDACtC,EAGF,GAAIkD,EAAW,QAAU,mBAAqBA,EAAW,QAAU,mBAAoB,CACrF,GAAI,OAAQA,GAAcA,EAAW,KAAO,OAC1C,MAAM,IAAI,MACR,+BAA+BlD,CAAK,gBAAgBkD,EAAW,KAAK,uBACtE,EAEF,QACF,CAEA,GAAI,OAAOA,EAAW,IAAO,SAC3B,MAAM,IAAI,MACR,+BAA+BlD,CAAK,gBAAgBkD,EAAW,KAAK,4BACtE,EAGF,GAAI,CAACH,EAAiBG,EAAW,EAAE,GAAK,EAAEA,EAAW,MAAMG,GACzD,MAAM,IAAI,MACR,+BAA+BrD,CAAK,4BAA4BkD,EAAW,EAAE,IAC/E,CAEJ,CACF,EAEaK,EAAkB,CAC7BC,EACAC,EACAC,EAII,CAAC,KACqC,CAC1C,aAAAD,EACA,GAAIC,EAAQ,eAAiB,OAAY,CAAE,aAAcA,EAAQ,YAAa,EAAI,CAAC,EACnF,GAAIA,EAAQ,QAAU,OAAY,CAAE,MAAOA,EAAQ,KAAM,EAAI,CAAC,EAC9D,GAAI,UAAWA,EAAU,CAAE,MAAOA,EAAQ,KAAM,EAAI,CAAC,EACrD,SAAAF,CACF,GAEaG,EAAgB,CAC3B3C,EACAhB,EACAE,EACA0D,EACAC,EACAhD,IACuC,CACvC,GAAIG,EAAS,SAAW,EACtB,MAAM,IAAI,MAAM,mCAAmC,EAGrD,IAAM8C,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAM9D,CAAK,EAAGgB,EAAS,OAAS,CAAC,CAAC,EACxE+C,EAAgB/C,EAAS8C,CAAS,EAClChD,EAAUJ,GACdG,EAAW,CAAC,GAAI,OAAO,KAAKA,CAAO,EAAiB,GAAGG,CAAQ,EAAcA,CAC/E,EAEA,MAAO,CACL,OAAA4C,EACA,cAAAG,EACA,QAAS,CACP,SAAU,CAAC,GAAG/C,CAAQ,EACtB,MAAO8C,CACT,EACA,QAAS3D,EAAaD,CAAO,EAC7B,QAASW,EACLD,GAAiBC,EAASC,CAAO,EACjCC,GAAyBC,EAAUF,CAAO,EAC9C,MAAOzB,EACLwE,CACF,CACF,CACF,EAEaG,EACXR,GACuC,CACvC,IAAMS,EAAqD,CACzD,GAAGT,EACH,QAAS,CACP,SAAU,CAAC,GAAGA,EAAS,QAAQ,QAAQ,EACvC,MAAOA,EAAS,QAAQ,KAC1B,EACA,QAASrD,EAAaqD,EAAS,OAAO,EACtC,QAAS,CAAE,GAAGA,EAAS,OAAQ,EAC/B,MAAOnE,EACLmE,EAAS,KACX,CACF,EAEA,OAAAlD,GAAoB2D,CAAc,EAC3BA,CACT,EAEaC,GAAmB,MAgB9Bd,EACAI,EACAV,EACAL,EACA0B,EACAC,EAKAC,IACgC,CAChC,QAAWnB,KAAcE,EAAa,CACpC,IAAMkB,EAAcpB,EAAW,OAAS,KAAOA,EAAW,OAASM,EAAS,cACtEe,EAAerB,EAAW,QAAUJ,EAAM,KAEhD,GAAI,CAACwB,GAAe,CAACC,EACnB,SAGF,GAAI,CAACrB,EAAW,KACd,OAAOA,EAGT,IAAIsB,EACJ,GAAI/B,EAAO,QACT,MAAMA,EAAO,OAGf+B,EACEtB,EAAW,KAGX,CACA,SAAAM,EACA,QAASA,EAAS,QAClB,KAAMA,EAAS,cACf,SAAUA,EAAS,QAAQ,SAC3B,MAAOA,EAAS,QAAQ,MACxB,MAAAV,EACA,OAAAL,EACA,SAAA0B,CACF,CAAC,EAED,IAAMM,EAAarD,GAAcoD,CAAW,EACtCE,EAAoBD,EAAcD,EAAuC,KAE3EG,EACJ,GAAI,CACEF,GACFL,GAAO,oBAAoBlB,CAAU,EACrCyB,EAAU,MAAM1C,GACdO,GAAgBkC,EAA2CjC,CAAM,EACjES,EAAW,WAAamB,EACxB,IACE,IAAI7C,GACF,oCAAoC0B,EAAW,WAAamB,CAAgB,cAAcvB,EAAM,IAAI,iBAAiBI,EAAW,IAAM,aAAa,IACrJ,CACJ,GAEAyB,EAAUH,CAEd,OAASjC,EAAO,CACd,MAAIkC,GACFL,GAAO,oBAAoBlB,EAAYX,CAAK,EAExCA,CACR,CAMA,GAJIkC,GACFL,GAAO,sBAAsBlB,CAAU,EAGrCyB,EACF,OAAOzB,CAEX,CAEA,OAAO,IACT,EAEa0B,GAAqB,CAChCpB,EACAqB,EACAC,IACuC,CACvC,IAAMC,EAAevB,EAAS,QAAQ,SAAS,MAAM,EAAGA,EAAS,QAAQ,MAAQ,CAAC,EAC9EwB,EAAeD,EACfF,IAAgBrB,EAAS,gBAC3BwB,EAAe,CAAC,GAAGD,EAAcF,CAAW,GAG9C,IAAMI,EAAYD,EAAa,OAAS,EAClCnE,EAAUK,GAAcsC,EAAS,QAASqB,CAAW,EAE3D,OAAOlB,EACLqB,EACAC,EACAH,EACAtB,EAAS,OACTA,EAAS,MACT3C,CACF,CACF,EC1rBO,IAAMqE,GAA2C,CAItD,CACA,QAAAC,CACF,IAEmD,CACjD,IAAMC,EAAuBC,GAAsCA,IAAU,kBAEvEC,EAAqBC,GACxB,OAAO,OAAOA,EAAW,MAAM,EAA8B,OAC5D,CAACC,EAAOC,IAAUD,GAASJ,EAAoBK,EAAM,KAAK,EAAI,EAAI,GAClE,CACF,EAEEC,EAAeJ,EAAkBH,EAAQ,aAAa,EAAE,KAAK,EAE3DQ,EAAaJ,GAA2C,CAC5DG,EAAeJ,EAAkBC,CAAU,CAC7C,EAEMK,EAAkB,CACtBC,EACAC,EAGAC,IACG,CACH,GAAIA,IAAe,QAAa,CAACZ,EAAQ,YAAYY,CAAU,EAC7D,OAGF,IAAMC,EAAWb,EAAQ,aAAa,EAChCc,EAAUD,EAAS,MAAM,OAAOH,CAAM,GAAKK,EAAwB,EACnEC,EAAOL,EAAQG,CAAO,EAC5B,GACEA,EAAQ,QAAUE,EAAK,OACvBF,EAAQ,YAAcE,EAAK,WAC3BF,EAAQ,eAAiBE,EAAK,cAC9BF,EAAQ,QAAUE,EAAK,MAEvB,OAGF,IAAMC,EAAa,CACjB,GAAGJ,EAAS,MAAM,OAClB,CAACH,CAAM,EAAGM,CACZ,EACME,EAAajB,EAAoBa,EAAQ,KAAK,EAC9CK,EAAgBlB,EAAoBe,EAAK,KAAK,EAC9CI,EACJF,IAAeC,EAAgBZ,EAAeA,GAAgBY,EAAgB,EAAI,IACpFnB,EAAQ,YACN,CACE,GAAGa,EACH,MAAO,CACL,UAAWO,EAAmB,EAC9B,OAAQH,CACV,CACF,EACA,CAAE,OAAQ,GAAM,OAAQ,OAAQ,CAClC,EACAV,EAAea,CACjB,EAEA,MAAO,CACL,UAAAZ,EACA,gBAAAC,EACA,eAAgB,CACdC,EACAR,EACAmB,EACAC,EACAV,IACG,CACHH,EACEC,EACA,KAAO,CACL,MAAAR,EACA,UAAAmB,EACA,aAAcC,GAAgB,KAC9B,MAAO,IACT,GACAV,CACF,CACF,EACA,YAAa,CAACF,EAAiBE,IAAwB,CACrDH,EAAgBC,EAAQ,IAAMK,EAAwB,EAAGH,CAAU,CACrE,EACA,aAAc,CACZF,EACAW,EACAE,EACAD,EACAV,IACG,CACHH,EACEC,EACA,KAAO,CACL,MAAO,QACP,UAAAW,EACA,aAAcC,GAAgB,KAC9B,MAAAC,CACF,GACAX,CACF,CACF,CACF,CACF,ECxIA,IAAMY,GAMJC,GAEAA,EAAY,IAAKC,GACf,OAAOA,GAAU,SAAWA,EAAQA,EAAM,IAC5C,EAEIC,GAA6CC,GAA8C,CAC/F,IAAIC,EAAQ,EACZ,QAAWC,KAAUF,EACfA,EAAQE,CAAM,IAChBD,GAAS,GAGb,OAAOA,CACT,EAEaE,GAAqC,CAOhDC,EACAC,EACAC,IACqC,CACrC,IAAMC,EACJH,EAAQ,cAAgB,OACpB,WACA,MAAM,QAAQA,EAAQ,WAAW,EAC/B,SACA,QACFI,EACJD,IAAS,SACLX,GACEQ,EAAQ,WAMV,EACA,KAEN,MAAO,IAAM,CACX,IAAMK,EAAWH,EAAY,EACvBI,EAAkBD,EAAS,QAAQ,MACnCE,EAAO,CACX,aAAcF,EAAS,cACvB,gBAAAC,EACA,iBAAkBX,GAAkBU,EAAS,OAAO,EACpD,UAAWA,EAAS,MAAM,UAC1B,OAAQA,EAAS,SAAW,QAC5B,UAAWA,EAAS,SAAW,UAC/B,WAAYA,EAAS,SAAW,YAChC,aAAcA,EAAS,SAAW,aAClC,cAAeA,EAAS,gBAAkBJ,EAAgB,OAC5D,EAEA,GAAIE,IAAS,UAAYC,IAAoB,KAAM,CACjD,IAAMI,EAAYJ,EAAgB,OAC5BK,EAAcL,EAAgB,QAAQC,EAAS,aAAa,EAElE,MAAO,CACL,GAAGE,EACH,gBAAiBE,IAAgB,GAAKH,EAAkBG,EACxD,KAAM,SACN,UAAAD,EACA,cAAeA,EACf,YAAaC,IAAgB,EAC7B,WAAYA,IAAgBD,EAAY,EACxC,UAAWJ,CACb,CACF,CAEA,OAAID,IAAS,QACJ,CACL,GAAGI,EACH,KAAM,OACR,EAGK,CACL,GAAGA,EACH,KAAM,UACR,CACF,CACF,ECjFO,IAAMG,GAA+B,CAI1C,CACA,QAAAC,EACA,WAAAC,EACA,QAAAC,EACA,eAAAC,EACA,MAAAC,CACF,IAMiD,CAC/C,IAAMC,EAAoBC,GAAsB,CAC9CC,EAAkB,uCAAuCD,CAAS,eAAe,CACnF,EAEME,EAAqB,IACzBC,EACE,CAACP,CAAO,EACR,EACAQ,EAAaP,CAAc,EAC3B,QACAQ,EAAuBP,CAAK,CAC9B,EAEF,MAAO,CACL,aAAc,IACRJ,EAAQ,WAAW,GACrBK,EAAiB,cAAc,EACxB,QAAQ,QAAQL,EAAQ,YAAY,CAAC,GAGvCA,EAAQ,MACb,SAAY,CACV,IAAMY,EAAWZ,EAAQ,aAAa,EACtC,GAAIY,EAAS,SAAW,QACtB,OAAOZ,EAAQ,YAAY,EAG7B,IAAMa,EAAoBb,EAAQ,YAChC,CACE,GAAGY,EACH,OAAQ,SACV,EACA,CAAE,OAAQ,GAAM,OAAQ,OAAQ,CAClC,EACA,OAAAZ,EAAQ,KAAK,CACX,KAAM,gBACN,OAAQa,EAAkB,cAC1B,UAAWC,EAAI,CACjB,CAAC,EACMd,EAAQ,YAAY,CAC7B,EACA,IAAMA,EAAQ,YAAY,CAC5B,EAEF,aAAc,IACRA,EAAQ,WAAW,GACrBK,EAAiB,cAAc,EACxB,QAAQ,QAAQL,EAAQ,YAAY,CAAC,IAG9CA,EAAQ,eAAe,EAChBA,EAAQ,MACb,SAAY,CACV,IAAMa,EAAoBb,EAAQ,YAAYQ,EAAmB,EAAG,CAClE,OAAQ,GACR,OAAQ,OACV,CAAC,EACD,OAAAR,EAAQ,KAAK,CACX,KAAM,gBACN,OAAQa,EAAkB,cAC1B,UAAWC,EAAI,CACjB,CAAC,EACDb,EAAW,UAAUY,EAAkB,KAAK,EACrCb,EAAQ,YAAY,CAC7B,EACA,IAAMA,EAAQ,YAAY,CAC5B,GAEF,cAAgBe,GACVf,EAAQ,WAAW,GACrBK,EAAiB,eAAe,EACzB,QAAQ,QAAQL,EAAQ,YAAY,CAAC,GAGvCA,EAAQ,MACb,SAAY,CACV,IAAMY,EAAWZ,EAAQ,aAAa,EAChCgB,EAAcC,EAA0BF,EAAQL,EAAaE,EAAS,OAAO,CAAC,CAAC,EAQrF,OAP0BZ,EAAQ,YAChC,CACE,GAAGY,EACH,QAASI,CACX,EACA,CAAE,OAAQ,GAAM,OAAQ,SAAU,CACpC,CAEF,EACA,IAAMhB,EAAQ,YAAY,CAC5B,EAEF,eAAiBkB,GACXlB,EAAQ,WAAW,GACrBK,EAAiB,gBAAgB,EAC1B,QAAQ,QAAQL,EAAQ,YAAY,CAAC,GAGvCA,EAAQ,MACb,SAAY,CACV,IAAMY,EAAWZ,EAAQ,aAAa,EAChCmB,EAAeD,GAAUN,EAAS,cACxC,OAAMO,KAAgBf,GAItBH,EAAW,YAAYkB,CAAY,EAC5BnB,EAAQ,YAAY,CAC7B,EACA,IAAMA,EAAQ,YAAY,CAC5B,EAEF,QAAS,IAAM,CACbA,EAAQ,QAAQ,CAClB,CACF,CACF,EChFO,IAAMoB,GAA2C,CAKtD,CACA,QAAAC,EACA,MAAAC,EACA,YAAAC,EACA,kBAAAC,CACF,KAKoF,CAClF,wBAAyB,CAACC,EAAyBC,EAAuBC,EAAa,IAAM,CAC3F,IAAMC,EAAWP,EAAQ,aAAa,EACtC,GAAIO,EAAS,SAAW,UACtB,OAAOC,EAAgBR,EAAQ,YAAY,EAAG,EAAK,EAGrD,IAAMS,EAAgBC,GAAmBN,CAAc,EACvD,GAAIG,EAAS,QAAQ,QAAU,EAC7B,OAAOC,EAAgBR,EAAQ,YAAY,EAAG,EAAK,EAGrD,IAAMW,EAAOJ,EAAS,cAChBK,EAAY,KAAK,IAAI,EAAGL,EAAS,QAAQ,MAAQE,CAAa,EAC9DI,EAAeN,EAAS,QAAQ,MAAQK,EAC9C,GAAIC,GAAgB,EAClB,OAAOL,EAAgBR,EAAQ,YAAY,EAAG,EAAK,EAGrDA,EAAQ,KAAK,CAAE,KAAM,YAAa,OAAQW,EAAM,UAAWG,EAAI,CAAE,CAAC,EAClE,IAAMC,EAAoBf,EAAQ,YAChCgB,EACET,EAAS,QAAQ,SACjBK,EACAL,EAAS,QACTA,EAAS,OACTA,EAAS,MACTA,EAAS,OACX,EACA,CACE,OAAQ,GACR,OAAQ,YACV,CACF,EAEA,OAAAP,EAAQ,KAAK,CACX,KAAM,sBACN,KAAAW,EACA,GAAII,EAAkB,cACtB,eAAgBN,EAChB,aAAAI,EACA,UAAWC,EAAI,CACjB,CAAC,EACDd,EAAQ,KAAK,CAAE,KAAM,aAAc,OAAQe,EAAkB,cAAe,UAAWD,EAAI,CAAE,CAAC,EAC9FX,EAAkB,CAChB,iBAAkBI,EAClB,SAAUQ,EACV,KAAAJ,EACA,GAAII,EAAkB,cACtB,MAAO,CAAE,KAAM,kBAAmB,EAClC,aAAcV,GAAgB,KAC9B,WAAAC,CACF,CAAC,EAEME,EAAgBO,EAAmB,GAAM,CAC9C,GAAIV,IAAiB,OAAY,CAAE,aAAAA,CAAa,EAAI,CAAC,CACvD,CAAC,CACH,EACA,2BAA4B,CAACA,EAAuBC,EAAa,IAAM,CACrE,IAAMC,EAAWP,EAAQ,aAAa,EACtC,GAAIO,EAAS,SAAW,UACtB,OAAOC,EAAgBR,EAAQ,YAAY,EAAG,EAAK,EAGrD,IAAMiB,EAAcV,EAAS,QAAQ,SAAS,OAAS,EACvD,GAAIA,EAAS,QAAQ,OAASU,EAC5B,OAAOT,EAAgBR,EAAQ,YAAY,EAAG,EAAK,EAGrD,IAAMW,EAAOJ,EAAS,cACtBP,EAAQ,KAAK,CAAE,KAAM,YAAa,OAAQW,EAAM,UAAWG,EAAI,CAAE,CAAC,EAClE,IAAMC,EAAoBf,EAAQ,YAChCgB,EACET,EAAS,QAAQ,SACjBU,EACAV,EAAS,QACTA,EAAS,OACTA,EAAS,MACTA,EAAS,OACX,EACA,CACE,OAAQ,GACR,OAAQ,YACV,CACF,EAEA,OAAAP,EAAQ,KAAK,CACX,KAAM,yBACN,KAAAW,EACA,GAAII,EAAkB,cACtB,UAAWD,EAAI,CACjB,CAAC,EACDd,EAAQ,KAAK,CAAE,KAAM,aAAc,OAAQe,EAAkB,cAAe,UAAWD,EAAI,CAAE,CAAC,EAC9FX,EAAkB,CAChB,iBAAkBI,EAClB,SAAUQ,EACV,KAAAJ,EACA,GAAII,EAAkB,cACtB,MAAO,CAAE,KAAM,qBAAsB,EACrC,aAAcV,GAAgB,KAC9B,WAAAC,CACF,CAAC,EAEME,EAAgBO,EAAmB,GAAM,CAC9C,GAAIV,IAAiB,OAAY,CAAE,aAAAA,CAAa,EAAI,CAAC,CACvD,CAAC,CACH,EACA,8BAA+B,CAACa,EAAmBC,IACjDjB,EAAY,KAAMkB,IACIA,EAAW,OAAS,KAAOA,EAAW,OAASF,IAC7CE,EAAW,QAAUD,CAC5C,EACH,yBAA0B,CACxBD,EACAG,EACAC,EACAjB,EACAe,EACAG,EACAjB,EAAa,IACV,CACH,IAAMC,EAAWP,EAAQ,aAAa,EAChCwB,EAAqBjB,EAAS,QAAQ,SAAS,MAAM,EAAGA,EAAS,QAAQ,MAAQ,CAAC,EAClFQ,EAAoBf,EAAQ,YAChC,CACE,GAAGO,EACH,QAAS,CACP,SAAUiB,EACV,MAAOA,EAAmB,OAAS,CACrC,EACA,QAASD,EACT,OAAQF,IAAW,WAAa,YAAc,YAChD,EACA,CACE,OAAQ,GACR,OAAQ,YACV,CACF,EAEA,OAAArB,EAAQ,KAAK,CACX,KAAM,qBACN,KAAMkB,EACN,GAAIG,EACJ,UAAWC,EAAgB,KAC3B,aAAAjB,EACA,GAAIe,GAAY,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,EACrE,UAAWN,EAAI,CACjB,CAAC,EACDd,EAAQ,KAAK,CACX,KAAMqB,IAAW,WAAa,oBAAsB,qBACpD,OAAQN,EAAkB,cAC1B,UAAWD,EAAI,CACjB,CAAC,EACDX,EAAkB,CAChB,iBAAkBI,EAClB,SAAUQ,EACV,KAAMG,EACN,GAAIG,EACJ,MAAOC,EACP,aAAAjB,EACA,GAAIe,GAAY,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,EACrE,WAAAd,EACA,GAAIc,IAAe,OAAY,CAAE,WAAAA,CAAW,EAAI,CAAC,CACnD,CAAC,EAEMZ,EAAgBO,EAAmB,GAAM,CAC9C,GAAIV,IAAiB,KAAO,CAAE,aAAAA,CAAa,EAAI,CAAC,EAChD,GAAIe,GAAY,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,CACvE,CAAC,CACH,EACA,qBAAsB,CACpBF,EACAG,EACAC,EACAF,EACAG,EACAjB,EAAa,IACV,CACHmB,EAAiBxB,EAAOoB,EAAQ,sCAAsCA,CAAM,IAAI,EAEhF,IAAMd,EAAWP,EAAQ,aAAa,EAChC0B,EAAgBnB,EAAS,cAC3BmB,IAAkBL,GACpBrB,EAAQ,KAAK,CAAE,KAAM,YAAa,OAAQ0B,EAAe,UAAWZ,EAAI,CAAE,CAAC,EAG7E,IAAMC,EAAoBf,EAAQ,YAChC2B,GAAmBpB,EAAUc,EAAQE,CAAW,EAChD,CACE,OAAQ,GACR,OAAQ,YACV,CACF,EAEA,OAAAvB,EAAQ,KAAK,CACX,KAAM,qBACN,KAAMkB,EACN,GAAIH,EAAkB,cACtB,UAAWO,EAAgB,KAC3B,aAAcF,EAAW,GACzB,GAAIA,EAAW,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,EACpE,UAAWN,EAAI,CACjB,CAAC,EACGY,IAAkBX,EAAkB,eACtCf,EAAQ,KAAK,CACX,KAAM,aACN,OAAQe,EAAkB,cAC1B,UAAWD,EAAI,CACjB,CAAC,EAEHX,EAAkB,CAChB,iBAAkBI,EAClB,SAAUQ,EACV,KAAMG,EACN,GAAIH,EAAkB,cACtB,MAAOO,EACP,aAAcF,EAAW,GACzB,GAAIA,EAAW,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,EACpE,WAAAd,EACA,WAAAc,CACF,CAAC,EAEMZ,EAAgBO,EAAmB,GAAM,CAC9C,aAAcK,EAAW,GACzB,GAAIA,EAAW,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,CACtE,CAAC,CACH,CACF,GCzRO,IAAMQ,GAAuC,CAMlD,CACA,QAAAC,EACA,aAAAC,CACF,IAS0F,CACxF,IAAMC,EAGA,CAAC,EAEP,QAAWC,KAAUH,EACnB,GAAI,CACFE,EAAM,KAAK,CACT,KAAMC,EAAO,KACb,MAAOA,EAAO,MAAMF,CAAY,CAOlC,CAAC,CACH,OAASG,EAAO,CACd,QAAWC,IAAqB,CAAC,GAAGH,CAAK,EAAE,QAAQ,EACjD,GAAI,CACFG,EAAkB,MAAM,UAAU,CACpC,MAAQ,CAER,CAGF,IAAMC,EAAUF,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAC/DG,EAAc,IAAI,MAAM,mBAAmBJ,EAAO,IAAI,mBAAmBG,CAAO,EAAE,EACxF,aAAO,OAAOC,EAAa,CAAE,MAAOH,CAAM,CAAC,EACrCG,CACR,CAGF,MAAO,CACL,gBAAkBC,GAChBN,EAAM,OACJ,CAACO,EAAiBN,IAChBA,EAAO,MAAM,kBAAkBM,CAAe,GAAKA,EACrDD,CACF,EACF,iBAAkB,CAAC,CAAE,iBAAAE,EAAkB,SAAAF,EAAU,OAAAG,CAAO,IAAM,CAC5D,IAAIC,EACJ,QAAWT,KAAUD,EACnB,GAAI,CACF,IAAMW,EAASV,EAAO,MAAM,mBAAmB,CAC7C,iBAAAO,EACA,SAAAF,EACA,OAAAG,CACF,CAAC,EACGG,GAAcD,CAAM,GACtBE,EACE,mBAAmBZ,EAAO,IAAI,6IAEhC,CAEJ,OAASC,EAAO,CACdQ,MAAeR,EACjB,CAEF,GAAIQ,IAAe,OACjB,MAAMA,CAEV,EACA,cAAgBI,GAAY,CAC1B,IAAMC,EAAkBD,EAOlBE,EAA0BF,EAC1BG,EAAsB,IAAI,IAEhC,QAAWhB,KAAUD,EAAO,CAC1B,IAAMkB,EAAYjB,EAAO,MAAM,iBAAiB,CAC9C,QAAAa,EACA,QAASf,EAAa,QAOtB,gBAAiBA,EAAa,eAOhC,CAAC,EAED,GAAKmB,EAIL,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQF,CAAS,EAAG,CACpD,IAAMG,EAAiBJ,EAAoB,IAAIE,CAAG,EAClD,GAAIE,EACF,MAAM,IAAI,MACR,mBAAmBpB,EAAO,IAAI,iBAAiBkB,CAAG,wCAAmCE,CAAc,IACrG,EAEF,GAAIF,KAAOJ,EACT,MAAM,IAAI,MACR,mBAAmBd,EAAO,IAAI,uCAAuCkB,CAAG,IAC1E,EAEFF,EAAoB,IAAIE,EAAKlB,EAAO,IAAI,EACxCe,EAAwBG,CAAG,EAAIC,CACjC,CACF,CAEA,OAAOL,CACT,EACA,QAAS,IAAM,CACb,IAAIL,EACJ,QAAWT,KAAUD,EACnB,GAAI,CACFC,EAAO,MAAM,UAAU,CACzB,OAASC,EAAO,CACdQ,MAAeR,EACjB,CAEF,GAAIQ,IAAe,OACjB,MAAMA,CAEV,CACF,CACF,ECtIO,IAAMY,GAA8B,CAIzC,CACA,SAAUC,EACV,iBAAAC,EACA,UAAAC,EACA,gBAAAC,CACF,IAS2D,CACzD,IAAIC,EAAWC,EAAkBL,CAAe,EAC5CM,EAAkBD,EAAkBD,CAAQ,EAC1CG,EAAY,IAAI,IAChBC,EAAiB,IAAI,IACvBC,EAA6B,QAAQ,QAAQ,EAC7CC,EAAmB,EACnBC,EAAa,GACbC,EAAgD,KAC9CC,EAA4B,IAAI,IAChCC,EACJX,IACC,CAACY,EAAgBC,IAAkC,CAClDC,GAAmB,WAAWD,CAAO,4BAA6BD,CAAK,CACzE,GAEIG,EAAS,IAAM,CACnB,QAAWC,KAAYZ,EACrB,GAAI,CACFY,EAAS,CACX,OAASJ,EAAO,CAEdD,EAAoBC,EAAO,UAAU,CACvC,CAEJ,EAEMK,EAAQC,GAAuD,CACnE,QAAWF,KAAYX,EACrB,GAAI,CACFW,EAASE,CAAK,CAChB,OAASN,EAAO,CAEdD,EAAoBC,EAAO,OAAO,CACpC,CAEJ,EAEMO,EAAc,CAClBC,EACAC,EAA2B,CAAC,IACzB,CACH,IAAMC,EAA0BnB,EAC1BoB,EAAiBrB,EAAkBkB,CAAY,EAC/CI,EAAsBtB,EAAkBqB,CAAc,EAC5D,OAAAzB,IAAmB,CACjB,iBAAkBI,EAAkBoB,CAAuB,EAC3D,SAAUpB,EAAkBsB,CAAmB,EAC/C,OAAQH,EAAQ,QAAU,YAC5B,CAAC,EACDpB,EAAWsB,EACXpB,EAAkBqB,EACdH,EAAQ,QACVN,EAAO,EAEFS,CACT,EAEMC,EAAeC,GACnB,CAAClB,GAAckB,IAAenB,EAE1BoB,EAAiB,IAAM,CAC3BpB,GAAoB,EAChBE,GAAyB,CAACA,EAAsB,OAAO,SACzDA,EAAsB,MAAM,EAE9BA,EAAwB,KACxB,QAAWmB,KAAclB,EAClBkB,EAAW,OAAO,SACrBA,EAAW,MAAM,EAGrBlB,EAA0B,MAAM,EAChCJ,EAAc,QAAQ,QAAQ,CAChC,EAEMuB,EAAiBH,GAA+C,CACpE,GAAI,CAACD,EAAYC,CAAU,EACzB,OAAO,KAGT,IAAME,EAAa,IAAI,gBACvB,OAAKH,EAAYC,CAAU,GAK3BhB,EAA0B,IAAIkB,CAAU,EACjCA,IALLA,EAAW,MAAM,EACV,KAKX,EAEME,EAAkBF,GAAgC,CACtDlB,EAA0B,OAAOkB,CAAU,CAC7C,EAEMG,EAAQ,CACZC,EACAC,IACe,CACf,IAAMP,EAAanB,EACb2B,EAAqB,SAAY,CACrC,GAAI,CAACT,EAAYC,CAAU,EACzB,OAAOO,EAAW,EAEpB,IAAME,EAAkB,IAAI,gBAC5B1B,EAAwB0B,EAExB,GAAI,CACF,OAAKV,EAAYC,CAAU,EAKpB,MAAMM,EAAON,EAAYS,EAAgB,MAAM,GAJpDA,EAAgB,MAAM,EACfF,EAAW,EAItB,QAAE,CACIxB,IAA0B0B,IAC5B1B,EAAwB,KAE5B,CACF,EAEM2B,EAAgB9B,EAAY,KAAK4B,EAAoBA,CAAkB,EAG7E,OAAA5B,EAAc8B,EAAc,KAC1B,IAAG,GACH,IAAG,EACL,EACOA,CACT,EAEMC,EAAarB,GACbR,EACK,IAAG,IAGZJ,EAAU,IAAIY,CAAQ,EACf,IAAM,CACXZ,EAAU,OAAOY,CAAQ,CAC3B,GAoDF,MAAO,CACL,YAAa,IAAMb,EACnB,aAAc,IAAMF,EACpB,YAAAkB,EACA,WAAY,IAAMX,EAClB,YAAAiB,EACA,eAAAE,EACA,cAAAE,EACA,eAAAC,EACA,MAAAC,EACA,OAAAhB,EACA,KAAAE,EACA,UAAAoB,EACA,kBA9DwB,CACxBC,EACAtB,EACAuB,IACG,CACH,GAAI/B,EACF,MAAO,IAAG,GAGZ,IAAMgC,EAAUD,GAAc,OAAO,GACjCE,EAAWH,EAASnC,CAAe,EAEvC,OAAOkC,EAAU,IAAM,CACrB,IAAMK,EAAeJ,EAASnC,CAAe,EAC7C,GAAIqC,EAAQC,EAAUC,CAAY,EAChC,OAGF,IAAMC,EAAWF,EACjBA,EAAWC,EACX1B,EAAS0B,EAAcC,CAAQ,CACjC,CAAC,CACH,EAyCE,eAtCA3B,GAEIR,EACK,IAAG,IAGZH,EAAe,IAAIW,CAAQ,EACpB,IAAM,CACXX,EAAe,OAAOW,CAAQ,CAChC,GA8BA,QA3Bc,IAAM,CAChBR,IAIJA,EAAa,GACbmB,EAAe,EACfvB,EAAU,MAAM,EAChBC,EAAe,MAAM,EACrBN,IAAY,EACd,CAkBA,CACF,EC5NO,IAAM6C,GAAqC,CAMhDC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IAC+D,CAC/D,IAAMC,EAA0B,CAACC,EAAY,SAC3CC,EAAgBX,EAAQ,YAAY,EAAG,GAAO,CAC5C,GAAIA,EAAQ,WAAW,EAAI,CAAE,MAAO,IAAIY,EAAqBF,CAAS,CAAE,EAAI,CAAC,CAC/E,CAAC,EAEGG,EAAyB,CAC7BC,EACAC,EACAC,IAEAL,EAAgBX,EAAQ,YAAY,EAAG,GAAO,CAC5C,GAAIe,IAAiB,OAAY,CAAE,aAAAA,CAAa,EAAI,CAAC,EACrD,GAAIC,IAAU,OAAY,CAAE,MAAAA,CAAM,EAAI,CAAC,EACvC,MAAAF,CACF,CAAC,EAEGG,EAA6B,CACjCC,EACAC,EACAL,EACAC,EACAC,EACAI,EACAC,EAAuB,MAElBA,GACHpB,EAAW,aAAaiB,EAAUC,EAAWL,EAAOC,GAAgB,OAAWK,CAAU,EAE3FpB,EAAQ,KAAK,CACX,KAAM,mBACN,KAAMkB,EACN,UAAAC,EACA,aAAAJ,EACA,GAAIC,IAAU,OAAY,CAAE,MAAAA,CAAM,EAAI,CAAC,EACvC,MAAAF,EACA,UAAWQ,EAAI,CACjB,CAAC,EACMT,EAAuBC,EAAOC,GAAgB,OAAWC,CAAK,GAGjEO,EAA4B,CAChCC,EACAN,IAKKO,GAAoBD,CAAK,GAI9BE,EAAiBtB,EAAOoB,EAAM,OAAQ,qCAAqCA,EAAM,MAAM,IAAI,EAEpF,CACL,sBAAuBnB,EAAY,OAAQsB,IACrBA,EAAW,OAAS,KAAOA,EAAW,OAAST,IAGjES,EAAW,QAAU,gBACrB,OAAQA,GACRA,EAAW,KAAOH,EAAM,MAE3B,EACD,YAAa,IACf,GAhBS,CAAE,sBAAuBnB,EAAa,YAAa,IAAK,EAmB7DuB,EAA0B,MAC9BC,EACAC,EACAZ,EACAE,EACAW,IAOG,CACH,IAAIJ,EACAK,EAA6C,KAC7CC,EACAC,EAAyB,GAC7B,GAAI,CACFP,EAAc,MAAMQ,GAClBN,EACAO,EAAkBpC,EAAQ,aAAa,CAAC,EACxC8B,EACAC,EACAzB,EACA,CACE,kBAAoB+B,GAAsB,CACxCpC,EAAW,eACTiB,EACA,kBACAY,EAAgB,KAChBO,EAAkB,GAClBjB,CACF,CACF,EACA,oBAAqB,IAAM,CACzBnB,EAAW,YAAYiB,EAAUE,CAAU,CAC7C,EACA,kBAAmB,CAACiB,EAAmBvB,IAAU,CAC/CkB,EAA8BK,EAAkB,IAAM,KACtDJ,EAAuBI,EAAkB,MACzCH,EAAyB,GACzBjC,EAAW,aACTiB,EACAY,EAAgB,KAChBhB,EACAuB,EAAkB,GAClBjB,CACF,CACF,CACF,EACAZ,CACF,CACF,OAASM,EAAO,CACd,OAAKd,EAAQ,YAAYoB,CAAU,EAI5B,CACL,WAAY,KACZ,YAAaH,EACXC,EACAY,EAAgB,KAChBhB,EACAkB,EACAC,EACAb,EACAc,CACF,CACF,EAdS,CAAE,WAAY,KAAM,YAAazB,EAAwBqB,EAAgB,IAAI,CAAE,CAe1F,CAEA,MAAO,CAAE,WAAAH,EAAY,YAAa,IAAK,CACzC,EAEMW,EAA0B,CAC9Bd,EACAN,EACAE,IACyC,CACzC,GAAIK,GAAoBD,CAAK,EAC3B,OAAOf,EAAwBe,EAAM,IAAI,EAG3C,GAAIA,EAAM,OAAS,mBAAoB,CACrC,IAAMe,EAAiBrC,EAAW,wBAAwB,EAAGsB,EAAM,KAAMJ,CAAU,EACnF,OAAImB,EAAe,cACjBvC,EAAQ,KAAK,CACX,KAAM,qBACN,KAAMkB,EACN,GAAIqB,EAAe,SAAS,cAC5B,UAAWf,EAAM,KACjB,aAAc,KACd,UAAWF,EAAI,CACjB,CAAC,EAEIiB,CACT,CAkBA,OAfEf,EAAM,OAAS,gBACf,CAACjB,GACD,CAACL,EAAW,8BAA8BgB,EAAU,cAAc,GAclEM,EAAM,OAAS,mBACf,CAACtB,EAAW,8BAA8BgB,EAAU,iBAAiB,EAE9DhB,EAAW,yBAChBgB,EACA,WACAM,EACA,KACA,OACAxB,EAAQ,aAAa,EAAE,QACvBoB,CACF,EAIAI,EAAM,OAAS,oBACf,CAACtB,EAAW,8BAA8BgB,EAAU,kBAAkB,EAE/DhB,EAAW,yBAChBgB,EACA,aACAM,EACA,KACA,OACAxB,EAAQ,aAAa,EAAE,QACvBoB,CACF,EAGKX,EAAwBe,EAAM,IAAI,CAC3C,EAEMgB,EAAqB,CACzBb,EACAG,EACAZ,EACAE,IAG8E,CAC9E,IAAMqB,EAAWzC,EAAQ,aAAa,EACtC,GAAI,CAAC2B,EAAW,cACd,MAAO,CAAE,YAAac,EAAS,QAAS,YAAa,IAAK,EAG5D,GAAI,CACF,IAAMC,EACJf,EAAW,cAQX,CACA,SAAUS,EAAkBK,CAAQ,EACpC,QAASA,EAAS,QAClB,KAAMA,EAAS,cACf,SAAUA,EAAS,QAAQ,SAC3B,MAAOA,EAAS,QAAQ,MACxB,MAAOX,CAOT,CAAC,EAED,MAAO,CACL,YAAaa,EAA0BD,CAAW,EAClD,YAAa,IACf,CACF,OAAS5B,EAAO,CACd,OAAKd,EAAQ,YAAYoB,CAAU,EAI5B,CACL,YAAa,KACb,YAAaH,EACXC,EACAY,EAAgB,KAChBhB,EACAa,EAAW,GACXA,EAAW,MACXP,CACF,CACF,EAbS,CAAE,YAAa,KAAM,YAAaX,EAAwBqB,EAAgB,IAAI,CAAE,CAc3F,CACF,EAEA,MAAO,CACL,wBAAArB,EACA,YAAa,MACXe,EACAJ,EACAW,IACkD,CAClD,GAAI/B,EAAQ,aAAa,EAAE,SAAW,UACpC,OAAOS,EAAwBe,EAAM,IAAI,EAG3C,IAAMN,EAAWlB,EAAQ,aAAa,EAAE,cAClC8B,EAAkBN,EAGxB,GAFAxB,EAAQ,KAAK,CAAE,KAAM,mBAAoB,KAAMkB,EAAU,MAAAM,EAAO,UAAWF,EAAI,CAAE,CAAC,EAE9EnB,EAAU,CACZ,GAAIsB,GAAoBD,CAAK,EAC3B,OAAOtB,EAAW,qBAChBgB,EACAM,EAAM,OACNM,EACA,CACE,KAAMZ,EACN,MAAO,eACP,GAAIM,EAAM,MACZ,EACAxB,EAAQ,aAAa,EAAE,QACvBoB,CACF,EAGF,GACEI,EAAM,OAAS,mBACfA,EAAM,OAAS,oBACfA,EAAM,OAAS,mBAEf,OAAOf,EAAwBe,EAAM,IAAI,CAE7C,CAEA,IAAMoB,EAAuBrB,EAA0BC,EAAON,CAAQ,EACtE,GAAI0B,EAAqB,YACvB,OAAOA,EAAqB,YAG9B,IAAMC,EAAsB,MAAMjB,EAChCgB,EAAqB,sBACrBd,EACAZ,EACAE,EACAW,CACF,EACA,GAAIc,EAAoB,YACtB,OAAOA,EAAoB,YAG7B,GAAI,CAAC7C,EAAQ,YAAYoB,CAAU,EACjC,OAAOX,EAAwBe,EAAM,IAAI,EAG3C,GAAM,CAAE,WAAAG,CAAW,EAAIkB,EACvB,GAAI,CAAClB,EACH,OAAOW,EAAwBd,EAAON,EAAUE,CAAU,EAG5DnB,EAAW,YAAYiB,EAAUE,CAAU,EAE3C,IAAM0B,EAAoBN,EACxBb,EACAG,EACAZ,EACAE,CACF,EACA,GAAI0B,EAAkB,YACpB,OAAOA,EAAkB,YAG3B,IAAMC,EAASC,GAAwBrB,CAAU,EACjD,OAAIsB,EAAiBF,CAAM,EAClB7C,EAAW,yBAChBgB,EACA6B,EACAjB,EACAH,EAAW,IAAM,KACjBA,EACAmB,EAAkB,YAClB1B,CACF,EAGKlB,EAAW,qBAChBgB,EACA6B,EACAjB,EACAH,EACAmB,EAAkB,YAClB1B,CACF,CACF,CACF,CACF,ECpbA,IAAM8B,GAA4BC,GAAkB,CAClD,IAAIC,EAAO,WACX,QAASC,EAAQ,EAAGA,EAAQF,EAAM,OAAQE,GAAS,EACjDD,GAAQD,EAAM,WAAWE,CAAK,EAC9BD,EAAO,KAAK,KAAKA,EAAM,QAAQ,EAEjC,OAAQA,IAAS,GAAG,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAClD,EAEME,GAMJC,GACyE,CACzE,IAAMC,EAAwB,IAAI,IAC5BC,EAAU,IAAI,IAEpB,OAAOF,EAAY,IAAKG,GAAe,CACrC,IAAMC,EACJD,EAAW,QAAU,kBACjB,WACAA,EAAW,QAAU,mBACnB,aACA,OAAOA,EAAW,EAAE,EACtBE,EAAW,KAAK,UAAU,CAC9B,KAAMF,EAAW,KACjB,MAAOA,EAAW,MAClB,OAAAC,CACF,CAAC,EACKE,GAAWL,EAAsB,IAAII,CAAQ,GAAK,GAAK,EAC7DJ,EAAsB,IAAII,EAAUC,CAAO,EAE3C,IAAMC,EAAa,KAAK,UAAU,CAChC,KAAMJ,EAAW,KACjB,MAAOA,EAAW,MAClB,OAAAC,EACA,QAAAE,CACF,CAAC,EAEGE,EAAS,EACPC,GAAM,IAAM,CAChB,IAAIC,EAAYf,GAAyBY,CAAU,EACnD,KAAOL,EAAQ,IAAIQ,CAAS,GAC1BF,GAAU,EACVE,EAAYf,GAAyB,GAAGY,CAAU,IAAIC,CAAM,EAAE,EAEhE,OAAOE,CACT,GAAG,EACH,OAAAR,EAAQ,IAAIO,CAAE,EAEP,CACL,GAAGN,EACH,GAAAM,EACA,GAAIN,EAAW,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,CACtE,CACF,CAAC,CACH,EAEaQ,GAOXC,GACkF,CAElF,IAAMC,EAAoF,CAAC,EACrF,CAAE,YAAAb,CAAY,EAAIY,EAExB,GAAIZ,IAAgB,OAClB,MAAO,CACL,GAAGY,EACH,YAAab,GAAyBc,CAAmB,CAC3D,EAGF,GAAI,MAAM,QAAQb,CAAW,EAAG,CAC9B,GAAIA,EAAY,SAAW,EACzB,MAAM,IAAI,MACR,6EACF,EAGF,GAAM,CAACc,EAAa,GAAGC,CAAa,EAAIf,EACxC,GAAI,OAAOc,GAAgB,SACzB,MAAM,IAAI,MAAM,iEAAiE,EAGnF,GAAI,EAAEA,KAAeF,EAAQ,OAC3B,MAAM,IAAI,MAAM,sDAAsDE,CAAW,IAAI,EAIvF,IAAME,EAAmBJ,EAAQ,SAAWE,EAE5C,GAAIF,EAAQ,UAAY,QAIlB,CAHeZ,EAAY,IAAKiB,GAClC,OAAOA,GAAU,SAAWA,EAAQA,EAAM,IAC5C,EACgB,SAASL,EAAQ,OAAO,EACtC,MAAM,IAAI,MACR,yBAAyBA,EAAQ,OAAO,yCAC1C,EAIJ,IAAIM,EAAeJ,EACbK,EAAY,IAAI,IAAY,CAACL,CAAW,CAAC,EAC/C,OAAW,CAACM,EAAQH,CAAK,IAAKF,EAAc,QAAQ,EAAG,CACrD,IAAMjB,EAAQsB,EAAS,EACvB,GAAI,OAAOH,GAAU,SAAU,CAC7B,GAAI,EAAEA,KAASL,EAAQ,OACrB,MAAM,IAAI,MAAM,sDAAsDK,CAAK,IAAI,EAGjF,GAAIE,EAAU,IAAIF,CAAK,EACrB,MAAM,IAAI,MACR,sDAAsDA,CAAK,cAAcnB,CAAK,GAChF,EAEFqB,EAAU,IAAIF,CAAK,EAEnBJ,EAAoB,KAAK,CACvB,KAAMK,EACN,MAAO,eACP,GAAID,CACN,CAA+D,EAC/DC,EAAeD,EACf,QACF,CAEA,GAAI,CAACA,GAAS,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAC5D,MAAM,IAAI,MACR,uCAAuCnB,CAAK,kDAC9C,EAGF,IAAMuB,EAAc,IAAI,IAAI,CAC1B,OACA,QACA,gBACA,UACA,UACA,WACF,CAAC,EACD,QAAWC,KAAO,OAAO,KAAKL,CAAK,EACjC,GAAI,CAACI,EAAY,IAAIC,CAAG,EACtB,MAAM,IAAI,MACR,6CAA6CxB,CAAK,gCAAgCwB,CAAG,gGACvF,EAIJ,GAAI,OAAOL,EAAM,MAAS,SACxB,MAAM,IAAI,MACR,6CAA6CnB,CAAK,6BACpD,EAGF,GAAI,EAAEmB,EAAM,QAAQL,EAAQ,OAC1B,MAAM,IAAI,MAAM,sDAAsDK,EAAM,IAAI,IAAI,EAGtF,GAAIE,EAAU,IAAIF,EAAM,IAAI,EAC1B,MAAM,IAAI,MACR,sDAAsDA,EAAM,IAAI,cAAcnB,CAAK,GACrF,EAIF,GAFAqB,EAAU,IAAIF,EAAM,IAAI,EAEpBA,EAAM,gBAAkB,QAAa,OAAOA,EAAM,eAAkB,WACtE,MAAM,IAAI,MACR,6CAA6CnB,CAAK,2DACpD,EAGF,GAAImB,EAAM,UAAY,QAAa,OAAOA,EAAM,SAAY,WAC1D,MAAM,IAAI,MACR,6CAA6CnB,CAAK,qDACpD,EAGF,GAAImB,EAAM,UAAY,QAAa,OAAOA,EAAM,SAAY,WAC1D,MAAM,IAAI,MACR,6CAA6CnB,CAAK,qDACpD,EAGFyB,EAAsBN,EAAM,UAAW,6CAA6CnB,CAAK,EAAE,EAE3Fe,EAAoB,KAAK,CACvB,GAAII,EAAM,QAAU,OAAY,CAAE,MAAOA,EAAM,KAAM,EAAI,CAAC,EAC1D,GAAIA,EAAM,YAAc,OAAY,CAAE,UAAWA,EAAM,SAAU,EAAI,CAAC,EACtE,GAAIA,EAAM,gBAAkB,OAAY,CAAE,cAAeA,EAAM,aAAc,EAAI,CAAC,EAClF,GAAIA,EAAM,UAAY,OAAY,CAAE,QAASA,EAAM,OAAQ,EAAI,CAAC,EAChE,GAAIA,EAAM,UAAY,OAAY,CAAE,QAASA,EAAM,OAAQ,EAAI,CAAC,EAChE,KAAMC,EACN,MAAO,eACP,GAAID,EAAM,IACZ,CAA+D,EAC/DC,EAAeD,EAAM,IACvB,CAEA,MAAO,CACL,GAAGL,EACH,QAASI,EACT,YAAajB,GAAyBc,CAAmB,CAC3D,CACF,CAEA,GAAI,CAACb,GAAe,OAAOA,GAAgB,SACzC,MAAM,IAAI,MAAM,sEAAsE,EAGxF,IAAMwB,EAAkBxB,EAOlByB,EAAsB,CAC1B,GAAG,OAAO,QAAQD,CAAe,EAAE,OAAO,CAAC,CAACE,CAAO,IAAMA,IAAY,QAAQ,EAC7E,GAAIF,EAAgB,OAAU,CAAC,CAAC,SAAUA,EAAgB,MAAM,CAAC,EAAc,CAAC,CAClF,EAEA,OAAW,CAACE,EAASC,CAAQ,IAAKF,EAAqB,CACrD,GAAIC,IAAY,UAAY,EAAEA,KAAWd,EAAQ,OAC/C,MAAM,IAAI,MAAM,+CAA+Cc,CAAO,IAAI,EAG5E,GAAI,CAACC,GAAY,OAAOA,GAAa,UAAY,MAAM,QAAQA,CAAQ,EACrE,MAAM,IAAI,MAAM,4BAA4BD,CAAO,gCAAgC,EAGrF,OAAW,CAACE,EAAOC,CAAQ,IAAK,OAAO,QAAQF,CAAQ,EAEpD,CACD,IAAMG,EAAaF,IAAU,mBAAqBA,IAAU,mBACtDG,EACJD,IAAeD,IAAa,IAAS,MAAM,QAAQA,CAAQ,GAAKA,EAAS,SAAW,GAChF,CAAC,CAAC,CAAC,EACHA,EAEN,GAAI,CAAC,MAAM,QAAQE,CAAK,EACtB,MAAM,IAAI,MAAM,4BAA4BL,CAAO,IAAIE,CAAK,qBAAqB,EAGnF,OAAW,CAAC9B,EAAOkC,CAAI,IAAKD,EAAM,QAAQ,EAAG,CAC3C,GAAI,CAACC,GAAQ,OAAOA,GAAS,SAC3B,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,uBACrD,EAGF,IAAMuB,EAAc,IAAI,IACtBS,EACI,CAAC,OAAQ,gBAAiB,UAAW,UAAW,QAAS,WAAW,EACpE,CAAC,KAAM,OAAQ,gBAAiB,UAAW,UAAW,QAAS,WAAW,CAChF,EACA,QAAWR,KAAO,OAAO,KAAKU,CAAI,EAChC,GAAI,CAACX,EAAY,IAAIC,CAAG,EACtB,MAAM,IAAI,MACR,0BAA0BI,CAAO,IAAIE,CAAK,IAAI9B,CAAK,kCAAkCwB,CAAG,IAC1F,EAIJ,GAAI,CAACQ,GAAc,OAAQE,EAA0B,IAAO,SAC1D,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,6BACrD,EAGF,GAAKkC,EAA4B,OAAS,QAAa,OAAOA,EAAK,MAAS,WAC1E,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,oDACrD,EAGF,GACGkC,EAAqC,gBAAkB,QACxD,OAAOA,EAAK,eAAkB,WAE9B,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,6DACrD,EAGF,GACGkC,EAA+B,UAAY,QAC5C,OAAOA,EAAK,SAAY,WAExB,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,uDACrD,EAGF,GACGkC,EAA+B,UAAY,QAC5C,OAAOA,EAAK,SAAY,WAExB,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,uDACrD,EAGF,GAAKkC,EAA6B,QAAU,QAAa,OAAOA,EAAK,OAAU,SAC7E,MAAM,IAAI,MACR,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,mDACrD,EAGFyB,EACGS,EAAiC,UAClC,0BAA0BN,CAAO,IAAIE,CAAK,IAAI9B,CAAK,IACrD,EAEAe,EAAoB,KAAK,CACvB,GAAGmB,EACH,KAAON,IAAY,SAAW,IAAMA,EACpC,MAAAE,CACF,CAA+D,CACjE,CACF,CACF,CAEA,MAAO,CACL,GAAGhB,EACH,YAAab,GAAyBc,CAAmB,CAC3D,CACF,ECtTO,SAASoB,GAQdC,EACAC,EACyF,CACzF,GAAI,CAACD,EAAQ,OAAS,OAAOA,EAAQ,OAAU,SAC7C,MAAM,IAAI,MAAM,wCAAwC,EAG1D,GACEA,EAAQ,cAAgB,SACvBA,EAAQ,cAAgB,MACtB,OAAOA,EAAQ,aAAgB,UAAY,CAAC,MAAM,QAAQA,EAAQ,WAAW,GAEhF,MAAM,IAAI,MAAM,sEAAsE,EAGxF,QAAWE,KAAU,OAAO,KAAKF,EAAQ,KAAK,EAC5C,GAAIE,IAAW,KAAOA,IAAW,UAAYA,IAAW,YAAcA,IAAW,aAC/E,MAAM,IAAI,MAAM,YAAYA,CAAM,kDAAkD,EAIxF,GAAIF,EAAQ,UAAY,QAAa,CAAC,MAAM,QAAQA,EAAQ,WAAW,EACrE,MAAM,IAAI,MACR,wIAEF,EAGFG,EAA0BH,EAAQ,OAAO,EACzC,IAAMI,EAAkBC,GAAyBL,CAAO,EAExDM,EACEF,EAAgB,MAChBA,EAAgB,QAChB,yBAAyBA,EAAgB,OAAO,qCAClD,EACAG,GAA2BH,EAAgB,YAAaA,EAAgB,KAAK,EAE7E,IAAMI,EAA4BP,GAAS,2BAA6B,GACxEQ,EAAsBR,GAAS,iBAAkB,yBAAyB,EAC1E,IAAMS,EAAmBT,GAAS,iBAC5BU,EAAyBC,EAAaR,EAAgB,OAAO,EAC7DS,EAAW,OAAO,YACrB,OAAO,KAAKT,EAAgB,KAAK,EAAgB,IAAKF,GAAW,CAChEA,EACAY,GAAeV,EAAgB,MAAMF,CAAM,EAAE,IAAI,CACnD,CAAC,CACH,EAEMa,EAAuB,IAC3BC,EACE,CAACZ,EAAgB,OAAO,EACxB,EACAQ,EAAaD,CAAsB,EACnC,QACAM,EAAuBb,EAAgB,KAAK,CAC9C,EAEIc,EAAmBC,GAMvB,CACA,QAASlB,GAAS,SAAW,CAAC,EAC9B,aAAc,CACZ,QAAAD,EACA,gBAAAI,EACA,QAAS,CACP,0BAAAI,EACA,iBAAAE,CACF,EACA,qBAAAK,CACF,CACF,CAAC,EAEKK,EAAkBF,EAAiB,gBAAgBH,EAAqB,CAAC,EAC/EZ,EAA0BiB,EAAgB,QAAS,0BAA0B,EAE7E,IAAMC,EAAkBpB,GAAS,gBAC3BqB,EAAmBrB,GAAS,iBAC5BsB,EAAUC,GAA0D,CACxE,SAAUJ,EACV,iBAAkBF,EAAiB,iBACnC,UAAWA,EAAiB,QAC5B,GAAIG,IAAoB,OAAY,CAAE,gBAAAA,CAAgB,EAAI,CAAC,CAC7D,CAAC,EACKI,EAAaC,GAAuE,CACxF,QAAAH,CACF,CAAC,EAEGI,EAEiD,IACnD,QAAQ,QAAQC,EAAgBL,EAAQ,YAAY,EAAG,EAAK,CAAC,EAEzDM,EAAwF,CAAC,CAC7F,iBAAAC,EACA,SAAAC,EACA,KAAAC,EACA,GAAAC,EACA,MAAAC,EACA,aAAAC,EACA,MAAAC,EACA,WAAAC,EACA,WAAAC,CACF,IAAM,CACJ,IAAMC,EAAanC,EAAgB,MAAM4B,CAAI,EACvCQ,EAAaC,EAAiBR,CAAE,EAAI,KAAO7B,EAAgB,MAAM6B,CAAE,EACnES,EAAYtC,EAAgB,UAAY,CAAC,EACzCuC,EAAYC,GACZ,CAACrB,EAAQ,YAAYc,CAAU,GAAKd,EAAQ,WAAW,EAClD,QAAQ,QAAQK,EAAgBL,EAAQ,YAAY,EAAG,EAAK,CAAC,EAE/DI,EAAaiB,CAAS,EAEzBC,GAA2BtB,EAAQ,cAAcc,CAAU,EACjE,GAAI,CAACQ,GACH,OAEF,GAAM,CAAE,OAAAC,CAAO,EAAID,GACbE,EAAuB,CAC3BC,EACAC,KACG,CACH,IAAMC,GAAU,CACd,MAAAD,GACA,KAAAjB,EACA,GAAAC,EACA,UAAWC,EAAM,KACjB,aAAAC,EACA,GAAIC,IAAU,OAAY,CAAE,MAAAA,CAAM,EAAI,CAAC,CACzC,EACAb,EAAQ,KAAK,CACX,KAAM,kBACN,GAAG2B,GACH,MAAAF,EACA,UAAWG,EAAI,CACjB,CAAC,EACD7B,IAAmB0B,EAAOE,EAAO,CACnC,GAEM,SAAY,CAChB,GAAI,CACF,GAAIX,GAAY,QACd,GAAI,CACF,MAAMA,EAAW,QAAQ,CACvB,SAAUT,EACV,QAASA,EAAiB,QAC1B,KAAAE,EACA,GAAAC,EACA,MAAAC,EACA,aAAAC,EACA,GAAIC,IAAU,OAAY,CAAE,MAAAA,CAAM,EAAI,CAAC,EACvC,SAAAM,EACA,OAAAI,EACA,SAAAH,CACF,CAAC,CACH,OAASK,EAAO,CACd,GAAIF,EAAO,SAAW,CAACvB,EAAQ,YAAYc,CAAU,EACnD,OAEFU,EAAqBC,EAAO,cAAc,EAC1C,MACF,CAGF,GAAI,CAACzB,EAAQ,YAAYc,CAAU,EACjC,OAGF,GAAIC,GAAY,QACd,GAAI,CACF,MAAMA,EAAW,QAAQ,CACvB,SAAUR,EACV,QAASA,EAAiB,QAC1B,KAAAE,EACA,GAAAC,EACA,MAAAC,EACA,aAAAC,EACA,GAAIG,EAAW,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,EACpE,SAAAI,EACA,OAAAI,EACA,SAAAH,CACF,CAAC,CACH,OAASK,EAAO,CACd,GAAIF,EAAO,SAAW,CAACvB,EAAQ,YAAYc,CAAU,EACnD,OAEFU,EAAqBC,EAAO,oBAAoB,EAChD,MACF,CAGF,GAAI,CAACzB,EAAQ,YAAYc,CAAU,EACjC,OAGF,GAAIG,GAAY,QACd,GAAI,CACF,MAAMA,EAAW,QAAQ,CACvB,SAAAT,EACA,QAASA,EAAS,QAClB,KAAAC,EACA,GAAAC,EACA,MAAAC,EACA,aAAAC,EACA,GAAIC,IAAU,OAAY,CAAE,MAAAA,CAAM,EAAI,CAAC,EACvC,SAAAM,EACA,OAAAI,EACA,SAAAH,CACF,CAAC,CACH,OAASK,EAAO,CACd,GAAIF,EAAO,SAAW,CAACvB,EAAQ,YAAYc,CAAU,EACnD,OAEFU,EAAqBC,EAAO,cAAc,EAC1C,MACF,CAGF,GAAI,CAACzB,EAAQ,YAAYc,CAAU,EACjC,OAGF,GAAIC,GAAY,QACd,GAAI,CACF,MAAMA,EAAW,QAAQ,CACvB,SAAAP,EACA,QAASA,EAAS,QAClB,KAAAC,EACA,GAAAC,EACA,MAAAC,EACA,aAAAC,EACA,GAAIG,EAAW,QAAU,OAAY,CAAE,MAAOA,EAAW,KAAM,EAAI,CAAC,EACpE,SAAAI,EACA,OAAAI,EACA,SAAAH,CACF,CAAC,CACH,OAASK,EAAO,CACd,GAAIF,EAAO,SAAW,CAACvB,EAAQ,YAAYc,CAAU,EACnD,OAEFU,EAAqBC,EAAO,oBAAoB,EAChD,MACF,CAEJ,QAAE,CACAzB,EAAQ,eAAesB,EAAwB,CACjD,CACF,GAAG,CACL,EAEMO,EAAaC,GAKjB,CACA,QAAA9B,EACA,MAAOnB,EAAgB,MACvB,YAAaA,EAAgB,YAC7B,kBAAAyB,CACF,CAAC,EAEKyB,EAAiBC,GAMrBhC,EACAE,EACA2B,EACApD,EAAQ,cAAgB,OACxBI,EAAgB,MAChBA,EAAgB,YACfA,EAAgB,UAAY,CAAC,EAC9BI,EACAE,CACF,EAEM8C,EAAWC,GAA2D,CAC1E,QAAAlC,EACA,WAAAE,EACA,QAASrB,EAAgB,QACzB,eAAgBO,EAChB,MAAOP,EAAgB,KACzB,CAAC,EAEKsD,EAAcC,GAClB3D,EACAI,EACAmB,EAAQ,WACV,EAEMqC,EAA8E,CAClF,YAAarC,EAAQ,YACrB,YAAcrB,GAAWY,GAAeD,EAASX,CAAM,CAAC,EACxD,YAAAwD,EACA,aAAcF,EAAS,aACvB,UAAWjC,EAAQ,UACnB,kBAAmBA,EAAQ,kBAC3B,eAAgBA,EAAQ,eACxB,eAAiBsC,GACftC,EAAQ,eAAgBW,GAAU,CAC5BA,EAAM,OAAS,iBACjB2B,EAAS3B,CAAK,CAElB,CAAC,EACH,eAAiB2B,GACftC,EAAQ,eAAgBW,GAAU,CAC5BA,EAAM,OAAS,iBACjB2B,EAAS3B,CAAK,CAElB,CAAC,EACH,kBAAoB2B,GAClBtC,EAAQ,eAAgBW,GAAU,CAC5BA,EAAM,OAAS,qBACjB2B,EAAS3B,CAAK,CAElB,CAAC,EACH,mBAAqB2B,GACnBtC,EAAQ,eAAgBW,GAAU,CAC5BA,EAAM,OAAS,sBACjB2B,EAAS3B,CAAK,CAElB,CAAC,EACH,aAAcsB,EAAS,aACvB,cAAeA,EAAS,cACxB,eAAgBA,EAAS,eACzB,QAASA,EAAS,QAClB,iBAAmBM,GACjBvC,EAAQ,MACN,MAAOc,GACLe,EAAW,wBAAwBU,EAAO,mBAAoBzB,CAAU,EAC1E,IAAMiB,EAAe,wBAAwB,kBAAkB,CACjE,EACF,oBAAqB,IACnB/B,EAAQ,MACN,MAAOc,GACLe,EAAW,2BAA2B,sBAAuBf,CAAU,EACzE,IAAMiB,EAAe,wBAAwB,qBAAqB,CACpE,EACF,aAAc,IACZM,EAAQ,KAAK,CAAE,KAAM,cAAe,CAAyC,EAC/E,aAAe1D,GACb0D,EAAQ,KAAK,CAAE,KAAM,eAAgB,OAAA1D,CAAO,CAAyC,EACvF,iBAAmB6D,GACjBA,IAAY,OACRH,EAAQ,KAAK,CAAE,KAAM,kBAAmB,CAAyC,EACjFA,EAAQ,KAAK,CACX,KAAM,mBACN,QAAAG,CACF,CAAyC,EAC/C,gBAAkBA,GAChBA,IAAY,OACRH,EAAQ,KAAK,CAAE,KAAM,iBAAkB,CAAyC,EAChFA,EAAQ,KAAK,CACX,KAAM,kBACN,QAAAG,CACF,CAAyC,EAC/C,KAAO7B,GACLX,EAAQ,MACN,CAACc,EAAYS,IAAWQ,EAAe,YAAYpB,EAAOG,EAAYS,CAAM,EAC5E,IAAMQ,EAAe,wBAAwBpB,EAAM,IAAI,CACzD,CACJ,EAEA,OAAAP,EAAeiC,EAAQ,KAEhB1C,EAAiB,cAAc0C,CAAO,CAQ/C,CC9WA,SAASI,EAQPC,EAC8E,CAC9E,MAAO,CACL,WAAYA,EACZ,KAAKC,EAAiF,CACpF,OAAOF,EAOL,CAAE,GAAGC,EAAW,MAAOC,CAAM,CAAC,CAClC,EACA,cAAcC,EAA2E,CACvF,OAAOH,EAOL,CAAE,GAAGC,EAAW,eAAgBE,CAAG,CAAC,CACxC,EACA,QAAQA,EAAsE,CAC5E,OAAOH,EAOL,CAAE,GAAGC,EAAW,SAAUE,CAAG,CAAC,CAClC,EACA,QAAQA,EAAsE,CAC5E,OAAOH,EAOL,CAAE,GAAGC,EAAW,SAAUE,CAAG,CAAC,CAClC,EACA,MAAMC,EAAe,CACnB,OAAOJ,EAOL,CAAE,GAAGC,EAAW,OAAQG,CAAM,CAAC,CACnC,EACA,UAAUC,EAAY,CACpB,OAAOL,EAOL,CAAE,GAAGC,EAAW,WAAYI,CAAG,CAAC,CACpC,CACF,CACF,CAEA,SAASC,GAAgBC,EAA0C,CACjE,IAAMC,EAAgC,CAAE,GAAID,EAAE,GAAI,EAClD,OAAIA,EAAE,QAAU,SAAWC,EAAK,KAAOD,EAAE,OACrCA,EAAE,iBAAmB,SAAWC,EAAK,cAAgBD,EAAE,gBACvDA,EAAE,WAAa,SAAWC,EAAK,QAAUD,EAAE,UAC3CA,EAAE,WAAa,SAAWC,EAAK,QAAUD,EAAE,UAC3CA,EAAE,SAAW,SAAWC,EAAK,MAAQD,EAAE,QACvCA,EAAE,aAAe,SAAWC,EAAK,UAAYD,EAAE,YAC5CC,CACT,CAEA,SAASC,GAAwBF,EAAkD,CACjF,IAAMC,EAAgC,CAAC,EACvC,OAAID,EAAE,OAAS,SAAWC,EAAK,KAAOD,EAAE,MACpCA,EAAE,gBAAkB,SAAWC,EAAK,cAAgBD,EAAE,eACtDA,EAAE,UAAY,SAAWC,EAAK,QAAUD,EAAE,SAC1CA,EAAE,UAAY,SAAWC,EAAK,QAAUD,EAAE,SAC1CA,EAAE,QAAU,SAAWC,EAAK,MAAQD,EAAE,OACtCA,EAAE,YAAc,SAAWC,EAAK,UAAYD,EAAE,WAC3CC,CACT,CAGO,SAASE,IAMwD,CAiBtE,SAASC,EAAGC,EAA4E,CACtF,OAAOZ,EAAc,CACnB,IAAKY,EACL,MAAO,OACP,eAAgB,OAChB,SAAU,OACV,SAAU,OACV,OAAQ,OACR,WAAY,MACd,CAAC,CACH,CAEA,SAASC,EAAaC,EAA8D,CAClF,OAAI,OAAOA,GAAU,WAUZA,EAAM,CAAE,GATEH,CASW,CAAC,EAGxBG,CACT,CAEA,SAASC,EAAqBD,EAAqD,CACjF,OAAIA,IAAU,IAAQA,EAAM,SAAW,EAC9BA,EAIPA,EAOA,IAAKb,GAAcQ,GAAwBR,CAAS,CAAC,CACzD,CAEA,SAASe,EACPC,EACAC,EAMA,CACA,MAAO,CACL,GAAAD,EACA,MAAOC,GAAQ,KACf,SAAUA,GAAQ,QAClB,SAAUA,GAAQ,QAClB,IAAKA,GAAQ,EACf,CASF,CAEA,SAASC,EAAMC,EAgBkE,CAC/E,IAAMC,EAAc,CAAC,EAIfC,EAAkB,CAAC,EAEzB,QAAWC,KAAeH,EAAM,MAO9B,GANAC,EAAYE,EAAY,EAAE,EAAI,CAC5B,GAAIA,EAAY,QAAU,OAAY,CAAE,KAAMA,EAAY,KAAM,EAAI,CAAC,EACrE,GAAIA,EAAY,WAAa,OAAY,CAAE,QAASA,EAAY,QAAS,EAAI,CAAC,EAC9E,GAAIA,EAAY,WAAa,OAAY,CAAE,QAASA,EAAY,QAAS,EAAI,CAAC,CAChF,EAEIA,EAAY,IAAK,CACnB,IAAMC,EAA2C,CAAC,EAElD,OAAW,CAACC,EAAWX,CAAK,IAAK,OAAO,QAAQS,EAAY,GAAG,EAAG,CAChE,GAAI,CAACT,EAAO,SAEZ,GAAIW,IAAc,mBAAqBA,IAAc,mBAAoB,CACvED,EAAgBC,CAAS,EAAIV,EAAqBD,CAA0B,EAC5E,QACF,CAEA,IAAMY,EAAWb,EAAaC,CAA6B,EAC3DU,EAAgBC,CAAS,EAAIC,EAAS,IAAKC,GACzCrB,GAAgBqB,EAAQ,UAAU,CACpC,CACF,CAEAL,EAAgBC,EAAY,EAAE,EAAIC,CACpC,CAGF,GAAIJ,EAAM,OAAQ,CAChB,IAAMQ,EAA6C,CAAC,EAEpD,OAAW,CAACH,EAAWI,CAAK,IAAK,OAAO,QAAQT,EAAM,MAAM,EACtDS,IAAU,SAEVJ,IAAc,mBAAqBA,IAAc,mBACnDG,EAAkBH,CAAS,EAAIV,EAAqBc,CAA0B,EACrE,MAAM,QAAQA,CAAK,IAC5BD,EAAkBH,CAAS,EACzBI,EACA,IAAKF,GAAYrB,GAAgBqB,EAAQ,UAAU,CAAC,IAI1DL,EAAgB,OAASM,CAC3B,CAEA,MAAO,CACL,QAASR,EAAM,QACf,QAASA,EAAM,QACf,GAAIA,EAAM,WAAa,OAAY,CAAE,SAAUA,EAAM,QAAS,EAAI,CAAC,EACnE,MAAOC,EACP,YAAaC,CAMf,CACF,CAEA,MAAO,CACL,WAAAN,EACA,GAAAL,EACA,MAAAQ,CACF,CACF",
6
+ "names": ["index_exports", "__export", "JourneyDisposedError", "createJourneyBuilder", "createJourneyMachine", "__toCommonJS", "assertStepExists", "steps", "stepId", "message", "isPlainObject", "value", "cloneSerializableValue", "entry", "key", "entryValue", "describeValue", "constructorName", "assertSerializableValue", "label", "state", "path", "pathLabel", "index", "assertSerializableContext", "context", "cloneContext", "cloneDefinitionValueFallback", "cloneMetaValue", "freezeSnapshotValue", "item", "normalizeStepCount", "now", "unique", "items", "normalizeVisited", "visited", "stepIds", "buildVisitedFromTimeline", "timeline", "resolvedStepIds", "appendVisited", "current", "isPromiseLike", "isFiniteNumber", "validateFiniteTimeout", "timeoutMs", "JourneyTimeoutError", "JourneyDisposedError", "operation", "isDevelopmentEnvironment", "diagnosticGlobal", "nodeEnv", "warnInDevelopment", "detail", "errorInDevelopment", "withTimeout", "promise", "buildError", "resolve", "reject", "timer", "error", "withAbortSignal", "signal", "onAbort", "buildIdleStepAsyncState", "buildInitialAsyncState", "isGoToStepByIdEvent", "event", "isTerminalTarget", "target", "resolveTransitionTarget", "transition", "validateJourneyTransitions", "transitions", "stepRegistry", "allowedKeys", "buildSendResult", "snapshot", "transitioned", "options", "buildSnapshot", "status", "asyncState", "safeIndex", "currentStepId", "stabilizeSnapshot", "stableSnapshot", "selectTransition", "handlers", "hooks", "defaultTimeoutMs", "fromMatches", "eventMatches", "guardResult", "asyncGuard", "asyncGuardPromise", "allowed", "transitionSnapshot", "nextCurrent", "nextContext", "baseTimeline", "nextTimeline", "nextIndex", "createJourneyMachineAsyncStateController", "runtime", "isAsyncLoadingPhase", "phase", "countLoadingSteps", "asyncState", "count", "state", "loadingCount", "syncState", "updateStepAsync", "stepId", "updater", "runVersion", "snapshot", "current", "buildIdleStepAsyncState", "next", "nextByStep", "wasLoading", "willBeLoading", "nextLoadingCount", "eventType", "transitionId", "error", "resolveLinearStepOrder", "transitions", "entry", "countVisitedSteps", "visited", "count", "stepId", "createJourneyMachineComputedGetter", "journey", "resolvedJourney", "getSnapshot", "mode", "linearStepOrder", "snapshot", "activeStepIndex", "base", "stepCount", "linearIndex", "createJourneyMachineControls", "runtime", "asyncState", "initial", "initialContext", "steps", "warnDisposedNoop", "operation", "warnInDevelopment", "buildResetSnapshot", "buildSnapshot", "cloneContext", "buildInitialAsyncState", "snapshot", "committedSnapshot", "now", "updater", "nextContext", "assertSerializableContext", "stepId", "resolvedStep", "createJourneyMachineNavigationController", "runtime", "steps", "transitions", "scheduleLifecycle", "requestedSteps", "transitionId", "runVersion", "snapshot", "buildSendResult", "stepsToGoBack", "normalizeStepCount", "from", "nextIndex", "appliedSteps", "now", "committedSnapshot", "buildSnapshot", "targetIndex", "fromStep", "eventType", "transition", "target", "transitionEvent", "nextContext", "normalizedTimeline", "assertStepExists", "beforeCurrent", "transitionSnapshot", "createJourneyMachinePluginController", "plugins", "setupContext", "hooks", "plugin", "error", "initializedPlugin", "message", "pluginError", "snapshot", "currentSnapshot", "previousSnapshot", "reason", "firstError", "result", "isPromiseLike", "warnInDevelopment", "machine", "extensionTarget", "writableExtensionTarget", "pluginExtensionKeys", "extension", "key", "value", "existingPlugin", "createJourneyMachineRuntime", "initialSnapshot", "onSnapshotChange", "onDispose", "onListenerError", "snapshot", "stabilizeSnapshot", "exposedSnapshot", "listeners", "eventListeners", "actionQueue", "lifecycleVersion", "isDisposed", "activeAbortController", "lifecycleAbortControllers", "reportListenerError", "error", "context", "errorInDevelopment", "notify", "listener", "emit", "event", "setSnapshot", "nextSnapshot", "options", "previousExposedSnapshot", "stableSnapshot", "nextExposedSnapshot", "isRunActive", "runVersion", "cancelInFlight", "controller", "openLifecycle", "closeLifecycle", "queue", "runner", "onCanceled", "createQueuedRunner", "abortController", "resultPromise", "subscribe", "selector", "equalityFn", "isEqual", "selected", "nextSelected", "previous", "createJourneyMachineSendController", "runtime", "asyncState", "navigation", "headless", "steps", "transitions", "handlers", "requireExplicitCompletion", "defaultTimeoutMs", "buildCanceledSendResult", "operation", "buildSendResult", "JourneyDisposedError", "buildErroredSendResult", "error", "transitionId", "label", "buildTransitionErrorResult", "fromStep", "eventType", "runVersion", "skipAsyncStateUpdate", "now", "resolveTransitionsForSend", "event", "isGoToStepByIdEvent", "assertStepExists", "transition", "selectTransitionForSend", "transitionsToEvaluate", "transitionEvent", "signal", "asyncGuardErrorTransitionId", "asyncGuardErrorLabel", "asyncGuardErrorHandled", "selectTransition", "stabilizeSnapshot", "currentTransition", "handleNoTransitionMatch", "fallbackResult", "resolveNextContext", "snapshot", "nextContext", "assertSerializableContext", "transitionResolution", "selectionResolution", "contextResolution", "target", "resolveTransitionTarget", "isTerminalTarget", "hashTransitionDescriptor", "value", "hash", "index", "buildResolvedTransitions", "transitions", "transitionRouteCounts", "usedIds", "transition", "target", "routeKey", "ordinal", "descriptor", "suffix", "id", "candidate", "resolveJourneyDefinition", "journey", "resolvedTransitions", "initialStep", "linearEntries", "resolvedInitial", "entry", "previousStep", "seenSteps", "offset", "allowedKeys", "key", "validateFiniteTimeout", "transitionGraph", "orderedGraphEntries", "fromKey", "eventMap", "event", "rawEdges", "isTerminal", "edges", "edge", "createJourneyMachine", "journey", "options", "stepId", "assertSerializableContext", "resolvedJourney", "resolveJourneyDefinition", "assertStepExists", "validateJourneyTransitions", "requireExplicitCompletion", "validateFiniteTimeout", "defaultTimeoutMs", "initialContextTemplate", "cloneContext", "stepMeta", "cloneMetaValue", "buildInitialSnapshot", "buildSnapshot", "buildInitialAsyncState", "pluginController", "createJourneyMachinePluginController", "initialSnapshot", "onListenerError", "onLifecycleError", "runtime", "createJourneyMachineRuntime", "asyncState", "createJourneyMachineAsyncStateController", "dispatchSend", "buildSendResult", "scheduleLifecycle", "previousSnapshot", "snapshot", "from", "to", "event", "transitionId", "label", "runVersion", "transition", "sourceStep", "targetStep", "isTerminalTarget", "handlers", "dispatch", "nextEvent", "lifecycleAbortController", "signal", "reportLifecycleError", "error", "phase", "context", "now", "navigation", "createJourneyMachineNavigationController", "sendController", "createJourneyMachineSendController", "controls", "createJourneyMachineControls", "getComputed", "createJourneyMachineComputedGetter", "machine", "listener", "steps", "payload", "makeToBuilder", "candidate", "guard", "fn", "label", "ms", "candidateToEdge", "c", "edge", "terminalCandidateToEdge", "createJourneyBuilder", "to", "stepId", "resolveEntry", "entry", "resolveTerminalEntry", "createStep", "id", "config", "build", "input", "stepsRecord", "transitionGraph", "stepBuilder", "stepTransitions", "eventType", "builders", "builder", "globalTransitions", "value"]
7
7
  }