@statewalker/fsm 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,238 +0,0 @@
1
- import {
2
- FsmProcess
3
- } from "../chunk-CRID7TZR.js";
4
-
5
- // src/utils/handlers.ts
6
- var KEY_HANDLERS = "handlers";
7
- function callStateHandlers(state) {
8
- const key = state.key;
9
- for (let parent = state.parent; !!parent; parent = parent?.parent) {
10
- const handlers = parent.getData(KEY_HANDLERS)?.[key];
11
- handlers?.forEach((handler) => handler(state));
12
- }
13
- }
14
- function addSubstateHandlers(state, handlers) {
15
- const oldIndex = state.getData(KEY_HANDLERS);
16
- const index = oldIndex ? { ...oldIndex } : {};
17
- for (const [key, handler] of Object.entries(handlers)) {
18
- const list = index[key] = index[key] || [];
19
- list.push(handler);
20
- }
21
- state.setData(KEY_HANDLERS, index);
22
- }
23
-
24
- // src/utils/printer.ts
25
- var KEY_PRINTER = "printer";
26
- function preparePrinter(process, { prefix = "", print = console.log, lineNumbers = false }) {
27
- let lineCounter = 0;
28
- const shift = () => {
29
- let prefix2 = "";
30
- for (let s = process.state?.parent; !!s; s = s.parent) {
31
- prefix2 += " ";
32
- }
33
- return prefix2;
34
- };
35
- const getPrefix = lineNumbers ? () => `[${++lineCounter}]${shift()}` : shift;
36
- const printer = (...args) => print(prefix, getPrefix(), ...args);
37
- return printer;
38
- }
39
- function setPrinter(state, config = {}) {
40
- const printer = preparePrinter(state.process, config);
41
- state.setData(KEY_PRINTER, printer);
42
- }
43
- function setProcessPrinter(process, config = {}) {
44
- const printer = preparePrinter(process, config);
45
- process.setData(KEY_PRINTER, printer);
46
- }
47
- function getProcessPrinter(process) {
48
- return process.getData(KEY_PRINTER) || console.log;
49
- }
50
- function getPrinter(state) {
51
- return state.getData(KEY_PRINTER, true) || getProcessPrinter(state.process);
52
- }
53
-
54
- // src/utils/tracer.ts
55
- function setProcessTracer(process, print) {
56
- return process.onStateCreate((state) => {
57
- setStateTracer(state, print);
58
- });
59
- }
60
- function setStateTracer(state, print) {
61
- state.onEnter(() => {
62
- const printLine = print || getPrinter(state);
63
- printLine(`<${state?.key} event="${state.process.event}">`);
64
- });
65
- state.onExit(() => {
66
- const printLine = print || getPrinter(state);
67
- printLine(`</${state.key}> <!-- event="${state.process.event}" -->`);
68
- });
69
- }
70
-
71
- // src/utils/process.ts
72
- function newProcess(config, {
73
- prefix,
74
- print,
75
- lineNumbers = true
76
- }) {
77
- let process = new FsmProcess(config);
78
- setProcessPrinter(process, {
79
- prefix,
80
- print,
81
- lineNumbers
82
- });
83
- setProcessTracer(process);
84
- return process;
85
- }
86
-
87
- // src/utils/transitions.ts
88
- function isStateTransitionEnabled(process, event) {
89
- const transitions = getStateTransitions(process.state);
90
- let active = false;
91
- for (const [from, ev, to] of transitions) {
92
- if (ev === event) {
93
- active = true;
94
- break;
95
- }
96
- }
97
- return active;
98
- }
99
- function getStateTransitions(state) {
100
- const result = [];
101
- let index = {};
102
- if (state) {
103
- let prevStateKey = state.key;
104
- for (let parent = state?.parent; parent; parent = parent.parent) {
105
- if (!parent.descriptor) continue;
106
- result.push(
107
- ...getTransitionsFromDescriptor(parent.descriptor, prevStateKey, index)
108
- );
109
- prevStateKey = parent.key;
110
- }
111
- }
112
- return result.reverse();
113
- }
114
- function getTransitionsFromDescriptor(descriptor, prevStateKey, index = {}) {
115
- const result = [];
116
- const prevStateKeys = [prevStateKey, "*"];
117
- for (const prevKey of prevStateKeys) {
118
- const targets = descriptor.transitions[prevKey];
119
- if (targets) {
120
- for (const [event, target] of Object.entries(targets)) {
121
- if (index[event]) continue;
122
- if (target) {
123
- index[event] = true;
124
- }
125
- result.push([prevStateKey, event, target]);
126
- }
127
- }
128
- }
129
- return result;
130
- }
131
-
132
- // src/utils/newFsmStateHandler.ts
133
- function newModuleLoader(baseUrl) {
134
- const cache = {};
135
- return async (path) => {
136
- return cache[path] = cache[path] || (async () => {
137
- const suffixes = ["/", "", ".js", "/index.js"];
138
- for (const suffix of suffixes) {
139
- const url = new URL(path + suffix, baseUrl).pathname;
140
- try {
141
- return await import(url);
142
- } catch (error) {
143
- continue;
144
- }
145
- }
146
- })();
147
- };
148
- }
149
- async function newHandlerLoader(baseUrl, loader = newModuleLoader(baseUrl)) {
150
- return async (state) => {
151
- const stack = [];
152
- for (let s = state; s; s = s.parent) {
153
- stack.unshift(s.key);
154
- }
155
- const handlers = [];
156
- let topName;
157
- while (stack.length > 0) {
158
- const lastSegment = stack.pop();
159
- if (!topName) {
160
- topName = lastSegment;
161
- if (topName === void 0) break;
162
- }
163
- const path = [...stack, topName].join("/");
164
- const handler = await loader(path);
165
- handler && handlers.push(handler);
166
- }
167
- return handlers;
168
- };
169
- }
170
- function newStateHandlers(loader, newContext = (state) => ({
171
- state: state.key,
172
- event: state.process.event
173
- })) {
174
- return (state) => {
175
- const stack = [];
176
- for (let s = state.parent; !!s; s = s.parent) {
177
- const store2 = s.getData("context");
178
- store2 && stack.push(store2);
179
- }
180
- const store = newContext(state, ...stack);
181
- stack.unshift(store);
182
- state.setData("context", store);
183
- let registrations = [];
184
- state.onExit(() => {
185
- for (const registration of registrations) {
186
- registration?.();
187
- }
188
- });
189
- state.onEnter(async () => {
190
- const modules = await loader(state);
191
- if (!modules?.length) return;
192
- for (const module of modules) {
193
- const ctx = isClass(module.context) ? new module.context(...stack) : isFunction(module.context) ? module.context(...stack) || store : store;
194
- const stateContext = ctx;
195
- let notifyTrigger = (event) => {
196
- if (event) {
197
- state.process.dispatch(event);
198
- }
199
- };
200
- const removeTrigger = module?.trigger?.(
201
- stateContext,
202
- (event) => notifyTrigger(event)
203
- );
204
- registrations.push(() => notifyTrigger = () => {
205
- });
206
- removeTrigger && registrations.push(removeTrigger);
207
- const handler = module.default || module.handler;
208
- registrations.push(handler?.(stateContext));
209
- }
210
- function isFunction(value) {
211
- return typeof value === "function";
212
- }
213
- function isClass(value) {
214
- if (!isFunction(value)) return false;
215
- return value.prototype.constructor.toString().match(/^class/);
216
- }
217
- });
218
- };
219
- }
220
- export {
221
- KEY_HANDLERS,
222
- KEY_PRINTER,
223
- addSubstateHandlers,
224
- callStateHandlers,
225
- getPrinter,
226
- getProcessPrinter,
227
- getStateTransitions,
228
- isStateTransitionEnabled,
229
- newHandlerLoader,
230
- newModuleLoader,
231
- newProcess,
232
- newStateHandlers,
233
- preparePrinter,
234
- setPrinter,
235
- setProcessPrinter,
236
- setProcessTracer,
237
- setStateTracer
238
- };