UNPKG

16.8 kBJavaScriptView Raw
1import { __values, __spreadArray, __read, __assign } from './_virtual/_tslib.js';
2import { SpecialTargets } from './types.js';
3import { raise, send } from './actionTypes.js';
4import { DEFAULT_GUARD_TYPE, TARGETLESS_KEY, STATE_DELIMITER } from './constants.js';
5import { IS_PRODUCTION } from './environment.js';
6
7var _a;
8function keys(value) {
9 return Object.keys(value);
10}
11function matchesState(parentStateId, childStateId, delimiter) {
12 if (delimiter === void 0) {
13 delimiter = STATE_DELIMITER;
14 }
15
16 var parentStateValue = toStateValue(parentStateId, delimiter);
17 var childStateValue = toStateValue(childStateId, delimiter);
18
19 if (isString(childStateValue)) {
20 if (isString(parentStateValue)) {
21 return childStateValue === parentStateValue;
22 } // Parent more specific than child
23
24
25 return false;
26 }
27
28 if (isString(parentStateValue)) {
29 return parentStateValue in childStateValue;
30 }
31
32 return Object.keys(parentStateValue).every(function (key) {
33 if (!(key in childStateValue)) {
34 return false;
35 }
36
37 return matchesState(parentStateValue[key], childStateValue[key]);
38 });
39}
40function getEventType(event) {
41 try {
42 return isString(event) || typeof event === 'number' ? "".concat(event) : event.type;
43 } catch (e) {
44 throw new Error('Events must be strings or objects with a string event.type property.');
45 }
46}
47function getActionType(action) {
48 try {
49 return isString(action) || typeof action === 'number' ? "".concat(action) : isFunction(action) ? action.name : action.type;
50 } catch (e) {
51 throw new Error('Actions must be strings or objects with a string action.type property.');
52 }
53}
54function toStatePath(stateId, delimiter) {
55 try {
56 if (isArray(stateId)) {
57 return stateId;
58 }
59
60 return stateId.toString().split(delimiter);
61 } catch (e) {
62 throw new Error("'".concat(stateId, "' is not a valid state path."));
63 }
64}
65function isStateLike(state) {
66 return typeof state === 'object' && 'value' in state && 'context' in state && 'event' in state && '_event' in state;
67}
68function toStateValue(stateValue, delimiter) {
69 if (isStateLike(stateValue)) {
70 return stateValue.value;
71 }
72
73 if (isArray(stateValue)) {
74 return pathToStateValue(stateValue);
75 }
76
77 if (typeof stateValue !== 'string') {
78 return stateValue;
79 }
80
81 var statePath = toStatePath(stateValue, delimiter);
82 return pathToStateValue(statePath);
83}
84function pathToStateValue(statePath) {
85 if (statePath.length === 1) {
86 return statePath[0];
87 }
88
89 var value = {};
90 var marker = value;
91
92 for (var i = 0; i < statePath.length - 1; i++) {
93 if (i === statePath.length - 2) {
94 marker[statePath[i]] = statePath[i + 1];
95 } else {
96 marker[statePath[i]] = {};
97 marker = marker[statePath[i]];
98 }
99 }
100
101 return value;
102}
103function mapValues(collection, iteratee) {
104 var result = {};
105 var collectionKeys = Object.keys(collection);
106
107 for (var i = 0; i < collectionKeys.length; i++) {
108 var key = collectionKeys[i];
109 result[key] = iteratee(collection[key], key, collection, i);
110 }
111
112 return result;
113}
114function mapFilterValues(collection, iteratee, predicate) {
115 var e_1, _a;
116
117 var result = {};
118
119 try {
120 for (var _b = __values(Object.keys(collection)), _c = _b.next(); !_c.done; _c = _b.next()) {
121 var key = _c.value;
122 var item = collection[key];
123
124 if (!predicate(item)) {
125 continue;
126 }
127
128 result[key] = iteratee(item, key, collection);
129 }
130 } catch (e_1_1) {
131 e_1 = {
132 error: e_1_1
133 };
134 } finally {
135 try {
136 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
137 } finally {
138 if (e_1) throw e_1.error;
139 }
140 }
141
142 return result;
143}
144/**
145 * Retrieves a value at the given path.
146 * @param props The deep path to the prop of the desired value
147 */
148
149var path = function (props) {
150 return function (object) {
151 var e_2, _a;
152
153 var result = object;
154
155 try {
156 for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {
157 var prop = props_1_1.value;
158 result = result[prop];
159 }
160 } catch (e_2_1) {
161 e_2 = {
162 error: e_2_1
163 };
164 } finally {
165 try {
166 if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);
167 } finally {
168 if (e_2) throw e_2.error;
169 }
170 }
171
172 return result;
173 };
174};
175/**
176 * Retrieves a value at the given path via the nested accessor prop.
177 * @param props The deep path to the prop of the desired value
178 */
179
180function nestedPath(props, accessorProp) {
181 return function (object) {
182 var e_3, _a;
183
184 var result = object;
185
186 try {
187 for (var props_2 = __values(props), props_2_1 = props_2.next(); !props_2_1.done; props_2_1 = props_2.next()) {
188 var prop = props_2_1.value;
189 result = result[accessorProp][prop];
190 }
191 } catch (e_3_1) {
192 e_3 = {
193 error: e_3_1
194 };
195 } finally {
196 try {
197 if (props_2_1 && !props_2_1.done && (_a = props_2.return)) _a.call(props_2);
198 } finally {
199 if (e_3) throw e_3.error;
200 }
201 }
202
203 return result;
204 };
205}
206function toStatePaths(stateValue) {
207 if (!stateValue) {
208 return [[]];
209 }
210
211 if (isString(stateValue)) {
212 return [[stateValue]];
213 }
214
215 var result = flatten(Object.keys(stateValue).map(function (key) {
216 var subStateValue = stateValue[key];
217
218 if (typeof subStateValue !== 'string' && (!subStateValue || !Object.keys(subStateValue).length)) {
219 return [[key]];
220 }
221
222 return toStatePaths(stateValue[key]).map(function (subPath) {
223 return [key].concat(subPath);
224 });
225 }));
226 return result;
227}
228function pathsToStateValue(paths) {
229 var e_4, _a;
230
231 var result = {};
232
233 if (paths && paths.length === 1 && paths[0].length === 1) {
234 return paths[0][0];
235 }
236
237 try {
238 for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
239 var currentPath = paths_1_1.value;
240 var marker = result; // tslint:disable-next-line:prefer-for-of
241
242 for (var i = 0; i < currentPath.length; i++) {
243 var subPath = currentPath[i];
244
245 if (i === currentPath.length - 2) {
246 marker[subPath] = currentPath[i + 1];
247 break;
248 }
249
250 marker[subPath] = marker[subPath] || {};
251 marker = marker[subPath];
252 }
253 }
254 } catch (e_4_1) {
255 e_4 = {
256 error: e_4_1
257 };
258 } finally {
259 try {
260 if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
261 } finally {
262 if (e_4) throw e_4.error;
263 }
264 }
265
266 return result;
267}
268function flatten(array) {
269 var _a;
270
271 return (_a = []).concat.apply(_a, __spreadArray([], __read(array), false));
272}
273function toArrayStrict(value) {
274 if (isArray(value)) {
275 return value;
276 }
277
278 return [value];
279}
280function toArray(value) {
281 if (value === undefined) {
282 return [];
283 }
284
285 return toArrayStrict(value);
286}
287function mapContext(mapper, context, _event) {
288 var e_5, _a;
289
290 if (isFunction(mapper)) {
291 return mapper(context, _event.data);
292 }
293
294 var result = {};
295
296 try {
297 for (var _b = __values(Object.keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {
298 var key = _c.value;
299 var subMapper = mapper[key];
300
301 if (isFunction(subMapper)) {
302 result[key] = subMapper(context, _event.data);
303 } else {
304 result[key] = subMapper;
305 }
306 }
307 } catch (e_5_1) {
308 e_5 = {
309 error: e_5_1
310 };
311 } finally {
312 try {
313 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
314 } finally {
315 if (e_5) throw e_5.error;
316 }
317 }
318
319 return result;
320}
321function isBuiltInEvent(eventType) {
322 return /^(done|error)\./.test(eventType);
323}
324function isPromiseLike(value) {
325 if (value instanceof Promise) {
326 return true;
327 } // Check if shape matches the Promise/A+ specification for a "thenable".
328
329
330 if (value !== null && (isFunction(value) || typeof value === 'object') && isFunction(value.then)) {
331 return true;
332 }
333
334 return false;
335}
336function isBehavior(value) {
337 return value !== null && typeof value === 'object' && 'transition' in value && typeof value.transition === 'function';
338}
339function partition(items, predicate) {
340 var e_6, _a;
341
342 var _b = __read([[], []], 2),
343 truthy = _b[0],
344 falsy = _b[1];
345
346 try {
347 for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
348 var item = items_1_1.value;
349
350 if (predicate(item)) {
351 truthy.push(item);
352 } else {
353 falsy.push(item);
354 }
355 }
356 } catch (e_6_1) {
357 e_6 = {
358 error: e_6_1
359 };
360 } finally {
361 try {
362 if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
363 } finally {
364 if (e_6) throw e_6.error;
365 }
366 }
367
368 return [truthy, falsy];
369}
370function updateHistoryStates(hist, stateValue) {
371 return mapValues(hist.states, function (subHist, key) {
372 if (!subHist) {
373 return undefined;
374 }
375
376 var subStateValue = (isString(stateValue) ? undefined : stateValue[key]) || (subHist ? subHist.current : undefined);
377
378 if (!subStateValue) {
379 return undefined;
380 }
381
382 return {
383 current: subStateValue,
384 states: updateHistoryStates(subHist, subStateValue)
385 };
386 });
387}
388function updateHistoryValue(hist, stateValue) {
389 return {
390 current: stateValue,
391 states: updateHistoryStates(hist, stateValue)
392 };
393}
394function updateContext(context, _event, assignActions, state) {
395 if (!IS_PRODUCTION) {
396 warn(!!context, 'Attempting to update undefined context');
397 }
398
399 var updatedContext = context ? assignActions.reduce(function (acc, assignAction) {
400 var e_7, _a;
401
402 var assignment = assignAction.assignment;
403 var meta = {
404 state: state,
405 action: assignAction,
406 _event: _event
407 };
408 var partialUpdate = {};
409
410 if (isFunction(assignment)) {
411 partialUpdate = assignment(acc, _event.data, meta);
412 } else {
413 try {
414 for (var _b = __values(Object.keys(assignment)), _c = _b.next(); !_c.done; _c = _b.next()) {
415 var key = _c.value;
416 var propAssignment = assignment[key];
417 partialUpdate[key] = isFunction(propAssignment) ? propAssignment(acc, _event.data, meta) : propAssignment;
418 }
419 } catch (e_7_1) {
420 e_7 = {
421 error: e_7_1
422 };
423 } finally {
424 try {
425 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
426 } finally {
427 if (e_7) throw e_7.error;
428 }
429 }
430 }
431
432 return Object.assign({}, acc, partialUpdate);
433 }, context) : context;
434 return updatedContext;
435} // tslint:disable-next-line:no-empty
436
437var warn = function () {};
438
439if (!IS_PRODUCTION) {
440 warn = function (condition, message) {
441 var error = condition instanceof Error ? condition : undefined;
442
443 if (!error && condition) {
444 return;
445 }
446
447 if (console !== undefined) {
448 var args = ["Warning: ".concat(message)];
449
450 if (error) {
451 args.push(error);
452 } // tslint:disable-next-line:no-console
453
454
455 console.warn.apply(console, args);
456 }
457 };
458}
459function isArray(value) {
460 return Array.isArray(value);
461} // tslint:disable-next-line:ban-types
462
463function isFunction(value) {
464 return typeof value === 'function';
465}
466function isString(value) {
467 return typeof value === 'string';
468}
469function toGuard(condition, guardMap) {
470 if (!condition) {
471 return undefined;
472 }
473
474 if (isString(condition)) {
475 return {
476 type: DEFAULT_GUARD_TYPE,
477 name: condition,
478 predicate: guardMap ? guardMap[condition] : undefined
479 };
480 }
481
482 if (isFunction(condition)) {
483 return {
484 type: DEFAULT_GUARD_TYPE,
485 name: condition.name,
486 predicate: condition
487 };
488 }
489
490 return condition;
491}
492function isObservable(value) {
493 try {
494 return 'subscribe' in value && isFunction(value.subscribe);
495 } catch (e) {
496 return false;
497 }
498}
499var symbolObservable = /*#__PURE__*/function () {
500 return typeof Symbol === 'function' && Symbol.observable || '@@observable';
501}(); // TODO: to be removed in v5, left it out just to minimize the scope of the change and maintain compatibility with older versions of integration paackages
502
503var interopSymbols = (_a = {}, _a[symbolObservable] = function () {
504 return this;
505}, _a[Symbol.observable] = function () {
506 return this;
507}, _a);
508function isMachine(value) {
509 return !!value && '__xstatenode' in value;
510}
511function isActor(value) {
512 return !!value && typeof value.send === 'function';
513}
514var uniqueId = /*#__PURE__*/function () {
515 var currentId = 0;
516 return function () {
517 currentId++;
518 return currentId.toString(16);
519 };
520}();
521function toEventObject(event, payload // id?: TEvent['type']
522) {
523 if (isString(event) || typeof event === 'number') {
524 return __assign({
525 type: event
526 }, payload);
527 }
528
529 return event;
530}
531function toSCXMLEvent(event, scxmlEvent) {
532 if (!isString(event) && '$$type' in event && event.$$type === 'scxml') {
533 return event;
534 }
535
536 var eventObject = toEventObject(event);
537 return __assign({
538 name: eventObject.type,
539 data: eventObject,
540 $$type: 'scxml',
541 type: 'external'
542 }, scxmlEvent);
543}
544function toTransitionConfigArray(event, configLike) {
545 var transitions = toArrayStrict(configLike).map(function (transitionLike) {
546 if (typeof transitionLike === 'undefined' || typeof transitionLike === 'string' || isMachine(transitionLike)) {
547 return {
548 target: transitionLike,
549 event: event
550 };
551 }
552
553 return __assign(__assign({}, transitionLike), {
554 event: event
555 });
556 });
557 return transitions;
558}
559function normalizeTarget(target) {
560 if (target === undefined || target === TARGETLESS_KEY) {
561 return undefined;
562 }
563
564 return toArray(target);
565}
566function reportUnhandledExceptionOnInvocation(originalError, currentError, id) {
567 if (!IS_PRODUCTION) {
568 var originalStackTrace = originalError.stack ? " Stacktrace was '".concat(originalError.stack, "'") : '';
569
570 if (originalError === currentError) {
571 // tslint:disable-next-line:no-console
572 console.error("Missing onError handler for invocation '".concat(id, "', error was '").concat(originalError, "'.").concat(originalStackTrace));
573 } else {
574 var stackTrace = currentError.stack ? " Stacktrace was '".concat(currentError.stack, "'") : ''; // tslint:disable-next-line:no-console
575
576 console.error("Missing onError handler and/or unhandled exception/promise rejection for invocation '".concat(id, "'. ") + "Original error: '".concat(originalError, "'. ").concat(originalStackTrace, " Current error is '").concat(currentError, "'.").concat(stackTrace));
577 }
578 }
579}
580function evaluateGuard(machine, guard, context, _event, state) {
581 var guards = machine.options.guards;
582 var guardMeta = {
583 state: state,
584 cond: guard,
585 _event: _event
586 }; // TODO: do not hardcode!
587
588 if (guard.type === DEFAULT_GUARD_TYPE) {
589 return ((guards === null || guards === void 0 ? void 0 : guards[guard.name]) || guard.predicate)(context, _event.data, guardMeta);
590 }
591
592 var condFn = guards === null || guards === void 0 ? void 0 : guards[guard.type];
593
594 if (!condFn) {
595 throw new Error("Guard '".concat(guard.type, "' is not implemented on machine '").concat(machine.id, "'."));
596 }
597
598 return condFn(context, _event.data, guardMeta);
599}
600function toInvokeSource(src) {
601 if (typeof src === 'string') {
602 return {
603 type: src
604 };
605 }
606
607 return src;
608}
609function toObserver(nextHandler, errorHandler, completionHandler) {
610 var noop = function () {};
611
612 var isObserver = typeof nextHandler === 'object';
613 var self = isObserver ? nextHandler : null;
614 return {
615 next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),
616 error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),
617 complete: ((isObserver ? nextHandler.complete : completionHandler) || noop).bind(self)
618 };
619}
620function createInvokeId(stateNodeId, index) {
621 return "".concat(stateNodeId, ":invocation[").concat(index, "]");
622}
623function isRaisableAction(action) {
624 return (action.type === raise || action.type === send && action.to === SpecialTargets.Internal) && typeof action.delay !== 'number';
625}
626
627export { createInvokeId, evaluateGuard, flatten, getActionType, getEventType, interopSymbols, isActor, isArray, isBehavior, isBuiltInEvent, isFunction, isMachine, isObservable, isPromiseLike, isRaisableAction, isStateLike, isString, keys, mapContext, mapFilterValues, mapValues, matchesState, nestedPath, normalizeTarget, partition, path, pathToStateValue, pathsToStateValue, reportUnhandledExceptionOnInvocation, symbolObservable, toArray, toArrayStrict, toEventObject, toGuard, toInvokeSource, toObserver, toSCXMLEvent, toStatePath, toStatePaths, toStateValue, toTransitionConfigArray, uniqueId, updateContext, updateHistoryStates, updateHistoryValue, warn };