UNPKG

@formily/path

Version:
573 lines 20.7 kB
var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; import { Parser } from './parser'; import { isStr, isArr, isFn, isEqual, isObj, isNum, isRegExp } from './shared'; import { getDestructor, getInByDestructor, setInByDestructor, deleteInByDestructor, existInByDestructor, } from './destructor'; import { Matcher } from './matcher'; var pathCache = new Map(); var isMatcher = Symbol('PATH_MATCHER'); var isValid = function (val) { return val !== undefined && val !== null; }; var isSimplePath = function (val) { return val.indexOf('*') === -1 && val.indexOf('~') === -1 && val.indexOf('[') === -1 && val.indexOf(']') === -1 && val.indexOf(',') === -1 && val.indexOf(':') === -1 && val.indexOf(' ') === -1 && val[0] !== '.'; }; var isAssignable = function (val) { return typeof val === 'object' || typeof val === 'function'; }; var isNumberIndex = function (val) { return isStr(val) ? /^\d+$/.test(val) : isNum(val); }; var getIn = function (segments, source) { for (var i = 0; i < segments.length; i++) { var index = segments[i]; var rules = getDestructor(index); if (!rules) { if (!isValid(source)) return; source = source[index]; } else { source = getInByDestructor(source, rules, { setIn: setIn, getIn: getIn }); break; } } return source; }; var setIn = function (segments, source, value) { for (var i = 0; i < segments.length; i++) { var index = segments[i]; var rules = getDestructor(index); if (!rules) { if (!isValid(source) || !isAssignable(source)) return; if (isArr(source) && !isNumberIndex(index)) { return; } if (!isValid(source[index])) { if (value === undefined) { if (source[index] === null) source[index] = value; return; } if (i < segments.length - 1) { source[index] = isNum(segments[i + 1]) ? [] : {}; } } if (i === segments.length - 1) { source[index] = value; } source = source[index]; } else { setInByDestructor(source, rules, value, { setIn: setIn, getIn: getIn }); break; } } }; var deleteIn = function (segments, source) { for (var i = 0; i < segments.length; i++) { var index = segments[i]; var rules = getDestructor(index); if (!rules) { if (i === segments.length - 1 && isValid(source)) { delete source[index]; return; } if (!isValid(source) || !isAssignable(source)) return; source = source[index]; if (!isObj(source)) { return; } } else { deleteInByDestructor(source, rules, { setIn: setIn, getIn: getIn, deleteIn: deleteIn, }); break; } } }; var hasOwnProperty = Object.prototype.hasOwnProperty; var existIn = function (segments, source, start) { if (start instanceof Path) { start = start.length; } for (var i = start; i < segments.length; i++) { var index = segments[i]; var rules = getDestructor(index); if (!rules) { if (i === segments.length - 1) { return hasOwnProperty.call(source, index); } if (!isValid(source) || !isAssignable(source)) return false; source = source[index]; if (!isObj(source)) { return false; } } else { return existInByDestructor(source, rules, start, { setIn: setIn, getIn: getIn, deleteIn: deleteIn, existIn: existIn, }); } } }; var parse = function (pattern, base) { if (pattern instanceof Path) { return { entire: pattern.entire, segments: pattern.segments.slice(), isRegExp: false, haveRelativePattern: pattern.haveRelativePattern, isWildMatchPattern: pattern.isWildMatchPattern, isMatchPattern: pattern.isMatchPattern, haveExcludePattern: pattern.haveExcludePattern, tree: pattern.tree, }; } else if (isStr(pattern)) { if (!pattern) { return { entire: '', segments: [], isRegExp: false, isWildMatchPattern: false, haveExcludePattern: false, isMatchPattern: false, }; } if (isSimplePath(pattern)) { return { entire: pattern, segments: pattern.split('.'), isRegExp: false, isWildMatchPattern: false, haveExcludePattern: false, isMatchPattern: false, }; } var parser = new Parser(pattern, Path.parse(base)); var tree = parser.parse(); if (!parser.isMatchPattern) { var segments = parser.data.segments; return { entire: segments.join('.'), segments: segments, tree: tree, isRegExp: false, haveRelativePattern: parser.haveRelativePattern, isWildMatchPattern: false, haveExcludePattern: false, isMatchPattern: false, }; } else { return { entire: pattern, segments: [], isRegExp: false, haveRelativePattern: false, isWildMatchPattern: parser.isWildMatchPattern, haveExcludePattern: parser.haveExcludePattern, isMatchPattern: true, tree: tree, }; } } else if (isFn(pattern) && pattern[isMatcher]) { return parse(pattern['path']); } else if (isArr(pattern)) { return { entire: pattern.join('.'), segments: pattern.reduce(function (buf, key) { return buf.concat(parseString(key)); }, []), isRegExp: false, haveRelativePattern: false, isWildMatchPattern: false, haveExcludePattern: false, isMatchPattern: false, }; } else if (isRegExp(pattern)) { return { entire: pattern, segments: [], isRegExp: true, haveRelativePattern: false, isWildMatchPattern: false, haveExcludePattern: false, isMatchPattern: true, }; } else { return { entire: '', isRegExp: false, segments: pattern !== undefined ? [pattern] : [], haveRelativePattern: false, isWildMatchPattern: false, haveExcludePattern: false, isMatchPattern: false, }; } }; var parseString = function (source) { if (isStr(source)) { source = source.replace(/\s*/g, ''); try { var _a = parse(source), segments = _a.segments, isMatchPattern = _a.isMatchPattern; return !isMatchPattern ? segments : source; } catch (e) { return source; } } else if (source instanceof Path) { return source.segments; } return source; }; var Path = /** @class */ (function () { function Path(input, base) { var _this = this; this.concat = function () { var _a; var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be concat")); } var path = new Path(''); path.segments = (_a = _this.segments).concat.apply(_a, __spreadArray([], __read(args.map(function (s) { return parseString(s); })), false)); path.entire = path.segments.join('.'); return path; }; this.slice = function (start, end) { if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be slice")); } var path = new Path(''); path.segments = _this.segments.slice(start, end); path.entire = path.segments.join('.'); return path; }; this.push = function () { var items = []; for (var _i = 0; _i < arguments.length; _i++) { items[_i] = arguments[_i]; } return _this.concat.apply(_this, __spreadArray([], __read(items), false)); }; this.pop = function () { if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be pop")); } return new Path(_this.segments.slice(0, _this.segments.length - 1)); }; this.splice = function (start, deleteCount) { var items = []; for (var _i = 2; _i < arguments.length; _i++) { items[_i - 2] = arguments[_i]; } if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be splice")); } items = items.reduce(function (buf, item) { return buf.concat(parseString(item)); }, []); var segments_ = _this.segments.slice(); segments_.splice.apply(segments_, __spreadArray([start, deleteCount], __read(items), false)); return new Path(segments_); }; this.forEach = function (callback) { if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be each")); } _this.segments.forEach(callback); }; this.map = function (callback) { if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be map")); } return _this.segments.map(callback); }; this.reduce = function (callback, initial) { if (_this.isMatchPattern || _this.isRegExp) { throw new Error("".concat(_this.entire, " cannot be reduce")); } return _this.segments.reduce(callback, initial); }; this.parent = function () { return _this.slice(0, _this.length - 1); }; this.includes = function (pattern) { var _a = Path.parse(pattern), entire = _a.entire, segments = _a.segments, isMatchPattern = _a.isMatchPattern; var cache = _this.includesCache.get(entire); if (cache !== undefined) return cache; var cacheWith = function (value) { _this.includesCache.set(entire, value); return value; }; if (_this.isMatchPattern) { if (!isMatchPattern) { return cacheWith(_this.match(segments)); } else { throw new Error("".concat(_this.entire, " cannot be used to match ").concat(entire)); } } if (isMatchPattern) { throw new Error("".concat(_this.entire, " cannot be used to match ").concat(entire)); } if (segments.length > _this.segments.length) return cacheWith(false); for (var i = 0; i < segments.length; i++) { if (!isEqual(String(segments[i]), String(_this.segments[i]))) { return cacheWith(false); } } return cacheWith(true); }; this.transform = function (regexp, callback) { if (!isFn(callback)) return ''; if (_this.isMatchPattern) { throw new Error("".concat(_this.entire, " cannot be transformed")); } var reg = new RegExp(regexp); var args = _this.segments.filter(function (key) { return reg.test(key); }); return callback.apply(void 0, __spreadArray([], __read(args), false)); }; this.match = function (pattern) { var _a, _b; var path = Path.parse(pattern); var cache = _this.matchCache.get(path.entire); if (cache !== undefined) { if (cache.record && cache.record.score !== undefined) { _this.matchScore = cache.record.score; } return cache.matched; } var cacheWith = function (value) { _this.matchCache.set(path.entire, value); return value; }; if (path.isMatchPattern) { if (_this.isMatchPattern) { throw new Error("".concat(path.entire, " cannot match ").concat(_this.entire)); } else { _this.matchScore = 0; return cacheWith(path.match(_this.segments)); } } else { if (_this.isMatchPattern) { if (_this.isRegExp) { try { return (_b = (_a = _this['entire']) === null || _a === void 0 ? void 0 : _a['test']) === null || _b === void 0 ? void 0 : _b.call(_a, path.entire); } finally { ; _this.entire.lastIndex = 0; } } var record = { score: 0, }; var result = cacheWith(new Matcher(_this.tree, record).match(path.segments)); _this.matchScore = record.score; return result.matched; } else { var record = { score: 0, }; var result = cacheWith(Matcher.matchSegments(_this.segments, path.segments, record)); _this.matchScore = record.score; return result.matched; } } }; //别名组匹配 this.matchAliasGroup = function (name, alias) { var namePath = Path.parse(name); var aliasPath = Path.parse(alias); var nameMatched = _this.match(namePath); var nameMatchedScore = _this.matchScore; var aliasMatched = _this.match(aliasPath); var aliasMatchedScore = _this.matchScore; if (_this.haveExcludePattern) { if (nameMatchedScore >= aliasMatchedScore) { return nameMatched; } else { return aliasMatched; } } else { return nameMatched || aliasMatched; } }; this.existIn = function (source, start) { if (start === void 0) { start = 0; } return existIn(_this.segments, source, start); }; this.getIn = function (source) { return getIn(_this.segments, source); }; this.setIn = function (source, value) { setIn(_this.segments, source, value); return source; }; this.deleteIn = function (source) { deleteIn(_this.segments, source); return source; }; this.ensureIn = function (source, defaults) { var results = _this.getIn(source); if (results === undefined) { _this.setIn(source, defaults); return _this.getIn(source); } return results; }; var _a = parse(input, base), tree = _a.tree, segments = _a.segments, entire = _a.entire, isRegExp = _a.isRegExp, isMatchPattern = _a.isMatchPattern, isWildMatchPattern = _a.isWildMatchPattern, haveRelativePattern = _a.haveRelativePattern, haveExcludePattern = _a.haveExcludePattern; this.entire = entire; this.segments = segments; this.isMatchPattern = isMatchPattern; this.isWildMatchPattern = isWildMatchPattern; this.haveRelativePattern = haveRelativePattern; this.isRegExp = isRegExp; this.haveExcludePattern = haveExcludePattern; this.tree = tree; this.matchCache = new Map(); this.includesCache = new Map(); } Path.prototype.toString = function () { var _a; return (_a = this.entire) === null || _a === void 0 ? void 0 : _a.toString(); }; Path.prototype.toArr = function () { var _a; return (_a = this.segments) === null || _a === void 0 ? void 0 : _a.slice(); }; Object.defineProperty(Path.prototype, "length", { get: function () { return this.segments.length; }, enumerable: false, configurable: true }); Path.match = function (pattern) { var path = Path.parse(pattern); var matcher = function (target) { return path.match(target); }; matcher[isMatcher] = true; matcher.path = path; return matcher; }; Path.isPathPattern = function (target) { return !!(isStr(target) || isArr(target) || isRegExp(target) || (isFn(target) && target[isMatcher])); }; Path.transform = function (pattern, regexp, callback) { return Path.parse(pattern).transform(regexp, callback); }; Path.parse = function (path, base) { if (path === void 0) { path = ''; } if (path instanceof Path) { var found = pathCache.get(path.entire); if (found) { return found; } else { pathCache.set(path.entire, path); return path; } } else if (path && path[isMatcher]) { return Path.parse(path['path']); } else { var key_ = base ? Path.parse(base) : ''; var key = "".concat(path, ":").concat(key_); var found = pathCache.get(key); if (found) { return found; } else { path = new Path(path, base); pathCache.set(key, path); return path; } } }; Path.getIn = function (source, pattern) { var path = Path.parse(pattern); return path.getIn(source); }; Path.setIn = function (source, pattern, value) { var path = Path.parse(pattern); return path.setIn(source, value); }; Path.deleteIn = function (source, pattern) { var path = Path.parse(pattern); return path.deleteIn(source); }; Path.existIn = function (source, pattern, start) { var path = Path.parse(pattern); return path.existIn(source, start); }; Path.ensureIn = function (source, pattern, defaultValue) { var path = Path.parse(pattern); return path.ensureIn(source, defaultValue); }; return Path; }()); export { Path }; //# sourceMappingURL=index.js.map