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 CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  ## 0.6.x
3
3
 
4
+ * destruncting for "each" for array and object
4
5
  * style's attribute "global"
5
6
  * compound classes (handle mix of class and class directives)
6
7
  * new passing class
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, (n, pk) => {
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, fn) => {
306
- let result = {};
307
- let ast = result.ast = acorn.parse(exp, {sourceType: 'module', ecmaVersion: 12});
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
- for(let k in n) {
317
- if(k == '_parent') continue;
318
- let v = n[k];
319
- if(v == null || typeof(v) != 'object') continue;
320
- if(Array.isArray(v)) {
321
- v.forEach(i => {
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
- result.build = (data) => {
334
- return astring.generate(data || ast);
337
+ self.build = function(data) {
338
+ return astring.generate(data || self.ast);
335
339
  };
336
- return result;
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
- let itemName, indexName, bind0 = null;
5016
- if(right[0] == '{') {
5017
- rx = right.match(/^(\{[^}]+\})(.*)$/s);
5018
- assert(rx, `Wrong #each expression '${data.value}'`);
5019
- let exp = rx[1], keywords;
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
- keywords = acorn.parse(`(${exp} = $$item)`, {sourceType: 'module', ecmaVersion: 12}).body[0].expression.left.properties.map(p => p.key.name);
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
- exp,
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.exp} = $$item));`);
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, (n, pk) => {
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, fn) => {
307
- let result = {};
308
- let ast = result.ast = acorn.parse(exp, {sourceType: 'module', ecmaVersion: 12});
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
- 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);
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
- result.build = (data) => {
335
- return astring.generate(data || ast);
338
+ self.build = function(data) {
339
+ return astring.generate(data || self.ast);
336
340
  };
337
- return result;
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
- let itemName, indexName, bind0 = null;
5017
- if(right[0] == '{') {
5018
- rx = right.match(/^(\{[^}]+\})(.*)$/s);
5019
- assert(rx, `Wrong #each expression '${data.value}'`);
5020
- let exp = rx[1], keywords;
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
- keywords = acorn.parse(`(${exp} = $$item)`, {sourceType: 'module', ecmaVersion: 12}).body[0].expression.left.properties.map(p => p.key.name);
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
- exp,
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.exp} = $$item));`);
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.55';
5920
+ const version = '0.6.56';
5892
5921
 
5893
5922
 
5894
5923
  async function compile(source, config = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "malinajs",
3
- "version": "0.6.55",
3
+ "version": "0.6.56",
4
4
  "license": "MIT",
5
5
  "scripts": {
6
6
  "prepare": "npm run build",