UNPKG

2.74 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.StateMatcher = void 0;
4var predicates_1 = require("../common/predicates");
5var common_1 = require("../common/common");
6var safeConsole_1 = require("../common/safeConsole");
7var StateMatcher = /** @class */ (function () {
8 function StateMatcher(_states) {
9 this._states = _states;
10 }
11 StateMatcher.prototype.isRelative = function (stateName) {
12 stateName = stateName || '';
13 return stateName.indexOf('.') === 0 || stateName.indexOf('^') === 0;
14 };
15 StateMatcher.prototype.find = function (stateOrName, base, matchGlob) {
16 if (matchGlob === void 0) { matchGlob = true; }
17 if (!stateOrName && stateOrName !== '')
18 return undefined;
19 var isStr = predicates_1.isString(stateOrName);
20 var name = isStr ? stateOrName : stateOrName.name;
21 if (this.isRelative(name))
22 name = this.resolvePath(name, base);
23 var state = this._states[name];
24 if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
25 return state;
26 }
27 else if (isStr && matchGlob) {
28 var _states = common_1.values(this._states);
29 var matches = _states.filter(function (_state) { return _state.__stateObjectCache.nameGlob && _state.__stateObjectCache.nameGlob.matches(name); });
30 if (matches.length > 1) {
31 safeConsole_1.safeConsole.error("stateMatcher.find: Found multiple matches for " + name + " using glob: ", matches.map(function (match) { return match.name; }));
32 }
33 return matches[0];
34 }
35 return undefined;
36 };
37 StateMatcher.prototype.resolvePath = function (name, base) {
38 if (!base)
39 throw new Error("No reference point given for path '" + name + "'");
40 var baseState = this.find(base);
41 var splitName = name.split('.');
42 var pathLength = splitName.length;
43 var i = 0, current = baseState;
44 for (; i < pathLength; i++) {
45 if (splitName[i] === '' && i === 0) {
46 current = baseState;
47 continue;
48 }
49 if (splitName[i] === '^') {
50 if (!current.parent)
51 throw new Error("Path '" + name + "' not valid for state '" + baseState.name + "'");
52 current = current.parent;
53 continue;
54 }
55 break;
56 }
57 var relName = splitName.slice(i).join('.');
58 return current.name + (current.name && relName ? '.' : '') + relName;
59 };
60 return StateMatcher;
61}());
62exports.StateMatcher = StateMatcher;
63//# sourceMappingURL=stateMatcher.js.map
\No newline at end of file