malinajs 0.6.55 → 0.6.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/compile.js +93 -64
- package/malina.js +94 -65
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/compile.js
CHANGED
|
@@ -291,7 +291,7 @@ const extractKeywords = (exp) => {
|
|
|
291
291
|
|
|
292
292
|
const replaceElementKeyword = (exp, fn) => {
|
|
293
293
|
let changed = false;
|
|
294
|
-
let r = parseJS(exp
|
|
294
|
+
let r = parseJS(exp).transform((n, pk) => {
|
|
295
295
|
if(n.type != 'Identifier') return;
|
|
296
296
|
if(pk == 'property' || pk == 'params') return;
|
|
297
297
|
if(n.name != '$element') return;
|
|
@@ -302,38 +302,42 @@ const replaceElementKeyword = (exp, fn) => {
|
|
|
302
302
|
};
|
|
303
303
|
|
|
304
304
|
|
|
305
|
-
const parseJS = (exp
|
|
306
|
-
let
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
const rec = (n, pk) => {
|
|
310
|
-
let self;
|
|
311
|
-
if(n.type) {
|
|
312
|
-
self = n;
|
|
313
|
-
fn?.(n, pk);
|
|
314
|
-
}
|
|
305
|
+
const parseJS = (exp) => {
|
|
306
|
+
let self = {};
|
|
307
|
+
self.ast = acorn.parse(exp, {sourceType: 'module', ecmaVersion: 12});
|
|
315
308
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
let
|
|
319
|
-
if(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
i._parent = self || n._parent;
|
|
323
|
-
rec(i, k);
|
|
324
|
-
});
|
|
325
|
-
} else {
|
|
326
|
-
v._parent = self || n._parent;
|
|
327
|
-
rec(v, k);
|
|
309
|
+
self.transform = function(fn) {
|
|
310
|
+
const rec = (n, pk) => {
|
|
311
|
+
let self;
|
|
312
|
+
if(n.type) {
|
|
313
|
+
self = n;
|
|
314
|
+
fn?.(n, pk);
|
|
328
315
|
}
|
|
329
|
-
|
|
316
|
+
|
|
317
|
+
for(let k in n) {
|
|
318
|
+
if(k == '_parent') continue;
|
|
319
|
+
let v = n[k];
|
|
320
|
+
if(v == null || typeof(v) != 'object') continue;
|
|
321
|
+
if(Array.isArray(v)) {
|
|
322
|
+
v.forEach(i => {
|
|
323
|
+
i._parent = self || n._parent;
|
|
324
|
+
rec(i, k);
|
|
325
|
+
});
|
|
326
|
+
} else {
|
|
327
|
+
v._parent = self || n._parent;
|
|
328
|
+
rec(v, k);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
rec(self.ast, null);
|
|
333
|
+
|
|
334
|
+
return self;
|
|
330
335
|
};
|
|
331
|
-
rec(ast, null);
|
|
332
336
|
|
|
333
|
-
|
|
334
|
-
return astring.generate(data || ast);
|
|
337
|
+
self.build = function(data) {
|
|
338
|
+
return astring.generate(data || self.ast);
|
|
335
339
|
};
|
|
336
|
-
return
|
|
340
|
+
return self;
|
|
337
341
|
};
|
|
338
342
|
|
|
339
343
|
|
|
@@ -5002,7 +5006,7 @@ function makeEachBlock(data, option) {
|
|
|
5002
5006
|
assert(rx, `Wrong #each expression '${data.value}'`);
|
|
5003
5007
|
let arrayName = rx[1];
|
|
5004
5008
|
let right = rx[2];
|
|
5005
|
-
let keyName;
|
|
5009
|
+
let keyName, keyFunction = null;
|
|
5006
5010
|
|
|
5007
5011
|
// get keyName
|
|
5008
5012
|
rx = right.match(/^(.*)\s*\(\s*([^\(\)]+)\s*\)\s*$/s);
|
|
@@ -5012,61 +5016,86 @@ function makeEachBlock(data, option) {
|
|
|
5012
5016
|
}
|
|
5013
5017
|
right = right.trim();
|
|
5014
5018
|
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5019
|
+
const makeKeyFunction = (keyLink) => {
|
|
5020
|
+
const e = parseJS(keyName).transform((n, pk) => {
|
|
5021
|
+
if(n.type != 'Identifier') return;
|
|
5022
|
+
if(pk == 'property') return;
|
|
5023
|
+
let r = keyLink[n.name];
|
|
5024
|
+
if(r) n.name = r;
|
|
5025
|
+
});
|
|
5026
|
+
let exp = e.build(e.ast.body[0].expression);
|
|
5027
|
+
keyFunction = xNode('key-function', {
|
|
5028
|
+
exp
|
|
5029
|
+
}, (ctx, n) => {
|
|
5030
|
+
ctx.write(`($$item, $index) => ${n.exp}`);
|
|
5031
|
+
});
|
|
5032
|
+
};
|
|
5020
5033
|
|
|
5034
|
+
let itemName, indexName, bind0 = null;
|
|
5035
|
+
if(right[0] == '{' || right[0] == '[') {
|
|
5036
|
+
let keywords, unwrap;
|
|
5021
5037
|
try {
|
|
5022
|
-
|
|
5038
|
+
let exp = `[${right}]`;
|
|
5039
|
+
let e = parseJS(exp);
|
|
5040
|
+
assert(e.ast.body.length == 1);
|
|
5041
|
+
|
|
5042
|
+
itemName = '$$item';
|
|
5043
|
+
let n = e.ast.body[0];
|
|
5044
|
+
let a = n.expression.elements[0];
|
|
5045
|
+
unwrap = exp.substring(a.start, a.end);
|
|
5046
|
+
if(n.expression.elements.length == 1) {
|
|
5047
|
+
indexName = '$index';
|
|
5048
|
+
} else {
|
|
5049
|
+
assert(n.expression.elements.length == 2);
|
|
5050
|
+
let b = n.expression.elements[1];
|
|
5051
|
+
assert(b.type == 'Identifier');
|
|
5052
|
+
indexName = exp.substring(b.start, b.end);
|
|
5053
|
+
}
|
|
5054
|
+
|
|
5055
|
+
e = parseJS(`(${unwrap} = $$item)`);
|
|
5056
|
+
let l = e.ast.body[0].expression.left;
|
|
5057
|
+
if(l.type == 'ArrayPattern') {
|
|
5058
|
+
keywords = l.elements.map(p => p.name);
|
|
5059
|
+
|
|
5060
|
+
if(keyName) {
|
|
5061
|
+
let keyLink = {};
|
|
5062
|
+
for(let i in keywords) keyLink[keywords[i]] = `$$item[${i}]`;
|
|
5063
|
+
makeKeyFunction(keyLink);
|
|
5064
|
+
}
|
|
5065
|
+
} else {
|
|
5066
|
+
assert(l.type == 'ObjectPattern');
|
|
5067
|
+
keywords = l.properties.map(p => p.key.name);
|
|
5068
|
+
|
|
5069
|
+
if(keyName) {
|
|
5070
|
+
let keyLink = {};
|
|
5071
|
+
for(let k of keywords) keyLink[k] = `$$item.${k}`;
|
|
5072
|
+
makeKeyFunction(keyLink);
|
|
5073
|
+
}
|
|
5074
|
+
}
|
|
5023
5075
|
} catch (e) {
|
|
5024
5076
|
throw new Error('Wrong destructuring in each: ' + data.value);
|
|
5025
5077
|
}
|
|
5026
5078
|
|
|
5027
|
-
itemName = '$$item';
|
|
5028
|
-
indexName = rx[2].trim();
|
|
5029
|
-
if(indexName[0] == ',') indexName = indexName.substring(1).trim();
|
|
5030
|
-
indexName = indexName || '$index';
|
|
5031
|
-
|
|
5032
5079
|
bind0 = xNode('each:unwrap', {
|
|
5033
|
-
|
|
5080
|
+
unwrap,
|
|
5034
5081
|
keywords
|
|
5035
5082
|
}, (ctx, n) => {
|
|
5036
5083
|
ctx.writeLine(`let ${n.keywords.join(', ')};`);
|
|
5037
|
-
ctx.writeLine(`$runtime.prefixPush($ctx.cd, () => (${n.
|
|
5084
|
+
ctx.writeLine(`$runtime.prefixPush($ctx.cd, () => (${n.unwrap} = $$item));`);
|
|
5038
5085
|
});
|
|
5039
5086
|
} else {
|
|
5040
5087
|
rx = right.trim().split(/\s*\,\s*/);
|
|
5041
5088
|
assert(rx.length <= 2, `Wrong #each expression '${data.value}'`);
|
|
5042
5089
|
itemName = rx[0];
|
|
5043
5090
|
indexName = rx[1] || '$index';
|
|
5091
|
+
if(keyName) {
|
|
5092
|
+
if(keyName == itemName) keyFunction = 'noop';
|
|
5093
|
+
else makeKeyFunction({[itemName]: '$$item', [indexName]: '$index'});
|
|
5094
|
+
}
|
|
5044
5095
|
}
|
|
5045
5096
|
assert(isSimpleName(itemName), `Wrong name '${itemName}'`);
|
|
5046
5097
|
assert(isSimpleName(indexName), `Wrong name '${indexName}'`);
|
|
5047
5098
|
|
|
5048
|
-
let keyFunction = null;
|
|
5049
|
-
if(keyName == itemName) {
|
|
5050
|
-
keyName = null;
|
|
5051
|
-
keyFunction = 'noop';
|
|
5052
|
-
}
|
|
5053
|
-
if(keyName) assert(detectExpressionType(keyName) == 'identifier', `Wrong key '${keyName}'`);
|
|
5054
|
-
|
|
5055
|
-
if(keyName) {
|
|
5056
|
-
this.detectDependency(keyName);
|
|
5057
|
-
keyFunction = xNode('function', {
|
|
5058
|
-
inline: true,
|
|
5059
|
-
arrow: true,
|
|
5060
|
-
args: [itemName, 'i'],
|
|
5061
|
-
body: [xNode('block', {
|
|
5062
|
-
index: indexName,
|
|
5063
|
-
key: keyName
|
|
5064
|
-
}, (ctx, data) => {
|
|
5065
|
-
if(data.key == data.index) ctx.writeLine('return i;');
|
|
5066
|
-
else ctx.writeLine(`return ${data.key};`);
|
|
5067
|
-
})]
|
|
5068
|
-
});
|
|
5069
|
-
}
|
|
5070
5099
|
let bind;
|
|
5071
5100
|
if(itemData.source) {
|
|
5072
5101
|
bind = xNode('function', {
|
package/malina.js
CHANGED
|
@@ -292,7 +292,7 @@
|
|
|
292
292
|
|
|
293
293
|
const replaceElementKeyword = (exp, fn) => {
|
|
294
294
|
let changed = false;
|
|
295
|
-
let r = parseJS(exp
|
|
295
|
+
let r = parseJS(exp).transform((n, pk) => {
|
|
296
296
|
if(n.type != 'Identifier') return;
|
|
297
297
|
if(pk == 'property' || pk == 'params') return;
|
|
298
298
|
if(n.name != '$element') return;
|
|
@@ -303,38 +303,42 @@
|
|
|
303
303
|
};
|
|
304
304
|
|
|
305
305
|
|
|
306
|
-
const parseJS = (exp
|
|
307
|
-
let
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const rec = (n, pk) => {
|
|
311
|
-
let self;
|
|
312
|
-
if(n.type) {
|
|
313
|
-
self = n;
|
|
314
|
-
fn?.(n, pk);
|
|
315
|
-
}
|
|
306
|
+
const parseJS = (exp) => {
|
|
307
|
+
let self = {};
|
|
308
|
+
self.ast = acorn.parse(exp, {sourceType: 'module', ecmaVersion: 12});
|
|
316
309
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
let
|
|
320
|
-
if(
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
i._parent = self || n._parent;
|
|
324
|
-
rec(i, k);
|
|
325
|
-
});
|
|
326
|
-
} else {
|
|
327
|
-
v._parent = self || n._parent;
|
|
328
|
-
rec(v, k);
|
|
310
|
+
self.transform = function(fn) {
|
|
311
|
+
const rec = (n, pk) => {
|
|
312
|
+
let self;
|
|
313
|
+
if(n.type) {
|
|
314
|
+
self = n;
|
|
315
|
+
fn?.(n, pk);
|
|
329
316
|
}
|
|
330
|
-
|
|
317
|
+
|
|
318
|
+
for(let k in n) {
|
|
319
|
+
if(k == '_parent') continue;
|
|
320
|
+
let v = n[k];
|
|
321
|
+
if(v == null || typeof(v) != 'object') continue;
|
|
322
|
+
if(Array.isArray(v)) {
|
|
323
|
+
v.forEach(i => {
|
|
324
|
+
i._parent = self || n._parent;
|
|
325
|
+
rec(i, k);
|
|
326
|
+
});
|
|
327
|
+
} else {
|
|
328
|
+
v._parent = self || n._parent;
|
|
329
|
+
rec(v, k);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
rec(self.ast, null);
|
|
334
|
+
|
|
335
|
+
return self;
|
|
331
336
|
};
|
|
332
|
-
rec(ast, null);
|
|
333
337
|
|
|
334
|
-
|
|
335
|
-
return astring.generate(data || ast);
|
|
338
|
+
self.build = function(data) {
|
|
339
|
+
return astring.generate(data || self.ast);
|
|
336
340
|
};
|
|
337
|
-
return
|
|
341
|
+
return self;
|
|
338
342
|
};
|
|
339
343
|
|
|
340
344
|
|
|
@@ -5003,7 +5007,7 @@
|
|
|
5003
5007
|
assert(rx, `Wrong #each expression '${data.value}'`);
|
|
5004
5008
|
let arrayName = rx[1];
|
|
5005
5009
|
let right = rx[2];
|
|
5006
|
-
let keyName;
|
|
5010
|
+
let keyName, keyFunction = null;
|
|
5007
5011
|
|
|
5008
5012
|
// get keyName
|
|
5009
5013
|
rx = right.match(/^(.*)\s*\(\s*([^\(\)]+)\s*\)\s*$/s);
|
|
@@ -5013,61 +5017,86 @@
|
|
|
5013
5017
|
}
|
|
5014
5018
|
right = right.trim();
|
|
5015
5019
|
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5020
|
+
const makeKeyFunction = (keyLink) => {
|
|
5021
|
+
const e = parseJS(keyName).transform((n, pk) => {
|
|
5022
|
+
if(n.type != 'Identifier') return;
|
|
5023
|
+
if(pk == 'property') return;
|
|
5024
|
+
let r = keyLink[n.name];
|
|
5025
|
+
if(r) n.name = r;
|
|
5026
|
+
});
|
|
5027
|
+
let exp = e.build(e.ast.body[0].expression);
|
|
5028
|
+
keyFunction = xNode('key-function', {
|
|
5029
|
+
exp
|
|
5030
|
+
}, (ctx, n) => {
|
|
5031
|
+
ctx.write(`($$item, $index) => ${n.exp}`);
|
|
5032
|
+
});
|
|
5033
|
+
};
|
|
5021
5034
|
|
|
5035
|
+
let itemName, indexName, bind0 = null;
|
|
5036
|
+
if(right[0] == '{' || right[0] == '[') {
|
|
5037
|
+
let keywords, unwrap;
|
|
5022
5038
|
try {
|
|
5023
|
-
|
|
5039
|
+
let exp = `[${right}]`;
|
|
5040
|
+
let e = parseJS(exp);
|
|
5041
|
+
assert(e.ast.body.length == 1);
|
|
5042
|
+
|
|
5043
|
+
itemName = '$$item';
|
|
5044
|
+
let n = e.ast.body[0];
|
|
5045
|
+
let a = n.expression.elements[0];
|
|
5046
|
+
unwrap = exp.substring(a.start, a.end);
|
|
5047
|
+
if(n.expression.elements.length == 1) {
|
|
5048
|
+
indexName = '$index';
|
|
5049
|
+
} else {
|
|
5050
|
+
assert(n.expression.elements.length == 2);
|
|
5051
|
+
let b = n.expression.elements[1];
|
|
5052
|
+
assert(b.type == 'Identifier');
|
|
5053
|
+
indexName = exp.substring(b.start, b.end);
|
|
5054
|
+
}
|
|
5055
|
+
|
|
5056
|
+
e = parseJS(`(${unwrap} = $$item)`);
|
|
5057
|
+
let l = e.ast.body[0].expression.left;
|
|
5058
|
+
if(l.type == 'ArrayPattern') {
|
|
5059
|
+
keywords = l.elements.map(p => p.name);
|
|
5060
|
+
|
|
5061
|
+
if(keyName) {
|
|
5062
|
+
let keyLink = {};
|
|
5063
|
+
for(let i in keywords) keyLink[keywords[i]] = `$$item[${i}]`;
|
|
5064
|
+
makeKeyFunction(keyLink);
|
|
5065
|
+
}
|
|
5066
|
+
} else {
|
|
5067
|
+
assert(l.type == 'ObjectPattern');
|
|
5068
|
+
keywords = l.properties.map(p => p.key.name);
|
|
5069
|
+
|
|
5070
|
+
if(keyName) {
|
|
5071
|
+
let keyLink = {};
|
|
5072
|
+
for(let k of keywords) keyLink[k] = `$$item.${k}`;
|
|
5073
|
+
makeKeyFunction(keyLink);
|
|
5074
|
+
}
|
|
5075
|
+
}
|
|
5024
5076
|
} catch (e) {
|
|
5025
5077
|
throw new Error('Wrong destructuring in each: ' + data.value);
|
|
5026
5078
|
}
|
|
5027
5079
|
|
|
5028
|
-
itemName = '$$item';
|
|
5029
|
-
indexName = rx[2].trim();
|
|
5030
|
-
if(indexName[0] == ',') indexName = indexName.substring(1).trim();
|
|
5031
|
-
indexName = indexName || '$index';
|
|
5032
|
-
|
|
5033
5080
|
bind0 = xNode('each:unwrap', {
|
|
5034
|
-
|
|
5081
|
+
unwrap,
|
|
5035
5082
|
keywords
|
|
5036
5083
|
}, (ctx, n) => {
|
|
5037
5084
|
ctx.writeLine(`let ${n.keywords.join(', ')};`);
|
|
5038
|
-
ctx.writeLine(`$runtime.prefixPush($ctx.cd, () => (${n.
|
|
5085
|
+
ctx.writeLine(`$runtime.prefixPush($ctx.cd, () => (${n.unwrap} = $$item));`);
|
|
5039
5086
|
});
|
|
5040
5087
|
} else {
|
|
5041
5088
|
rx = right.trim().split(/\s*\,\s*/);
|
|
5042
5089
|
assert(rx.length <= 2, `Wrong #each expression '${data.value}'`);
|
|
5043
5090
|
itemName = rx[0];
|
|
5044
5091
|
indexName = rx[1] || '$index';
|
|
5092
|
+
if(keyName) {
|
|
5093
|
+
if(keyName == itemName) keyFunction = 'noop';
|
|
5094
|
+
else makeKeyFunction({[itemName]: '$$item', [indexName]: '$index'});
|
|
5095
|
+
}
|
|
5045
5096
|
}
|
|
5046
5097
|
assert(isSimpleName(itemName), `Wrong name '${itemName}'`);
|
|
5047
5098
|
assert(isSimpleName(indexName), `Wrong name '${indexName}'`);
|
|
5048
5099
|
|
|
5049
|
-
let keyFunction = null;
|
|
5050
|
-
if(keyName == itemName) {
|
|
5051
|
-
keyName = null;
|
|
5052
|
-
keyFunction = 'noop';
|
|
5053
|
-
}
|
|
5054
|
-
if(keyName) assert(detectExpressionType(keyName) == 'identifier', `Wrong key '${keyName}'`);
|
|
5055
|
-
|
|
5056
|
-
if(keyName) {
|
|
5057
|
-
this.detectDependency(keyName);
|
|
5058
|
-
keyFunction = xNode('function', {
|
|
5059
|
-
inline: true,
|
|
5060
|
-
arrow: true,
|
|
5061
|
-
args: [itemName, 'i'],
|
|
5062
|
-
body: [xNode('block', {
|
|
5063
|
-
index: indexName,
|
|
5064
|
-
key: keyName
|
|
5065
|
-
}, (ctx, data) => {
|
|
5066
|
-
if(data.key == data.index) ctx.writeLine('return i;');
|
|
5067
|
-
else ctx.writeLine(`return ${data.key};`);
|
|
5068
|
-
})]
|
|
5069
|
-
});
|
|
5070
|
-
}
|
|
5071
5100
|
let bind;
|
|
5072
5101
|
if(itemData.source) {
|
|
5073
5102
|
bind = xNode('function', {
|
|
@@ -5888,7 +5917,7 @@
|
|
|
5888
5917
|
return {event, fn};
|
|
5889
5918
|
}
|
|
5890
5919
|
|
|
5891
|
-
const version = '0.6.
|
|
5920
|
+
const version = '0.6.56';
|
|
5892
5921
|
|
|
5893
5922
|
|
|
5894
5923
|
async function compile(source, config = {}) {
|