UNPKG

6.72 kBJavaScriptView Raw
1// regex that contains all symbols applicable for expression used to AI detect an expression.
2const expressionSymbolsRegex = /[\+\-\*\/%\?:<>=!\|&\(\)^~]|^`.*\$\{.+\}.*`$/;
3export var bindingConstants;
4(function (bindingConstants) {
5 bindingConstants.sourceProperty = 'sourceProperty';
6 bindingConstants.targetProperty = 'targetProperty';
7 bindingConstants.expression = 'expression';
8 bindingConstants.twoWay = 'twoWay';
9 bindingConstants.source = 'source';
10 bindingConstants.bindingValueKey = '$value';
11 bindingConstants.parentValueKey = '$parent';
12 bindingConstants.parentsValueKey = '$parents';
13 bindingConstants.newPropertyValueKey = '$newPropertyValue';
14})(bindingConstants || (bindingConstants = {}));
15const hasEqualSignRegex = /=+/;
16const equalSignComparisionOperatorsRegex = /(==|===|>=|<=|!=|!==)/;
17// this regex is used to search for all instaces of '$parents[]' within an expression
18export const parentsRegex = /\$parents\s*\[\s*(['"]*)\w*\1\s*\]/g;
19function isNamedParam(value) {
20 const equalSignIndex = value.search(hasEqualSignRegex);
21 if (equalSignIndex > -1) {
22 const equalSignSurround = value.substr(equalSignIndex > 0 ? equalSignIndex - 1 : 0, 3);
23 if (equalSignSurround.search(equalSignComparisionOperatorsRegex) === -1) {
24 return true;
25 }
26 }
27 return false;
28}
29function areNamedParams(params) {
30 for (let i = 0; i < params.length; i++) {
31 if (isNamedParam(params[i])) {
32 return true;
33 }
34 }
35 return false;
36}
37const namedParamConstants = {
38 propName: 'propName',
39 propValue: 'propValue',
40};
41function getPropertyNameValuePair(param, knownOptions, callback) {
42 let nameValuePair = {};
43 let propertyName = param.substr(0, param.indexOf('=')).trim();
44 const propertyValue = param.substr(param.indexOf('=') + 1).trim();
45 if (knownOptions) {
46 if (!propertyName) {
47 propertyName = knownOptions.defaultProperty;
48 }
49 else {
50 propertyName = propertyName in knownOptions ? propertyName : null;
51 }
52 }
53 if (propertyName) {
54 if (callback) {
55 nameValuePair = callback(propertyName, propertyValue);
56 }
57 else {
58 nameValuePair[namedParamConstants.propName] = propertyName;
59 nameValuePair[namedParamConstants.propValue] = propertyValue;
60 }
61 return nameValuePair;
62 }
63 return null;
64}
65function parseNamedProperties(parameterList, knownOptions, callback) {
66 const result = {};
67 let nameValuePair;
68 for (let i = 0; i < parameterList.length; i++) {
69 nameValuePair = getPropertyNameValuePair(parameterList[i], knownOptions, callback);
70 if (nameValuePair) {
71 result[nameValuePair[namedParamConstants.propName]] = nameValuePair[namedParamConstants.propValue];
72 }
73 }
74 return result;
75}
76function getParamsArray(value) {
77 const result = [];
78 let skipComma = 0;
79 let indexReached = 0;
80 let singleQuoteBlock = false;
81 let doubleQuoteBlock = false;
82 for (let i = 0; i < value.length; i++) {
83 if (value[i] === '"') {
84 doubleQuoteBlock = !doubleQuoteBlock;
85 }
86 if (value[i] === "'") {
87 singleQuoteBlock = !singleQuoteBlock;
88 }
89 if (value[i] === '(' || value[i] === '[') {
90 skipComma++;
91 }
92 if (value[i] === ')' || value[i] === ']') {
93 skipComma--;
94 }
95 if (value[i] === ',' && skipComma === 0 && !(singleQuoteBlock || doubleQuoteBlock)) {
96 result.push(value.substr(indexReached, i - indexReached));
97 indexReached = i + 1;
98 }
99 }
100 result.push(value.substr(indexReached));
101 return result;
102}
103function isExpression(expression) {
104 if (expression.search(expressionSymbolsRegex) > -1) {
105 const parentsMatches = expression.match(parentsRegex);
106 if (parentsMatches) {
107 const restOfExpression = expression.substr(expression.indexOf(parentsMatches[0]) + parentsMatches[0].length);
108 // no more expression regognition symbols so it is safe for sourceProperty
109 if (!(restOfExpression.search(expressionSymbolsRegex) > -1)) {
110 return false;
111 }
112 }
113 return true;
114 }
115 return false;
116}
117export function getBindingOptions(name, value) {
118 let namedParams = [];
119 const params = getParamsArray(value);
120 if (!areNamedParams(params)) {
121 if (params.length === 1) {
122 const trimmedValue = params[0].trim();
123 let sourceProp;
124 if (isExpression(trimmedValue)) {
125 sourceProp = bindingConstants.bindingValueKey;
126 namedParams.push(bindingConstants.expression + ' = ' + trimmedValue);
127 }
128 else {
129 sourceProp = trimmedValue;
130 }
131 namedParams.push(bindingConstants.sourceProperty + ' = ' + sourceProp);
132 namedParams.push(bindingConstants.twoWay + ' = true');
133 }
134 else {
135 namedParams.push(bindingConstants.sourceProperty + ' = ' + params[0].trim());
136 namedParams.push(bindingConstants.expression + ' = ' + params[1].trim());
137 const twoWay = params[2] ? params[2].toLowerCase().trim() === 'true' : true;
138 namedParams.push(bindingConstants.twoWay + ' = ' + twoWay);
139 }
140 }
141 else {
142 namedParams = params;
143 }
144 const bindingPropertyHandler = function (prop, value) {
145 const result = {};
146 result[namedParamConstants.propName] = prop;
147 if (prop === bindingConstants.twoWay) {
148 // create a real boolean value
149 if (value === 'true') {
150 result[namedParamConstants.propValue] = true;
151 }
152 else {
153 result[namedParamConstants.propValue] = false;
154 }
155 }
156 else {
157 result[namedParamConstants.propValue] = value;
158 }
159 return result;
160 };
161 const bindingOptionsParameters = parseNamedProperties(namedParams, xmlBindingProperties, bindingPropertyHandler);
162 const bindOptions = {
163 targetProperty: name,
164 };
165 for (const prop in bindingOptionsParameters) {
166 if (bindingOptionsParameters.hasOwnProperty(prop)) {
167 bindOptions[prop] = bindingOptionsParameters[prop];
168 }
169 }
170 if (bindOptions[bindingConstants.twoWay] === undefined) {
171 bindOptions[bindingConstants.twoWay] = true;
172 }
173 return bindOptions;
174}
175const xmlBindingProperties = {
176 sourceProperty: true,
177 expression: true,
178 twoWay: true,
179 source: true,
180 defaultProperty: bindingConstants.sourceProperty,
181};
182//# sourceMappingURL=binding-builder.js.map
\No newline at end of file