1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.StateMatcher = void 0;
|
4 | var predicates_1 = require("../common/predicates");
|
5 | var common_1 = require("../common/common");
|
6 | var safeConsole_1 = require("../common/safeConsole");
|
7 | var StateMatcher = (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 | }());
|
62 | exports.StateMatcher = StateMatcher;
|
63 |
|
\ | No newline at end of file |