@stackflow/core
Advanced tools
+8
-0
@@ -955,2 +955,3 @@ "use strict"; | ||
| }; | ||
| let currentInterval = null; | ||
| const actions = { | ||
@@ -968,2 +969,5 @@ getStack() { | ||
| setStackValue(nextStackValue); | ||
| if (currentInterval !== null) { | ||
| clearInterval(currentInterval); | ||
| } | ||
| const interval = setInterval(() => { | ||
@@ -976,4 +980,8 @@ const nextStackValue2 = aggregate(events.value, (/* @__PURE__ */ new Date()).getTime()); | ||
| clearInterval(interval); | ||
| if (currentInterval === interval) { | ||
| currentInterval = null; | ||
| } | ||
| } | ||
| }, INTERVAL_MS); | ||
| currentInterval = interval; | ||
| }, | ||
@@ -980,0 +988,0 @@ push: () => { |
| { | ||
| "version": 3, | ||
| "sources": ["../src/index.ts", "../src/utils/compareBy.ts", "../src/utils/divideBy.ts", "../src/utils/findIndices.ts", "../src/utils/time.ts", "../src/utils/id.ts", "../src/utils/last.ts", "../src/utils/omit.ts", "../src/utils/once.ts", "../src/utils/uniqBy.ts", "../src/activity-utils/findTargetActivityIndices.ts", "../src/activity-utils/findNewActivityIndex.ts", "../src/activity-utils/makeActivityFromEvent.ts", "../src/activity-utils/makeReducer.ts", "../src/activity-utils/makeActivitiesReducer.ts", "../src/activity-utils/makeActivityReducer.ts", "../src/activity-utils/makeStackReducer.ts", "../src/event-utils/filterEvents.ts", "../src/event-utils/makeEvent.ts", "../src/event-utils/validateEvents.ts", "../src/aggregate.ts", "../src/makeCoreStore.ts", "../src/produceEffects.ts", "../src/utils/triggerPreEffectHooks.ts", "../src/utils/makeActions.ts", "../src/utils/triggerPostEffectHooks.ts"], | ||
| "sourcesContent": ["export { aggregate } from \"./aggregate\";\nexport { Effect } from \"./Effect\";\nexport * from \"./event-types\";\nexport { DispatchEvent, makeEvent } from \"./event-utils\";\nexport * from \"./interfaces\";\nexport * from \"./makeCoreStore\";\nexport { produceEffects } from \"./produceEffects\";\nexport {\n Activity,\n ActivityStep,\n ActivityTransitionState,\n RegisteredActivity,\n Stack,\n} from \"./Stack\";\nexport { id } from \"./utils\";\n", "export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "export const divideBy = <T, U extends T>(\n arr: T[],\n predicate: (t: T) => t is U,\n): [U[], T[]] => {\n const satisfied: U[] = [];\n const unsatisfied: T[] = [];\n\n arr.forEach((element) => {\n if (predicate(element)) {\n satisfied.push(element);\n } else {\n unsatisfied.push(element);\n }\n });\n\n return [satisfied, unsatisfied];\n};\n", "export function findIndices<T>(arr: T[], compare: (t: T) => boolean) {\n return arr\n .map((e, i) => (compare(e) ? i : undefined))\n .filter((output): output is number => typeof output === \"number\");\n}\n", "let dt = 0;\nlet memt = 0;\n\nexport const time = () => {\n const t = new Date().getTime();\n\n if (memt === t) {\n dt += 1;\n } else {\n memt = t;\n dt = 0;\n }\n\n return (t * 1000 + dt) / 1000;\n};\n", "import { time } from \"./time\";\n\nexport function id() {\n return (time() * 1000).toString(16);\n}\n", "export function last<T>(arr: T[]) {\n return arr.length === 0 ? undefined : arr[arr.length - 1];\n}\n", "export function omit<T extends {}, K extends keyof T>(\n obj: T,\n fields: K[],\n): Omit<T, K> {\n const output = {\n ...obj,\n };\n\n fields.forEach((field) => {\n delete output[field];\n });\n\n return output;\n}\n", "export function once(cb: () => void) {\n let called = false;\n\n return () => {\n if (called) {\n return;\n }\n called = true;\n\n cb();\n };\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nfunction isActivityNotExited(activity: Activity) {\n return !activity.exitedBy;\n}\n\nfunction compareActivitiesByEventDate(a1: Activity, a2: Activity) {\n return a2.enteredBy.eventDate - a1.enteredBy.eventDate;\n}\n\nfunction findLatestActiveActivity(activities: Activity[]) {\n return activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate)[0];\n}\n\nexport function findTargetActivityIndices(\n activities: Activity[],\n event: DomainEvent,\n context: {\n now: number;\n transitionDuration: number;\n },\n): number[] {\n const targetActivities: number[] = [];\n\n switch (event.name) {\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n\n if (alreadyExistingActivityIndex !== undefined) {\n break;\n }\n\n const sorted = activities\n .slice()\n .sort(compareActivitiesByEventDate)\n .filter(isActivityNotExited);\n\n const isTransitionDone =\n context.now - event.eventDate >= context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n if (transitionState === \"enter-done\") {\n const range = sorted.findIndex(\n (activity) =>\n !(\n event.skipEnterActiveState &&\n activity.enteredBy.name === \"Replaced\" &&\n activity.transitionState === \"enter-active\"\n ),\n );\n\n return sorted.slice(0, range + 1).map((a) => activities.indexOf(a));\n }\n break;\n }\n case \"Popped\": {\n const sorted = activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate);\n\n const latestActivity = sorted.slice(0, sorted.length - 1)[0];\n\n if (latestActivity) {\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPushed\":\n case \"StepReplaced\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPopped\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity && latestActivity.steps.length > 1) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n\n break;\n }\n default:\n break;\n }\n return targetActivities;\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nexport function findNewActivityIndex(\n activities: Activity[],\n event: PushedEvent | ReplacedEvent,\n) {\n switch (event.name) {\n case \"Pushed\":\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n return alreadyExistingActivityIndex ?? activities.length;\n }\n default:\n return -1;\n }\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\n\nexport function makeActivityFromEvent(\n event: PushedEvent | ReplacedEvent,\n transitionState: ActivityTransitionState,\n): Activity {\n return {\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.activityParams,\n context: event.activityContext,\n steps: [\n {\n id: event.activityId,\n params: event.activityParams,\n enteredBy: event,\n zIndex: -1,\n },\n ],\n enteredBy: event,\n isTop: false,\n isActive: false,\n isRoot: false,\n zIndex: -1,\n };\n}\n", "import type { DomainEvent } from \"../event-types\";\n\ntype Reducer<T> = (state: T, event: DomainEvent) => T;\n\nexport function makeReducer<T>(\n reducerMap: {\n [key in DomainEvent[\"name\"]]: (\n state: T,\n event: Extract<DomainEvent, { name: key }>,\n ) => T;\n },\n) {\n return (target: T, event: DomainEvent) => {\n const reducer = (reducerMap[event.name] as Reducer<T>).bind(reducerMap);\n if (reducer) {\n return reducer(target, event);\n }\n throw new Error(`No reducer for event ${JSON.stringify(event)}`);\n };\n}\n", "import type { DomainEvent, PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findNewActivityIndex } from \"./findNewActivityIndex\";\nimport { makeActivityFromEvent } from \"./makeActivityFromEvent\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activities: Activity[]) {\n return activities;\n}\n\n/**\n * Create activity list reducers for each event type (Activity[] + Event => Activity[])\n */\nexport function makeActivitiesReducer({\n transitionDuration,\n now,\n resumedAt,\n}: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Push new activity to activities\n */\n Pushed(activities: Activity[], event: PushedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * Replace activity at reservedIndex with new activity\n */\n Replaced(activities: Activity[], event: ReplacedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n // reuse state of alreadyExistingActivity\n const transitionState =\n activities[reservedIndex]?.transitionState ??\n (event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\");\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Popped: noop,\n StepPushed: noop,\n StepReplaced: noop,\n StepPopped: noop,\n Paused: noop,\n Resumed: noop,\n });\n}\n", "import type {\n DomainEvent,\n PoppedEvent,\n ReplacedEvent,\n StepPoppedEvent,\n StepPushedEvent,\n StepReplacedEvent,\n} from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { last } from \"../utils\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activity: Activity) {\n return activity;\n}\n\n/**\n * Create activity reducers for each event type (Activity + Event => Activity)\n */\nexport function makeActivityReducer(context: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Change transition state to exit-done\n */\n Replaced: (activity: Activity, event: ReplacedEvent): Activity => ({\n ...activity,\n exitedBy: event,\n transitionState: \"exit-done\",\n }),\n\n /**\n * Change transition state to exit-done or exit-active depending on skipExitActiveState\n */\n Popped: (activity: Activity, event: PoppedEvent): Activity => {\n const isTransitionDone =\n context.now - (context.resumedAt ?? event.eventDate) >=\n context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipExitActiveState || isTransitionDone\n ? \"exit-done\"\n : \"exit-active\";\n\n return {\n ...activity,\n exitedBy: event,\n transitionState,\n params:\n transitionState === \"exit-done\"\n ? activity.steps[0].params\n : activity.params,\n steps:\n transitionState === \"exit-done\"\n ? [activity.steps[0]]\n : activity.steps,\n };\n },\n\n /**\n * Replace step params\n * Push new step\n */\n StepPushed: (activity: Activity, event: StepPushedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [...activity.steps, newRoute],\n };\n },\n\n /**\n * Replace step params\n * Replace the last step\n */\n StepReplaced: (activity: Activity, event: StepReplacedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [\n ...activity.steps.slice(0, activity.steps.length - 1),\n newRoute,\n ],\n };\n },\n\n /**\n * Pop the last step\n * If there are params in the previous step, set them as the new params\n */\n StepPopped: (activity: Activity, event: StepPoppedEvent): Activity => {\n activity.steps.pop();\n\n const beforeActivityParams = last(activity.steps)?.params;\n\n return {\n ...activity,\n params: beforeActivityParams ?? activity.params,\n };\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Pushed: noop,\n Paused: noop,\n Resumed: noop,\n } as const);\n}\n", "import type {\n ActivityRegisteredEvent,\n DomainEvent,\n InitializedEvent,\n PausedEvent,\n ResumedEvent,\n} from \"../event-types\";\nimport type { Stack } from \"../Stack\";\nimport { findTargetActivityIndices } from \"./findTargetActivityIndices\";\nimport { makeActivitiesReducer } from \"./makeActivitiesReducer\";\nimport { makeActivityReducer } from \"./makeActivityReducer\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction withPauseReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n) {\n return (stack: Stack, event: T) => {\n if (stack.globalTransitionState === \"paused\") {\n return {\n ...stack,\n pausedEvents: stack.pausedEvents\n ? [...stack.pausedEvents, event]\n : [event],\n };\n }\n\n return reducer(stack, event);\n };\n}\n\nfunction withActivitiesReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n context: {\n now: number;\n resumedAt?: number;\n },\n) {\n return (stack: Stack, event: T) => {\n const activitiesReducer = makeActivitiesReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activityReducer = makeActivityReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activities = activitiesReducer(stack.activities, event);\n\n const targetActivityIndices = findTargetActivityIndices(\n stack.activities,\n event,\n { transitionDuration: stack.transitionDuration, now: context.now },\n );\n\n for (const targetActivityIndex of targetActivityIndices) {\n activities[targetActivityIndex] = activityReducer(\n activities[targetActivityIndex],\n event,\n );\n }\n\n const isLoading = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n );\n\n const globalTransitionState =\n stack.globalTransitionState === \"paused\"\n ? \"paused\"\n : isLoading\n ? \"loading\"\n : \"idle\";\n\n return reducer({ ...stack, activities, globalTransitionState }, event);\n };\n}\n\nfunction noop(stack: Stack, event: DomainEvent) {\n return { ...stack, events: [...stack.events, event] };\n}\n\nexport function makeStackReducer(context: { now: number; resumedAt?: number }) {\n return makeReducer({\n Initialized: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: InitializedEvent): Stack => {\n return {\n ...stack,\n transitionDuration: event.transitionDuration,\n events: [...stack.events, event],\n };\n }, context),\n ),\n ActivityRegistered: withPauseReducer(\n withActivitiesReducer(\n (stack: Stack, event: ActivityRegisteredEvent): Stack => {\n return {\n ...stack,\n registeredActivities: [\n ...stack.registeredActivities,\n {\n name: event.activityName,\n ...(event.activityParamsSchema\n ? {\n paramsSchema: event.activityParamsSchema,\n }\n : null),\n },\n ],\n events: [...stack.events, event],\n };\n },\n context,\n ),\n ),\n Paused: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: PausedEvent): Stack => {\n return {\n ...stack,\n globalTransitionState: \"paused\",\n events: [...stack.events, event],\n };\n }, context),\n ),\n Resumed: withActivitiesReducer(\n (stack: Stack, event: ResumedEvent): Stack => {\n if (stack.globalTransitionState !== \"paused\" || !stack.pausedEvents) {\n return { ...stack, events: [...stack.events, event] };\n }\n\n const reducer = makeStackReducer({\n now: context.now,\n resumedAt: event.eventDate,\n });\n\n const { pausedEvents, ...rest } = stack;\n const resumedStack = pausedEvents.reduce(reducer, {\n ...rest,\n globalTransitionState: \"idle\",\n });\n\n return {\n ...resumedStack,\n events: [...resumedStack.events, event],\n };\n },\n context,\n ),\n Pushed: withPauseReducer(withActivitiesReducer(noop, context)),\n Replaced: withPauseReducer(withActivitiesReducer(noop, context)),\n Popped: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPushed: withPauseReducer(withActivitiesReducer(noop, context)),\n StepReplaced: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPopped: withPauseReducer(withActivitiesReducer(noop, context)),\n });\n}\n", "import type { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport { id, time } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n eventDate: time(),\n ...parameters,\n name,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n\n const registeredActivityNames = new Set(\n activityRegisteredEvents.map((e) => e.activityName),\n );\n\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (pushedEvents.some((e) => !registeredActivityNames.has(e.activityName))) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n}\n", "import { makeStackReducer } from \"./activity-utils/makeStackReducer\";\nimport type { DomainEvent } from \"./event-types\";\nimport { validateEvents } from \"./event-utils\";\nimport type { ActivityStep, Stack } from \"./Stack\";\nimport { compareBy, last, uniqBy } from \"./utils\";\n\nexport function aggregate(inputEvents: DomainEvent[], now: number): Stack {\n /**\n * 1. Pre-process\n */\n const events = uniqBy(\n [...inputEvents].sort((a, b) => a.eventDate - b.eventDate),\n (e) => e.id,\n );\n\n /**\n * 2. Validate events\n */\n validateEvents(events);\n\n /**\n * 3. Run reducer\n */\n const stackReducer = makeStackReducer({ now });\n const stack = events.reduce(stackReducer, {\n activities: [],\n globalTransitionState: \"idle\",\n registeredActivities: [],\n transitionDuration: 0,\n events: [],\n });\n\n /**\n * 4. Post-process\n */\n const visibleActivities = stack.activities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\" ||\n activity.transitionState === \"exit-active\",\n );\n const enteredActivities = visibleActivities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\",\n );\n\n const lastVisibleActivity = visibleActivities[visibleActivities.length - 1];\n const lastEnteredActivity = enteredActivities[enteredActivities.length - 1];\n\n const output: Stack = {\n ...stack,\n activities: stack.activities\n .map((activity) => {\n let zIndex = visibleActivities.findIndex(\n ({ id }) => id === activity.id,\n );\n\n const beforeActivities = visibleActivities.slice(0, zIndex);\n\n for (const beforeActivity of beforeActivities) {\n for (const step of beforeActivity.steps) {\n if (step.hasZIndex) {\n zIndex += 1;\n }\n }\n }\n\n const steps = activity.steps.reduce<ActivityStep[]>((acc, step) => {\n const lastStep = last(acc);\n const lastStepZIndex = lastStep?.zIndex ?? zIndex;\n\n return [\n ...acc,\n {\n ...step,\n zIndex: lastStepZIndex + (step.hasZIndex ? 1 : 0),\n },\n ];\n }, []);\n\n return {\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n steps,\n enteredBy: activity.enteredBy,\n zIndex,\n isTop: lastVisibleActivity?.id === activity.id,\n isActive: lastEnteredActivity?.id === activity.id,\n isRoot:\n zIndex === 0 ||\n (zIndex === 1 &&\n activity.transitionState === \"enter-active\" &&\n activity.enteredBy.name === \"Replaced\"),\n ...(activity.exitedBy\n ? {\n exitedBy: activity.exitedBy,\n }\n : null),\n ...(activity.context\n ? {\n context: activity.context,\n }\n : null),\n };\n })\n .sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\nimport { aggregate } from \"./aggregate\";\nimport type { DomainEvent, PushedEvent, StepPushedEvent } from \"./event-types\";\nimport { makeEvent } from \"./event-utils\";\nimport type { StackflowActions, StackflowPlugin } from \"./interfaces\";\nimport { produceEffects } from \"./produceEffects\";\nimport type { Stack } from \"./Stack\";\nimport { divideBy, once } from \"./utils\";\nimport { makeActions } from \"./utils/makeActions\";\nimport { triggerPostEffectHooks } from \"./utils/triggerPostEffectHooks\";\n\nconst SECOND = 1000;\n\n// 60FPS\nconst INTERVAL_MS = SECOND / 60;\n\nexport type MakeCoreStoreOptions = {\n initialEvents: DomainEvent[];\n initialContext?: any;\n plugins: StackflowPlugin[];\n handlers?: {\n onInitialActivityIgnored?: (\n initialPushedEvents: (PushedEvent | StepPushedEvent)[],\n ) => void;\n onInitialActivityNotFound?: () => void;\n };\n};\n\nexport type CoreStore = {\n actions: StackflowActions;\n init: () => void;\n pullEvents: () => DomainEvent[];\n subscribe: (listener: () => void) => () => void;\n pluginInstances: ReturnType<StackflowPlugin>[];\n};\n\nexport function makeCoreStore(options: MakeCoreStoreOptions): CoreStore {\n const storeListeners: Array<() => void> = [];\n\n const defaultPlugin: StackflowPlugin = () => ({\n key: \"@stackflow/core\",\n onChanged() {\n storeListeners.forEach((listener) => listener());\n },\n });\n\n const pluginInstances: ReturnType<StackflowPlugin>[] = [\n defaultPlugin(),\n ...options.plugins.map((plugin) => plugin()),\n ];\n\n const [initialPushedEventsByOption, initialRemainingEvents] = divideBy(\n options.initialEvents,\n (e) => e.name === \"Pushed\" || e.name === \"StepPushed\",\n );\n\n const initialPushedEvents = pluginInstances.reduce(\n (initialEvents, pluginInstance) =>\n pluginInstance.overrideInitialEvents?.({\n initialEvents,\n initialContext: options.initialContext ?? {},\n }) ?? initialEvents,\n initialPushedEventsByOption,\n );\n\n const isInitialActivityIgnored =\n initialPushedEvents.length > 0 &&\n initialPushedEventsByOption.length > 0 &&\n initialPushedEvents !== initialPushedEventsByOption;\n\n if (isInitialActivityIgnored) {\n options.handlers?.onInitialActivityIgnored?.(initialPushedEvents);\n }\n\n if (initialPushedEvents.length === 0) {\n options.handlers?.onInitialActivityNotFound?.();\n }\n\n const events: { value: DomainEvent[] } = {\n value: [...initialRemainingEvents, ...initialPushedEvents],\n };\n\n const stack = {\n value: aggregate(events.value, new Date().getTime()),\n };\n\n const actions: StackflowActions = {\n getStack() {\n return stack.value;\n },\n dispatchEvent(name, params) {\n const newEvent = makeEvent(name, params);\n const nextStackValue = aggregate(\n [...events.value, newEvent],\n new Date().getTime(),\n );\n\n events.value.push(newEvent);\n setStackValue(nextStackValue);\n\n const interval = setInterval(() => {\n const nextStackValue = aggregate(events.value, new Date().getTime());\n\n if (!isEqual(stack.value, nextStackValue)) {\n setStackValue(nextStackValue);\n }\n\n if (nextStackValue.globalTransitionState === \"idle\") {\n clearInterval(interval);\n }\n }, INTERVAL_MS);\n },\n push: () => {},\n replace: () => {},\n pop: () => {},\n stepPush: () => {},\n stepReplace: () => {},\n stepPop: () => {},\n pause: () => {},\n resume: () => {},\n };\n\n const setStackValue = (nextStackValue: Stack) => {\n const effects = produceEffects(stack.value, nextStackValue);\n stack.value = nextStackValue;\n triggerPostEffectHooks(effects, pluginInstances, actions);\n };\n\n // Initialize action methods after actions object is fully created\n Object.assign(\n actions,\n makeActions({\n dispatchEvent: actions.dispatchEvent,\n pluginInstances,\n actions,\n }),\n );\n\n return {\n actions,\n init: once(() => {\n pluginInstances.forEach((pluginInstance) => {\n pluginInstance.onInit?.({\n actions,\n });\n });\n }),\n pullEvents: () => events.value,\n subscribe(listener) {\n storeListeners.push(listener);\n\n return function dispose() {\n const listenerIndex = storeListeners.findIndex((l) => l === listener);\n\n if (listenerIndex > -1) {\n storeListeners.splice(listenerIndex, 1);\n }\n };\n },\n pluginInstances,\n };\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport type { Effect } from \"./Effect\";\nimport type { Stack } from \"./Stack\";\nimport { omit } from \"./utils\";\n\nexport function produceEffects(prevOutput: Stack, nextOutput: Stack): Effect[] {\n const output: Effect[] = [];\n\n const somethingChanged = !isEqual(prevOutput, nextOutput);\n\n if (somethingChanged) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n const isPaused =\n prevOutput.globalTransitionState !== \"paused\" &&\n nextOutput.globalTransitionState === \"paused\";\n const isResumed =\n prevOutput.globalTransitionState === \"paused\" &&\n nextOutput.globalTransitionState !== \"paused\";\n\n if (isPaused) {\n output.push({\n _TAG: \"PAUSED\",\n });\n }\n if (isResumed) {\n output.push({\n _TAG: \"RESUMED\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (prevActivity && nextActivity && prevActivity.id === nextActivity.id) {\n for (\n let j = 0;\n j <\n Math.max(\n (prevActivity.steps ?? []).length,\n (nextActivity.steps ?? []).length,\n );\n j += 1\n ) {\n const prevStep = prevActivity.steps[j];\n const nextStep = nextActivity.steps[j];\n\n if (!prevStep && nextStep) {\n output.push({\n _TAG: \"STEP_PUSHED\",\n activity: nextActivity,\n step: nextStep,\n });\n } else if (prevStep && !nextStep) {\n output.push({\n _TAG: \"STEP_POPPED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity.steps.length === nextActivity.steps.length &&\n prevStep.id !== nextStep.id\n ) {\n output.push({\n _TAG: \"STEP_REPLACED\",\n activity: nextActivity,\n step: nextStep,\n });\n }\n }\n }\n\n if (!prevActivity && nextActivity) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity &&\n nextActivity &&\n prevActivity.id === nextActivity.id &&\n !isEqual(\n omit(prevActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n omit(nextActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n ) &&\n nextActivity.enteredBy.name === \"Replaced\" &&\n !isEqual(prevActivity.enteredBy, nextActivity.enteredBy)\n ) {\n output.push({\n _TAG: \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const isPrevActivityPushed =\n prevOutput.activities[j]?.transitionState === \"enter-done\" ||\n prevOutput.activities[j]?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextOutput.activities[j]?.transitionState === \"exit-active\" ||\n nextOutput.activities[j]?.transitionState === \"exit-done\";\n const isReplacedEvent =\n nextOutput.activities[j + 1]?.enteredBy.name === \"Replaced\" &&\n nextOutput.activities[j + 1]?.transitionState === \"enter-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped && !isReplacedEvent) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextOutput.activities[j],\n });\n }\n }\n\n return output;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport type { StackflowPluginPreEffectHook } from \"../interfaces/StackflowPluginHook\";\n\ntype PreEffectHookResult<T> = {\n isPrevented: boolean;\n nextActionParams: T;\n};\n\ntype EventNameToParams<K extends ActionName> = Omit<\n Extract<DomainEvent, { name: K }>,\n keyof BaseDomainEvent\n>;\n\nconst PLUGIN_HOOK_MAP = {\n Pushed: \"onBeforePush\",\n Replaced: \"onBeforeReplace\",\n Popped: \"onBeforePop\",\n StepPushed: \"onBeforeStepPush\",\n StepReplaced: \"onBeforeStepReplace\",\n StepPopped: \"onBeforeStepPop\",\n Paused: \"onBeforePause\",\n Resumed: \"onBeforeResume\",\n} as const;\n\ntype ActionName = Exclude<\n DomainEvent[\"name\"],\n \"Initialized\" | \"ActivityRegistered\"\n>;\n\nexport function triggerPreEffectHook<K extends ActionName>(\n actionName: K,\n actionParams: EventNameToParams<K>,\n pluginInstances: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): PreEffectHookResult<EventNameToParams<K>> {\n let isPrevented = false;\n let nextActionParams = { ...actionParams };\n\n for (const pluginInstance of pluginInstances) {\n const hook = pluginInstance[PLUGIN_HOOK_MAP[actionName]] as\n | StackflowPluginPreEffectHook<EventNameToParams<K>>\n | undefined;\n if (hook) {\n hook({\n actionParams: { ...nextActionParams },\n actions: {\n ...actions,\n preventDefault: () => {\n isPrevented = true;\n },\n overrideActionParams: (partialActionParams: EventNameToParams<K>) => {\n nextActionParams = {\n ...nextActionParams,\n ...partialActionParams,\n };\n },\n },\n });\n }\n }\n\n return {\n isPrevented,\n nextActionParams,\n };\n}\n", "import type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport { triggerPreEffectHook } from \"./triggerPreEffectHooks\";\n\ntype ActionCreatorOptions = {\n dispatchEvent: StackflowActions[\"dispatchEvent\"];\n pluginInstances: ReturnType<StackflowPlugin>[];\n actions: StackflowActions;\n};\n\nexport function makeActions({\n dispatchEvent,\n pluginInstances,\n actions,\n}: ActionCreatorOptions): Omit<StackflowActions, \"dispatchEvent\" | \"getStack\"> {\n return {\n push(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Pushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Pushed\", nextActionParams);\n },\n replace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Replaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Replaced\", nextActionParams);\n },\n pop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Popped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Popped\", nextActionParams);\n },\n stepPush(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPushed\", nextActionParams);\n },\n stepReplace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepReplaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepReplaced\", nextActionParams);\n },\n stepPop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPopped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPopped\", nextActionParams);\n },\n pause(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Paused\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Paused\", nextActionParams);\n },\n resume(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Resumed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Resumed\", nextActionParams);\n },\n };\n}\n", "import type { Effect } from \"../Effect\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\n\nexport function triggerPostEffectHooks(\n effects: Effect[],\n plugins: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): void {\n effects.forEach((effect) => {\n plugins.forEach((plugin) => {\n switch (effect._TAG) {\n case \"PUSHED\":\n plugin.onPushed?.({ actions, effect });\n break;\n case \"REPLACED\":\n plugin.onReplaced?.({ actions, effect });\n break;\n case \"POPPED\":\n plugin.onPopped?.({ actions, effect });\n break;\n case \"STEP_PUSHED\":\n plugin.onStepPushed?.({ actions, effect });\n break;\n case \"STEP_REPLACED\":\n plugin.onStepReplaced?.({ actions, effect });\n break;\n case \"STEP_POPPED\":\n plugin.onStepPopped?.({ actions, effect });\n break;\n case \"PAUSED\":\n plugin.onPaused?.({ actions, effect });\n break;\n case \"RESUMED\":\n plugin.onResumed?.({ actions, effect });\n break;\n case \"%SOMETHING_CHANGED%\":\n plugin.onChanged?.({ actions, effect });\n break;\n }\n });\n });\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["export { aggregate } from \"./aggregate\";\nexport { Effect } from \"./Effect\";\nexport * from \"./event-types\";\nexport { DispatchEvent, makeEvent } from \"./event-utils\";\nexport * from \"./interfaces\";\nexport * from \"./makeCoreStore\";\nexport { produceEffects } from \"./produceEffects\";\nexport {\n Activity,\n ActivityStep,\n ActivityTransitionState,\n RegisteredActivity,\n Stack,\n} from \"./Stack\";\nexport { id } from \"./utils\";\n", "export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "export const divideBy = <T, U extends T>(\n arr: T[],\n predicate: (t: T) => t is U,\n): [U[], T[]] => {\n const satisfied: U[] = [];\n const unsatisfied: T[] = [];\n\n arr.forEach((element) => {\n if (predicate(element)) {\n satisfied.push(element);\n } else {\n unsatisfied.push(element);\n }\n });\n\n return [satisfied, unsatisfied];\n};\n", "export function findIndices<T>(arr: T[], compare: (t: T) => boolean) {\n return arr\n .map((e, i) => (compare(e) ? i : undefined))\n .filter((output): output is number => typeof output === \"number\");\n}\n", "let dt = 0;\nlet memt = 0;\n\nexport const time = () => {\n const t = new Date().getTime();\n\n if (memt === t) {\n dt += 1;\n } else {\n memt = t;\n dt = 0;\n }\n\n return (t * 1000 + dt) / 1000;\n};\n", "import { time } from \"./time\";\n\nexport function id() {\n return (time() * 1000).toString(16);\n}\n", "export function last<T>(arr: T[]) {\n return arr.length === 0 ? undefined : arr[arr.length - 1];\n}\n", "export function omit<T extends {}, K extends keyof T>(\n obj: T,\n fields: K[],\n): Omit<T, K> {\n const output = {\n ...obj,\n };\n\n fields.forEach((field) => {\n delete output[field];\n });\n\n return output;\n}\n", "export function once(cb: () => void) {\n let called = false;\n\n return () => {\n if (called) {\n return;\n }\n called = true;\n\n cb();\n };\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nfunction isActivityNotExited(activity: Activity) {\n return !activity.exitedBy;\n}\n\nfunction compareActivitiesByEventDate(a1: Activity, a2: Activity) {\n return a2.enteredBy.eventDate - a1.enteredBy.eventDate;\n}\n\nfunction findLatestActiveActivity(activities: Activity[]) {\n return activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate)[0];\n}\n\nexport function findTargetActivityIndices(\n activities: Activity[],\n event: DomainEvent,\n context: {\n now: number;\n transitionDuration: number;\n },\n): number[] {\n const targetActivities: number[] = [];\n\n switch (event.name) {\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n\n if (alreadyExistingActivityIndex !== undefined) {\n break;\n }\n\n const sorted = activities\n .slice()\n .sort(compareActivitiesByEventDate)\n .filter(isActivityNotExited);\n\n const isTransitionDone =\n context.now - event.eventDate >= context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n if (transitionState === \"enter-done\") {\n const range = sorted.findIndex(\n (activity) =>\n !(\n event.skipEnterActiveState &&\n activity.enteredBy.name === \"Replaced\" &&\n activity.transitionState === \"enter-active\"\n ),\n );\n\n return sorted.slice(0, range + 1).map((a) => activities.indexOf(a));\n }\n break;\n }\n case \"Popped\": {\n const sorted = activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate);\n\n const latestActivity = sorted.slice(0, sorted.length - 1)[0];\n\n if (latestActivity) {\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPushed\":\n case \"StepReplaced\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPopped\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity && latestActivity.steps.length > 1) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n\n break;\n }\n default:\n break;\n }\n return targetActivities;\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nexport function findNewActivityIndex(\n activities: Activity[],\n event: PushedEvent | ReplacedEvent,\n) {\n switch (event.name) {\n case \"Pushed\":\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n return alreadyExistingActivityIndex ?? activities.length;\n }\n default:\n return -1;\n }\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\n\nexport function makeActivityFromEvent(\n event: PushedEvent | ReplacedEvent,\n transitionState: ActivityTransitionState,\n): Activity {\n return {\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.activityParams,\n context: event.activityContext,\n steps: [\n {\n id: event.activityId,\n params: event.activityParams,\n enteredBy: event,\n zIndex: -1,\n },\n ],\n enteredBy: event,\n isTop: false,\n isActive: false,\n isRoot: false,\n zIndex: -1,\n };\n}\n", "import type { DomainEvent } from \"../event-types\";\n\ntype Reducer<T> = (state: T, event: DomainEvent) => T;\n\nexport function makeReducer<T>(\n reducerMap: {\n [key in DomainEvent[\"name\"]]: (\n state: T,\n event: Extract<DomainEvent, { name: key }>,\n ) => T;\n },\n) {\n return (target: T, event: DomainEvent) => {\n const reducer = (reducerMap[event.name] as Reducer<T>).bind(reducerMap);\n if (reducer) {\n return reducer(target, event);\n }\n throw new Error(`No reducer for event ${JSON.stringify(event)}`);\n };\n}\n", "import type { DomainEvent, PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findNewActivityIndex } from \"./findNewActivityIndex\";\nimport { makeActivityFromEvent } from \"./makeActivityFromEvent\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activities: Activity[]) {\n return activities;\n}\n\n/**\n * Create activity list reducers for each event type (Activity[] + Event => Activity[])\n */\nexport function makeActivitiesReducer({\n transitionDuration,\n now,\n resumedAt,\n}: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Push new activity to activities\n */\n Pushed(activities: Activity[], event: PushedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * Replace activity at reservedIndex with new activity\n */\n Replaced(activities: Activity[], event: ReplacedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n // reuse state of alreadyExistingActivity\n const transitionState =\n activities[reservedIndex]?.transitionState ??\n (event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\");\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Popped: noop,\n StepPushed: noop,\n StepReplaced: noop,\n StepPopped: noop,\n Paused: noop,\n Resumed: noop,\n });\n}\n", "import type {\n DomainEvent,\n PoppedEvent,\n ReplacedEvent,\n StepPoppedEvent,\n StepPushedEvent,\n StepReplacedEvent,\n} from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { last } from \"../utils\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activity: Activity) {\n return activity;\n}\n\n/**\n * Create activity reducers for each event type (Activity + Event => Activity)\n */\nexport function makeActivityReducer(context: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Change transition state to exit-done\n */\n Replaced: (activity: Activity, event: ReplacedEvent): Activity => ({\n ...activity,\n exitedBy: event,\n transitionState: \"exit-done\",\n }),\n\n /**\n * Change transition state to exit-done or exit-active depending on skipExitActiveState\n */\n Popped: (activity: Activity, event: PoppedEvent): Activity => {\n const isTransitionDone =\n context.now - (context.resumedAt ?? event.eventDate) >=\n context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipExitActiveState || isTransitionDone\n ? \"exit-done\"\n : \"exit-active\";\n\n return {\n ...activity,\n exitedBy: event,\n transitionState,\n params:\n transitionState === \"exit-done\"\n ? activity.steps[0].params\n : activity.params,\n steps:\n transitionState === \"exit-done\"\n ? [activity.steps[0]]\n : activity.steps,\n };\n },\n\n /**\n * Replace step params\n * Push new step\n */\n StepPushed: (activity: Activity, event: StepPushedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [...activity.steps, newRoute],\n };\n },\n\n /**\n * Replace step params\n * Replace the last step\n */\n StepReplaced: (activity: Activity, event: StepReplacedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [\n ...activity.steps.slice(0, activity.steps.length - 1),\n newRoute,\n ],\n };\n },\n\n /**\n * Pop the last step\n * If there are params in the previous step, set them as the new params\n */\n StepPopped: (activity: Activity, event: StepPoppedEvent): Activity => {\n activity.steps.pop();\n\n const beforeActivityParams = last(activity.steps)?.params;\n\n return {\n ...activity,\n params: beforeActivityParams ?? activity.params,\n };\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Pushed: noop,\n Paused: noop,\n Resumed: noop,\n } as const);\n}\n", "import type {\n ActivityRegisteredEvent,\n DomainEvent,\n InitializedEvent,\n PausedEvent,\n ResumedEvent,\n} from \"../event-types\";\nimport type { Stack } from \"../Stack\";\nimport { findTargetActivityIndices } from \"./findTargetActivityIndices\";\nimport { makeActivitiesReducer } from \"./makeActivitiesReducer\";\nimport { makeActivityReducer } from \"./makeActivityReducer\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction withPauseReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n) {\n return (stack: Stack, event: T) => {\n if (stack.globalTransitionState === \"paused\") {\n return {\n ...stack,\n pausedEvents: stack.pausedEvents\n ? [...stack.pausedEvents, event]\n : [event],\n };\n }\n\n return reducer(stack, event);\n };\n}\n\nfunction withActivitiesReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n context: {\n now: number;\n resumedAt?: number;\n },\n) {\n return (stack: Stack, event: T) => {\n const activitiesReducer = makeActivitiesReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activityReducer = makeActivityReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activities = activitiesReducer(stack.activities, event);\n\n const targetActivityIndices = findTargetActivityIndices(\n stack.activities,\n event,\n { transitionDuration: stack.transitionDuration, now: context.now },\n );\n\n for (const targetActivityIndex of targetActivityIndices) {\n activities[targetActivityIndex] = activityReducer(\n activities[targetActivityIndex],\n event,\n );\n }\n\n const isLoading = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n );\n\n const globalTransitionState =\n stack.globalTransitionState === \"paused\"\n ? \"paused\"\n : isLoading\n ? \"loading\"\n : \"idle\";\n\n return reducer({ ...stack, activities, globalTransitionState }, event);\n };\n}\n\nfunction noop(stack: Stack, event: DomainEvent) {\n return { ...stack, events: [...stack.events, event] };\n}\n\nexport function makeStackReducer(context: { now: number; resumedAt?: number }) {\n return makeReducer({\n Initialized: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: InitializedEvent): Stack => {\n return {\n ...stack,\n transitionDuration: event.transitionDuration,\n events: [...stack.events, event],\n };\n }, context),\n ),\n ActivityRegistered: withPauseReducer(\n withActivitiesReducer(\n (stack: Stack, event: ActivityRegisteredEvent): Stack => {\n return {\n ...stack,\n registeredActivities: [\n ...stack.registeredActivities,\n {\n name: event.activityName,\n ...(event.activityParamsSchema\n ? {\n paramsSchema: event.activityParamsSchema,\n }\n : null),\n },\n ],\n events: [...stack.events, event],\n };\n },\n context,\n ),\n ),\n Paused: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: PausedEvent): Stack => {\n return {\n ...stack,\n globalTransitionState: \"paused\",\n events: [...stack.events, event],\n };\n }, context),\n ),\n Resumed: withActivitiesReducer(\n (stack: Stack, event: ResumedEvent): Stack => {\n if (stack.globalTransitionState !== \"paused\" || !stack.pausedEvents) {\n return { ...stack, events: [...stack.events, event] };\n }\n\n const reducer = makeStackReducer({\n now: context.now,\n resumedAt: event.eventDate,\n });\n\n const { pausedEvents, ...rest } = stack;\n const resumedStack = pausedEvents.reduce(reducer, {\n ...rest,\n globalTransitionState: \"idle\",\n });\n\n return {\n ...resumedStack,\n events: [...resumedStack.events, event],\n };\n },\n context,\n ),\n Pushed: withPauseReducer(withActivitiesReducer(noop, context)),\n Replaced: withPauseReducer(withActivitiesReducer(noop, context)),\n Popped: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPushed: withPauseReducer(withActivitiesReducer(noop, context)),\n StepReplaced: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPopped: withPauseReducer(withActivitiesReducer(noop, context)),\n });\n}\n", "import type { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport { id, time } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n eventDate: time(),\n ...parameters,\n name,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n\n const registeredActivityNames = new Set(\n activityRegisteredEvents.map((e) => e.activityName),\n );\n\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (pushedEvents.some((e) => !registeredActivityNames.has(e.activityName))) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n}\n", "import { makeStackReducer } from \"./activity-utils/makeStackReducer\";\nimport type { DomainEvent } from \"./event-types\";\nimport { validateEvents } from \"./event-utils\";\nimport type { ActivityStep, Stack } from \"./Stack\";\nimport { compareBy, last, uniqBy } from \"./utils\";\n\nexport function aggregate(inputEvents: DomainEvent[], now: number): Stack {\n /**\n * 1. Pre-process\n */\n const events = uniqBy(\n [...inputEvents].sort((a, b) => a.eventDate - b.eventDate),\n (e) => e.id,\n );\n\n /**\n * 2. Validate events\n */\n validateEvents(events);\n\n /**\n * 3. Run reducer\n */\n const stackReducer = makeStackReducer({ now });\n const stack = events.reduce(stackReducer, {\n activities: [],\n globalTransitionState: \"idle\",\n registeredActivities: [],\n transitionDuration: 0,\n events: [],\n });\n\n /**\n * 4. Post-process\n */\n const visibleActivities = stack.activities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\" ||\n activity.transitionState === \"exit-active\",\n );\n const enteredActivities = visibleActivities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\",\n );\n\n const lastVisibleActivity = visibleActivities[visibleActivities.length - 1];\n const lastEnteredActivity = enteredActivities[enteredActivities.length - 1];\n\n const output: Stack = {\n ...stack,\n activities: stack.activities\n .map((activity) => {\n let zIndex = visibleActivities.findIndex(\n ({ id }) => id === activity.id,\n );\n\n const beforeActivities = visibleActivities.slice(0, zIndex);\n\n for (const beforeActivity of beforeActivities) {\n for (const step of beforeActivity.steps) {\n if (step.hasZIndex) {\n zIndex += 1;\n }\n }\n }\n\n const steps = activity.steps.reduce<ActivityStep[]>((acc, step) => {\n const lastStep = last(acc);\n const lastStepZIndex = lastStep?.zIndex ?? zIndex;\n\n return [\n ...acc,\n {\n ...step,\n zIndex: lastStepZIndex + (step.hasZIndex ? 1 : 0),\n },\n ];\n }, []);\n\n return {\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n steps,\n enteredBy: activity.enteredBy,\n zIndex,\n isTop: lastVisibleActivity?.id === activity.id,\n isActive: lastEnteredActivity?.id === activity.id,\n isRoot:\n zIndex === 0 ||\n (zIndex === 1 &&\n activity.transitionState === \"enter-active\" &&\n activity.enteredBy.name === \"Replaced\"),\n ...(activity.exitedBy\n ? {\n exitedBy: activity.exitedBy,\n }\n : null),\n ...(activity.context\n ? {\n context: activity.context,\n }\n : null),\n };\n })\n .sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\nimport { aggregate } from \"./aggregate\";\nimport type { DomainEvent, PushedEvent, StepPushedEvent } from \"./event-types\";\nimport { makeEvent } from \"./event-utils\";\nimport type { StackflowActions, StackflowPlugin } from \"./interfaces\";\nimport { produceEffects } from \"./produceEffects\";\nimport type { Stack } from \"./Stack\";\nimport { divideBy, once } from \"./utils\";\nimport { makeActions } from \"./utils/makeActions\";\nimport { triggerPostEffectHooks } from \"./utils/triggerPostEffectHooks\";\n\nconst SECOND = 1000;\n\n// 60FPS\nconst INTERVAL_MS = SECOND / 60;\n\nexport type MakeCoreStoreOptions = {\n initialEvents: DomainEvent[];\n initialContext?: any;\n plugins: StackflowPlugin[];\n handlers?: {\n onInitialActivityIgnored?: (\n initialPushedEvents: (PushedEvent | StepPushedEvent)[],\n ) => void;\n onInitialActivityNotFound?: () => void;\n };\n};\n\nexport type CoreStore = {\n actions: StackflowActions;\n init: () => void;\n pullEvents: () => DomainEvent[];\n subscribe: (listener: () => void) => () => void;\n pluginInstances: ReturnType<StackflowPlugin>[];\n};\n\nexport function makeCoreStore(options: MakeCoreStoreOptions): CoreStore {\n const storeListeners: Array<() => void> = [];\n\n const defaultPlugin: StackflowPlugin = () => ({\n key: \"@stackflow/core\",\n onChanged() {\n storeListeners.forEach((listener) => listener());\n },\n });\n\n const pluginInstances: ReturnType<StackflowPlugin>[] = [\n defaultPlugin(),\n ...options.plugins.map((plugin) => plugin()),\n ];\n\n const [initialPushedEventsByOption, initialRemainingEvents] = divideBy(\n options.initialEvents,\n (e) => e.name === \"Pushed\" || e.name === \"StepPushed\",\n );\n\n const initialPushedEvents = pluginInstances.reduce(\n (initialEvents, pluginInstance) =>\n pluginInstance.overrideInitialEvents?.({\n initialEvents,\n initialContext: options.initialContext ?? {},\n }) ?? initialEvents,\n initialPushedEventsByOption,\n );\n\n const isInitialActivityIgnored =\n initialPushedEvents.length > 0 &&\n initialPushedEventsByOption.length > 0 &&\n initialPushedEvents !== initialPushedEventsByOption;\n\n if (isInitialActivityIgnored) {\n options.handlers?.onInitialActivityIgnored?.(initialPushedEvents);\n }\n\n if (initialPushedEvents.length === 0) {\n options.handlers?.onInitialActivityNotFound?.();\n }\n\n const events: { value: DomainEvent[] } = {\n value: [...initialRemainingEvents, ...initialPushedEvents],\n };\n\n const stack = {\n value: aggregate(events.value, new Date().getTime()),\n };\n\n let currentInterval: ReturnType<typeof setInterval> | null = null;\n\n const actions: StackflowActions = {\n getStack() {\n return stack.value;\n },\n dispatchEvent(name, params) {\n const newEvent = makeEvent(name, params);\n const nextStackValue = aggregate(\n [...events.value, newEvent],\n new Date().getTime(),\n );\n\n events.value.push(newEvent);\n setStackValue(nextStackValue);\n\n if (currentInterval !== null) {\n clearInterval(currentInterval);\n }\n\n const interval = setInterval(() => {\n const nextStackValue = aggregate(events.value, new Date().getTime());\n\n if (!isEqual(stack.value, nextStackValue)) {\n setStackValue(nextStackValue);\n }\n\n if (nextStackValue.globalTransitionState === \"idle\") {\n clearInterval(interval);\n if (currentInterval === interval) {\n currentInterval = null;\n }\n }\n }, INTERVAL_MS);\n currentInterval = interval;\n },\n push: () => {},\n replace: () => {},\n pop: () => {},\n stepPush: () => {},\n stepReplace: () => {},\n stepPop: () => {},\n pause: () => {},\n resume: () => {},\n };\n\n const setStackValue = (nextStackValue: Stack) => {\n const effects = produceEffects(stack.value, nextStackValue);\n stack.value = nextStackValue;\n triggerPostEffectHooks(effects, pluginInstances, actions);\n };\n\n // Initialize action methods after actions object is fully created\n Object.assign(\n actions,\n makeActions({\n dispatchEvent: actions.dispatchEvent,\n pluginInstances,\n actions,\n }),\n );\n\n return {\n actions,\n init: once(() => {\n pluginInstances.forEach((pluginInstance) => {\n pluginInstance.onInit?.({\n actions,\n });\n });\n }),\n pullEvents: () => events.value,\n subscribe(listener) {\n storeListeners.push(listener);\n\n return function dispose() {\n const listenerIndex = storeListeners.findIndex((l) => l === listener);\n\n if (listenerIndex > -1) {\n storeListeners.splice(listenerIndex, 1);\n }\n };\n },\n pluginInstances,\n };\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport type { Effect } from \"./Effect\";\nimport type { Stack } from \"./Stack\";\nimport { omit } from \"./utils\";\n\nexport function produceEffects(prevOutput: Stack, nextOutput: Stack): Effect[] {\n const output: Effect[] = [];\n\n const somethingChanged = !isEqual(prevOutput, nextOutput);\n\n if (somethingChanged) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n const isPaused =\n prevOutput.globalTransitionState !== \"paused\" &&\n nextOutput.globalTransitionState === \"paused\";\n const isResumed =\n prevOutput.globalTransitionState === \"paused\" &&\n nextOutput.globalTransitionState !== \"paused\";\n\n if (isPaused) {\n output.push({\n _TAG: \"PAUSED\",\n });\n }\n if (isResumed) {\n output.push({\n _TAG: \"RESUMED\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (prevActivity && nextActivity && prevActivity.id === nextActivity.id) {\n for (\n let j = 0;\n j <\n Math.max(\n (prevActivity.steps ?? []).length,\n (nextActivity.steps ?? []).length,\n );\n j += 1\n ) {\n const prevStep = prevActivity.steps[j];\n const nextStep = nextActivity.steps[j];\n\n if (!prevStep && nextStep) {\n output.push({\n _TAG: \"STEP_PUSHED\",\n activity: nextActivity,\n step: nextStep,\n });\n } else if (prevStep && !nextStep) {\n output.push({\n _TAG: \"STEP_POPPED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity.steps.length === nextActivity.steps.length &&\n prevStep.id !== nextStep.id\n ) {\n output.push({\n _TAG: \"STEP_REPLACED\",\n activity: nextActivity,\n step: nextStep,\n });\n }\n }\n }\n\n if (!prevActivity && nextActivity) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity &&\n nextActivity &&\n prevActivity.id === nextActivity.id &&\n !isEqual(\n omit(prevActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n omit(nextActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n ) &&\n nextActivity.enteredBy.name === \"Replaced\" &&\n !isEqual(prevActivity.enteredBy, nextActivity.enteredBy)\n ) {\n output.push({\n _TAG: \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const isPrevActivityPushed =\n prevOutput.activities[j]?.transitionState === \"enter-done\" ||\n prevOutput.activities[j]?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextOutput.activities[j]?.transitionState === \"exit-active\" ||\n nextOutput.activities[j]?.transitionState === \"exit-done\";\n const isReplacedEvent =\n nextOutput.activities[j + 1]?.enteredBy.name === \"Replaced\" &&\n nextOutput.activities[j + 1]?.transitionState === \"enter-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped && !isReplacedEvent) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextOutput.activities[j],\n });\n }\n }\n\n return output;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport type { StackflowPluginPreEffectHook } from \"../interfaces/StackflowPluginHook\";\n\ntype PreEffectHookResult<T> = {\n isPrevented: boolean;\n nextActionParams: T;\n};\n\ntype EventNameToParams<K extends ActionName> = Omit<\n Extract<DomainEvent, { name: K }>,\n keyof BaseDomainEvent\n>;\n\nconst PLUGIN_HOOK_MAP = {\n Pushed: \"onBeforePush\",\n Replaced: \"onBeforeReplace\",\n Popped: \"onBeforePop\",\n StepPushed: \"onBeforeStepPush\",\n StepReplaced: \"onBeforeStepReplace\",\n StepPopped: \"onBeforeStepPop\",\n Paused: \"onBeforePause\",\n Resumed: \"onBeforeResume\",\n} as const;\n\ntype ActionName = Exclude<\n DomainEvent[\"name\"],\n \"Initialized\" | \"ActivityRegistered\"\n>;\n\nexport function triggerPreEffectHook<K extends ActionName>(\n actionName: K,\n actionParams: EventNameToParams<K>,\n pluginInstances: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): PreEffectHookResult<EventNameToParams<K>> {\n let isPrevented = false;\n let nextActionParams = { ...actionParams };\n\n for (const pluginInstance of pluginInstances) {\n const hook = pluginInstance[PLUGIN_HOOK_MAP[actionName]] as\n | StackflowPluginPreEffectHook<EventNameToParams<K>>\n | undefined;\n if (hook) {\n hook({\n actionParams: { ...nextActionParams },\n actions: {\n ...actions,\n preventDefault: () => {\n isPrevented = true;\n },\n overrideActionParams: (partialActionParams: EventNameToParams<K>) => {\n nextActionParams = {\n ...nextActionParams,\n ...partialActionParams,\n };\n },\n },\n });\n }\n }\n\n return {\n isPrevented,\n nextActionParams,\n };\n}\n", "import type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport { triggerPreEffectHook } from \"./triggerPreEffectHooks\";\n\ntype ActionCreatorOptions = {\n dispatchEvent: StackflowActions[\"dispatchEvent\"];\n pluginInstances: ReturnType<StackflowPlugin>[];\n actions: StackflowActions;\n};\n\nexport function makeActions({\n dispatchEvent,\n pluginInstances,\n actions,\n}: ActionCreatorOptions): Omit<StackflowActions, \"dispatchEvent\" | \"getStack\"> {\n return {\n push(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Pushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Pushed\", nextActionParams);\n },\n replace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Replaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Replaced\", nextActionParams);\n },\n pop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Popped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Popped\", nextActionParams);\n },\n stepPush(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPushed\", nextActionParams);\n },\n stepReplace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepReplaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepReplaced\", nextActionParams);\n },\n stepPop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPopped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPopped\", nextActionParams);\n },\n pause(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Paused\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Paused\", nextActionParams);\n },\n resume(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Resumed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Resumed\", nextActionParams);\n },\n };\n}\n", "import type { Effect } from \"../Effect\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\n\nexport function triggerPostEffectHooks(\n effects: Effect[],\n plugins: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): void {\n effects.forEach((effect) => {\n plugins.forEach((plugin) => {\n switch (effect._TAG) {\n case \"PUSHED\":\n plugin.onPushed?.({ actions, effect });\n break;\n case \"REPLACED\":\n plugin.onReplaced?.({ actions, effect });\n break;\n case \"POPPED\":\n plugin.onPopped?.({ actions, effect });\n break;\n case \"STEP_PUSHED\":\n plugin.onStepPushed?.({ actions, effect });\n break;\n case \"STEP_REPLACED\":\n plugin.onStepReplaced?.({ actions, effect });\n break;\n case \"STEP_POPPED\":\n plugin.onStepPopped?.({ actions, effect });\n break;\n case \"PAUSED\":\n plugin.onPaused?.({ actions, effect });\n break;\n case \"RESUMED\":\n plugin.onResumed?.({ actions, effect });\n break;\n case \"%SOMETHING_CHANGED%\":\n plugin.onChanged?.({ actions, effect });\n break;\n }\n });\n });\n}\n"], | ||
| "mappings": "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", | ||
| "names": ["noop", "noop", "id", "import_react_fast_compare", "isEqual", "_a", "_b", "_c", "nextStackValue", "isEqual"] | ||
| } |
+8
-0
@@ -918,2 +918,3 @@ var __defProp = Object.defineProperty; | ||
| }; | ||
| let currentInterval = null; | ||
| const actions = { | ||
@@ -931,2 +932,5 @@ getStack() { | ||
| setStackValue(nextStackValue); | ||
| if (currentInterval !== null) { | ||
| clearInterval(currentInterval); | ||
| } | ||
| const interval = setInterval(() => { | ||
@@ -939,4 +943,8 @@ const nextStackValue2 = aggregate(events.value, (/* @__PURE__ */ new Date()).getTime()); | ||
| clearInterval(interval); | ||
| if (currentInterval === interval) { | ||
| currentInterval = null; | ||
| } | ||
| } | ||
| }, INTERVAL_MS); | ||
| currentInterval = interval; | ||
| }, | ||
@@ -943,0 +951,0 @@ push: () => { |
| { | ||
| "version": 3, | ||
| "sources": ["../src/utils/compareBy.ts", "../src/utils/divideBy.ts", "../src/utils/findIndices.ts", "../src/utils/time.ts", "../src/utils/id.ts", "../src/utils/last.ts", "../src/utils/omit.ts", "../src/utils/once.ts", "../src/utils/uniqBy.ts", "../src/activity-utils/findTargetActivityIndices.ts", "../src/activity-utils/findNewActivityIndex.ts", "../src/activity-utils/makeActivityFromEvent.ts", "../src/activity-utils/makeReducer.ts", "../src/activity-utils/makeActivitiesReducer.ts", "../src/activity-utils/makeActivityReducer.ts", "../src/activity-utils/makeStackReducer.ts", "../src/event-utils/filterEvents.ts", "../src/event-utils/makeEvent.ts", "../src/event-utils/validateEvents.ts", "../src/aggregate.ts", "../src/makeCoreStore.ts", "../src/produceEffects.ts", "../src/utils/triggerPreEffectHooks.ts", "../src/utils/makeActions.ts", "../src/utils/triggerPostEffectHooks.ts"], | ||
| "sourcesContent": ["export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "export const divideBy = <T, U extends T>(\n arr: T[],\n predicate: (t: T) => t is U,\n): [U[], T[]] => {\n const satisfied: U[] = [];\n const unsatisfied: T[] = [];\n\n arr.forEach((element) => {\n if (predicate(element)) {\n satisfied.push(element);\n } else {\n unsatisfied.push(element);\n }\n });\n\n return [satisfied, unsatisfied];\n};\n", "export function findIndices<T>(arr: T[], compare: (t: T) => boolean) {\n return arr\n .map((e, i) => (compare(e) ? i : undefined))\n .filter((output): output is number => typeof output === \"number\");\n}\n", "let dt = 0;\nlet memt = 0;\n\nexport const time = () => {\n const t = new Date().getTime();\n\n if (memt === t) {\n dt += 1;\n } else {\n memt = t;\n dt = 0;\n }\n\n return (t * 1000 + dt) / 1000;\n};\n", "import { time } from \"./time\";\n\nexport function id() {\n return (time() * 1000).toString(16);\n}\n", "export function last<T>(arr: T[]) {\n return arr.length === 0 ? undefined : arr[arr.length - 1];\n}\n", "export function omit<T extends {}, K extends keyof T>(\n obj: T,\n fields: K[],\n): Omit<T, K> {\n const output = {\n ...obj,\n };\n\n fields.forEach((field) => {\n delete output[field];\n });\n\n return output;\n}\n", "export function once(cb: () => void) {\n let called = false;\n\n return () => {\n if (called) {\n return;\n }\n called = true;\n\n cb();\n };\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nfunction isActivityNotExited(activity: Activity) {\n return !activity.exitedBy;\n}\n\nfunction compareActivitiesByEventDate(a1: Activity, a2: Activity) {\n return a2.enteredBy.eventDate - a1.enteredBy.eventDate;\n}\n\nfunction findLatestActiveActivity(activities: Activity[]) {\n return activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate)[0];\n}\n\nexport function findTargetActivityIndices(\n activities: Activity[],\n event: DomainEvent,\n context: {\n now: number;\n transitionDuration: number;\n },\n): number[] {\n const targetActivities: number[] = [];\n\n switch (event.name) {\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n\n if (alreadyExistingActivityIndex !== undefined) {\n break;\n }\n\n const sorted = activities\n .slice()\n .sort(compareActivitiesByEventDate)\n .filter(isActivityNotExited);\n\n const isTransitionDone =\n context.now - event.eventDate >= context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n if (transitionState === \"enter-done\") {\n const range = sorted.findIndex(\n (activity) =>\n !(\n event.skipEnterActiveState &&\n activity.enteredBy.name === \"Replaced\" &&\n activity.transitionState === \"enter-active\"\n ),\n );\n\n return sorted.slice(0, range + 1).map((a) => activities.indexOf(a));\n }\n break;\n }\n case \"Popped\": {\n const sorted = activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate);\n\n const latestActivity = sorted.slice(0, sorted.length - 1)[0];\n\n if (latestActivity) {\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPushed\":\n case \"StepReplaced\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPopped\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity && latestActivity.steps.length > 1) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n\n break;\n }\n default:\n break;\n }\n return targetActivities;\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nexport function findNewActivityIndex(\n activities: Activity[],\n event: PushedEvent | ReplacedEvent,\n) {\n switch (event.name) {\n case \"Pushed\":\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n return alreadyExistingActivityIndex ?? activities.length;\n }\n default:\n return -1;\n }\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\n\nexport function makeActivityFromEvent(\n event: PushedEvent | ReplacedEvent,\n transitionState: ActivityTransitionState,\n): Activity {\n return {\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.activityParams,\n context: event.activityContext,\n steps: [\n {\n id: event.activityId,\n params: event.activityParams,\n enteredBy: event,\n zIndex: -1,\n },\n ],\n enteredBy: event,\n isTop: false,\n isActive: false,\n isRoot: false,\n zIndex: -1,\n };\n}\n", "import type { DomainEvent } from \"../event-types\";\n\ntype Reducer<T> = (state: T, event: DomainEvent) => T;\n\nexport function makeReducer<T>(\n reducerMap: {\n [key in DomainEvent[\"name\"]]: (\n state: T,\n event: Extract<DomainEvent, { name: key }>,\n ) => T;\n },\n) {\n return (target: T, event: DomainEvent) => {\n const reducer = (reducerMap[event.name] as Reducer<T>).bind(reducerMap);\n if (reducer) {\n return reducer(target, event);\n }\n throw new Error(`No reducer for event ${JSON.stringify(event)}`);\n };\n}\n", "import type { DomainEvent, PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findNewActivityIndex } from \"./findNewActivityIndex\";\nimport { makeActivityFromEvent } from \"./makeActivityFromEvent\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activities: Activity[]) {\n return activities;\n}\n\n/**\n * Create activity list reducers for each event type (Activity[] + Event => Activity[])\n */\nexport function makeActivitiesReducer({\n transitionDuration,\n now,\n resumedAt,\n}: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Push new activity to activities\n */\n Pushed(activities: Activity[], event: PushedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * Replace activity at reservedIndex with new activity\n */\n Replaced(activities: Activity[], event: ReplacedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n // reuse state of alreadyExistingActivity\n const transitionState =\n activities[reservedIndex]?.transitionState ??\n (event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\");\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Popped: noop,\n StepPushed: noop,\n StepReplaced: noop,\n StepPopped: noop,\n Paused: noop,\n Resumed: noop,\n });\n}\n", "import type {\n DomainEvent,\n PoppedEvent,\n ReplacedEvent,\n StepPoppedEvent,\n StepPushedEvent,\n StepReplacedEvent,\n} from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { last } from \"../utils\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activity: Activity) {\n return activity;\n}\n\n/**\n * Create activity reducers for each event type (Activity + Event => Activity)\n */\nexport function makeActivityReducer(context: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Change transition state to exit-done\n */\n Replaced: (activity: Activity, event: ReplacedEvent): Activity => ({\n ...activity,\n exitedBy: event,\n transitionState: \"exit-done\",\n }),\n\n /**\n * Change transition state to exit-done or exit-active depending on skipExitActiveState\n */\n Popped: (activity: Activity, event: PoppedEvent): Activity => {\n const isTransitionDone =\n context.now - (context.resumedAt ?? event.eventDate) >=\n context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipExitActiveState || isTransitionDone\n ? \"exit-done\"\n : \"exit-active\";\n\n return {\n ...activity,\n exitedBy: event,\n transitionState,\n params:\n transitionState === \"exit-done\"\n ? activity.steps[0].params\n : activity.params,\n steps:\n transitionState === \"exit-done\"\n ? [activity.steps[0]]\n : activity.steps,\n };\n },\n\n /**\n * Replace step params\n * Push new step\n */\n StepPushed: (activity: Activity, event: StepPushedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [...activity.steps, newRoute],\n };\n },\n\n /**\n * Replace step params\n * Replace the last step\n */\n StepReplaced: (activity: Activity, event: StepReplacedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [\n ...activity.steps.slice(0, activity.steps.length - 1),\n newRoute,\n ],\n };\n },\n\n /**\n * Pop the last step\n * If there are params in the previous step, set them as the new params\n */\n StepPopped: (activity: Activity, event: StepPoppedEvent): Activity => {\n activity.steps.pop();\n\n const beforeActivityParams = last(activity.steps)?.params;\n\n return {\n ...activity,\n params: beforeActivityParams ?? activity.params,\n };\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Pushed: noop,\n Paused: noop,\n Resumed: noop,\n } as const);\n}\n", "import type {\n ActivityRegisteredEvent,\n DomainEvent,\n InitializedEvent,\n PausedEvent,\n ResumedEvent,\n} from \"../event-types\";\nimport type { Stack } from \"../Stack\";\nimport { findTargetActivityIndices } from \"./findTargetActivityIndices\";\nimport { makeActivitiesReducer } from \"./makeActivitiesReducer\";\nimport { makeActivityReducer } from \"./makeActivityReducer\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction withPauseReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n) {\n return (stack: Stack, event: T) => {\n if (stack.globalTransitionState === \"paused\") {\n return {\n ...stack,\n pausedEvents: stack.pausedEvents\n ? [...stack.pausedEvents, event]\n : [event],\n };\n }\n\n return reducer(stack, event);\n };\n}\n\nfunction withActivitiesReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n context: {\n now: number;\n resumedAt?: number;\n },\n) {\n return (stack: Stack, event: T) => {\n const activitiesReducer = makeActivitiesReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activityReducer = makeActivityReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activities = activitiesReducer(stack.activities, event);\n\n const targetActivityIndices = findTargetActivityIndices(\n stack.activities,\n event,\n { transitionDuration: stack.transitionDuration, now: context.now },\n );\n\n for (const targetActivityIndex of targetActivityIndices) {\n activities[targetActivityIndex] = activityReducer(\n activities[targetActivityIndex],\n event,\n );\n }\n\n const isLoading = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n );\n\n const globalTransitionState =\n stack.globalTransitionState === \"paused\"\n ? \"paused\"\n : isLoading\n ? \"loading\"\n : \"idle\";\n\n return reducer({ ...stack, activities, globalTransitionState }, event);\n };\n}\n\nfunction noop(stack: Stack, event: DomainEvent) {\n return { ...stack, events: [...stack.events, event] };\n}\n\nexport function makeStackReducer(context: { now: number; resumedAt?: number }) {\n return makeReducer({\n Initialized: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: InitializedEvent): Stack => {\n return {\n ...stack,\n transitionDuration: event.transitionDuration,\n events: [...stack.events, event],\n };\n }, context),\n ),\n ActivityRegistered: withPauseReducer(\n withActivitiesReducer(\n (stack: Stack, event: ActivityRegisteredEvent): Stack => {\n return {\n ...stack,\n registeredActivities: [\n ...stack.registeredActivities,\n {\n name: event.activityName,\n ...(event.activityParamsSchema\n ? {\n paramsSchema: event.activityParamsSchema,\n }\n : null),\n },\n ],\n events: [...stack.events, event],\n };\n },\n context,\n ),\n ),\n Paused: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: PausedEvent): Stack => {\n return {\n ...stack,\n globalTransitionState: \"paused\",\n events: [...stack.events, event],\n };\n }, context),\n ),\n Resumed: withActivitiesReducer(\n (stack: Stack, event: ResumedEvent): Stack => {\n if (stack.globalTransitionState !== \"paused\" || !stack.pausedEvents) {\n return { ...stack, events: [...stack.events, event] };\n }\n\n const reducer = makeStackReducer({\n now: context.now,\n resumedAt: event.eventDate,\n });\n\n const { pausedEvents, ...rest } = stack;\n const resumedStack = pausedEvents.reduce(reducer, {\n ...rest,\n globalTransitionState: \"idle\",\n });\n\n return {\n ...resumedStack,\n events: [...resumedStack.events, event],\n };\n },\n context,\n ),\n Pushed: withPauseReducer(withActivitiesReducer(noop, context)),\n Replaced: withPauseReducer(withActivitiesReducer(noop, context)),\n Popped: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPushed: withPauseReducer(withActivitiesReducer(noop, context)),\n StepReplaced: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPopped: withPauseReducer(withActivitiesReducer(noop, context)),\n });\n}\n", "import type { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport { id, time } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n eventDate: time(),\n ...parameters,\n name,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n\n const registeredActivityNames = new Set(\n activityRegisteredEvents.map((e) => e.activityName),\n );\n\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (pushedEvents.some((e) => !registeredActivityNames.has(e.activityName))) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n}\n", "import { makeStackReducer } from \"./activity-utils/makeStackReducer\";\nimport type { DomainEvent } from \"./event-types\";\nimport { validateEvents } from \"./event-utils\";\nimport type { ActivityStep, Stack } from \"./Stack\";\nimport { compareBy, last, uniqBy } from \"./utils\";\n\nexport function aggregate(inputEvents: DomainEvent[], now: number): Stack {\n /**\n * 1. Pre-process\n */\n const events = uniqBy(\n [...inputEvents].sort((a, b) => a.eventDate - b.eventDate),\n (e) => e.id,\n );\n\n /**\n * 2. Validate events\n */\n validateEvents(events);\n\n /**\n * 3. Run reducer\n */\n const stackReducer = makeStackReducer({ now });\n const stack = events.reduce(stackReducer, {\n activities: [],\n globalTransitionState: \"idle\",\n registeredActivities: [],\n transitionDuration: 0,\n events: [],\n });\n\n /**\n * 4. Post-process\n */\n const visibleActivities = stack.activities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\" ||\n activity.transitionState === \"exit-active\",\n );\n const enteredActivities = visibleActivities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\",\n );\n\n const lastVisibleActivity = visibleActivities[visibleActivities.length - 1];\n const lastEnteredActivity = enteredActivities[enteredActivities.length - 1];\n\n const output: Stack = {\n ...stack,\n activities: stack.activities\n .map((activity) => {\n let zIndex = visibleActivities.findIndex(\n ({ id }) => id === activity.id,\n );\n\n const beforeActivities = visibleActivities.slice(0, zIndex);\n\n for (const beforeActivity of beforeActivities) {\n for (const step of beforeActivity.steps) {\n if (step.hasZIndex) {\n zIndex += 1;\n }\n }\n }\n\n const steps = activity.steps.reduce<ActivityStep[]>((acc, step) => {\n const lastStep = last(acc);\n const lastStepZIndex = lastStep?.zIndex ?? zIndex;\n\n return [\n ...acc,\n {\n ...step,\n zIndex: lastStepZIndex + (step.hasZIndex ? 1 : 0),\n },\n ];\n }, []);\n\n return {\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n steps,\n enteredBy: activity.enteredBy,\n zIndex,\n isTop: lastVisibleActivity?.id === activity.id,\n isActive: lastEnteredActivity?.id === activity.id,\n isRoot:\n zIndex === 0 ||\n (zIndex === 1 &&\n activity.transitionState === \"enter-active\" &&\n activity.enteredBy.name === \"Replaced\"),\n ...(activity.exitedBy\n ? {\n exitedBy: activity.exitedBy,\n }\n : null),\n ...(activity.context\n ? {\n context: activity.context,\n }\n : null),\n };\n })\n .sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\nimport { aggregate } from \"./aggregate\";\nimport type { DomainEvent, PushedEvent, StepPushedEvent } from \"./event-types\";\nimport { makeEvent } from \"./event-utils\";\nimport type { StackflowActions, StackflowPlugin } from \"./interfaces\";\nimport { produceEffects } from \"./produceEffects\";\nimport type { Stack } from \"./Stack\";\nimport { divideBy, once } from \"./utils\";\nimport { makeActions } from \"./utils/makeActions\";\nimport { triggerPostEffectHooks } from \"./utils/triggerPostEffectHooks\";\n\nconst SECOND = 1000;\n\n// 60FPS\nconst INTERVAL_MS = SECOND / 60;\n\nexport type MakeCoreStoreOptions = {\n initialEvents: DomainEvent[];\n initialContext?: any;\n plugins: StackflowPlugin[];\n handlers?: {\n onInitialActivityIgnored?: (\n initialPushedEvents: (PushedEvent | StepPushedEvent)[],\n ) => void;\n onInitialActivityNotFound?: () => void;\n };\n};\n\nexport type CoreStore = {\n actions: StackflowActions;\n init: () => void;\n pullEvents: () => DomainEvent[];\n subscribe: (listener: () => void) => () => void;\n pluginInstances: ReturnType<StackflowPlugin>[];\n};\n\nexport function makeCoreStore(options: MakeCoreStoreOptions): CoreStore {\n const storeListeners: Array<() => void> = [];\n\n const defaultPlugin: StackflowPlugin = () => ({\n key: \"@stackflow/core\",\n onChanged() {\n storeListeners.forEach((listener) => listener());\n },\n });\n\n const pluginInstances: ReturnType<StackflowPlugin>[] = [\n defaultPlugin(),\n ...options.plugins.map((plugin) => plugin()),\n ];\n\n const [initialPushedEventsByOption, initialRemainingEvents] = divideBy(\n options.initialEvents,\n (e) => e.name === \"Pushed\" || e.name === \"StepPushed\",\n );\n\n const initialPushedEvents = pluginInstances.reduce(\n (initialEvents, pluginInstance) =>\n pluginInstance.overrideInitialEvents?.({\n initialEvents,\n initialContext: options.initialContext ?? {},\n }) ?? initialEvents,\n initialPushedEventsByOption,\n );\n\n const isInitialActivityIgnored =\n initialPushedEvents.length > 0 &&\n initialPushedEventsByOption.length > 0 &&\n initialPushedEvents !== initialPushedEventsByOption;\n\n if (isInitialActivityIgnored) {\n options.handlers?.onInitialActivityIgnored?.(initialPushedEvents);\n }\n\n if (initialPushedEvents.length === 0) {\n options.handlers?.onInitialActivityNotFound?.();\n }\n\n const events: { value: DomainEvent[] } = {\n value: [...initialRemainingEvents, ...initialPushedEvents],\n };\n\n const stack = {\n value: aggregate(events.value, new Date().getTime()),\n };\n\n const actions: StackflowActions = {\n getStack() {\n return stack.value;\n },\n dispatchEvent(name, params) {\n const newEvent = makeEvent(name, params);\n const nextStackValue = aggregate(\n [...events.value, newEvent],\n new Date().getTime(),\n );\n\n events.value.push(newEvent);\n setStackValue(nextStackValue);\n\n const interval = setInterval(() => {\n const nextStackValue = aggregate(events.value, new Date().getTime());\n\n if (!isEqual(stack.value, nextStackValue)) {\n setStackValue(nextStackValue);\n }\n\n if (nextStackValue.globalTransitionState === \"idle\") {\n clearInterval(interval);\n }\n }, INTERVAL_MS);\n },\n push: () => {},\n replace: () => {},\n pop: () => {},\n stepPush: () => {},\n stepReplace: () => {},\n stepPop: () => {},\n pause: () => {},\n resume: () => {},\n };\n\n const setStackValue = (nextStackValue: Stack) => {\n const effects = produceEffects(stack.value, nextStackValue);\n stack.value = nextStackValue;\n triggerPostEffectHooks(effects, pluginInstances, actions);\n };\n\n // Initialize action methods after actions object is fully created\n Object.assign(\n actions,\n makeActions({\n dispatchEvent: actions.dispatchEvent,\n pluginInstances,\n actions,\n }),\n );\n\n return {\n actions,\n init: once(() => {\n pluginInstances.forEach((pluginInstance) => {\n pluginInstance.onInit?.({\n actions,\n });\n });\n }),\n pullEvents: () => events.value,\n subscribe(listener) {\n storeListeners.push(listener);\n\n return function dispose() {\n const listenerIndex = storeListeners.findIndex((l) => l === listener);\n\n if (listenerIndex > -1) {\n storeListeners.splice(listenerIndex, 1);\n }\n };\n },\n pluginInstances,\n };\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport type { Effect } from \"./Effect\";\nimport type { Stack } from \"./Stack\";\nimport { omit } from \"./utils\";\n\nexport function produceEffects(prevOutput: Stack, nextOutput: Stack): Effect[] {\n const output: Effect[] = [];\n\n const somethingChanged = !isEqual(prevOutput, nextOutput);\n\n if (somethingChanged) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n const isPaused =\n prevOutput.globalTransitionState !== \"paused\" &&\n nextOutput.globalTransitionState === \"paused\";\n const isResumed =\n prevOutput.globalTransitionState === \"paused\" &&\n nextOutput.globalTransitionState !== \"paused\";\n\n if (isPaused) {\n output.push({\n _TAG: \"PAUSED\",\n });\n }\n if (isResumed) {\n output.push({\n _TAG: \"RESUMED\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (prevActivity && nextActivity && prevActivity.id === nextActivity.id) {\n for (\n let j = 0;\n j <\n Math.max(\n (prevActivity.steps ?? []).length,\n (nextActivity.steps ?? []).length,\n );\n j += 1\n ) {\n const prevStep = prevActivity.steps[j];\n const nextStep = nextActivity.steps[j];\n\n if (!prevStep && nextStep) {\n output.push({\n _TAG: \"STEP_PUSHED\",\n activity: nextActivity,\n step: nextStep,\n });\n } else if (prevStep && !nextStep) {\n output.push({\n _TAG: \"STEP_POPPED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity.steps.length === nextActivity.steps.length &&\n prevStep.id !== nextStep.id\n ) {\n output.push({\n _TAG: \"STEP_REPLACED\",\n activity: nextActivity,\n step: nextStep,\n });\n }\n }\n }\n\n if (!prevActivity && nextActivity) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity &&\n nextActivity &&\n prevActivity.id === nextActivity.id &&\n !isEqual(\n omit(prevActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n omit(nextActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n ) &&\n nextActivity.enteredBy.name === \"Replaced\" &&\n !isEqual(prevActivity.enteredBy, nextActivity.enteredBy)\n ) {\n output.push({\n _TAG: \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const isPrevActivityPushed =\n prevOutput.activities[j]?.transitionState === \"enter-done\" ||\n prevOutput.activities[j]?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextOutput.activities[j]?.transitionState === \"exit-active\" ||\n nextOutput.activities[j]?.transitionState === \"exit-done\";\n const isReplacedEvent =\n nextOutput.activities[j + 1]?.enteredBy.name === \"Replaced\" &&\n nextOutput.activities[j + 1]?.transitionState === \"enter-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped && !isReplacedEvent) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextOutput.activities[j],\n });\n }\n }\n\n return output;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport type { StackflowPluginPreEffectHook } from \"../interfaces/StackflowPluginHook\";\n\ntype PreEffectHookResult<T> = {\n isPrevented: boolean;\n nextActionParams: T;\n};\n\ntype EventNameToParams<K extends ActionName> = Omit<\n Extract<DomainEvent, { name: K }>,\n keyof BaseDomainEvent\n>;\n\nconst PLUGIN_HOOK_MAP = {\n Pushed: \"onBeforePush\",\n Replaced: \"onBeforeReplace\",\n Popped: \"onBeforePop\",\n StepPushed: \"onBeforeStepPush\",\n StepReplaced: \"onBeforeStepReplace\",\n StepPopped: \"onBeforeStepPop\",\n Paused: \"onBeforePause\",\n Resumed: \"onBeforeResume\",\n} as const;\n\ntype ActionName = Exclude<\n DomainEvent[\"name\"],\n \"Initialized\" | \"ActivityRegistered\"\n>;\n\nexport function triggerPreEffectHook<K extends ActionName>(\n actionName: K,\n actionParams: EventNameToParams<K>,\n pluginInstances: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): PreEffectHookResult<EventNameToParams<K>> {\n let isPrevented = false;\n let nextActionParams = { ...actionParams };\n\n for (const pluginInstance of pluginInstances) {\n const hook = pluginInstance[PLUGIN_HOOK_MAP[actionName]] as\n | StackflowPluginPreEffectHook<EventNameToParams<K>>\n | undefined;\n if (hook) {\n hook({\n actionParams: { ...nextActionParams },\n actions: {\n ...actions,\n preventDefault: () => {\n isPrevented = true;\n },\n overrideActionParams: (partialActionParams: EventNameToParams<K>) => {\n nextActionParams = {\n ...nextActionParams,\n ...partialActionParams,\n };\n },\n },\n });\n }\n }\n\n return {\n isPrevented,\n nextActionParams,\n };\n}\n", "import type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport { triggerPreEffectHook } from \"./triggerPreEffectHooks\";\n\ntype ActionCreatorOptions = {\n dispatchEvent: StackflowActions[\"dispatchEvent\"];\n pluginInstances: ReturnType<StackflowPlugin>[];\n actions: StackflowActions;\n};\n\nexport function makeActions({\n dispatchEvent,\n pluginInstances,\n actions,\n}: ActionCreatorOptions): Omit<StackflowActions, \"dispatchEvent\" | \"getStack\"> {\n return {\n push(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Pushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Pushed\", nextActionParams);\n },\n replace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Replaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Replaced\", nextActionParams);\n },\n pop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Popped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Popped\", nextActionParams);\n },\n stepPush(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPushed\", nextActionParams);\n },\n stepReplace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepReplaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepReplaced\", nextActionParams);\n },\n stepPop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPopped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPopped\", nextActionParams);\n },\n pause(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Paused\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Paused\", nextActionParams);\n },\n resume(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Resumed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Resumed\", nextActionParams);\n },\n };\n}\n", "import type { Effect } from \"../Effect\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\n\nexport function triggerPostEffectHooks(\n effects: Effect[],\n plugins: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): void {\n effects.forEach((effect) => {\n plugins.forEach((plugin) => {\n switch (effect._TAG) {\n case \"PUSHED\":\n plugin.onPushed?.({ actions, effect });\n break;\n case \"REPLACED\":\n plugin.onReplaced?.({ actions, effect });\n break;\n case \"POPPED\":\n plugin.onPopped?.({ actions, effect });\n break;\n case \"STEP_PUSHED\":\n plugin.onStepPushed?.({ actions, effect });\n break;\n case \"STEP_REPLACED\":\n plugin.onStepReplaced?.({ actions, effect });\n break;\n case \"STEP_POPPED\":\n plugin.onStepPopped?.({ actions, effect });\n break;\n case \"PAUSED\":\n plugin.onPaused?.({ actions, effect });\n break;\n case \"RESUMED\":\n plugin.onResumed?.({ actions, effect });\n break;\n case \"%SOMETHING_CHANGED%\":\n plugin.onChanged?.({ actions, effect });\n break;\n }\n });\n });\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "export const divideBy = <T, U extends T>(\n arr: T[],\n predicate: (t: T) => t is U,\n): [U[], T[]] => {\n const satisfied: U[] = [];\n const unsatisfied: T[] = [];\n\n arr.forEach((element) => {\n if (predicate(element)) {\n satisfied.push(element);\n } else {\n unsatisfied.push(element);\n }\n });\n\n return [satisfied, unsatisfied];\n};\n", "export function findIndices<T>(arr: T[], compare: (t: T) => boolean) {\n return arr\n .map((e, i) => (compare(e) ? i : undefined))\n .filter((output): output is number => typeof output === \"number\");\n}\n", "let dt = 0;\nlet memt = 0;\n\nexport const time = () => {\n const t = new Date().getTime();\n\n if (memt === t) {\n dt += 1;\n } else {\n memt = t;\n dt = 0;\n }\n\n return (t * 1000 + dt) / 1000;\n};\n", "import { time } from \"./time\";\n\nexport function id() {\n return (time() * 1000).toString(16);\n}\n", "export function last<T>(arr: T[]) {\n return arr.length === 0 ? undefined : arr[arr.length - 1];\n}\n", "export function omit<T extends {}, K extends keyof T>(\n obj: T,\n fields: K[],\n): Omit<T, K> {\n const output = {\n ...obj,\n };\n\n fields.forEach((field) => {\n delete output[field];\n });\n\n return output;\n}\n", "export function once(cb: () => void) {\n let called = false;\n\n return () => {\n if (called) {\n return;\n }\n called = true;\n\n cb();\n };\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nfunction isActivityNotExited(activity: Activity) {\n return !activity.exitedBy;\n}\n\nfunction compareActivitiesByEventDate(a1: Activity, a2: Activity) {\n return a2.enteredBy.eventDate - a1.enteredBy.eventDate;\n}\n\nfunction findLatestActiveActivity(activities: Activity[]) {\n return activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate)[0];\n}\n\nexport function findTargetActivityIndices(\n activities: Activity[],\n event: DomainEvent,\n context: {\n now: number;\n transitionDuration: number;\n },\n): number[] {\n const targetActivities: number[] = [];\n\n switch (event.name) {\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n\n if (alreadyExistingActivityIndex !== undefined) {\n break;\n }\n\n const sorted = activities\n .slice()\n .sort(compareActivitiesByEventDate)\n .filter(isActivityNotExited);\n\n const isTransitionDone =\n context.now - event.eventDate >= context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n if (transitionState === \"enter-done\") {\n const range = sorted.findIndex(\n (activity) =>\n !(\n event.skipEnterActiveState &&\n activity.enteredBy.name === \"Replaced\" &&\n activity.transitionState === \"enter-active\"\n ),\n );\n\n return sorted.slice(0, range + 1).map((a) => activities.indexOf(a));\n }\n break;\n }\n case \"Popped\": {\n const sorted = activities\n .filter(isActivityNotExited)\n .sort(compareActivitiesByEventDate);\n\n const latestActivity = sorted.slice(0, sorted.length - 1)[0];\n\n if (latestActivity) {\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPushed\":\n case \"StepReplaced\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n break;\n }\n case \"StepPopped\": {\n const latestActivity = findLatestActiveActivity(activities);\n\n if (latestActivity && latestActivity.steps.length > 1) {\n if (\n event.targetActivityId &&\n event.targetActivityId !== latestActivity.id\n ) {\n break;\n }\n targetActivities.push(activities.indexOf(latestActivity));\n }\n\n break;\n }\n default:\n break;\n }\n return targetActivities;\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity } from \"../Stack\";\nimport { findIndices, last } from \"../utils\";\n\nexport function findNewActivityIndex(\n activities: Activity[],\n event: PushedEvent | ReplacedEvent,\n) {\n switch (event.name) {\n case \"Pushed\":\n case \"Replaced\": {\n const alreadyExistingActivityIndex = last(\n findIndices(activities, (activity) => activity.id === event.activityId),\n );\n return alreadyExistingActivityIndex ?? activities.length;\n }\n default:\n return -1;\n }\n}\n", "import type { PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\n\nexport function makeActivityFromEvent(\n event: PushedEvent | ReplacedEvent,\n transitionState: ActivityTransitionState,\n): Activity {\n return {\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.activityParams,\n context: event.activityContext,\n steps: [\n {\n id: event.activityId,\n params: event.activityParams,\n enteredBy: event,\n zIndex: -1,\n },\n ],\n enteredBy: event,\n isTop: false,\n isActive: false,\n isRoot: false,\n zIndex: -1,\n };\n}\n", "import type { DomainEvent } from \"../event-types\";\n\ntype Reducer<T> = (state: T, event: DomainEvent) => T;\n\nexport function makeReducer<T>(\n reducerMap: {\n [key in DomainEvent[\"name\"]]: (\n state: T,\n event: Extract<DomainEvent, { name: key }>,\n ) => T;\n },\n) {\n return (target: T, event: DomainEvent) => {\n const reducer = (reducerMap[event.name] as Reducer<T>).bind(reducerMap);\n if (reducer) {\n return reducer(target, event);\n }\n throw new Error(`No reducer for event ${JSON.stringify(event)}`);\n };\n}\n", "import type { DomainEvent, PushedEvent, ReplacedEvent } from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { findNewActivityIndex } from \"./findNewActivityIndex\";\nimport { makeActivityFromEvent } from \"./makeActivityFromEvent\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activities: Activity[]) {\n return activities;\n}\n\n/**\n * Create activity list reducers for each event type (Activity[] + Event => Activity[])\n */\nexport function makeActivitiesReducer({\n transitionDuration,\n now,\n resumedAt,\n}: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Push new activity to activities\n */\n Pushed(activities: Activity[], event: PushedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\";\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * Replace activity at reservedIndex with new activity\n */\n Replaced(activities: Activity[], event: ReplacedEvent): Activity[] {\n const isTransitionDone =\n now - (resumedAt ?? event.eventDate) >= transitionDuration;\n\n const reservedIndex = findNewActivityIndex(activities, event);\n\n // reuse state of alreadyExistingActivity\n const transitionState =\n activities[reservedIndex]?.transitionState ??\n (event.skipEnterActiveState || isTransitionDone\n ? \"enter-done\"\n : \"enter-active\");\n\n return [\n ...activities.slice(0, reservedIndex),\n makeActivityFromEvent(event, transitionState),\n ...activities.slice(reservedIndex + 1),\n ];\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Popped: noop,\n StepPushed: noop,\n StepReplaced: noop,\n StepPopped: noop,\n Paused: noop,\n Resumed: noop,\n });\n}\n", "import type {\n DomainEvent,\n PoppedEvent,\n ReplacedEvent,\n StepPoppedEvent,\n StepPushedEvent,\n StepReplacedEvent,\n} from \"../event-types\";\nimport type { Activity, ActivityTransitionState } from \"../Stack\";\nimport { last } from \"../utils\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction noop(activity: Activity) {\n return activity;\n}\n\n/**\n * Create activity reducers for each event type (Activity + Event => Activity)\n */\nexport function makeActivityReducer(context: {\n transitionDuration: number;\n now: number;\n resumedAt?: number;\n}) {\n return makeReducer({\n /**\n * Change transition state to exit-done\n */\n Replaced: (activity: Activity, event: ReplacedEvent): Activity => ({\n ...activity,\n exitedBy: event,\n transitionState: \"exit-done\",\n }),\n\n /**\n * Change transition state to exit-done or exit-active depending on skipExitActiveState\n */\n Popped: (activity: Activity, event: PoppedEvent): Activity => {\n const isTransitionDone =\n context.now - (context.resumedAt ?? event.eventDate) >=\n context.transitionDuration;\n\n const transitionState: ActivityTransitionState =\n event.skipExitActiveState || isTransitionDone\n ? \"exit-done\"\n : \"exit-active\";\n\n return {\n ...activity,\n exitedBy: event,\n transitionState,\n params:\n transitionState === \"exit-done\"\n ? activity.steps[0].params\n : activity.params,\n steps:\n transitionState === \"exit-done\"\n ? [activity.steps[0]]\n : activity.steps,\n };\n },\n\n /**\n * Replace step params\n * Push new step\n */\n StepPushed: (activity: Activity, event: StepPushedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [...activity.steps, newRoute],\n };\n },\n\n /**\n * Replace step params\n * Replace the last step\n */\n StepReplaced: (activity: Activity, event: StepReplacedEvent): Activity => {\n const newRoute = {\n id: event.stepId,\n params: event.stepParams,\n enteredBy: event,\n zIndex: activity.zIndex,\n hasZIndex: event.hasZIndex ?? false,\n };\n\n return {\n ...activity,\n params: event.stepParams,\n steps: [\n ...activity.steps.slice(0, activity.steps.length - 1),\n newRoute,\n ],\n };\n },\n\n /**\n * Pop the last step\n * If there are params in the previous step, set them as the new params\n */\n StepPopped: (activity: Activity, event: StepPoppedEvent): Activity => {\n activity.steps.pop();\n\n const beforeActivityParams = last(activity.steps)?.params;\n\n return {\n ...activity,\n params: beforeActivityParams ?? activity.params,\n };\n },\n\n /**\n * noop\n */\n Initialized: noop,\n ActivityRegistered: noop,\n Pushed: noop,\n Paused: noop,\n Resumed: noop,\n } as const);\n}\n", "import type {\n ActivityRegisteredEvent,\n DomainEvent,\n InitializedEvent,\n PausedEvent,\n ResumedEvent,\n} from \"../event-types\";\nimport type { Stack } from \"../Stack\";\nimport { findTargetActivityIndices } from \"./findTargetActivityIndices\";\nimport { makeActivitiesReducer } from \"./makeActivitiesReducer\";\nimport { makeActivityReducer } from \"./makeActivityReducer\";\nimport { makeReducer } from \"./makeReducer\";\n\nfunction withPauseReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n) {\n return (stack: Stack, event: T) => {\n if (stack.globalTransitionState === \"paused\") {\n return {\n ...stack,\n pausedEvents: stack.pausedEvents\n ? [...stack.pausedEvents, event]\n : [event],\n };\n }\n\n return reducer(stack, event);\n };\n}\n\nfunction withActivitiesReducer<T extends DomainEvent>(\n reducer: (stack: Stack, event: T) => Stack,\n context: {\n now: number;\n resumedAt?: number;\n },\n) {\n return (stack: Stack, event: T) => {\n const activitiesReducer = makeActivitiesReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activityReducer = makeActivityReducer({\n transitionDuration: stack.transitionDuration,\n now: context.now,\n resumedAt: context.resumedAt,\n });\n\n const activities = activitiesReducer(stack.activities, event);\n\n const targetActivityIndices = findTargetActivityIndices(\n stack.activities,\n event,\n { transitionDuration: stack.transitionDuration, now: context.now },\n );\n\n for (const targetActivityIndex of targetActivityIndices) {\n activities[targetActivityIndex] = activityReducer(\n activities[targetActivityIndex],\n event,\n );\n }\n\n const isLoading = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n );\n\n const globalTransitionState =\n stack.globalTransitionState === \"paused\"\n ? \"paused\"\n : isLoading\n ? \"loading\"\n : \"idle\";\n\n return reducer({ ...stack, activities, globalTransitionState }, event);\n };\n}\n\nfunction noop(stack: Stack, event: DomainEvent) {\n return { ...stack, events: [...stack.events, event] };\n}\n\nexport function makeStackReducer(context: { now: number; resumedAt?: number }) {\n return makeReducer({\n Initialized: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: InitializedEvent): Stack => {\n return {\n ...stack,\n transitionDuration: event.transitionDuration,\n events: [...stack.events, event],\n };\n }, context),\n ),\n ActivityRegistered: withPauseReducer(\n withActivitiesReducer(\n (stack: Stack, event: ActivityRegisteredEvent): Stack => {\n return {\n ...stack,\n registeredActivities: [\n ...stack.registeredActivities,\n {\n name: event.activityName,\n ...(event.activityParamsSchema\n ? {\n paramsSchema: event.activityParamsSchema,\n }\n : null),\n },\n ],\n events: [...stack.events, event],\n };\n },\n context,\n ),\n ),\n Paused: withPauseReducer(\n withActivitiesReducer((stack: Stack, event: PausedEvent): Stack => {\n return {\n ...stack,\n globalTransitionState: \"paused\",\n events: [...stack.events, event],\n };\n }, context),\n ),\n Resumed: withActivitiesReducer(\n (stack: Stack, event: ResumedEvent): Stack => {\n if (stack.globalTransitionState !== \"paused\" || !stack.pausedEvents) {\n return { ...stack, events: [...stack.events, event] };\n }\n\n const reducer = makeStackReducer({\n now: context.now,\n resumedAt: event.eventDate,\n });\n\n const { pausedEvents, ...rest } = stack;\n const resumedStack = pausedEvents.reduce(reducer, {\n ...rest,\n globalTransitionState: \"idle\",\n });\n\n return {\n ...resumedStack,\n events: [...resumedStack.events, event],\n };\n },\n context,\n ),\n Pushed: withPauseReducer(withActivitiesReducer(noop, context)),\n Replaced: withPauseReducer(withActivitiesReducer(noop, context)),\n Popped: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPushed: withPauseReducer(withActivitiesReducer(noop, context)),\n StepReplaced: withPauseReducer(withActivitiesReducer(noop, context)),\n StepPopped: withPauseReducer(withActivitiesReducer(noop, context)),\n });\n}\n", "import type { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport { id, time } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n eventDate: time(),\n ...parameters,\n name,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n\n const registeredActivityNames = new Set(\n activityRegisteredEvents.map((e) => e.activityName),\n );\n\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (pushedEvents.some((e) => !registeredActivityNames.has(e.activityName))) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n}\n", "import { makeStackReducer } from \"./activity-utils/makeStackReducer\";\nimport type { DomainEvent } from \"./event-types\";\nimport { validateEvents } from \"./event-utils\";\nimport type { ActivityStep, Stack } from \"./Stack\";\nimport { compareBy, last, uniqBy } from \"./utils\";\n\nexport function aggregate(inputEvents: DomainEvent[], now: number): Stack {\n /**\n * 1. Pre-process\n */\n const events = uniqBy(\n [...inputEvents].sort((a, b) => a.eventDate - b.eventDate),\n (e) => e.id,\n );\n\n /**\n * 2. Validate events\n */\n validateEvents(events);\n\n /**\n * 3. Run reducer\n */\n const stackReducer = makeStackReducer({ now });\n const stack = events.reduce(stackReducer, {\n activities: [],\n globalTransitionState: \"idle\",\n registeredActivities: [],\n transitionDuration: 0,\n events: [],\n });\n\n /**\n * 4. Post-process\n */\n const visibleActivities = stack.activities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\" ||\n activity.transitionState === \"exit-active\",\n );\n const enteredActivities = visibleActivities.filter(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"enter-done\",\n );\n\n const lastVisibleActivity = visibleActivities[visibleActivities.length - 1];\n const lastEnteredActivity = enteredActivities[enteredActivities.length - 1];\n\n const output: Stack = {\n ...stack,\n activities: stack.activities\n .map((activity) => {\n let zIndex = visibleActivities.findIndex(\n ({ id }) => id === activity.id,\n );\n\n const beforeActivities = visibleActivities.slice(0, zIndex);\n\n for (const beforeActivity of beforeActivities) {\n for (const step of beforeActivity.steps) {\n if (step.hasZIndex) {\n zIndex += 1;\n }\n }\n }\n\n const steps = activity.steps.reduce<ActivityStep[]>((acc, step) => {\n const lastStep = last(acc);\n const lastStepZIndex = lastStep?.zIndex ?? zIndex;\n\n return [\n ...acc,\n {\n ...step,\n zIndex: lastStepZIndex + (step.hasZIndex ? 1 : 0),\n },\n ];\n }, []);\n\n return {\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n steps,\n enteredBy: activity.enteredBy,\n zIndex,\n isTop: lastVisibleActivity?.id === activity.id,\n isActive: lastEnteredActivity?.id === activity.id,\n isRoot:\n zIndex === 0 ||\n (zIndex === 1 &&\n activity.transitionState === \"enter-active\" &&\n activity.enteredBy.name === \"Replaced\"),\n ...(activity.exitedBy\n ? {\n exitedBy: activity.exitedBy,\n }\n : null),\n ...(activity.context\n ? {\n context: activity.context,\n }\n : null),\n };\n })\n .sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\nimport { aggregate } from \"./aggregate\";\nimport type { DomainEvent, PushedEvent, StepPushedEvent } from \"./event-types\";\nimport { makeEvent } from \"./event-utils\";\nimport type { StackflowActions, StackflowPlugin } from \"./interfaces\";\nimport { produceEffects } from \"./produceEffects\";\nimport type { Stack } from \"./Stack\";\nimport { divideBy, once } from \"./utils\";\nimport { makeActions } from \"./utils/makeActions\";\nimport { triggerPostEffectHooks } from \"./utils/triggerPostEffectHooks\";\n\nconst SECOND = 1000;\n\n// 60FPS\nconst INTERVAL_MS = SECOND / 60;\n\nexport type MakeCoreStoreOptions = {\n initialEvents: DomainEvent[];\n initialContext?: any;\n plugins: StackflowPlugin[];\n handlers?: {\n onInitialActivityIgnored?: (\n initialPushedEvents: (PushedEvent | StepPushedEvent)[],\n ) => void;\n onInitialActivityNotFound?: () => void;\n };\n};\n\nexport type CoreStore = {\n actions: StackflowActions;\n init: () => void;\n pullEvents: () => DomainEvent[];\n subscribe: (listener: () => void) => () => void;\n pluginInstances: ReturnType<StackflowPlugin>[];\n};\n\nexport function makeCoreStore(options: MakeCoreStoreOptions): CoreStore {\n const storeListeners: Array<() => void> = [];\n\n const defaultPlugin: StackflowPlugin = () => ({\n key: \"@stackflow/core\",\n onChanged() {\n storeListeners.forEach((listener) => listener());\n },\n });\n\n const pluginInstances: ReturnType<StackflowPlugin>[] = [\n defaultPlugin(),\n ...options.plugins.map((plugin) => plugin()),\n ];\n\n const [initialPushedEventsByOption, initialRemainingEvents] = divideBy(\n options.initialEvents,\n (e) => e.name === \"Pushed\" || e.name === \"StepPushed\",\n );\n\n const initialPushedEvents = pluginInstances.reduce(\n (initialEvents, pluginInstance) =>\n pluginInstance.overrideInitialEvents?.({\n initialEvents,\n initialContext: options.initialContext ?? {},\n }) ?? initialEvents,\n initialPushedEventsByOption,\n );\n\n const isInitialActivityIgnored =\n initialPushedEvents.length > 0 &&\n initialPushedEventsByOption.length > 0 &&\n initialPushedEvents !== initialPushedEventsByOption;\n\n if (isInitialActivityIgnored) {\n options.handlers?.onInitialActivityIgnored?.(initialPushedEvents);\n }\n\n if (initialPushedEvents.length === 0) {\n options.handlers?.onInitialActivityNotFound?.();\n }\n\n const events: { value: DomainEvent[] } = {\n value: [...initialRemainingEvents, ...initialPushedEvents],\n };\n\n const stack = {\n value: aggregate(events.value, new Date().getTime()),\n };\n\n let currentInterval: ReturnType<typeof setInterval> | null = null;\n\n const actions: StackflowActions = {\n getStack() {\n return stack.value;\n },\n dispatchEvent(name, params) {\n const newEvent = makeEvent(name, params);\n const nextStackValue = aggregate(\n [...events.value, newEvent],\n new Date().getTime(),\n );\n\n events.value.push(newEvent);\n setStackValue(nextStackValue);\n\n if (currentInterval !== null) {\n clearInterval(currentInterval);\n }\n\n const interval = setInterval(() => {\n const nextStackValue = aggregate(events.value, new Date().getTime());\n\n if (!isEqual(stack.value, nextStackValue)) {\n setStackValue(nextStackValue);\n }\n\n if (nextStackValue.globalTransitionState === \"idle\") {\n clearInterval(interval);\n if (currentInterval === interval) {\n currentInterval = null;\n }\n }\n }, INTERVAL_MS);\n currentInterval = interval;\n },\n push: () => {},\n replace: () => {},\n pop: () => {},\n stepPush: () => {},\n stepReplace: () => {},\n stepPop: () => {},\n pause: () => {},\n resume: () => {},\n };\n\n const setStackValue = (nextStackValue: Stack) => {\n const effects = produceEffects(stack.value, nextStackValue);\n stack.value = nextStackValue;\n triggerPostEffectHooks(effects, pluginInstances, actions);\n };\n\n // Initialize action methods after actions object is fully created\n Object.assign(\n actions,\n makeActions({\n dispatchEvent: actions.dispatchEvent,\n pluginInstances,\n actions,\n }),\n );\n\n return {\n actions,\n init: once(() => {\n pluginInstances.forEach((pluginInstance) => {\n pluginInstance.onInit?.({\n actions,\n });\n });\n }),\n pullEvents: () => events.value,\n subscribe(listener) {\n storeListeners.push(listener);\n\n return function dispose() {\n const listenerIndex = storeListeners.findIndex((l) => l === listener);\n\n if (listenerIndex > -1) {\n storeListeners.splice(listenerIndex, 1);\n }\n };\n },\n pluginInstances,\n };\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport type { Effect } from \"./Effect\";\nimport type { Stack } from \"./Stack\";\nimport { omit } from \"./utils\";\n\nexport function produceEffects(prevOutput: Stack, nextOutput: Stack): Effect[] {\n const output: Effect[] = [];\n\n const somethingChanged = !isEqual(prevOutput, nextOutput);\n\n if (somethingChanged) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n const isPaused =\n prevOutput.globalTransitionState !== \"paused\" &&\n nextOutput.globalTransitionState === \"paused\";\n const isResumed =\n prevOutput.globalTransitionState === \"paused\" &&\n nextOutput.globalTransitionState !== \"paused\";\n\n if (isPaused) {\n output.push({\n _TAG: \"PAUSED\",\n });\n }\n if (isResumed) {\n output.push({\n _TAG: \"RESUMED\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (prevActivity && nextActivity && prevActivity.id === nextActivity.id) {\n for (\n let j = 0;\n j <\n Math.max(\n (prevActivity.steps ?? []).length,\n (nextActivity.steps ?? []).length,\n );\n j += 1\n ) {\n const prevStep = prevActivity.steps[j];\n const nextStep = nextActivity.steps[j];\n\n if (!prevStep && nextStep) {\n output.push({\n _TAG: \"STEP_PUSHED\",\n activity: nextActivity,\n step: nextStep,\n });\n } else if (prevStep && !nextStep) {\n output.push({\n _TAG: \"STEP_POPPED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity.steps.length === nextActivity.steps.length &&\n prevStep.id !== nextStep.id\n ) {\n output.push({\n _TAG: \"STEP_REPLACED\",\n activity: nextActivity,\n step: nextStep,\n });\n }\n }\n }\n\n if (!prevActivity && nextActivity) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.enteredBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n } else if (\n prevActivity &&\n nextActivity &&\n prevActivity.id === nextActivity.id &&\n !isEqual(\n omit(prevActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n omit(nextActivity, [\n \"isActive\",\n \"isTop\",\n \"isRoot\",\n \"transitionState\",\n \"zIndex\",\n ]),\n ) &&\n nextActivity.enteredBy.name === \"Replaced\" &&\n !isEqual(prevActivity.enteredBy, nextActivity.enteredBy)\n ) {\n output.push({\n _TAG: \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const isPrevActivityPushed =\n prevOutput.activities[j]?.transitionState === \"enter-done\" ||\n prevOutput.activities[j]?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextOutput.activities[j]?.transitionState === \"exit-active\" ||\n nextOutput.activities[j]?.transitionState === \"exit-done\";\n const isReplacedEvent =\n nextOutput.activities[j + 1]?.enteredBy.name === \"Replaced\" &&\n nextOutput.activities[j + 1]?.transitionState === \"enter-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped && !isReplacedEvent) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextOutput.activities[j],\n });\n }\n }\n\n return output;\n}\n", "import type { DomainEvent } from \"../event-types\";\nimport type { BaseDomainEvent } from \"../event-types/_base\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport type { StackflowPluginPreEffectHook } from \"../interfaces/StackflowPluginHook\";\n\ntype PreEffectHookResult<T> = {\n isPrevented: boolean;\n nextActionParams: T;\n};\n\ntype EventNameToParams<K extends ActionName> = Omit<\n Extract<DomainEvent, { name: K }>,\n keyof BaseDomainEvent\n>;\n\nconst PLUGIN_HOOK_MAP = {\n Pushed: \"onBeforePush\",\n Replaced: \"onBeforeReplace\",\n Popped: \"onBeforePop\",\n StepPushed: \"onBeforeStepPush\",\n StepReplaced: \"onBeforeStepReplace\",\n StepPopped: \"onBeforeStepPop\",\n Paused: \"onBeforePause\",\n Resumed: \"onBeforeResume\",\n} as const;\n\ntype ActionName = Exclude<\n DomainEvent[\"name\"],\n \"Initialized\" | \"ActivityRegistered\"\n>;\n\nexport function triggerPreEffectHook<K extends ActionName>(\n actionName: K,\n actionParams: EventNameToParams<K>,\n pluginInstances: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): PreEffectHookResult<EventNameToParams<K>> {\n let isPrevented = false;\n let nextActionParams = { ...actionParams };\n\n for (const pluginInstance of pluginInstances) {\n const hook = pluginInstance[PLUGIN_HOOK_MAP[actionName]] as\n | StackflowPluginPreEffectHook<EventNameToParams<K>>\n | undefined;\n if (hook) {\n hook({\n actionParams: { ...nextActionParams },\n actions: {\n ...actions,\n preventDefault: () => {\n isPrevented = true;\n },\n overrideActionParams: (partialActionParams: EventNameToParams<K>) => {\n nextActionParams = {\n ...nextActionParams,\n ...partialActionParams,\n };\n },\n },\n });\n }\n }\n\n return {\n isPrevented,\n nextActionParams,\n };\n}\n", "import type { StackflowActions, StackflowPlugin } from \"../interfaces\";\nimport { triggerPreEffectHook } from \"./triggerPreEffectHooks\";\n\ntype ActionCreatorOptions = {\n dispatchEvent: StackflowActions[\"dispatchEvent\"];\n pluginInstances: ReturnType<StackflowPlugin>[];\n actions: StackflowActions;\n};\n\nexport function makeActions({\n dispatchEvent,\n pluginInstances,\n actions,\n}: ActionCreatorOptions): Omit<StackflowActions, \"dispatchEvent\" | \"getStack\"> {\n return {\n push(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Pushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Pushed\", nextActionParams);\n },\n replace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Replaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Replaced\", nextActionParams);\n },\n pop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Popped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Popped\", nextActionParams);\n },\n stepPush(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPushed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPushed\", nextActionParams);\n },\n stepReplace(params) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepReplaced\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepReplaced\", nextActionParams);\n },\n stepPop(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"StepPopped\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"StepPopped\", nextActionParams);\n },\n pause(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Paused\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Paused\", nextActionParams);\n },\n resume(params = {}) {\n const { isPrevented, nextActionParams } = triggerPreEffectHook(\n \"Resumed\",\n params,\n pluginInstances,\n actions,\n );\n\n if (isPrevented) {\n return;\n }\n\n dispatchEvent(\"Resumed\", nextActionParams);\n },\n };\n}\n", "import type { Effect } from \"../Effect\";\nimport type { StackflowActions, StackflowPlugin } from \"../interfaces\";\n\nexport function triggerPostEffectHooks(\n effects: Effect[],\n plugins: ReturnType<StackflowPlugin>[],\n actions: StackflowActions,\n): void {\n effects.forEach((effect) => {\n plugins.forEach((plugin) => {\n switch (effect._TAG) {\n case \"PUSHED\":\n plugin.onPushed?.({ actions, effect });\n break;\n case \"REPLACED\":\n plugin.onReplaced?.({ actions, effect });\n break;\n case \"POPPED\":\n plugin.onPopped?.({ actions, effect });\n break;\n case \"STEP_PUSHED\":\n plugin.onStepPushed?.({ actions, effect });\n break;\n case \"STEP_REPLACED\":\n plugin.onStepReplaced?.({ actions, effect });\n break;\n case \"STEP_POPPED\":\n plugin.onStepPopped?.({ actions, effect });\n break;\n case \"PAUSED\":\n plugin.onPaused?.({ actions, effect });\n break;\n case \"RESUMED\":\n plugin.onResumed?.({ actions, effect });\n break;\n case \"%SOMETHING_CHANGED%\":\n plugin.onChanged?.({ actions, effect });\n break;\n }\n });\n });\n}\n"], | ||
| "mappings": "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", | ||
| "names": ["noop", "noop", "id", "isEqual", "_a", "_b", "_c", "nextStackValue", "isEqual"] | ||
| } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"makeCoreStore.d.ts","sourceRoot":"","sources":["../src/makeCoreStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAYtE,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE;QACT,wBAAwB,CAAC,EAAE,CACzB,mBAAmB,EAAE,CAAC,WAAW,GAAG,eAAe,CAAC,EAAE,KACnD,IAAI,CAAC;QACV,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;KACxC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,WAAW,EAAE,CAAC;IAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;CAChD,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CA6HtE"} | ||
| {"version":3,"file":"makeCoreStore.d.ts","sourceRoot":"","sources":["../src/makeCoreStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAYtE,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE;QACT,wBAAwB,CAAC,EAAE,CACzB,mBAAmB,EAAE,CAAC,WAAW,GAAG,eAAe,CAAC,EAAE,KACnD,IAAI,CAAC;QACV,yBAAyB,CAAC,EAAE,MAAM,IAAI,CAAC;KACxC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,WAAW,EAAE,CAAC;IAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;CAChD,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAuItE"} |
+1
-1
| { | ||
| "name": "@stackflow/core", | ||
| "version": "1.3.0", | ||
| "version": "1.3.1", | ||
| "repository": { | ||
@@ -5,0 +5,0 @@ "type": "git", |
+10
-0
@@ -87,2 +87,4 @@ import isEqual from "react-fast-compare"; | ||
| let currentInterval: ReturnType<typeof setInterval> | null = null; | ||
| const actions: StackflowActions = { | ||
@@ -102,2 +104,6 @@ getStack() { | ||
| if (currentInterval !== null) { | ||
| clearInterval(currentInterval); | ||
| } | ||
| const interval = setInterval(() => { | ||
@@ -112,4 +118,8 @@ const nextStackValue = aggregate(events.value, new Date().getTime()); | ||
| clearInterval(interval); | ||
| if (currentInterval === interval) { | ||
| currentInterval = null; | ||
| } | ||
| } | ||
| }, INTERVAL_MS); | ||
| currentInterval = interval; | ||
| }, | ||
@@ -116,0 +126,0 @@ push: () => {}, |
439374
0.37%10867
0.22%