patternplate-client
Version:
Universal javascript client application for patternplate
206 lines (158 loc) • 18.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _values = require('babel-runtime/core-js/object/values');
var _values2 = _interopRequireDefault(_values);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _entries = require('babel-runtime/core-js/object/entries');
var _entries2 = _interopRequireDefault(_entries);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _extends3 = require('babel-runtime/helpers/extends');
var _extends4 = _interopRequireDefault(_extends3);
exports.searchFolder = searchFolder;
exports.matchPattern = matchPattern;
exports.createStems = createStems;
exports.createTokens = createTokens;
exports.getPatterns = getPatterns;
exports.filterPatterns = filterPatterns;
exports.isToken = isToken;
exports.isStem = isStem;
exports.isTagToken = isTagToken;
exports.isFlagToken = isFlagToken;
exports.isDependsToken = isDependsToken;
exports.isProvidesToken = isProvidesToken;
exports.getTokenValues = getTokenValues;
var _lodash = require('lodash');
var _navigate = require('../../utils/navigate');
var _navigate2 = _interopRequireDefault(_navigate);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function searchFolder(search, navigation) {
var merge = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (!search) {
return;
}
var cut = search.slice(0, search.length - 1);
var match = (0, _navigate2.default)(cut, navigation);
if (!match || match && !match.type === 'folder') {
return;
}
return rewrap(cut, match, merge);
}
function rewrap(id, data, merge) {
var fragments = id.split('/').filter(Boolean);
var stack = [];
return fragments.reduce(function (registry, fragment, index) {
var sub = stack.length > 0 ? (0, _navigate2.default)(stack.join('/'), registry) : registry;
sub[fragment] = fragments.length - 1 === index ? (0, _extends4.default)({}, data, merge) : (0, _extends4.default)({}, merge);
stack.push(fragment);
return registry;
}, {});
}
function matchPattern(pattern) {
var criteria = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if ((0, _keys2.default)(criteria).length === 0) {
return true;
}
return (0, _entries2.default)(criteria).every(function (item) {
var _item = (0, _slicedToArray3.default)(item, 2),
name = _item[0],
values = _item[1];
if (values.length === 0) {
return true;
}
if (name === 'tags') {
var tags = pattern.manifest.tags || [];
return values.some(function (tag) {
return (0, _lodash.includes)(tags, tag);
});
} else if (name === 'flags') {
var flag = pattern.manifest.flag || '';
return values.some(function (valueFlag) {
return valueFlag === flag;
});
} else if (name === 'depends') {
var dependencies = (0, _keys2.default)(pattern.manifest.patterns || {});
return values.some(function (dependency) {
return (0, _lodash.includes)(dependencies, dependency);
});
} else if (name === 'provides') {
var dependents = (0, _keys2.default)(pattern.manifest.dependentPatterns || {});
return values.some(function (dependent) {
return (0, _lodash.includes)(dependents, dependent);
});
}
return true;
});
}
function createStems(search) {
return search.split(' ').filter(isStem).filter(Boolean);
}
function createTokens(search) {
var fragments = search.split(' ');
var tokens = fragments.filter(isToken);
var tags = (0, _lodash.flatten)(tokens.filter(isTagToken).map(getTokenValues));
var flags = (0, _lodash.flatten)(tokens.filter(isFlagToken).map(getTokenValues));
var depends = (0, _lodash.flatten)(tokens.filter(isDependsToken).map(getTokenValues));
var provides = (0, _lodash.flatten)(tokens.filter(isProvidesToken).map(getTokenValues));
return {
tags: tags, flags: flags, depends: depends, provides: provides
};
}
function getPatterns(haystack) {
var criteria = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return (0, _values2.default)(haystack).reduce(function (registry, item) {
if (item.type === 'pattern') {
return matchPattern(item, criteria) ? [].concat((0, _toConsumableArray3.default)(registry), [item]) : registry;
} else if (item.type === 'folder') {
return [].concat((0, _toConsumableArray3.default)(registry), (0, _toConsumableArray3.default)(getPatterns(item.children, criteria)));
}
return registry;
}, []);
}
function filterPatterns(patterns, ids) {
return getPatterns(patterns).filter(function (_ref) {
var id = _ref.id;
return (0, _lodash.includes)(ids, id);
}).reduce(function (registry, item) {
var fragments = item.id.split('/');
var key = fragments[fragments.length - 1];
return (0, _extends4.default)({}, registry, (0, _defineProperty3.default)({}, key, item));
}, {});
}
var tokenKeys = ['tag', 'flag', 'depends', 'provides'];
function matchesToken(key, token) {
return (0, _lodash.startsWith)(token, key + ':');
}
function isToken(token) {
return tokenKeys.some(function (tokenKey) {
return matchesToken(tokenKey, token);
});
}
function isStem(token) {
return !isToken(token);
}
function isTagToken(token) {
return matchesToken('tag', token);
}
function isFlagToken(token) {
return matchesToken('flag', token);
}
function isDependsToken(token) {
return matchesToken('depends', token);
}
function isProvidesToken(token) {
return matchesToken('provides', token);
}
function getTokenValues(token) {
return token.split(':').slice(1).join('.').split(',').filter(Boolean).map(function (item) {
return item.trim();
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hcHBsaWNhdGlvbi9yZWR1Y2Vycy9zZWFyY2gtbWF0Y2hlcy9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbInNlYXJjaEZvbGRlciIsIm1hdGNoUGF0dGVybiIsImNyZWF0ZVN0ZW1zIiwiY3JlYXRlVG9rZW5zIiwiZ2V0UGF0dGVybnMiLCJmaWx0ZXJQYXR0ZXJucyIsImlzVG9rZW4iLCJpc1N0ZW0iLCJpc1RhZ1Rva2VuIiwiaXNGbGFnVG9rZW4iLCJpc0RlcGVuZHNUb2tlbiIsImlzUHJvdmlkZXNUb2tlbiIsImdldFRva2VuVmFsdWVzIiwic2VhcmNoIiwibmF2aWdhdGlvbiIsIm1lcmdlIiwiY3V0Iiwic2xpY2UiLCJsZW5ndGgiLCJtYXRjaCIsInR5cGUiLCJyZXdyYXAiLCJpZCIsImRhdGEiLCJmcmFnbWVudHMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJzdGFjayIsInJlZHVjZSIsInJlZ2lzdHJ5IiwiZnJhZ21lbnQiLCJpbmRleCIsInN1YiIsImpvaW4iLCJwdXNoIiwicGF0dGVybiIsImNyaXRlcmlhIiwiZXZlcnkiLCJpdGVtIiwibmFtZSIsInZhbHVlcyIsInRhZ3MiLCJtYW5pZmVzdCIsInNvbWUiLCJ0YWciLCJmbGFnIiwidmFsdWVGbGFnIiwiZGVwZW5kZW5jaWVzIiwicGF0dGVybnMiLCJkZXBlbmRlbmN5IiwiZGVwZW5kZW50cyIsImRlcGVuZGVudFBhdHRlcm5zIiwiZGVwZW5kZW50IiwidG9rZW5zIiwibWFwIiwiZmxhZ3MiLCJkZXBlbmRzIiwicHJvdmlkZXMiLCJoYXlzdGFjayIsImNoaWxkcmVuIiwiaWRzIiwia2V5IiwidG9rZW5LZXlzIiwibWF0Y2hlc1Rva2VuIiwidG9rZW4iLCJ0b2tlbktleSIsInRyaW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFJZ0JBLFksR0FBQUEsWTtRQTJCQUMsWSxHQUFBQSxZO1FBK0JBQyxXLEdBQUFBLFc7UUFN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ImZpbGUiOiJoZWxwZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmNsdWRlcywgZmxhdHRlbiwgc3RhcnRzV2l0aH0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IG5hdmlnYXRlIGZyb20gJy4uLy4uL3V0aWxzL25hdmlnYXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaEZvbGRlcihzZWFyY2gsIG5hdmlnYXRpb24sIG1lcmdlID0ge30pIHtcblx0aWYgKCFzZWFyY2gpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjdXQgPSBzZWFyY2guc2xpY2UoMCwgc2VhcmNoLmxlbmd0aCAtIDEpO1xuXHRjb25zdCBtYXRjaCA9IG5hdmlnYXRlKGN1dCwgbmF2aWdhdGlvbik7XG5cblx0aWYgKCFtYXRjaCB8fCBtYXRjaCAmJiAhbWF0Y2gudHlwZSA9PT0gJ2ZvbGRlcicpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRyZXR1cm4gcmV3cmFwKGN1dCwgbWF0Y2gsIG1lcmdlKTtcbn1cblxuZnVuY3Rpb24gcmV3cmFwKGlkLCBkYXRhLCBtZXJnZSkge1xuXHRjb25zdCBmcmFnbWVudHMgPSBpZC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcblx0Y29uc3Qgc3RhY2sgPSBbXTtcblxuXHRyZXR1cm4gZnJhZ21lbnRzLnJlZHVjZSgocmVnaXN0cnksIGZyYWdtZW50LCBpbmRleCkgPT4ge1xuXHRcdGNvbnN0IHN1YiA9IHN0YWNrLmxlbmd0aCA+IDAgPyBuYXZpZ2F0ZShzdGFjay5qb2luKCcvJyksIHJlZ2lzdHJ5KSA6IHJlZ2lzdHJ5O1xuXHRcdHN1YltmcmFnbWVudF0gPSBmcmFnbWVudHMubGVuZ3RoIC0gMSA9PT0gaW5kZXggPyB7Li4uZGF0YSwgLi4ubWVyZ2V9IDogey4uLm1lcmdlfTtcblx0XHRzdGFjay5wdXNoKGZyYWdtZW50KTtcblx0XHRyZXR1cm4gcmVnaXN0cnk7XG5cdH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0dGVybihwYXR0ZXJuLCBjcml0ZXJpYSA9IHt9KSB7XG5cdGlmIChPYmplY3Qua2V5cyhjcml0ZXJpYSkubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMoY3JpdGVyaWEpXG5cdFx0LmV2ZXJ5KGl0ZW0gPT4ge1xuXHRcdFx0Y29uc3QgW25hbWUsIHZhbHVlc10gPSBpdGVtO1xuXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5hbWUgPT09ICd0YWdzJykge1xuXHRcdFx0XHRjb25zdCB0YWdzID0gcGF0dGVybi5tYW5pZmVzdC50YWdzIHx8IFtdO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVzLnNvbWUodGFnID0+IGluY2x1ZGVzKHRhZ3MsIHRhZykpO1xuXHRcdFx0fSBlbHNlIGlmIChuYW1lID09PSAnZmxhZ3MnKSB7XG5cdFx0XHRcdGNvbnN0IGZsYWcgPSBwYXR0ZXJuLm1hbmlmZXN0LmZsYWcgfHwgJyc7XG5cdFx0XHRcdHJldHVybiB2YWx1ZXMuc29tZSh2YWx1ZUZsYWcgPT4gdmFsdWVGbGFnID09PSBmbGFnKTtcblx0XHRcdH0gZWxzZSBpZiAobmFtZSA9PT0gJ2RlcGVuZHMnKSB7XG5cdFx0XHRcdGNvbnN0IGRlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhdHRlcm4ubWFuaWZlc3QucGF0dGVybnMgfHwge30pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVzLnNvbWUoZGVwZW5kZW5jeSA9PiBpbmNsdWRlcyhkZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpKTtcblx0XHRcdH0gZWxzZSBpZiAobmFtZSA9PT0gJ3Byb3ZpZGVzJykge1xuXHRcdFx0XHRjb25zdCBkZXBlbmRlbnRzID0gT2JqZWN0LmtleXMocGF0dGVybi5tYW5pZmVzdC5kZXBlbmRlbnRQYXR0ZXJucyB8fCB7fSk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZXMuc29tZShkZXBlbmRlbnQgPT4gaW5jbHVkZXMoZGVwZW5kZW50cywgZGVwZW5kZW50KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RlbXMoc2VhcmNoKSB7XG5cdHJldHVybiBzZWFyY2guc3BsaXQoJyAnKVxuXHRcdC5maWx0ZXIoaXNTdGVtKVxuXHRcdC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUb2tlbnMoc2VhcmNoKSB7XG5cdGNvbnN0IGZyYWdtZW50cyA9IHNlYXJjaC5zcGxpdCgnICcpO1xuXHRjb25zdCB0b2tlbnMgPSBmcmFnbWVudHMuZmlsdGVyKGlzVG9rZW4pO1xuXHRjb25zdCB0YWdzID0gZmxhdHRlbih0b2tlbnMuZmlsdGVyKGlzVGFnVG9rZW4pLm1hcChnZXRUb2tlblZhbHVlcykpO1xuXHRjb25zdCBmbGFncyA9IGZsYXR0ZW4odG9rZW5zLmZpbHRlcihpc0ZsYWdUb2tlbikubWFwKGdldFRva2VuVmFsdWVzKSk7XG5cdGNvbnN0IGRlcGVuZHMgPSBmbGF0dGVuKHRva2Vucy5maWx0ZXIoaXNEZXBlbmRzVG9rZW4pLm1hcChnZXRUb2tlblZhbHVlcykpO1xuXHRjb25zdCBwcm92aWRlcyA9IGZsYXR0ZW4odG9rZW5zLmZpbHRlcihpc1Byb3ZpZGVzVG9rZW4pLm1hcChnZXRUb2tlblZhbHVlcykpO1xuXG5cdHJldHVybiB7XG5cdFx0dGFncywgZmxhZ3MsIGRlcGVuZHMsIHByb3ZpZGVzXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXR0ZXJucyhoYXlzdGFjaywgY3JpdGVyaWEgPSB7fSkge1xuXHRyZXR1cm4gT2JqZWN0LnZhbHVlcyhoYXlzdGFjaylcblx0XHQucmVkdWNlKChyZWdpc3RyeSwgaXRlbSkgPT4ge1xuXHRcdFx0aWYgKGl0ZW0udHlwZSA9PT0gJ3BhdHRlcm4nKSB7XG5cdFx0XHRcdHJldHVybiBtYXRjaFBhdHRlcm4oaXRlbSwgY3JpdGVyaWEpID9cblx0XHRcdFx0XHRbLi4ucmVnaXN0cnksIGl0ZW1dIDpcblx0XHRcdFx0XHRyZWdpc3RyeTtcblx0XHRcdH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnZm9sZGVyJykge1xuXHRcdFx0XHRyZXR1cm4gWy4uLnJlZ2lzdHJ5LCAuLi5nZXRQYXR0ZXJucyhpdGVtLmNoaWxkcmVuLCBjcml0ZXJpYSldO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlZ2lzdHJ5O1xuXHRcdH0sIFtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclBhdHRlcm5zKHBhdHRlcm5zLCBpZHMpIHtcblx0cmV0dXJuIGdldFBhdHRlcm5zKHBhdHRlcm5zKVxuXHRcdC5maWx0ZXIoKHtpZH0pID0+IGluY2x1ZGVzKGlkcywgaWQpKVxuXHRcdC5yZWR1Y2UoKHJlZ2lzdHJ5LCBpdGVtKSA9PiB7XG5cdFx0XHRjb25zdCBmcmFnbWVudHMgPSBpdGVtLmlkLnNwbGl0KCcvJyk7XG5cdFx0XHRjb25zdCBrZXkgPSBmcmFnbWVudHNbZnJhZ21lbnRzLmxlbmd0aCAtIDFdO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Li4ucmVnaXN0cnksXG5cdFx0XHRcdFtrZXldOiBpdGVtXG5cdFx0XHR9O1xuXHRcdH0sIHt9KTtcbn1cblxuY29uc3QgdG9rZW5LZXlzID0gWyd0YWcnLCAnZmxhZycsICdkZXBlbmRzJywgJ3Byb3ZpZGVzJ107XG5cbmZ1bmN0aW9uIG1hdGNoZXNUb2tlbihrZXksIHRva2VuKSB7XG5cdHJldHVybiBzdGFydHNXaXRoKHRva2VuLCBgJHtrZXl9OmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUb2tlbih0b2tlbikge1xuXHRyZXR1cm4gdG9rZW5LZXlzLnNvbWUodG9rZW5LZXkgPT4gbWF0Y2hlc1Rva2VuKHRva2VuS2V5LCB0b2tlbikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGVtKHRva2VuKSB7XG5cdHJldHVybiAhaXNUb2tlbih0b2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ1Rva2VuKHRva2VuKSB7XG5cdHJldHVybiBtYXRjaGVzVG9rZW4oJ3RhZycsIHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmxhZ1Rva2VuKHRva2VuKSB7XG5cdHJldHVybiBtYXRjaGVzVG9rZW4oJ2ZsYWcnLCB0b2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RlcGVuZHNUb2tlbih0b2tlbikge1xuXHRyZXR1cm4gbWF0Y2hlc1Rva2VuKCdkZXBlbmRzJywgdG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm92aWRlc1Rva2VuKHRva2VuKSB7XG5cdHJldHVybiBtYXRjaGVzVG9rZW4oJ3Byb3ZpZGVzJywgdG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW5WYWx1ZXModG9rZW4pIHtcblx0cmV0dXJuIHRva2VuXG5cdFx0LnNwbGl0KCc6Jylcblx0XHQuc2xpY2UoMSlcblx0XHQuam9pbignLicpXG5cdFx0LnNwbGl0KCcsJylcblx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0Lm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTtcbn1cbiJdfQ==