fastlion-amis
Version:
一种MIS页面生成工具
926 lines (925 loc) • 37.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.register = exports.dataMapping = exports.resolveMapping = exports.tokenize = exports.resolveVariableAndFilter = exports.isPureVariable = exports.resolveVariable = exports.pickValues = exports.getFilters = exports.registerFilter = exports.filters = exports.stripNumber = exports.parseDuration = exports.filterDate = exports.relativeValueRe = exports.formatDuration = exports.escapeHtml = exports.prettyBytes = void 0;
var tslib_1 = require("tslib");
var isPlainObject_1 = (0, tslib_1.__importDefault)(require("lodash/isPlainObject"));
var moment_1 = (0, tslib_1.__importDefault)(require("moment"));
var groupBy_1 = (0, tslib_1.__importDefault)(require("lodash/groupBy"));
var helper_1 = require("./helper");
var uniqBy_1 = (0, tslib_1.__importDefault)(require("lodash/uniqBy"));
var uniq_1 = (0, tslib_1.__importDefault)(require("lodash/uniq"));
var transform_1 = (0, tslib_1.__importDefault)(require("lodash/transform"));
var amis_formula_1 = require("amis-formula");
Object.defineProperty(exports, "resolveVariableAndFilter", { enumerable: true, get: function () { return amis_formula_1.resolveVariableAndFilter; } });
var UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
var prettyBytes = function (num) {
if (!Number.isFinite(num)) {
throw new TypeError("Expected a finite number, got " + typeof num + ": " + num);
}
var neg = num < 0;
if (neg) {
num = -num;
}
if (num < 1) {
return (neg ? '-' : '') + num + ' B';
}
var exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), UNITS.length - 1);
var numStr = Number((num / Math.pow(1000, exponent)).toPrecision(3));
var unit = UNITS[exponent];
return (neg ? '-' : '') + numStr + ' ' + unit;
};
exports.prettyBytes = prettyBytes;
var entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'/': '/'
};
var escapeHtml = function (str) {
return String(str).replace(/[&<>"'\/]/g, function (s) {
return entityMap[s];
});
};
exports.escapeHtml = escapeHtml;
function formatDuration(value) {
var unit = ['秒', '分', '时', '天', '月', '季', '年'];
var steps = [1, 60, 3600, 86400, 2592000, 7776000, 31104000];
var len = steps.length;
var parts = [];
while (len--) {
if (steps[len] && value >= steps[len]) {
parts.push(Math.floor(value / steps[len]) + unit[len]);
value %= steps[len];
}
else if (len === 0 && value) {
parts.push((value.toFixed ? value.toFixed(2) : '0') + unit[0]);
}
}
return parts.join('');
}
exports.formatDuration = formatDuration;
function makeSorter(key, method, order) {
return function (a, b) {
if (!a || !b) {
return 0;
}
var va = (0, exports.resolveVariable)(key, a);
var vb = (0, exports.resolveVariable)(key, b);
var result = 0;
if (method === 'numerical') {
result = (parseFloat(va) || 0) - (parseFloat(vb) || 0);
}
else {
result = String(va).localeCompare(String(vb));
}
return result * (order === 'desc' ? -1 : 1);
};
}
var timeUnitMap = {
year: 'Y',
month: 'M',
week: 'w',
weekday: 'W',
day: 'd',
hour: 'h',
minute: 'm',
min: 'm',
second: 's',
millisecond: 'ms'
};
exports.relativeValueRe = /^(.+)?(\+|-)(\d+)(minute|min|hour|day|week|month|year|weekday|second|millisecond)s?$/i;
var filterDate = function (value, data, format, utc) {
if (data === void 0) { data = {}; }
if (format === void 0) { format = 'X'; }
if (utc === void 0) { utc = false; }
var m, mm = utc ? moment_1.default.utc : moment_1.default;
if (typeof value === 'string') {
value = value.trim();
}
value = (0, exports.tokenize)(value, data);
if (value && typeof value === 'string' && (m = exports.relativeValueRe.exec(value))) {
var date = new Date();
var step = parseInt(m[3], 10);
var from = m[1]
? (0, exports.filterDate)(m[1], data, format, utc)
: mm(/(minute|min|hour|second)s?/.test(m[4])
? [
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds()
]
: [date.getFullYear(), date.getMonth(), date.getDate()]);
return m[2] === '-'
? from.subtract(step, timeUnitMap[m[4]])
: from.add(step, timeUnitMap[m[4]]);
// return from[m[2] === '-' ? 'subtract' : 'add'](step, mapping[m[4]] || m[4]);
}
else if (value === 'now') {
return mm();
}
else if (value === 'today') {
var date = new Date();
return mm([date.getFullYear(), date.getMonth(), date.getDate()]);
}
else {
return mm(value, format);
}
};
exports.filterDate = filterDate;
function parseDuration(str) {
var matches = /^((?:\-|\+)?(?:\d*\.)?\d+)(minute|min|hour|day|week|month|quarter|year|weekday|second|millisecond)s?$/.exec(str);
if (matches) {
var duration = moment_1.default.duration(parseFloat(matches[1]), matches[2]);
if (moment_1.default.isDuration(duration)) {
return duration;
}
}
return;
}
exports.parseDuration = parseDuration;
// 主要用于解决 0.1+0.2 结果的精度问题导致太长
function stripNumber(number) {
if (typeof number === 'number') {
return parseFloat(number.toPrecision(12));
}
else {
return number;
}
}
exports.stripNumber = stripNumber;
exports.filters = {
map: function (input, fn) {
var arg = [];
for (var _i = 2; _i < arguments.length; _i++) {
arg[_i - 2] = arguments[_i];
}
return Array.isArray(input) && exports.filters[fn]
? input.map(function (item) { return exports.filters[fn].apply(exports.filters, (0, tslib_1.__spreadArray)([item], arg, false)); })
: input;
},
html: function (input) { return (0, exports.escapeHtml)(input); },
json: function (input, tabSize) {
if (tabSize === void 0) { tabSize = 2; }
return tabSize
? JSON.stringify(input, null, parseInt(tabSize, 10))
: JSON.stringify(input);
},
toJson: function (input) {
var ret;
try {
ret = JSON.parse(input);
}
catch (e) {
ret = null;
}
return ret;
},
toInt: function (input) { return (typeof input === 'string' ? parseInt(input, 10) : input); },
toFloat: function (input) { return (typeof input === 'string' ? parseFloat(input) : input); },
raw: function (input) { return input; },
now: function () { return new Date(); },
toDate: function (input, inputFormat) {
if (inputFormat === void 0) { inputFormat = ''; }
var data = (0, moment_1.default)(input, inputFormat);
data.add();
return data.isValid() ? data.toDate() : undefined;
},
fromNow: function (input, inputFormat) {
if (inputFormat === void 0) { inputFormat = ''; }
return (0, moment_1.default)(input, inputFormat).fromNow();
},
dateModify: function (input, modifier, amount, unit) {
if (modifier === void 0) { modifier = 'add'; }
if (amount === void 0) { amount = 0; }
if (unit === void 0) { unit = 'days'; }
if (!(input instanceof Date)) {
input = new Date();
}
if (modifier === 'endOf' || modifier === 'startOf') {
return (0, moment_1.default)(input)[modifier === 'endOf' ? 'endOf' : 'startOf'](amount || 'day')
.toDate();
}
return (0, moment_1.default)(input)[modifier === 'add' ? 'add' : 'subtract'](parseInt(amount, 10) || 0, unit)
.toDate();
},
date: function (input, format, inputFormat) {
if (format === void 0) { format = 'LLL'; }
if (inputFormat === void 0) { inputFormat = 'X'; }
return (0, moment_1.default)(input, inputFormat).format(format);
},
number: function (input) {
var parts = String(input).split('.');
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return parts.join('.');
},
trim: function (input) { return (typeof input === 'string' ? input.trim() : input); },
percent: function (input, decimals) {
if (decimals === void 0) { decimals = 0; }
input = parseFloat(input) || 0;
decimals = parseInt(decimals, 10) || 0;
var whole = input * 100;
var multiplier = Math.pow(10, decimals);
return ((Math.round(whole * multiplier) / multiplier).toFixed(decimals) + '%');
},
duration: function (input) { return (input ? formatDuration(input) : input); },
bytes: function (input) { return (input ? (0, exports.prettyBytes)(parseFloat(input)) : input); },
round: function (input, decimals) {
var _a;
if (decimals === void 0) { decimals = 2; }
if (isNaN(input)) {
return 0;
}
decimals = (_a = parseInt(decimals, 10)) !== null && _a !== void 0 ? _a : 2;
var multiplier = Math.pow(10, decimals);
return (Math.round(input * multiplier) / multiplier).toFixed(decimals);
},
truncate: function (input, length, end) {
if (typeof input !== 'string') {
return input;
}
end = end || '...';
if (length == null) {
return input;
}
length = parseInt(length, 10) || 200;
return input.substring(0, length) + (input.length > length ? end : '');
},
url_encode: function (input) { return encodeURIComponent(input); },
url_decode: function (input) { return decodeURIComponent(input); },
default: function (input, defaultValue, strict) {
var _a;
if (strict === void 0) { strict = false; }
// Jay strict为false时不要排除 0
// (strict ? input : input ? input : undefined) ??
return ((_a = (strict ? input : input || input === 0 ? input : undefined)) !== null && _a !== void 0 ? _a : (function () {
try {
if (defaultValue === 'undefined') {
return undefined;
}
return JSON.parse(defaultValue);
}
catch (e) {
return defaultValue;
}
})());
},
join: function (input, glue) { return (input && input.join ? input.join(glue) : input); },
split: function (input, delimiter) {
if (delimiter === void 0) { delimiter = ','; }
return typeof input === 'string' ? input.split(delimiter) : input;
},
sortBy: function (input, key, method, order) {
if (method === void 0) { method = 'alpha'; }
return Array.isArray(input) ? input.sort(makeSorter(key, method, order)) : input;
},
objectToArray: function (input, label, value) {
if (label === void 0) { label = 'label'; }
if (value === void 0) { value = 'value'; }
return (0, transform_1.default)(input, function (result, v, k) {
var _a;
(result || (result = [])).push((_a = {},
_a[label] = v,
_a[value] = k,
_a));
}, []);
},
unique: function (input, key) {
return Array.isArray(input) ? (key ? (0, uniqBy_1.default)(input, key) : (0, uniq_1.default)(input)) : input;
},
topAndOther: function (input, len, labelField, restLabel) {
if (len === void 0) { len = 10; }
if (labelField === void 0) { labelField = 'name'; }
if (restLabel === void 0) { restLabel = '其他'; }
if (Array.isArray(input) && len) {
var grouped_1 = (0, groupBy_1.default)(input, function (item) {
var index = input.indexOf(item) + 1;
return index >= len ? len : index;
});
return Object.keys(grouped_1).map(function (key, index) {
var group = grouped_1[key];
var obj = group.reduce(function (obj, item) {
Object.keys(item).forEach(function (key) {
if (!obj.hasOwnProperty(key) || key === 'labelField') {
obj[key] = item[key];
}
else if (typeof item[key] === 'number' &&
typeof obj[key] === 'number') {
obj[key] += item[key];
}
else if (typeof item[key] === 'string' &&
/^(?:\-|\.)\d/.test(item[key]) &&
typeof obj[key] === 'number') {
obj[key] += parseFloat(item[key]) || 0;
}
else if (typeof item[key] === 'string' &&
typeof obj[key] === 'string') {
obj[key] += ", " + item[key];
}
else {
obj[key] = item[key];
}
});
return obj;
}, {});
if (index === len - 1) {
obj[labelField] = restLabel || '其他';
}
return obj;
});
}
return input;
},
first: function (input) { return input && input[0]; },
nth: function (input, nth) {
if (nth === void 0) { nth = 0; }
return input && input[nth];
},
last: function (input) { return input && (input.length ? input[input.length - 1] : null); },
minus: function (input, step) {
if (step === void 0) { step = 1; }
return stripNumber((Number(input) || 0) - Number(getStrOrVariable(step, this)));
},
plus: function (input, step) {
if (step === void 0) { step = 1; }
return stripNumber((Number(input) || 0) + Number(getStrOrVariable(step, this)));
},
times: function (input, step) {
if (step === void 0) { step = 1; }
return stripNumber((Number(input) || 0) * Number(getStrOrVariable(step, this)));
},
division: function (input, step) {
if (step === void 0) { step = 1; }
return stripNumber((Number(input) || 0) / Number(getStrOrVariable(step, this)));
},
count: function (input) {
return Array.isArray(input) || typeof input === 'string' ? input.length : 0;
},
sum: function (input, field) {
if (!Array.isArray(input)) {
return input;
}
var restult = input.reduce(function (sum, item) {
return sum + (parseFloat(field ? pickValues(field, item) : item) || 0);
}, 0);
return stripNumber(restult);
},
abs: function (input) { return (typeof input === 'number' ? Math.abs(input) : input); },
pick: function (input, path) {
if (path === void 0) { path = '&'; }
return Array.isArray(input) && !/^\d+$/.test(path)
? input.map(function (item, index) {
return pickValues(path, (0, helper_1.createObject)({ index: index }, item));
})
: pickValues(path, input);
},
pick_if_exist: function (input, path) {
if (path === void 0) { path = '&'; }
return Array.isArray(input)
? input.map(function (item) { return (0, exports.resolveVariable)(path, item) || item; })
: (0, exports.resolveVariable)(path, input) || input;
},
str2date: function (input, inputFormat, outputFormat) {
if (inputFormat === void 0) { inputFormat = 'X'; }
if (outputFormat === void 0) { outputFormat = 'X'; }
return input
? (0, exports.filterDate)(input, this, inputFormat).format(outputFormat)
: '';
},
asArray: function (input) { return (Array.isArray(input) ? input : input ? [input] : input); },
concat: function (input) {
var _this = this;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return Array.isArray(input)
? input.concat.apply(input, args.map(function (arg) { return getStrOrVariable(arg, _this); })) : input;
},
filter: function (input, keys, expOrDirective, arg1) {
if (!Array.isArray(input) || !keys || !expOrDirective) {
return input;
}
var directive = expOrDirective;
var fn = function () { return true; };
if (directive === 'isTrue') {
fn = function (value) { return !!value; };
}
else if (directive === 'isFalse') {
fn = function (value) { return !value; };
}
else if (directive === 'isExists') {
fn = function (value) { return typeof value !== 'undefined'; };
}
else if (directive === 'equals' || directive === 'equal') {
arg1 = arg1 ? getStrOrVariable(arg1, this) : '';
fn = function (value) { return arg1 == value; };
}
else if (directive === 'isIn') {
var list_1 = arg1 ? getStrOrVariable(arg1, this) : [];
list_1 = str2array(list_1);
list_1 = Array.isArray(list_1) ? list_1 : list_1 ? [list_1] : [];
fn = function (value) { return (list_1.length ? !!~list_1.indexOf(value) : true); };
}
else if (directive === 'notIn') {
var list_2 = arg1 ? getStrOrVariable(arg1, this) : [];
list_2 = str2array(list_2);
list_2 = Array.isArray(list_2) ? list_2 : list_2 ? [list_2] : [];
fn = function (value) { return !~list_2.indexOf(value); };
}
else {
if (directive !== 'match') {
directive = 'match';
arg1 = expOrDirective;
}
arg1 = arg1 ? getStrOrVariable(arg1, this) : '';
// 比对的值是空时直接返回。
if (!arg1) {
return input;
}
var reg_1 = (0, helper_1.string2regExp)("" + arg1, false);
fn = function (value) { return reg_1.test(String(value)); };
}
// 判断keys是否为*
var isAsterisk = /\s*\*\s*/.test(keys);
keys = keys.split(/\s*,\s*/);
return input.filter(function (item) {
// 当keys为*时从item中获取key
return (isAsterisk ? Object.keys(item) : keys).some(function (key) {
return fn((0, exports.resolveVariable)(key, item), key, item);
});
});
},
base64Encode: function (str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {
return String.fromCharCode(('0x' + p1));
}));
},
base64Decode: function (str) {
return decodeURIComponent(atob(str)
.split('')
.map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
})
.join(''));
},
lowerCase: function (input) {
return input && typeof input === 'string' ? input.toLowerCase() : input;
},
upperCase: function (input) {
return input && typeof input === 'string' ? input.toUpperCase() : input;
},
isTrue: function (input, trueValue, falseValue) {
return getConditionValue(input, !!input, trueValue, falseValue, this);
},
isFalse: function (input, trueValue, falseValue) {
return getConditionValue(input, !input, trueValue, falseValue, this);
},
isMatch: function (input, matchArg, trueValue, falseValue) {
matchArg = getStrOrVariable(matchArg, this);
return getConditionValue(input, matchArg && (0, helper_1.string2regExp)("" + matchArg, false).test(String(input)), trueValue, falseValue, this);
},
notMatch: function (input, matchArg, trueValue, falseValue) {
matchArg = getStrOrVariable(matchArg, this);
return getConditionValue(input, matchArg && !(0, helper_1.string2regExp)("" + matchArg, false).test(String(input)), trueValue, falseValue, this);
},
isEquals: function (input, equalsValue, trueValue, falseValue) {
equalsValue = /^\d+$/.test(equalsValue)
? parseInt(equalsValue, 10)
: getStrOrVariable(equalsValue, this);
return getConditionValue(input, input === equalsValue, trueValue, falseValue, this);
},
notEquals: function (input, equalsValue, trueValue, falseValue) {
equalsValue = /^\d+$/.test(equalsValue)
? parseInt(equalsValue, 10)
: getStrOrVariable(equalsValue, this);
return getConditionValue(input, input !== equalsValue, trueValue, falseValue, this);
}
};
/**
* 如果当前传入字符为:'xxx'或者"xxx",则返回字符xxx
* 否则去数据域中,获取变量xxx
*
* @param value 传入字符
* @param data 数据域
*/
function getStrOrVariable(value, data) {
return /^('|")(.*)\1$/.test(value)
? RegExp.$2
: /^-?\d+$/.test(value)
? parseInt(value, 10)
: /^(-?\d+)\.\d+?$/.test(value)
? parseFloat(value)
: /^\[.*\]$/.test(value)
? value
.substring(1, value.length - 1)
.split(/\s*,\s*/)
.filter(function (item) { return item; })
: /,/.test(value)
? value.split(/\s*,\s*/).filter(function (item) { return item; })
: (0, exports.resolveVariable)(value, data);
}
function str2array(list) {
if (list && typeof list === 'string') {
if (/^\[.*\]$/.test(list)) {
return list
.substring(1, list.length - 1)
.split(/\s*,\s*/)
.filter(function (item) { return item; });
}
else {
return list.split(/\s*,\s*/).filter(function (item) { return item; });
}
}
return list;
}
function getConditionValue(input, isTrue, trueValue, falseValue, data) {
return isTrue || (!isTrue && falseValue)
? getStrOrVariable(isTrue ? trueValue : falseValue, data)
: input;
}
function registerFilter(name, fn) {
exports.filters[name] = fn;
}
exports.registerFilter = registerFilter;
function getFilters() {
return exports.filters;
}
exports.getFilters = getFilters;
function pickValues(names, data) {
var _a;
var arr;
if (!names || ((arr = names.split(',')) && arr.length < 2)) {
var idx = names.indexOf('~');
if (~idx) {
var key = names.substring(0, idx);
var target = names.substring(idx + 1);
return _a = {},
_a[key] = (0, exports.resolveVariable)(target, data),
_a;
}
return (0, exports.resolveVariable)(names, data);
}
var ret = {};
arr.forEach(function (name) {
var idx = name.indexOf('~');
var target = name;
if (~idx) {
target = name.substring(idx + 1);
name = name.substring(0, idx);
}
(0, helper_1.setVariable)(ret, name, (0, exports.resolveVariable)(target, data));
});
return ret;
}
exports.pickValues = pickValues;
function objectGet(data, path) {
if (typeof data[path] !== 'undefined') {
return data[path];
}
var parts = (0, helper_1.keyToPath)(path.replace(/^{|}$/g, ''));
return parts.reduce(function (data, path) {
if (((0, helper_1.isObject)(data) || Array.isArray(data)) && path in data) {
return data[path];
}
return undefined;
}, data);
}
function parseJson(str, defaultValue) {
try {
return JSON.parse(str);
}
catch (e) {
return defaultValue;
}
}
function getCookie(name) {
var value = "; " + document.cookie;
var parts = value.split("; " + name + "=");
if (parts.length === 2) {
return parts.pop().split(';').shift();
}
return undefined;
}
var resolveVariable = function (path, data) {
if (data === void 0) { data = {}; }
if (!path || !data || typeof path !== 'string') {
return undefined;
}
// 有多个冒号不处理
var _a = path.split(':'), ns = _a[0], varname = _a[1];
if (!varname && ns) {
varname = ns;
ns = '';
}
if (ns === 'window') {
data = window;
}
else if (ns === 'ls' || ns === 'ss') {
var parts = (0, helper_1.keyToPath)(varname.replace(/^{|}$/g, ''));
var key = parts.shift();
var raw = ns === 'ss' ? sessionStorage.getItem(key) : localStorage.getItem(key);
if (typeof raw === 'string') {
var data_1 = parseJson(raw, raw);
if ((0, helper_1.isObject)(data_1) && parts.length) {
return objectGet(data_1, parts.join('.'));
}
return data_1;
}
return undefined;
}
else if (ns === 'cookie') {
var key = varname.replace(/^{|}$/g, '').trim();
return getCookie(key);
}
if (varname === '$$') {
return data;
}
else if (varname[0] === '$') {
varname = path.substring(1);
}
else if (varname === '&') {
return data;
}
return objectGet(data, varname);
};
exports.resolveVariable = resolveVariable;
function isPureVariable(path) {
return typeof path === 'string'
? /^\$(?:((?:\w+\:)?[a-z0-9_.][a-z0-9_.\[\]]*)|{[^}{]+})$/i.test(path)
: false;
}
exports.isPureVariable = isPureVariable;
// export const resolveVariableAndFilter = (
// path?: string,
// data: object = {},
// defaultFilter: string = '| html',
// fallbackValue = (value: any) => value
// ): any => {
// if (!path) {
// return undefined;
// }
// const m =
// /^(\\)?\$(?:((?:\w+\:)?[a-z0-9_.][a-z0-9_.\[\]]*)|{([\s\S]+)})$/i.exec(
// path
// );
// if (!m) {
// return undefined;
// }
// const [_, escape, key, key2] = m;
// // 如果是转义如: `\$abc` => `$abc`
// if (escape) {
// return _.substring(1);
// }
// let finalKey: string = key || key2;
// // 先只支持一层吧
// finalKey = finalKey.replace(
// /(\\|\\\$)?\$(?:([a-zA-Z0-9_.][a-zA-Z0-9_.\[\]]*)|{([^}{]+)})/g,
// (_, escape) => {
// return escape
// ? _.substring(1)
// : resolveVariableAndFilter(_, data, defaultFilter);
// }
// );
// // 默认 html 转义
// if (!~finalKey.indexOf('|')) {
// finalKey += defaultFilter;
// }
// let paths = finalKey.split(/\s*\|\s*/g);
// let originalKey = finalKey;
// finalKey = paths.shift() as string;
// let ret = resolveVariable(finalKey, data);
// let prevConInputChanged = false; // 前一个类三元过滤器生效,则跳过后续类三元过滤器
// return ret == null &&
// !~originalKey.indexOf('default') &&
// !~originalKey.indexOf('now')
// ? fallbackValue(ret)
// : paths.reduce((input, filter) => {
// let params = filter
// .replace(
// /([^\\])\\([\:\\])/g,
// (_, affix, content) =>
// `${affix}__${content === ':' ? 'colon' : 'slash'}__`
// )
// .split(':')
// .map(item =>
// item.replace(/__(slash|colon)__/g, (_, type) =>
// type === 'colon' ? ':' : '\\'
// )
// );
// let key = params.shift() as string;
// if (
// ~[
// 'isTrue',
// 'isFalse',
// 'isMatch',
// 'isEquals',
// 'notMatch',
// 'notEquals'
// ].indexOf(key)
// ) {
// if (prevConInputChanged) {
// return input;
// } else {
// const result = filters[key].call(data, input, ...params);
// prevConInputChanged = result !== input;
// return result;
// }
// } else {
// // 后面再遇到非类三元filter就重置了吧,不影响再后面的其他三元filter
// prevConInputChanged = false;
// }
// return (filters[key] || filters.raw).call(data, input, ...params);
// }, ret);
// };
var tokenize = function (str, data, defaultFilter) {
if (defaultFilter === void 0) { defaultFilter = '| html'; }
if (!str || typeof str !== 'string') {
return str;
}
return str.replace(/(\\)?\$(?:((?:\w+\:)?[a-z0-9_\.][a-z0-9_\.\[\]]*|&|\$)|{([^}{]+?)})/gi, function (_, escape, key1, key2, index, source) {
var _a;
if (!escape && key1 === '$') {
var prefix = source[index - 1];
return prefix === '='
? encodeURIComponent(JSON.stringify(data))
: (0, helper_1.qsstringify)(data);
}
return escape
? _.substring(1)
: (_a = (0, amis_formula_1.resolveVariableAndFilter)(_, data, defaultFilter)) !== null && _a !== void 0 ? _a : '';
});
};
exports.tokenize = tokenize;
function resolveMapping(value, data, defaultFilter) {
if (defaultFilter === void 0) { defaultFilter = '| raw'; }
return typeof value === 'string' && isPureVariable(value)
? (0, amis_formula_1.resolveVariableAndFilter)(value, data, defaultFilter, function () { return ''; })
: typeof value === 'string' && ~value.indexOf('$')
? (0, exports.tokenize)(value, data, defaultFilter)
: value;
}
exports.resolveMapping = resolveMapping;
function dataMapping(to, from, ignoreFunction, convertKeyToPath) {
if (from === void 0) { from = {}; }
if (ignoreFunction === void 0) { ignoreFunction = false; }
if (Array.isArray(to)) {
return to.map(function (item) {
return dataMapping(item, from, ignoreFunction, convertKeyToPath);
});
}
else if (typeof to === 'string') {
return resolveMapping(to, from);
}
else if (!(0, isPlainObject_1.default)(to)) {
return to;
}
var ret = {};
Object.keys(to).forEach(function (key) {
var _a, _b, _c, _d, _e;
var value = to[key];
var keys;
if (typeof ignoreFunction === 'function' && ignoreFunction(key, value)) {
// 如果被ignore,不做数据映射处理。
(0, helper_1.setVariable)(ret, key, value, convertKeyToPath);
}
else if (key === '&' && value === '$$') {
ret = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, ret), from);
}
else if (key === '&') {
var v = (0, isPlainObject_1.default)(value) &&
(keys = Object.keys(value)) &&
keys.length === 1 &&
from[keys[0].substring(1)] &&
Array.isArray(from[keys[0].substring(1)])
? from[keys[0].substring(1)].map(function (raw) {
return dataMapping(value[keys[0]], (0, helper_1.createObject)(from, raw), ignoreFunction, convertKeyToPath);
})
: resolveMapping(value, from);
if (Array.isArray(v) || typeof v === 'string') {
ret = v;
}
else if (typeof v === 'function') {
ret = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, ret), v(from));
}
else {
ret = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, ret), v);
}
}
else if (value === '$$') {
(0, helper_1.setVariable)(ret, key, from, convertKeyToPath);
}
else if (value && value[0] === '$') {
var v = resolveMapping(value, from);
// Jay 不要排除0
if (!v &&
((from === null || from === void 0 ? void 0 : from[key]) === 0 ||
(from === null || from === void 0 ? void 0 : from[(_e = (_d = (_c = (_b = (_a = (0, amis_formula_1.parse)(value)) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.body) === null || _d === void 0 ? void 0 : _d.input) === null || _e === void 0 ? void 0 : _e.name]) === 0)) {
v = '0';
}
(0, helper_1.setVariable)(ret, key, v, convertKeyToPath);
if (v === '__undefined') {
(0, helper_1.deleteVariable)(ret, key);
}
}
else if ((0, isPlainObject_1.default)(value) &&
(keys = Object.keys(value)) &&
keys.length === 1 &&
keys[0][0] === '$' &&
(0, isPlainObject_1.default)(value[keys[0]])) {
// from[keys[0].substring(1)] &&
// Array.isArray(from[keys[0].substring(1)])
// 支持只取数组中的部分值这个需求
// 如:
// data: {
// items: {
// '$rows': {
// id: '$id',
// forum_id: '$forum_id'
// }
// }
// }
var arr = Array.isArray(from[keys[0].substring(1)])
? from[keys[0].substring(1)]
: [];
var mapping_1 = value[keys[0]];
ret[key] = arr.map(function (raw) {
return dataMapping(mapping_1, (0, helper_1.createObject)(from, raw), ignoreFunction, convertKeyToPath);
});
}
else if ((0, isPlainObject_1.default)(value)) {
(0, helper_1.setVariable)(ret, key, dataMapping(value, from, ignoreFunction, convertKeyToPath), convertKeyToPath);
}
else if (Array.isArray(value)) {
(0, helper_1.setVariable)(ret, key, value.map(function (value) {
return (0, isPlainObject_1.default)(value)
? dataMapping(value, from, ignoreFunction, convertKeyToPath)
: resolveMapping(value, from);
}), convertKeyToPath);
}
else if (typeof value == 'string' && ~value.indexOf('$')) {
(0, helper_1.setVariable)(ret, key, resolveMapping(value, from), convertKeyToPath);
}
else if (typeof value === 'function' && ignoreFunction !== true) {
(0, helper_1.setVariable)(ret, key, value(from), convertKeyToPath);
}
else {
(0, helper_1.setVariable)(ret, key, value, convertKeyToPath);
if (value === '__undefined') {
(0, helper_1.deleteVariable)(ret, key);
}
}
});
return ret;
}
exports.dataMapping = dataMapping;
function matchSynatax(str) {
var from = 0;
while (true) {
var idx = str.indexOf('$', from);
if (~idx) {
var nextToken = str[idx + 1];
// 如果没有下一个字符,或者下一个字符是引号或者空格
// 这个一般不是取值用法
if (!nextToken || ~['"', "'", ' '].indexOf(nextToken)) {
from = idx + 1;
continue;
}
// 如果上个字符是转义也不是取值用法
var prevToken = str[idx - 1];
if (prevToken && prevToken === '\\') {
from = idx + 1;
continue;
}
return true;
}
else {
break;
}
}
return false;
}
function register() {
return {
name: 'builtin',
test: function (str) { return typeof str === 'string' && matchSynatax(str); },
removeEscapeToken: function (str) {
return typeof str === 'string' ? str.replace(/\\\$/g, '$') : str;
},
compile: function (str, data, defaultFilter) {
if (defaultFilter === void 0) { defaultFilter = '| html'; }
try {
return (0, exports.tokenize)(str, data, defaultFilter);
}
catch (e) {
return "error: " + e.message;
}
}
};
}
exports.register = register;
//# sourceMappingURL=./utils/tpl-builtin.js.map
;