spikijs 1.1.6 → 1.1.8

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Spikijs
2
2
 
3
- ~2.5 KB (Gzip): Reactive JavaScript micro-framework
3
+ ~5 KB (Gzip): Reactive JavaScript micro-framework
4
4
 
5
5
  ---
6
6
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "spikijs",
3
3
  "license": "MIT",
4
- "version": "1.1.6",
4
+ "version": "1.1.8",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
package/spiki.esm.js CHANGED
@@ -18,15 +18,14 @@ var spiki = (() => {
18
18
  if (!fn._q) {
19
19
  fn._q = true;
20
20
  scheduler.push(fn);
21
-
22
21
  if (!isFlushing) {
23
22
  isFlushing = true;
24
23
  resolved.then(() => {
25
- var queue = scheduler.slice();
24
+ var queue = scheduler;
26
25
  scheduler = [];
27
26
  isFlushing = false;
28
-
29
- for (var i = 0; i < queue.length; i++) {
27
+ var i = queue.length;
28
+ while (i--) {
30
29
  queue[i]._q = false;
31
30
  queue[i]();
32
31
  }
@@ -36,23 +35,17 @@ var spiki = (() => {
36
35
  };
37
36
 
38
37
  var evalPath = (scope, path) => {
39
- if (path.indexOf('.') === -1) {
40
- return { val: scope[path], ctx: scope };
38
+ if (typeof path === 'string') {
39
+ return { ctx: scope, val: scope ? scope[path] : undefined };
41
40
  }
42
-
43
- var parts = path.split('.');
44
- var val = scope;
45
- var ctx = scope;
46
-
47
- for (var i = 0; i < parts.length; i++) {
48
- if (val == null) {
49
- console.warn('Property undefined: ' + path);
50
- return { val: undefined, ctx: null };
51
- }
52
- ctx = val;
53
- val = val[parts[i]];
41
+ var i = 0, len = path.length;
42
+ while (i < len - 1 && scope) {
43
+ scope = scope[path[i++]];
54
44
  }
55
- return { val: val, ctx: ctx };
45
+ return {
46
+ ctx: scope,
47
+ val: scope ? scope[path[len - 1]] : undefined
48
+ };
56
49
  };
57
50
 
58
51
  // -------------------------------------------------------------------------
@@ -62,24 +55,18 @@ var spiki = (() => {
62
55
  var arrInst = {};
63
56
 
64
57
  arrMethods.forEach(method => {
65
- arrInst[method] = function() {
58
+ arrInst[method] = function(...args) {
66
59
  pauseTracking = true;
67
- try {
68
- return Array.prototype[method].apply(this, arguments);
69
- } finally {
70
- pauseTracking = false;
71
- trigger(this, 'length');
72
- }
60
+ try { return Array.prototype[method].apply(this, args); }
61
+ finally { pauseTracking = false; trigger(this, 'length'); }
73
62
  };
74
63
  });
75
64
 
76
65
  var track = (target, key) => {
77
66
  if (activeEffect) {
78
67
  var deps = target._d || (Object.defineProperty(target, '_d', {
79
- value: Object.create(null),
80
- writable: true
68
+ value: Object.create(null), writable: true
81
69
  }), target._d);
82
-
83
70
  var list = deps[key] || (deps[key] = []);
84
71
  if (list.indexOf(activeEffect) === -1) {
85
72
  list.push(activeEffect);
@@ -91,7 +78,8 @@ var spiki = (() => {
91
78
  var trigger = (target, key) => {
92
79
  if (!pauseTracking && target._d && target._d[key]) {
93
80
  var effects = target._d[key].slice();
94
- for (var i = 0; i < effects.length; i++) {
81
+ var i = 0, len = effects.length;
82
+ for (; i < len; i++) {
95
83
  var effect = effects[i];
96
84
  effect.sched ? effect.sched(effect) : effect();
97
85
  }
@@ -99,7 +87,8 @@ var spiki = (() => {
99
87
  };
100
88
 
101
89
  var cleanup = (runner) => {
102
- for (var i = 0; i < runner.deps.length; i++) {
90
+ var i = runner.deps.length;
91
+ while (i--) {
103
92
  var list = runner.deps[i];
104
93
  var idx = list.indexOf(runner);
105
94
  if (idx !== -1) {
@@ -115,11 +104,7 @@ var spiki = (() => {
115
104
  cleanup(runner);
116
105
  var prev = activeEffect;
117
106
  activeEffect = runner;
118
- try {
119
- fn();
120
- } finally {
121
- activeEffect = prev;
122
- }
107
+ try { fn(); } finally { activeEffect = prev; }
123
108
  };
124
109
  runner.deps = [];
125
110
  runner.sched = sched;
@@ -136,20 +121,20 @@ var spiki = (() => {
136
121
  if (key === '_y') return true;
137
122
  if (key === '_d') return target._d;
138
123
  if (Array.isArray(target) && arrInst.hasOwnProperty(key)) return arrInst[key];
139
-
124
+ var desc = Object.getOwnPropertyDescriptor(target, key);
125
+ if (desc && desc.get) {
126
+ var cacheKey = '_' + key;
127
+ if (!(cacheKey in target)) effect(() => receiver[cacheKey] = desc.get.call(receiver));
128
+ return receiver[cacheKey];
129
+ }
140
130
  track(target, key);
141
131
  var res = Reflect.get(target, key, receiver);
142
- return (res && typeof res === 'object' && !(res instanceof Node))
143
- ? makeReactive(res)
144
- : res;
132
+ return (res && typeof res === 'object' && !(res instanceof Node)) ? makeReactive(res) : res;
145
133
  },
146
134
  set: (target, key, val, receiver) => {
147
135
  var old = target[key];
148
136
  var isArr = Array.isArray(target);
149
- var hadKey = isArr
150
- ? Number(key) < target.length
151
- : Object.prototype.hasOwnProperty.call(target, key);
152
-
137
+ var hadKey = isArr ? Number(key) < target.length : Object.prototype.hasOwnProperty.call(target, key);
153
138
  if (!isArr && !hadKey) {
154
139
  var proto = Object.getPrototypeOf(target);
155
140
  while (proto && proto !== Object.prototype) {
@@ -161,7 +146,6 @@ var spiki = (() => {
161
146
  proto = Object.getPrototypeOf(proto);
162
147
  }
163
148
  }
164
-
165
149
  var res = Reflect.set(target, key, val, receiver);
166
150
  if (!pauseTracking && res) {
167
151
  if (!hadKey || val !== old) {
@@ -197,53 +181,36 @@ var spiki = (() => {
197
181
  // -------------------------------------------------------------------------
198
182
  // 3. DOM & COMPONENT ENGINE
199
183
  // -------------------------------------------------------------------------
200
- var domOps = {
201
- text: (el, val) => {
202
- el.textContent = val == null ? '' : val;
203
- },
204
- html: (el, val) => {
205
- if (el.innerHTML != val) el.innerHTML = val == null ? '' : val;
206
- },
207
- value: (el, val) => {
208
- if (el.type === 'checkbox') {
209
- el.checked = !!val;
210
- } else if (el.type === 'radio') {
211
- el.checked = (el.value == val);
212
- } else if (el.value != val) {
213
- el.value = val == null ? '' : val;
214
- }
215
- },
216
- attr: (el, val, name) => {
217
- if (val == null || val === false) {
218
- el.removeAttribute(name);
219
- } else {
220
- el.setAttribute(name, val === true ? '' : val);
221
- }
222
- },
223
- class: (el, val) => {
224
- if (typeof val === 'string') {
225
- var parts = val.match(/\S+/g) || [];
226
- for (var i = 0; i < parts.length; i++) {
227
- var c = parts[i];
228
- c[0] === '!'
229
- ? el.classList.remove(c.slice(1))
230
- : el.classList.add(c);
231
- }
232
- } else if (val) {
233
- for (var cls in val) {
234
- var add = !!val[cls];
235
- if (cls.indexOf(' ') !== -1) {
236
- var parts = cls.split(/\s+/);
237
- for (var j=0; j<parts.length; j++) {
238
- if(parts[j]) el.classList.toggle(parts[j], add);
239
- }
240
- } else {
241
- el.classList.toggle(cls, add);
242
- }
243
- }
244
- }
245
- },
246
- effect: () => {}
184
+ var domOps = Object.create(null);
185
+ domOps.text = (el, val) => {
186
+ val = val == null ? '' : val;
187
+ if (el.textContent !== String(val)) el.textContent = val;
188
+ };
189
+ domOps.html = (el, val) => {
190
+ if (el.innerHTML != val) el.innerHTML = val == null ? '' : val;
191
+ };
192
+ domOps.value = (el, val) => {
193
+ if (el.type === 'checkbox') el.checked = !!val;
194
+ else if (el.type === 'radio') el.checked = (el.value == val);
195
+ else if (el.value != val) el.value = val == null ? '' : val;
196
+ };
197
+ domOps.attr = (el, val, name) => {
198
+ if (val == null || val === false) el.removeAttribute(name);
199
+ else {
200
+ var str = val === true ? '' : String(val);
201
+ if (el.getAttribute(name) !== str) el.setAttribute(name, str);
202
+ }
203
+ };
204
+ domOps.class = (el, val) => {
205
+ var base = el._n || '';
206
+ var dyn = '';
207
+ if (typeof val === 'string') {
208
+ dyn = val;
209
+ } else if (val) {
210
+ for (var k in val) if (val[k]) dyn += (dyn ? ' ' : '') + k;
211
+ }
212
+ var res = base + (base && dyn ? ' ' : '') + dyn;
213
+ if (el.className !== res) el.className = res;
247
214
  };
248
215
 
249
216
  var mount = (rootElement, parentScope) => {
@@ -267,19 +234,40 @@ var spiki = (() => {
267
234
 
268
235
  var handle = (event) => {
269
236
  var target = event.target;
270
- while (target && target !== rootElement.parentNode) {
271
- var handlers = target._h && target._h[event.type];
237
+ if (event.type === 'input' && target._c) return;
238
+ var limit = rootElement.parentNode;
239
+ var type = event.type;
240
+
241
+ while (target && target !== limit) {
242
+ var handlers = target._h && target._h[type];
243
+
272
244
  if (handlers) {
273
- for (var i = 0; i < handlers.length; i++) {
245
+ var scope = target._s;
246
+ var i = handlers.length;
247
+ while (i--) {
274
248
  var handler = handlers[i];
249
+ var path = handler.p;
250
+
275
251
  if (handler.model) {
276
252
  var val = target.type === 'checkbox' ? target.checked : target.value;
277
- var result = evalPath(target._s, handler.path);
278
- if (result.ctx) {
279
- result.ctx[result.ctx === target._s ? handler.path : handler.path.split('.').pop()] = val;
253
+ if (typeof val === 'string') {
254
+ var clean = val.trim();
255
+ if (clean && isFinite(clean)) {
256
+ if (clean.charCodeAt(0) !== 48 || clean.length === 1 || clean.charCodeAt(1) === 46) {
257
+ val = Number(clean);
258
+ }
259
+ }
260
+ }
261
+ if (typeof path === 'string') {
262
+ if (scope) scope[path] = val;
263
+ } else {
264
+ var ctx = scope;
265
+ var k = 0, kLen = path.length - 1;
266
+ while (k < kLen && ctx) ctx = ctx[path[k++]];
267
+ if (ctx) ctx[path[kLen]] = val;
280
268
  }
281
269
  } else {
282
- var result = evalPath(target._s, handler.path);
270
+ var result = evalPath(scope, path);
283
271
  if (typeof result.val === 'function') result.val.call(result.ctx, event);
284
272
  }
285
273
  }
@@ -308,21 +296,22 @@ var spiki = (() => {
308
296
  var directiveFor = !directiveIf && el.tagName === 'TEMPLATE' && el.getAttribute('s-for');
309
297
  var bindings = [];
310
298
 
299
+ if (el.hasAttribute('class') && !el._n) el._n = el.className;
300
+
311
301
  if (directiveIf) {
312
302
  var end = document.createTextNode('');
313
303
  var active = null;
314
304
  var cBranch = [];
315
-
316
305
  el.replaceWith(end);
317
306
  var negate = directiveIf[0] === '!';
318
307
  var path = negate ? directiveIf.slice(1) : directiveIf;
308
+ var p = path.indexOf('.') === -1 ? path : path.split('.');
319
309
 
320
- parentCleanups.push(() => { cBranch.forEach(cleanup => cleanup()); });
310
+ parentCleanups.push(() => { cBranch.forEach(c => c()); });
321
311
 
322
312
  return parentCleanups.push(effect(() => {
323
- var show = evalPath(scope, path).val;
313
+ var show = evalPath(scope, p).val;
324
314
  if (negate) show = !show;
325
-
326
315
  if (show) {
327
316
  if (!active) {
328
317
  active = el.cloneNode(true);
@@ -331,40 +320,38 @@ var spiki = (() => {
331
320
  end.parentNode.insertBefore(active, end);
332
321
  }
333
322
  } else if (active) {
334
- cBranch.forEach(cleanup => cleanup());
335
- cBranch = [];
336
- active.remove();
337
- active = null;
323
+ cBranch.forEach(c => c()); cBranch = []; active.remove(); active = null;
338
324
  }
339
325
  }, nextTick));
340
326
  }
341
327
 
342
328
  if (directiveFor) {
343
- var regexMatch = directiveFor.match(/^\s*(.*?)\s+in\s+(.+)\s*$/);
344
- if (regexMatch) {
345
- var leftHandSide = regexMatch[1].split(',').map(s => s.trim().replace(/[()]/g, ''));
346
- var alias = leftHandSide[0];
347
- var idxAlias = leftHandSide[1];
348
- var listKey = regexMatch[2].trim();
329
+ var inIdx = directiveFor.indexOf(' in ');
330
+ if (inIdx !== -1) {
331
+ var leftSide = directiveFor.slice(0, inIdx).trim();
332
+ var listKey = directiveFor.slice(inIdx + 4).trim();
333
+ var leftParts = leftSide.replace(/[()]/g, '').split(',');
334
+ var alias = leftParts[0].trim();
335
+ var idxAlias = leftParts[1] ? leftParts[1].trim() : null;
336
+ var listPath = listKey.indexOf('.') === -1 ? listKey : listKey.split('.');
349
337
  var keyAttr = el.getAttribute('s-key');
338
+ var keyPath = keyAttr ? (keyAttr.indexOf('.') === -1 ? keyAttr : keyAttr.split('.')) : null;
339
+
350
340
  var end = document.createTextNode('');
351
341
  var nodePool = Object.create(null);
352
342
  var usedKeys;
353
-
354
343
  el.replaceWith(end);
355
344
 
356
345
  parentCleanups.push(() => {
357
- for(var key in nodePool) nodePool[key].cleanups.forEach(cleanup => cleanup());
346
+ for(var k in nodePool) nodePool[k].cleanups.forEach(c => c());
358
347
  });
359
348
 
360
349
  return parentCleanups.push(effect(() => {
361
- var list = evalPath(scope, listKey).val || [];
350
+ var list = evalPath(scope, listPath).val || [];
362
351
  if (Array.isArray(list)) track(list, 'length');
363
-
364
352
  var frag = document.createDocumentFragment();
365
353
  var cursor = end;
366
354
  usedKeys = Object.create(null);
367
-
368
355
  var isArr = Array.isArray(list);
369
356
  var keys = isArr ? list : Object.keys(list);
370
357
  var len = isArr ? list.length : keys.length;
@@ -372,18 +359,12 @@ var spiki = (() => {
372
359
  for (var i = 0; i < len; i++) {
373
360
  var key = isArr ? i : keys[i];
374
361
  var item = isArr ? list[i] : list[key];
375
-
376
362
  var unique;
377
- if (item == null || typeof item !== 'object') {
378
- unique = String(item);
379
- } else if (keyAttr) {
380
- unique = evalPath(item, keyAttr).val;
381
- } else {
382
- unique = String(key) + '_o';
383
- }
363
+ if (item == null || typeof item !== 'object') unique = String(item);
364
+ else if (keyPath) unique = evalPath(item, keyPath).val;
365
+ else unique = String(key) + '_o';
384
366
 
385
367
  if (usedKeys[unique]) unique += '_' + i;
386
-
387
368
  var row = nodePool[unique];
388
369
  if (row) {
389
370
  row.scope[alias] = item;
@@ -391,19 +372,13 @@ var spiki = (() => {
391
372
  } else {
392
373
  var clone = el.content.cloneNode(true);
393
374
  var rowScope = makeReactive(Object.create(scope));
394
-
395
- rowScope[alias] = item;
396
- if (idxAlias) rowScope[idxAlias] = key;
397
-
375
+ rowScope[alias] = item; if (idxAlias) rowScope[idxAlias] = key;
398
376
  var rowNodes = Array.prototype.slice.call(clone.childNodes);
399
377
  var rowCleanups = [];
400
-
401
378
  for(var n=0; n<rowNodes.length; n++) walk(rowNodes[n], rowScope, rowCleanups);
402
-
403
379
  row = { nodes: rowNodes, scope: rowScope, cleanups: rowCleanups };
404
380
  nodePool[unique] = row;
405
381
  }
406
-
407
382
  if (row.nodes[0] !== cursor.nextSibling) {
408
383
  for(var n=0; n<row.nodes.length; n++) frag.appendChild(row.nodes[n]);
409
384
  cursor.parentNode.insertBefore(frag, cursor.nextSibling);
@@ -411,13 +386,10 @@ var spiki = (() => {
411
386
  cursor = row.nodes[row.nodes.length-1];
412
387
  usedKeys[unique] = true;
413
388
  }
414
-
415
- for (var key in nodePool) {
416
- if (!usedKeys[key]) {
417
- nodePool[key].cleanups.forEach(cleanup => cleanup());
418
- for(var n=0; n<nodePool[key].nodes.length; n++) nodePool[key].nodes[n].remove();
419
- delete nodePool[key];
420
- }
389
+ for (var k in nodePool) if (!usedKeys[k]) {
390
+ nodePool[k].cleanups.forEach(c => c());
391
+ nodePool[k].nodes.forEach(n => n.remove());
392
+ delete nodePool[k];
421
393
  }
422
394
  }, nextTick));
423
395
  }
@@ -425,45 +397,57 @@ var spiki = (() => {
425
397
 
426
398
  if (el.hasAttributes()) {
427
399
  var attrs = el.attributes;
428
- for (var i = 0; i < attrs.length; i++) {
429
- var attrName = attrs[i].name;
430
- var attrValue = attrs[i].value;
400
+ var i = attrs.length;
401
+ while (i--) {
402
+ var attr = attrs[i];
403
+ var attrName = attr.name;
404
+ var attrValue = attr.value;
431
405
 
432
- if (attrName[0] === ':') {
406
+ if (attrName.charCodeAt(0) === 58) {
433
407
  var realName = attrName.slice(1);
434
- var neg = attrValue[0] === '!';
435
- bindings.push({ type: 'attr', name: realName, path: neg ? attrValue.slice(1) : attrValue, neg: neg });
436
- } else if (attrName.indexOf('s-') === 0) {
408
+ var neg = attrValue.charCodeAt(0) === 33;
409
+ var rawPath = neg ? attrValue.slice(1) : attrValue;
410
+ var p = rawPath.indexOf('.') === -1 ? rawPath : rawPath.split('.');
411
+ bindings.push({ type: 'attr', name: realName, path: p, neg: neg });
412
+ }
413
+ else if (attrName.charCodeAt(0) === 115 && attrName.charCodeAt(1) === 45) {
437
414
  var type = attrName.slice(2);
415
+ var p = attrValue.indexOf('.') === -1 ? attrValue : attrValue.split('.');
416
+
438
417
  if (type === 'init' || type === 'destroy') {
439
418
  ((type, path) => {
440
419
  var result = evalPath(scope, path);
441
420
  if (typeof result.val === 'function') {
442
- if (type === 'init') {
443
- nextTick(() => result.val.call(result.ctx, el));
444
- } else {
445
- parentCleanups.push(() => result.val.call(result.ctx, el));
446
- }
421
+ if (type === 'init') nextTick(() => result.val.call(result.ctx, el));
422
+ else parentCleanups.push(() => result.val.call(result.ctx, el));
447
423
  }
448
- })(type, attrValue);
449
- } else if (type === 'model') {
450
- bindings.push({ type: 'value', path: attrValue });
451
- el._s = scope;
452
- el._h = el._h || {};
453
- var evt = (el.type === 'checkbox' || el.type === 'radio' || el.tagName==='SELECT')
454
- ? 'change'
455
- : 'input';
456
-
457
- (el._h[evt] = el._h[evt] || []).unshift({ model: true, path: attrValue });
424
+ })(type, p);
425
+ }
426
+ else if (type === 'effect') {
427
+ parentCleanups.push(effect(() => {
428
+ var res = evalPath(scope, p);
429
+ if (typeof res.val === 'function') res.val.call(res.ctx, el);
430
+ }, nextTick));
431
+ }
432
+ else if (type === 'model') {
433
+ bindings.push({ type: 'value', path: p });
434
+ el._s = scope; el._h = el._h || {};
435
+ var evt = (el.type === 'checkbox' || el.type === 'radio' || el.tagName==='SELECT') ? 'change' : 'input';
436
+
437
+ if (evt === 'input') {
438
+ el.addEventListener('compositionstart', () => el._c = true);
439
+ el.addEventListener('compositionend', () => { el._c = false; handle({target: el, type: 'input'}); });
440
+ }
441
+
442
+ (el._h[evt] = el._h[evt] || []).unshift({ model: true, p: p });
458
443
  addListen(evt);
459
444
  } else if (type === 'ref') {
460
445
  state.$refs[attrValue] = el;
461
446
  } else if (domOps[type]) {
462
- bindings.push({ type: type, path: attrValue });
447
+ bindings.push({ type: type, path: p });
463
448
  } else {
464
- el._s = scope;
465
- el._h = el._h || {};
466
- (el._h[type] = el._h[type] || []).push({ path: attrValue });
449
+ el._s = scope; el._h = el._h || {};
450
+ (el._h[type] = el._h[type] || []).push({ p: p });
467
451
  addListen(type);
468
452
  }
469
453
  }
@@ -472,18 +456,16 @@ var spiki = (() => {
472
456
 
473
457
  if (bindings.length) {
474
458
  parentCleanups.push(effect(() => {
475
- for (var i = 0; i < bindings.length; i++) {
459
+ var i = bindings.length;
460
+ while (i--) {
476
461
  var binding = bindings[i];
477
462
  var result = evalPath(scope, binding.path);
478
463
  var val = (result.val && typeof result.val === 'function') ? result.val.call(result.ctx, el) : result.val;
479
464
 
480
465
  if (binding.type === 'attr') {
481
466
  if (binding.neg) val = !val;
482
- if (binding.name === 'class') {
483
- domOps.class(el, val);
484
- } else {
485
- domOps.attr(el, val, binding.name);
486
- }
467
+ if (binding.name === 'class') domOps.class(el, val);
468
+ else domOps.attr(el, val, binding.name);
487
469
  } else {
488
470
  domOps[binding.type](el, val);
489
471
  }
@@ -505,7 +487,7 @@ var spiki = (() => {
505
487
  return {
506
488
  unmount: () => {
507
489
  if (state.destroy) state.destroy.call(state);
508
- cleanups.forEach(cleanup => cleanup());
490
+ cleanups.forEach(c => c());
509
491
  for(var k in listeners) rootElement.removeEventListener(k, handle);
510
492
  rootElement._m = false;
511
493
  }
@@ -516,7 +498,8 @@ var spiki = (() => {
516
498
  data: (name, factory) => { cmpReg[name] = factory; },
517
499
  start: () => {
518
500
  var els = document.querySelectorAll('[s-data]');
519
- for(var i=0; i<els.length; i++) mount(els[i]);
501
+ var i = els.length;
502
+ while (i--) mount(els[i]);
520
503
  },
521
504
  store: (k, v) => v === undefined ? globalStore[k] : (globalStore[k] = v),
522
505
  raw: (o) => (o && o._p) || o
package/spiki.esm.min.js CHANGED
@@ -1 +1 @@
1
- var spiki=(()=>{var S=Object,T=Array,v=Reflect,e=Promise,a=Node,$=document,l=console,O="length",q="value",C="push",j="forEach",K="indexOf",M="split",B="slice",D="call",F="prototype",f="hasOwnProperty",p="getPrototypeOf",t="defineProperty",H="create",R="isArray",W="getAttribute",z="removeAttribute",G="hasAttribute",i="classList",I="tagName",J="type",Q="name",s="checked",U="parentNode",V="nextSibling",n="innerHTML",X="replaceWith",Y="insertBefore",Z="cloneNode",ee="remove",re="createTextNode",te="checkbox",ae="function",ne="object",oe="unshift",le="cleanups",se="nodes",o="deps",ie="destroy",ve="init",u=S[H](null),c=[],d=!1,h=null,_=!1,r=e.resolve(),fe=e=>{e._q||(e._q=!0,c[C](e),d||(d=!0,r.then(()=>{var e=c[B]();d=!(c=[]);for(var r=0;r<e[O];r++)e[r]._q=!1,e[r]()})))},pe=(e,r)=>{if(-1===r[K]("."))return{val:e[r],ctx:e};for(var t=r[M]("."),a=e,n=e,o=0;o<t[O];o++){if(null==a)return l.warn("Property undefined: "+r),{val:void 0,ctx:null};a=(n=a)[t[o]]}return{val:a,ctx:n}},y={};[C,"pop","shift",oe,"splice","sort","reverse"][j](e=>{y[e]=function(){_=!0;try{return T[F][e].apply(this,arguments)}finally{_=!1,m(this,O)}}});var ue=(e,r)=>{!h||-1===(r=(e=e._d||(S[t](e,"_d",{value:S[H](null),writable:!0}),e._d))[r]||(e[r]=[]))[K](h)&&(r[C](h),h[o][C](r))},m=(e,r)=>{if(!_&&e._d&&e._d[r])for(var t=e._d[r][B](),a=0;a<t[O];a++){var n=t[a];n.sched?n.sched(n):n()}},g=e=>{for(var r=0;r<e[o][O];r++){var t=e[o][r],a=t[K](e);-1!==a&&(t[a]=t[t[O]-1],t.pop())}e[o]=[]},ce=(r,e)=>{var t=()=>{g(t);var e=h;h=t;try{r()}finally{h=e}};return t[o]=[],t.sched=e,t(),()=>g(t)},de=e=>{if(!e||typeof e!=ne||e._y||e instanceof a)return e;if(e._p)return e._p;var r=new Proxy(e,{get:(e,r,t)=>"_y"===r||("_d"===r?e._d:T[R](e)&&y[f](r)?y[r]:(ue(e,r),!(t=v.get(e,r,t))||typeof t!=ne||t instanceof a?t:de(t))),set:(e,r,t,a)=>{var n=e[r],o=T[R](e),l=o?Number(r)<e[O]:S[F][f][D](e,r);if(!o&&!l)for(var s=S[p](e);s&&s!==S[F];){if(S[F][f][D](s,r)){var i=v.set(s,r,t);return _||t===n||m(e,r),i}s=S[p](s)}return i=v.set(e,r,t,a),!_&&i&&(l&&t===n||(m(e,r),o?m(e,O):l||m(e,"_k"))),i},deleteProperty:(e,r)=>{var t=S[F][f][D](e,r),a=v.deleteProperty(e,r);return a&&t&&(m(e,r),T[R](e)?m(e,O):m(e,"_k")),a},ownKeys:e=>(ue(e,"_k"),v.ownKeys(e))});return S[t](e,"_p",{value:r,enumerable:!1}),r},x=de({}),he={text:(e,r)=>{e.textContent=null==r?"":r},html:(e,r)=>{e[n]!=r&&(e[n]=null==r?"":r)},value:(e,r)=>{e[J]===te?e[s]=!!r:"radio"===e[J]?e[s]=e[q]==r:e[q]!=r&&(e[q]=null==r?"":r)},attr:(e,r,t)=>{null==r||!1===r?e[z](t):e.setAttribute(t,!0===r?"":r)},class:(e,r)=>{if("string"==typeof r)for(var t=r.match(/\S+/g)||[],a=0;a<t[O];a++){var n=t[a];"!"===n[0]?e[i][ee](n[B](1)):e[i].add(n)}else if(r)for(var o in r){var l=!!r[o];if(-1!==o[K](" "))for(var t=o[M](/\s+/),s=0;s<t[O];s++)t[s]&&e[i].toggle(t[s],l);else e[i].toggle(o,l)}},effect:()=>{}},_e=(k,e)=>{if(!k._m){var r=k[W]("s-data");if(u[r]){k._m=!0,r=u[r](),e&&S.setPrototypeOf(r,e);var E=de(r);E.$refs={},E.$root=k,E.$store=x,E.$parent=e;var t=[],a=S[H](null),n=e=>{for(var r=e.target;r&&r!==k[U];){var t=r._h&&r._h[e[J]];if(t)for(var a=0;a<t[O];a++){var n,o,l=t[a];l.model?(n=r[J]===te?r[s]:r[q],(o=pe(r._s,l.path)).ctx&&(o.ctx[o.ctx===r._s?l.path:l.path[M](".").pop()]=n)):typeof(o=pe(r._s,l.path)).val==ae&&o.val[D](o.ctx,e)}r=r[U]}},N=e=>{a[e]||(a[e]=!0,k.addEventListener(e,n))},L=(_,y,t)=>{if(1===_.nodeType&&!_[G]("s-ignore"))if(_!==k&&_[G]("s-data"))(r=_e(_,y))&&t[C](r.unmount);else{var e=_[W]("s-if"),r=!e&&"TEMPLATE"===_[I]&&_[W]("s-for"),a=[];if(e){var m=$[re](""),n=null,o=[];_[X](m);var l="!"===e[0],s=l?e[B](1):e;return t[C](()=>{o[j](e=>e())}),t[C](ce(()=>{var e=pe(y,s).val;l&&(e=!e),e?n||((n=_[Z](!0))[z]("s-if"),L(n,y,o),m[U][Y](n,m)):n&&(o[j](e=>e()),o=[],n[ee](),n=null)},fe))}if(r&&(e=r.match(/^\s*(.*?)\s+in\s+(.+)\s*$/))){var g,x=(r=e[1][M](",").map(e=>e.trim().replace(/[()]/g,"")))[0],b=r[1],P=e[2].trim(),w=_[W]("s-key"),m=$[re](""),A=S[H](null);return _[X](m),t[C](()=>{for(var e in A)A[e][le][j](e=>e())}),t[C](ce(()=>{var e=pe(y,P).val||[];T[R](e)&&ue(e,O);var r=$.createDocumentFragment(),t=m;g=S[H](null);for(var a=T[R](e),n=a?e:S.keys(e),o=(a?e:n)[O],l=0;l<o;l++){var s=a?l:n[l],i=a?e[l]:e[s],v=null==i||typeof i!=ne?String(i):w?pe(i,w).val:String(s)+"_o";g[v]&&(v+="_"+l);var f=A[v];if(f)f.scope[x]=i,b&&(f.scope[b]=s);else{var p=_.content[Z](!0),u=de(S[H](y));u[x]=i,b&&(u[b]=s);for(var c=T[F][B][D](p.childNodes),d=[],h=0;h<c[O];h++)L(c[h],u,d);f={nodes:c,scope:u,cleanups:d},A[v]=f}if(f[se][0]!==t[V]){for(h=0;h<f[se][O];h++)r.appendChild(f[se][h]);t[U][Y](r,t[V])}t=f[se][f[se][O]-1],g[v]=!0}for(s in A)if(!g[s]){for(A[s][le][j](e=>e()),h=0;h<A[s][se][O];h++)A[s][se][h][ee]();delete A[s]}},fe))}if(_.hasAttributes())for(var i=_.attributes,v=0;v<i[O];v++){var f,p,u=i[v][Q],c=i[v][q];":"===u[0]?(f=u[B](1),p="!"===c[0],a[C]({type:"attr",name:f,path:p?c[B](1):c,neg:p})):0===u[K]("s-")&&((p=u[B](2))===ve||p===ie?(e=>{var r=pe(y,c);typeof r.val==ae&&(e===ve?fe(()=>r.val[D](r.ctx,_)):t[C](()=>r.val[D](r.ctx,_)))})(p):"model"===p?(a[C]({type:q,path:c}),_._s=y,_._h=_._h||{},u=_[J]===te||"radio"===_[J]||"SELECT"===_[I]?"change":"input",(_._h[u]=_._h[u]||[])[oe]({model:!0,path:c}),N(u)):"ref"===p?E.$refs[c]=_:he[p]?a[C]({type:p,path:c}):(_._s=y,_._h=_._h||{},(_._h[p]=_._h[p]||[])[C]({path:c}),N(p)))}a[O]&&t[C](ce(()=>{for(var e=0;e<a[O];e++){var r=a[e],t=(t=pe(y,r.path)).val&&typeof t.val==ae?t.val[D](t.ctx,_):t.val;"attr"===r[J]?(r.neg&&(t=!t),"class"===r[Q]?he.class(_,t):he.attr(_,t,r[Q])):he[r[J]](_,t)}},fe));for(var d=_.firstChild;d;){var h=d[V];L(d,y,t),d=h}}};return L(k,E,t),E[ve]&&E[ve](),{unmount:()=>{for(var e in E[ie]&&E[ie][D](E),t[j](e=>e()),a)k.removeEventListener(e,n);k._m=!1}}}}};return{data:(e,r)=>{u[e]=r},start:()=>{for(var e=$.querySelectorAll("[s-data]"),r=0;r<e[O];r++)_e(e[r])},store:(e,r)=>void 0===r?x[e]:x[e]=r,raw:e=>e&&e._p||e}})();export default spiki;
1
+ var spiki=(()=>{var L=Object,$=Array,s=Reflect,r=Promise,o=Node,q=document,j="length",D="value",F="push",K="forEach",M="indexOf",B="split",H="slice",R="call",i="get",W="prototype",f="hasOwnProperty",p="getPrototypeOf",t="defineProperty",z="create",G="isArray",I="getAttribute",J="removeAttribute",Q="hasAttribute",U="tagName",V="type",X="name",c="checked",Y="parentNode",Z="nextSibling",a="textContent",n="innerHTML",rr="replaceWith",er="insertBefore",tr="cloneNode",ar="remove",nr="createTextNode",or="addEventListener",ir="input",lr="checkbox",vr="function",sr="class",fr="object",pr="unshift",ur="trim",cr="cleanups",dr="nodes",l="deps",_r="className",yr="destroy",hr="init",mr="charCodeAt",v="sched",u=L[z](null),d=[],_=!1,y=null,h=!1,e=r.resolve(),gr=r=>{r._q||(r._q=!0,d[F](r),_||(_=!0,e.then(()=>{var r=d;_=!(d=[]);for(var e=r[j];e--;)r[e]._q=!1,r[e]()})))},br=(r,e)=>{if("string"==typeof e)return{ctx:r,val:r?r[e]:void 0};for(var t=0,a=e[j];t<a-1&&r;)r=r[e[t++]];return{ctx:r,val:r?r[e[a-1]]:void 0}},m={};[F,"pop","shift",pr,"splice","sort","reverse"][K](r=>{m[r]=function(){h=!0;try{return $[W][r].apply(this,arguments)}finally{h=!1,g(this,j)}}});var xr=(r,e)=>{!y||-1===(e=(r=r._d||(L[t](r,"_d",{value:L[z](null),writable:!0}),r._d))[e]||(r[e]=[]))[M](y)&&(e[F](y),y[l][F](e))},g=(r,e)=>{if(!h&&r._d&&r._d[e])for(var t=r._d[e][H](),a=0,n=t[j];a<n;a++){var o=t[a];o[v]?o[v](o):o()}},b=r=>{for(var e=r[l][j];e--;){var t=r[l][e],a=t[M](r);-1!==a&&(t[a]=t[t[j]-1],t.pop())}r[l]=[]},Ar=(e,r)=>{var t=()=>{b(t);var r=y;y=t;try{e()}finally{y=r}};return t[l]=[],t[v]=r,t(),()=>b(t)},Pr=r=>{if(!r||typeof r!=fr||r._y||r instanceof o)return r;if(r._p)return r._p;var e=new Proxy(r,{get:(r,e,t)=>{if("_y"===e)return!0;if("_d"===e)return r._d;if($[G](r)&&m[f](e))return m[e];var a=L.getOwnPropertyDescriptor(r,e);if(a&&a[i]){var n="_"+e;return n in r||Ar(()=>t[n]=a[i][R](t)),t[n]}return xr(r,e),!(e=s[i](r,e,t))||typeof e!=fr||e instanceof o?e:Pr(e)},set:(r,e,t,a)=>{var n=r[e],o=$[G](r),i=o?Number(e)<r[j]:L[W][f][R](r,e);if(!o&&!i)for(var l=L[p](r);l&&l!==L[W];){if(L[W][f][R](l,e)){var v=s.set(l,e,t);return h||t===n||g(r,e),v}l=L[p](l)}return v=s.set(r,e,t,a),!h&&v&&(i&&t===n||(g(r,e),o?g(r,j):i||g(r,"_k"))),v},deleteProperty:(r,e)=>{var t=L[W][f][R](r,e),a=s.deleteProperty(r,e);return a&&t&&(g(r,e),$[G](r)?g(r,j):g(r,"_k")),a},ownKeys:r=>(xr(r,"_k"),s.ownKeys(r))});return L[t](r,"_p",{value:e,enumerable:!1}),e},x=Pr({}),wr=L[z](null);wr.text=(r,e)=>{e=null==e?"":e,r[a]!==String(e)&&(r[a]=e)},wr.html=(r,e)=>{r[n]!=e&&(r[n]=null==e?"":e)},wr[D]=(r,e)=>{r[V]===lr?r[c]=!!e:"radio"===r[V]?r[c]=r[D]==e:r[D]!=e&&(r[D]=null==e?"":e)},wr.attr=(r,e,t)=>{null==e||!1===e?r[J](t):(e=!0===e?"":String(e),r[I](t)!==e&&r.setAttribute(t,e))},wr[sr]=(r,e)=>{var t=r._n||"",a="";if("string"==typeof e)a=e;else if(e)for(var n in e)e[n]&&(a+=(a?" ":"")+n);t=t+(t&&a?" ":"")+a,r[_r]!==t&&(r[_r]=t)};var Nr=(E,r)=>{if(!E._m){var e=E[I]("s-data");if(u[e]){E._m=!0,e=u[e](),r&&L.setPrototypeOf(e,r);var S=Pr(e);S.$refs={},S.$root=E,S.$store=x,S.$parent=r;var t=[],a=L[z](null),O=r=>{var e=r.target;if(r[V]!==ir||!e._c)for(var t=E[Y],a=r[V];e&&e!==t;){var n=e._h&&e._h[a];if(n)for(var o=e._s,i=n[j];i--;){var l=n[i],v=l.p;if(l.model){var s=e[V]===lr?e[c]:e[D];if("string"!=typeof s||(l=s[ur]())&&isFinite(l)&&(48===l[mr](0)&&1!==l[j]&&46!==l[mr](1)||(s=Number(l))),"string"==typeof v)o&&(o[v]=s);else{for(var f=o,p=0,u=v[j]-1;p<u&&f;)f=f[v[p++]];f&&(f[v[u]]=s)}}else typeof(s=br(o,v)).val==vr&&s.val[R](s.ctx,r)}e=e[Y]}},T=r=>{a[r]||(a[r]=!0,E[or](r,O))},C=(h,m,t)=>{if(1===h.nodeType&&!h[Q]("s-ignore"))if(h!==E&&h[Q]("s-data"))(r=Nr(h,m))&&t[F](r.unmount);else{var r=!(v=h[I]("s-if"))&&"TEMPLATE"===h[U]&&h[I]("s-for"),a=[];if(h[Q](sr)&&!h._n&&(h._n=h[_r]),v){var g=q[nr](""),e=null,n=[];h[rr](g);var o="!"===v[0],i=-1===(l=o?v[H](1):v)[M](".")?l:l[B](".");return t[F](()=>{n[K](r=>r())}),t[F](Ar(()=>{var r=br(m,i).val;o&&(r=!r),r?e||((e=h[tr](!0))[J]("s-if"),C(e,m,n),g[Y][er](e,g)):e&&(n[K](r=>r()),n=[],e[ar](),e=null)},gr))}if(r&&-1!==(v=r[M](" in "))){var b,l=r[H](0,v)[ur](),v=r[H](v+4)[ur](),x=(l=l.replace(/[()]/g,"")[B](","))[0][ur](),A=l[1]?l[1][ur]():null,P=-1===v[M](".")?v:v[B]("."),w=(v=h[I]("s-key"))?-1===v[M](".")?v:v[B]("."):null,g=q[nr](""),N=L[z](null);return h[rr](g),t[F](()=>{for(var r in N)N[r][cr][K](r=>r())}),t[F](Ar(()=>{var r=br(m,P).val||[];$[G](r)&&xr(r,j);var e=q.createDocumentFragment(),t=g;b=L[z](null);for(var a,n=$[G](r),o=n?r:L.keys(r),i=(n?r:o)[j],l=0;l<i;l++){var v=n?l:o[l],s=n?r[l]:r[v],f=null==s||typeof s!=fr?String(s):w?br(s,w).val:String(v)+"_o";b[f]&&(f+="_"+l);var p=N[f];if(p)p.scope[x]=s,A&&(p.scope[A]=v);else{var u=h.content[tr](!0),c=Pr(L[z](m));c[x]=s,A&&(c[A]=v);for(var d=$[W][H][R](u.childNodes),_=[],y=0;y<d[j];y++)C(d[y],c,_);p={nodes:d,scope:c,cleanups:_},N[f]=p}if(p[dr][0]!==t[Z]){for(y=0;y<p[dr][j];y++)e.appendChild(p[dr][y]);t[Y][er](e,t[Z])}t=p[dr][p[dr][j]-1],b[f]=!0}for(a in N)b[a]||(N[a][cr][K](r=>r()),N[a][dr][K](r=>r[ar]()),delete N[a])},gr))}if(h.hasAttributes())for(var s=h.attributes,f=s[j];f--;){var p,u,c=s[f],d=c[X],_=c[D];58===d[mr](0)?(p=d[H](1),c=(u=33===_[mr](0))?_[H](1):_,i=-1===c[M](".")?c:c[B]("."),a[F]({type:"attr",name:p,path:i,neg:u})):115===d[mr](0)&&45===d[mr](1)&&(u=d[H](2),i=-1===_[M](".")?_:_[B]("."),u===hr||u===yr?(r=>{var e=br(m,i);typeof e.val==vr&&(r===hr?gr(()=>e.val[R](e.ctx,h)):t[F](()=>e.val[R](e.ctx,h)))})(u):"effect"===u?t[F](Ar(()=>{var r=br(m,i);typeof r.val==vr&&r.val[R](r.ctx,h)},gr)):"model"===u?(a[F]({type:D,path:i}),h._s=m,h._h=h._h||{},(d=h[V]===lr||"radio"===h[V]||"SELECT"===h[U]?"change":ir)==ir&&(h[or]("compositionstart",()=>h._c=!0),h[or]("compositionend",()=>{h._c=!1,O({target:h,type:ir})})),(h._h[d]=h._h[d]||[])[pr]({model:!0,p:i}),T(d)):"ref"===u?S.$refs[_]=h:wr[u]?a[F]({type:u,path:i}):(h._s=m,h._h=h._h||{},(h._h[u]=h._h[u]||[])[F]({p:i}),T(u)))}a[j]&&t[F](Ar(()=>{for(var r=a[j];r--;){var e=a[r],t=(t=br(m,e.path)).val&&typeof t.val==vr?t.val[R](t.ctx,h):t.val;"attr"===e[V]?(e.neg&&(t=!t),e[X]===sr?wr[sr](h,t):wr.attr(h,t,e[X])):wr[e[V]](h,t)}},gr));for(var y=h.firstChild;y;){var k=y[Z];C(y,m,t),y=k}}};return C(E,S,t),S[hr]&&S[hr](),{unmount:()=>{for(var r in S[yr]&&S[yr][R](S),t[K](r=>r()),a)E.removeEventListener(r,O);E._m=!1}}}}};return{data:(r,e)=>{u[r]=e},start:()=>{for(var r=q.querySelectorAll("[s-data]"),e=r[j];e--;)Nr(r[e])},store:(r,e)=>void 0===e?x[r]:x[r]=e,raw:r=>r&&r._p||r}})();export default spiki;
package/spiki.js CHANGED
@@ -21,15 +21,14 @@ var spiki = (() => {
21
21
  if (!fn._q) {
22
22
  fn._q = true;
23
23
  scheduler.push(fn);
24
-
25
24
  if (!isFlushing) {
26
25
  isFlushing = true;
27
26
  resolved.then(() => {
28
- var queue = scheduler.slice();
27
+ var queue = scheduler;
29
28
  scheduler = [];
30
29
  isFlushing = false;
31
-
32
- for (var i = 0; i < queue.length; i++) {
30
+ var i = queue.length;
31
+ while (i--) {
33
32
  queue[i]._q = false;
34
33
  queue[i]();
35
34
  }
@@ -39,23 +38,17 @@ var spiki = (() => {
39
38
  };
40
39
 
41
40
  var evalPath = (scope, path) => {
42
- if (path.indexOf('.') === -1) {
43
- return { val: scope[path], ctx: scope };
41
+ if (typeof path === 'string') {
42
+ return { ctx: scope, val: scope ? scope[path] : undefined };
44
43
  }
45
-
46
- var parts = path.split('.');
47
- var val = scope;
48
- var ctx = scope;
49
-
50
- for (var i = 0; i < parts.length; i++) {
51
- if (val == null) {
52
- console.warn('Property undefined: ' + path);
53
- return { val: undefined, ctx: null };
54
- }
55
- ctx = val;
56
- val = val[parts[i]];
44
+ var i = 0, len = path.length;
45
+ while (i < len - 1 && scope) {
46
+ scope = scope[path[i++]];
57
47
  }
58
- return { val: val, ctx: ctx };
48
+ return {
49
+ ctx: scope,
50
+ val: scope ? scope[path[len - 1]] : undefined
51
+ };
59
52
  };
60
53
 
61
54
  // -------------------------------------------------------------------------
@@ -65,24 +58,18 @@ var spiki = (() => {
65
58
  var arrInst = {};
66
59
 
67
60
  arrMethods.forEach(method => {
68
- arrInst[method] = function() {
61
+ arrInst[method] = function(...args) {
69
62
  pauseTracking = true;
70
- try {
71
- return Array.prototype[method].apply(this, arguments);
72
- } finally {
73
- pauseTracking = false;
74
- trigger(this, 'length');
75
- }
63
+ try { return Array.prototype[method].apply(this, args); }
64
+ finally { pauseTracking = false; trigger(this, 'length'); }
76
65
  };
77
66
  });
78
67
 
79
68
  var track = (target, key) => {
80
69
  if (activeEffect) {
81
70
  var deps = target._d || (Object.defineProperty(target, '_d', {
82
- value: Object.create(null),
83
- writable: true
71
+ value: Object.create(null), writable: true
84
72
  }), target._d);
85
-
86
73
  var list = deps[key] || (deps[key] = []);
87
74
  if (list.indexOf(activeEffect) === -1) {
88
75
  list.push(activeEffect);
@@ -94,7 +81,8 @@ var spiki = (() => {
94
81
  var trigger = (target, key) => {
95
82
  if (!pauseTracking && target._d && target._d[key]) {
96
83
  var effects = target._d[key].slice();
97
- for (var i = 0; i < effects.length; i++) {
84
+ var i = 0, len = effects.length;
85
+ for (; i < len; i++) {
98
86
  var effect = effects[i];
99
87
  effect.sched ? effect.sched(effect) : effect();
100
88
  }
@@ -102,7 +90,8 @@ var spiki = (() => {
102
90
  };
103
91
 
104
92
  var cleanup = (runner) => {
105
- for (var i = 0; i < runner.deps.length; i++) {
93
+ var i = runner.deps.length;
94
+ while (i--) {
106
95
  var list = runner.deps[i];
107
96
  var idx = list.indexOf(runner);
108
97
  if (idx !== -1) {
@@ -118,11 +107,7 @@ var spiki = (() => {
118
107
  cleanup(runner);
119
108
  var prev = activeEffect;
120
109
  activeEffect = runner;
121
- try {
122
- fn();
123
- } finally {
124
- activeEffect = prev;
125
- }
110
+ try { fn(); } finally { activeEffect = prev; }
126
111
  };
127
112
  runner.deps = [];
128
113
  runner.sched = sched;
@@ -139,20 +124,20 @@ var spiki = (() => {
139
124
  if (key === '_y') return true;
140
125
  if (key === '_d') return target._d;
141
126
  if (Array.isArray(target) && arrInst.hasOwnProperty(key)) return arrInst[key];
142
-
127
+ var desc = Object.getOwnPropertyDescriptor(target, key);
128
+ if (desc && desc.get) {
129
+ var cacheKey = '_' + key;
130
+ if (!(cacheKey in target)) effect(() => receiver[cacheKey] = desc.get.call(receiver));
131
+ return receiver[cacheKey];
132
+ }
143
133
  track(target, key);
144
134
  var res = Reflect.get(target, key, receiver);
145
- return (res && typeof res === 'object' && !(res instanceof Node))
146
- ? makeReactive(res)
147
- : res;
135
+ return (res && typeof res === 'object' && !(res instanceof Node)) ? makeReactive(res) : res;
148
136
  },
149
137
  set: (target, key, val, receiver) => {
150
138
  var old = target[key];
151
139
  var isArr = Array.isArray(target);
152
- var hadKey = isArr
153
- ? Number(key) < target.length
154
- : Object.prototype.hasOwnProperty.call(target, key);
155
-
140
+ var hadKey = isArr ? Number(key) < target.length : Object.prototype.hasOwnProperty.call(target, key);
156
141
  if (!isArr && !hadKey) {
157
142
  var proto = Object.getPrototypeOf(target);
158
143
  while (proto && proto !== Object.prototype) {
@@ -164,7 +149,6 @@ var spiki = (() => {
164
149
  proto = Object.getPrototypeOf(proto);
165
150
  }
166
151
  }
167
-
168
152
  var res = Reflect.set(target, key, val, receiver);
169
153
  if (!pauseTracking && res) {
170
154
  if (!hadKey || val !== old) {
@@ -200,53 +184,36 @@ var spiki = (() => {
200
184
  // -------------------------------------------------------------------------
201
185
  // 3. DOM & COMPONENT ENGINE
202
186
  // -------------------------------------------------------------------------
203
- var domOps = {
204
- text: (el, val) => {
205
- el.textContent = val == null ? '' : val;
206
- },
207
- html: (el, val) => {
208
- if (el.innerHTML != val) el.innerHTML = val == null ? '' : val;
209
- },
210
- value: (el, val) => {
211
- if (el.type === 'checkbox') {
212
- el.checked = !!val;
213
- } else if (el.type === 'radio') {
214
- el.checked = (el.value == val);
215
- } else if (el.value != val) {
216
- el.value = val == null ? '' : val;
217
- }
218
- },
219
- attr: (el, val, name) => {
220
- if (val == null || val === false) {
221
- el.removeAttribute(name);
222
- } else {
223
- el.setAttribute(name, val === true ? '' : val);
224
- }
225
- },
226
- class: (el, val) => {
227
- if (typeof val === 'string') {
228
- var parts = val.match(/\S+/g) || [];
229
- for (var i = 0; i < parts.length; i++) {
230
- var c = parts[i];
231
- c[0] === '!'
232
- ? el.classList.remove(c.slice(1))
233
- : el.classList.add(c);
234
- }
235
- } else if (val) {
236
- for (var cls in val) {
237
- var add = !!val[cls];
238
- if (cls.indexOf(' ') !== -1) {
239
- var parts = cls.split(/\s+/);
240
- for (var j=0; j<parts.length; j++) {
241
- if(parts[j]) el.classList.toggle(parts[j], add);
242
- }
243
- } else {
244
- el.classList.toggle(cls, add);
245
- }
246
- }
247
- }
248
- },
249
- effect: () => {}
187
+ var domOps = Object.create(null);
188
+ domOps.text = (el, val) => {
189
+ val = val == null ? '' : val;
190
+ if (el.textContent !== String(val)) el.textContent = val;
191
+ };
192
+ domOps.html = (el, val) => {
193
+ if (el.innerHTML != val) el.innerHTML = val == null ? '' : val;
194
+ };
195
+ domOps.value = (el, val) => {
196
+ if (el.type === 'checkbox') el.checked = !!val;
197
+ else if (el.type === 'radio') el.checked = (el.value == val);
198
+ else if (el.value != val) el.value = val == null ? '' : val;
199
+ };
200
+ domOps.attr = (el, val, name) => {
201
+ if (val == null || val === false) el.removeAttribute(name);
202
+ else {
203
+ var str = val === true ? '' : String(val);
204
+ if (el.getAttribute(name) !== str) el.setAttribute(name, str);
205
+ }
206
+ };
207
+ domOps.class = (el, val) => {
208
+ var base = el._n || '';
209
+ var dyn = '';
210
+ if (typeof val === 'string') {
211
+ dyn = val;
212
+ } else if (val) {
213
+ for (var k in val) if (val[k]) dyn += (dyn ? ' ' : '') + k;
214
+ }
215
+ var res = base + (base && dyn ? ' ' : '') + dyn;
216
+ if (el.className !== res) el.className = res;
250
217
  };
251
218
 
252
219
  var mount = (rootElement, parentScope) => {
@@ -270,19 +237,40 @@ var spiki = (() => {
270
237
 
271
238
  var handle = (event) => {
272
239
  var target = event.target;
273
- while (target && target !== rootElement.parentNode) {
274
- var handlers = target._h && target._h[event.type];
240
+ if (event.type === 'input' && target._c) return;
241
+ var limit = rootElement.parentNode;
242
+ var type = event.type;
243
+
244
+ while (target && target !== limit) {
245
+ var handlers = target._h && target._h[type];
246
+
275
247
  if (handlers) {
276
- for (var i = 0; i < handlers.length; i++) {
248
+ var scope = target._s;
249
+ var i = handlers.length;
250
+ while (i--) {
277
251
  var handler = handlers[i];
252
+ var path = handler.p;
253
+
278
254
  if (handler.model) {
279
255
  var val = target.type === 'checkbox' ? target.checked : target.value;
280
- var result = evalPath(target._s, handler.path);
281
- if (result.ctx) {
282
- result.ctx[result.ctx === target._s ? handler.path : handler.path.split('.').pop()] = val;
256
+ if (typeof val === 'string') {
257
+ var clean = val.trim();
258
+ if (clean && isFinite(clean)) {
259
+ if (clean.charCodeAt(0) !== 48 || clean.length === 1 || clean.charCodeAt(1) === 46) {
260
+ val = Number(clean);
261
+ }
262
+ }
263
+ }
264
+ if (typeof path === 'string') {
265
+ if (scope) scope[path] = val;
266
+ } else {
267
+ var ctx = scope;
268
+ var k = 0, kLen = path.length - 1;
269
+ while (k < kLen && ctx) ctx = ctx[path[k++]];
270
+ if (ctx) ctx[path[kLen]] = val;
283
271
  }
284
272
  } else {
285
- var result = evalPath(target._s, handler.path);
273
+ var result = evalPath(scope, path);
286
274
  if (typeof result.val === 'function') result.val.call(result.ctx, event);
287
275
  }
288
276
  }
@@ -311,21 +299,22 @@ var spiki = (() => {
311
299
  var directiveFor = !directiveIf && el.tagName === 'TEMPLATE' && el.getAttribute('s-for');
312
300
  var bindings = [];
313
301
 
302
+ if (el.hasAttribute('class') && !el._n) el._n = el.className;
303
+
314
304
  if (directiveIf) {
315
305
  var end = document.createTextNode('');
316
306
  var active = null;
317
307
  var cBranch = [];
318
-
319
308
  el.replaceWith(end);
320
309
  var negate = directiveIf[0] === '!';
321
310
  var path = negate ? directiveIf.slice(1) : directiveIf;
311
+ var p = path.indexOf('.') === -1 ? path : path.split('.');
322
312
 
323
- parentCleanups.push(() => { cBranch.forEach(cleanup => cleanup()); });
313
+ parentCleanups.push(() => { cBranch.forEach(c => c()); });
324
314
 
325
315
  return parentCleanups.push(effect(() => {
326
- var show = evalPath(scope, path).val;
316
+ var show = evalPath(scope, p).val;
327
317
  if (negate) show = !show;
328
-
329
318
  if (show) {
330
319
  if (!active) {
331
320
  active = el.cloneNode(true);
@@ -334,40 +323,38 @@ var spiki = (() => {
334
323
  end.parentNode.insertBefore(active, end);
335
324
  }
336
325
  } else if (active) {
337
- cBranch.forEach(cleanup => cleanup());
338
- cBranch = [];
339
- active.remove();
340
- active = null;
326
+ cBranch.forEach(c => c()); cBranch = []; active.remove(); active = null;
341
327
  }
342
328
  }, nextTick));
343
329
  }
344
330
 
345
331
  if (directiveFor) {
346
- var regexMatch = directiveFor.match(/^\s*(.*?)\s+in\s+(.+)\s*$/);
347
- if (regexMatch) {
348
- var leftHandSide = regexMatch[1].split(',').map(s => s.trim().replace(/[()]/g, ''));
349
- var alias = leftHandSide[0];
350
- var idxAlias = leftHandSide[1];
351
- var listKey = regexMatch[2].trim();
332
+ var inIdx = directiveFor.indexOf(' in ');
333
+ if (inIdx !== -1) {
334
+ var leftSide = directiveFor.slice(0, inIdx).trim();
335
+ var listKey = directiveFor.slice(inIdx + 4).trim();
336
+ var leftParts = leftSide.replace(/[()]/g, '').split(',');
337
+ var alias = leftParts[0].trim();
338
+ var idxAlias = leftParts[1] ? leftParts[1].trim() : null;
339
+ var listPath = listKey.indexOf('.') === -1 ? listKey : listKey.split('.');
352
340
  var keyAttr = el.getAttribute('s-key');
341
+ var keyPath = keyAttr ? (keyAttr.indexOf('.') === -1 ? keyAttr : keyAttr.split('.')) : null;
342
+
353
343
  var end = document.createTextNode('');
354
344
  var nodePool = Object.create(null);
355
345
  var usedKeys;
356
-
357
346
  el.replaceWith(end);
358
347
 
359
348
  parentCleanups.push(() => {
360
- for(var key in nodePool) nodePool[key].cleanups.forEach(cleanup => cleanup());
349
+ for(var k in nodePool) nodePool[k].cleanups.forEach(c => c());
361
350
  });
362
351
 
363
352
  return parentCleanups.push(effect(() => {
364
- var list = evalPath(scope, listKey).val || [];
353
+ var list = evalPath(scope, listPath).val || [];
365
354
  if (Array.isArray(list)) track(list, 'length');
366
-
367
355
  var frag = document.createDocumentFragment();
368
356
  var cursor = end;
369
357
  usedKeys = Object.create(null);
370
-
371
358
  var isArr = Array.isArray(list);
372
359
  var keys = isArr ? list : Object.keys(list);
373
360
  var len = isArr ? list.length : keys.length;
@@ -375,18 +362,12 @@ var spiki = (() => {
375
362
  for (var i = 0; i < len; i++) {
376
363
  var key = isArr ? i : keys[i];
377
364
  var item = isArr ? list[i] : list[key];
378
-
379
365
  var unique;
380
- if (item == null || typeof item !== 'object') {
381
- unique = String(item);
382
- } else if (keyAttr) {
383
- unique = evalPath(item, keyAttr).val;
384
- } else {
385
- unique = String(key) + '_o';
386
- }
366
+ if (item == null || typeof item !== 'object') unique = String(item);
367
+ else if (keyPath) unique = evalPath(item, keyPath).val;
368
+ else unique = String(key) + '_o';
387
369
 
388
370
  if (usedKeys[unique]) unique += '_' + i;
389
-
390
371
  var row = nodePool[unique];
391
372
  if (row) {
392
373
  row.scope[alias] = item;
@@ -394,19 +375,13 @@ var spiki = (() => {
394
375
  } else {
395
376
  var clone = el.content.cloneNode(true);
396
377
  var rowScope = makeReactive(Object.create(scope));
397
-
398
- rowScope[alias] = item;
399
- if (idxAlias) rowScope[idxAlias] = key;
400
-
378
+ rowScope[alias] = item; if (idxAlias) rowScope[idxAlias] = key;
401
379
  var rowNodes = Array.prototype.slice.call(clone.childNodes);
402
380
  var rowCleanups = [];
403
-
404
381
  for(var n=0; n<rowNodes.length; n++) walk(rowNodes[n], rowScope, rowCleanups);
405
-
406
382
  row = { nodes: rowNodes, scope: rowScope, cleanups: rowCleanups };
407
383
  nodePool[unique] = row;
408
384
  }
409
-
410
385
  if (row.nodes[0] !== cursor.nextSibling) {
411
386
  for(var n=0; n<row.nodes.length; n++) frag.appendChild(row.nodes[n]);
412
387
  cursor.parentNode.insertBefore(frag, cursor.nextSibling);
@@ -414,13 +389,10 @@ var spiki = (() => {
414
389
  cursor = row.nodes[row.nodes.length-1];
415
390
  usedKeys[unique] = true;
416
391
  }
417
-
418
- for (var key in nodePool) {
419
- if (!usedKeys[key]) {
420
- nodePool[key].cleanups.forEach(cleanup => cleanup());
421
- for(var n=0; n<nodePool[key].nodes.length; n++) nodePool[key].nodes[n].remove();
422
- delete nodePool[key];
423
- }
392
+ for (var k in nodePool) if (!usedKeys[k]) {
393
+ nodePool[k].cleanups.forEach(c => c());
394
+ nodePool[k].nodes.forEach(n => n.remove());
395
+ delete nodePool[k];
424
396
  }
425
397
  }, nextTick));
426
398
  }
@@ -428,45 +400,57 @@ var spiki = (() => {
428
400
 
429
401
  if (el.hasAttributes()) {
430
402
  var attrs = el.attributes;
431
- for (var i = 0; i < attrs.length; i++) {
432
- var attrName = attrs[i].name;
433
- var attrValue = attrs[i].value;
403
+ var i = attrs.length;
404
+ while (i--) {
405
+ var attr = attrs[i];
406
+ var attrName = attr.name;
407
+ var attrValue = attr.value;
434
408
 
435
- if (attrName[0] === ':') {
409
+ if (attrName.charCodeAt(0) === 58) {
436
410
  var realName = attrName.slice(1);
437
- var neg = attrValue[0] === '!';
438
- bindings.push({ type: 'attr', name: realName, path: neg ? attrValue.slice(1) : attrValue, neg: neg });
439
- } else if (attrName.indexOf('s-') === 0) {
411
+ var neg = attrValue.charCodeAt(0) === 33;
412
+ var rawPath = neg ? attrValue.slice(1) : attrValue;
413
+ var p = rawPath.indexOf('.') === -1 ? rawPath : rawPath.split('.');
414
+ bindings.push({ type: 'attr', name: realName, path: p, neg: neg });
415
+ }
416
+ else if (attrName.charCodeAt(0) === 115 && attrName.charCodeAt(1) === 45) {
440
417
  var type = attrName.slice(2);
418
+ var p = attrValue.indexOf('.') === -1 ? attrValue : attrValue.split('.');
419
+
441
420
  if (type === 'init' || type === 'destroy') {
442
421
  ((type, path) => {
443
422
  var result = evalPath(scope, path);
444
423
  if (typeof result.val === 'function') {
445
- if (type === 'init') {
446
- nextTick(() => result.val.call(result.ctx, el));
447
- } else {
448
- parentCleanups.push(() => result.val.call(result.ctx, el));
449
- }
424
+ if (type === 'init') nextTick(() => result.val.call(result.ctx, el));
425
+ else parentCleanups.push(() => result.val.call(result.ctx, el));
450
426
  }
451
- })(type, attrValue);
452
- } else if (type === 'model') {
453
- bindings.push({ type: 'value', path: attrValue });
454
- el._s = scope;
455
- el._h = el._h || {};
456
- var evt = (el.type === 'checkbox' || el.type === 'radio' || el.tagName==='SELECT')
457
- ? 'change'
458
- : 'input';
459
-
460
- (el._h[evt] = el._h[evt] || []).unshift({ model: true, path: attrValue });
427
+ })(type, p);
428
+ }
429
+ else if (type === 'effect') {
430
+ parentCleanups.push(effect(() => {
431
+ var res = evalPath(scope, p);
432
+ if (typeof res.val === 'function') res.val.call(res.ctx, el);
433
+ }, nextTick));
434
+ }
435
+ else if (type === 'model') {
436
+ bindings.push({ type: 'value', path: p });
437
+ el._s = scope; el._h = el._h || {};
438
+ var evt = (el.type === 'checkbox' || el.type === 'radio' || el.tagName==='SELECT') ? 'change' : 'input';
439
+
440
+ if (evt === 'input') {
441
+ el.addEventListener('compositionstart', () => el._c = true);
442
+ el.addEventListener('compositionend', () => { el._c = false; handle({target: el, type: 'input'}); });
443
+ }
444
+
445
+ (el._h[evt] = el._h[evt] || []).unshift({ model: true, p: p });
461
446
  addListen(evt);
462
447
  } else if (type === 'ref') {
463
448
  state.$refs[attrValue] = el;
464
449
  } else if (domOps[type]) {
465
- bindings.push({ type: type, path: attrValue });
450
+ bindings.push({ type: type, path: p });
466
451
  } else {
467
- el._s = scope;
468
- el._h = el._h || {};
469
- (el._h[type] = el._h[type] || []).push({ path: attrValue });
452
+ el._s = scope; el._h = el._h || {};
453
+ (el._h[type] = el._h[type] || []).push({ p: p });
470
454
  addListen(type);
471
455
  }
472
456
  }
@@ -475,18 +459,16 @@ var spiki = (() => {
475
459
 
476
460
  if (bindings.length) {
477
461
  parentCleanups.push(effect(() => {
478
- for (var i = 0; i < bindings.length; i++) {
462
+ var i = bindings.length;
463
+ while (i--) {
479
464
  var binding = bindings[i];
480
465
  var result = evalPath(scope, binding.path);
481
466
  var val = (result.val && typeof result.val === 'function') ? result.val.call(result.ctx, el) : result.val;
482
467
 
483
468
  if (binding.type === 'attr') {
484
469
  if (binding.neg) val = !val;
485
- if (binding.name === 'class') {
486
- domOps.class(el, val);
487
- } else {
488
- domOps.attr(el, val, binding.name);
489
- }
470
+ if (binding.name === 'class') domOps.class(el, val);
471
+ else domOps.attr(el, val, binding.name);
490
472
  } else {
491
473
  domOps[binding.type](el, val);
492
474
  }
@@ -508,7 +490,7 @@ var spiki = (() => {
508
490
  return {
509
491
  unmount: () => {
510
492
  if (state.destroy) state.destroy.call(state);
511
- cleanups.forEach(cleanup => cleanup());
493
+ cleanups.forEach(c => c());
512
494
  for(var k in listeners) rootElement.removeEventListener(k, handle);
513
495
  rootElement._m = false;
514
496
  }
@@ -519,7 +501,8 @@ var spiki = (() => {
519
501
  data: (name, factory) => { cmpReg[name] = factory; },
520
502
  start: () => {
521
503
  var els = document.querySelectorAll('[s-data]');
522
- for(var i=0; i<els.length; i++) mount(els[i]);
504
+ var i = els.length;
505
+ while (i--) mount(els[i]);
523
506
  },
524
507
  store: (k, v) => v === undefined ? globalStore[k] : (globalStore[k] = v),
525
508
  raw: (o) => (o && o._p) || o
package/spiki.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{"use strict";var e=(()=>{var S=Object,T=Array,v=Reflect,e=Promise,a=Node,$=document,l=console,O="length",q="value",C="push",j="forEach",K="indexOf",M="split",B="slice",D="call",F="prototype",f="hasOwnProperty",p="getPrototypeOf",t="defineProperty",H="create",R="isArray",W="getAttribute",z="removeAttribute",G="hasAttribute",i="classList",I="tagName",J="type",Q="name",s="checked",U="parentNode",V="nextSibling",n="innerHTML",X="replaceWith",Y="insertBefore",Z="cloneNode",ee="remove",re="createTextNode",te="checkbox",ae="function",ne="object",oe="unshift",le="cleanups",se="nodes",o="deps",ie="destroy",ve="init",u=S[H](null),c=[],d=!1,h=null,_=!1,r=e.resolve(),fe=e=>{e._q||(e._q=!0,c[C](e),d||(d=!0,r.then(()=>{var e=c[B]();d=!(c=[]);for(var r=0;r<e[O];r++)e[r]._q=!1,e[r]()})))},pe=(e,r)=>{if(-1===r[K]("."))return{val:e[r],ctx:e};for(var t=r[M]("."),a=e,n=e,o=0;o<t[O];o++){if(null==a)return l.warn("Property undefined: "+r),{val:void 0,ctx:null};a=(n=a)[t[o]]}return{val:a,ctx:n}},y={};[C,"pop","shift",oe,"splice","sort","reverse"][j](e=>{y[e]=function(){_=!0;try{return T[F][e].apply(this,arguments)}finally{_=!1,m(this,O)}}});var ue=(e,r)=>{!h||-1===(r=(e=e._d||(S[t](e,"_d",{value:S[H](null),writable:!0}),e._d))[r]||(e[r]=[]))[K](h)&&(r[C](h),h[o][C](r))},m=(e,r)=>{if(!_&&e._d&&e._d[r])for(var t=e._d[r][B](),a=0;a<t[O];a++){var n=t[a];n.sched?n.sched(n):n()}},g=e=>{for(var r=0;r<e[o][O];r++){var t=e[o][r],a=t[K](e);-1!==a&&(t[a]=t[t[O]-1],t.pop())}e[o]=[]},ce=(r,e)=>{var t=()=>{g(t);var e=h;h=t;try{r()}finally{h=e}};return t[o]=[],t.sched=e,t(),()=>g(t)},de=e=>{if(!e||typeof e!=ne||e._y||e instanceof a)return e;if(e._p)return e._p;var r=new Proxy(e,{get:(e,r,t)=>"_y"===r||("_d"===r?e._d:T[R](e)&&y[f](r)?y[r]:(ue(e,r),!(t=v.get(e,r,t))||typeof t!=ne||t instanceof a?t:de(t))),set:(e,r,t,a)=>{var n=e[r],o=T[R](e),l=o?Number(r)<e[O]:S[F][f][D](e,r);if(!o&&!l)for(var s=S[p](e);s&&s!==S[F];){if(S[F][f][D](s,r)){var i=v.set(s,r,t);return _||t===n||m(e,r),i}s=S[p](s)}return i=v.set(e,r,t,a),!_&&i&&(l&&t===n||(m(e,r),o?m(e,O):l||m(e,"_k"))),i},deleteProperty:(e,r)=>{var t=S[F][f][D](e,r),a=v.deleteProperty(e,r);return a&&t&&(m(e,r),T[R](e)?m(e,O):m(e,"_k")),a},ownKeys:e=>(ue(e,"_k"),v.ownKeys(e))});return S[t](e,"_p",{value:r,enumerable:!1}),r},x=de({}),he={text:(e,r)=>{e.textContent=null==r?"":r},html:(e,r)=>{e[n]!=r&&(e[n]=null==r?"":r)},value:(e,r)=>{e[J]===te?e[s]=!!r:"radio"===e[J]?e[s]=e[q]==r:e[q]!=r&&(e[q]=null==r?"":r)},attr:(e,r,t)=>{null==r||!1===r?e[z](t):e.setAttribute(t,!0===r?"":r)},class:(e,r)=>{if("string"==typeof r)for(var t=r.match(/\S+/g)||[],a=0;a<t[O];a++){var n=t[a];"!"===n[0]?e[i][ee](n[B](1)):e[i].add(n)}else if(r)for(var o in r){var l=!!r[o];if(-1!==o[K](" "))for(var t=o[M](/\s+/),s=0;s<t[O];s++)t[s]&&e[i].toggle(t[s],l);else e[i].toggle(o,l)}},effect:()=>{}},_e=(k,e)=>{if(!k._m){var r=k[W]("s-data");if(u[r]){k._m=!0,r=u[r](),e&&S.setPrototypeOf(r,e);var E=de(r);E.$refs={},E.$root=k,E.$store=x,E.$parent=e;var t=[],a=S[H](null),n=e=>{for(var r=e.target;r&&r!==k[U];){var t=r._h&&r._h[e[J]];if(t)for(var a=0;a<t[O];a++){var n,o,l=t[a];l.model?(n=r[J]===te?r[s]:r[q],(o=pe(r._s,l.path)).ctx&&(o.ctx[o.ctx===r._s?l.path:l.path[M](".").pop()]=n)):typeof(o=pe(r._s,l.path)).val==ae&&o.val[D](o.ctx,e)}r=r[U]}},N=e=>{a[e]||(a[e]=!0,k.addEventListener(e,n))},L=(_,y,t)=>{if(1===_.nodeType&&!_[G]("s-ignore"))if(_!==k&&_[G]("s-data"))(r=_e(_,y))&&t[C](r.unmount);else{var e=_[W]("s-if"),r=!e&&"TEMPLATE"===_[I]&&_[W]("s-for"),a=[];if(e){var m=$[re](""),n=null,o=[];_[X](m);var l="!"===e[0],s=l?e[B](1):e;return t[C](()=>{o[j](e=>e())}),t[C](ce(()=>{var e=pe(y,s).val;l&&(e=!e),e?n||((n=_[Z](!0))[z]("s-if"),L(n,y,o),m[U][Y](n,m)):n&&(o[j](e=>e()),o=[],n[ee](),n=null)},fe))}if(r&&(e=r.match(/^\s*(.*?)\s+in\s+(.+)\s*$/))){var g,x=(r=e[1][M](",").map(e=>e.trim().replace(/[()]/g,"")))[0],b=r[1],P=e[2].trim(),w=_[W]("s-key"),m=$[re](""),A=S[H](null);return _[X](m),t[C](()=>{for(var e in A)A[e][le][j](e=>e())}),t[C](ce(()=>{var e=pe(y,P).val||[];T[R](e)&&ue(e,O);var r=$.createDocumentFragment(),t=m;g=S[H](null);for(var a=T[R](e),n=a?e:S.keys(e),o=(a?e:n)[O],l=0;l<o;l++){var s=a?l:n[l],i=a?e[l]:e[s],v=null==i||typeof i!=ne?String(i):w?pe(i,w).val:String(s)+"_o";g[v]&&(v+="_"+l);var f=A[v];if(f)f.scope[x]=i,b&&(f.scope[b]=s);else{var p=_.content[Z](!0),u=de(S[H](y));u[x]=i,b&&(u[b]=s);for(var c=T[F][B][D](p.childNodes),d=[],h=0;h<c[O];h++)L(c[h],u,d);f={nodes:c,scope:u,cleanups:d},A[v]=f}if(f[se][0]!==t[V]){for(h=0;h<f[se][O];h++)r.appendChild(f[se][h]);t[U][Y](r,t[V])}t=f[se][f[se][O]-1],g[v]=!0}for(s in A)if(!g[s]){for(A[s][le][j](e=>e()),h=0;h<A[s][se][O];h++)A[s][se][h][ee]();delete A[s]}},fe))}if(_.hasAttributes())for(var i=_.attributes,v=0;v<i[O];v++){var f,p,u=i[v][Q],c=i[v][q];":"===u[0]?(f=u[B](1),p="!"===c[0],a[C]({type:"attr",name:f,path:p?c[B](1):c,neg:p})):0===u[K]("s-")&&((p=u[B](2))===ve||p===ie?(e=>{var r=pe(y,c);typeof r.val==ae&&(e===ve?fe(()=>r.val[D](r.ctx,_)):t[C](()=>r.val[D](r.ctx,_)))})(p):"model"===p?(a[C]({type:q,path:c}),_._s=y,_._h=_._h||{},u=_[J]===te||"radio"===_[J]||"SELECT"===_[I]?"change":"input",(_._h[u]=_._h[u]||[])[oe]({model:!0,path:c}),N(u)):"ref"===p?E.$refs[c]=_:he[p]?a[C]({type:p,path:c}):(_._s=y,_._h=_._h||{},(_._h[p]=_._h[p]||[])[C]({path:c}),N(p)))}a[O]&&t[C](ce(()=>{for(var e=0;e<a[O];e++){var r=a[e],t=(t=pe(y,r.path)).val&&typeof t.val==ae?t.val[D](t.ctx,_):t.val;"attr"===r[J]?(r.neg&&(t=!t),"class"===r[Q]?he.class(_,t):he.attr(_,t,r[Q])):he[r[J]](_,t)}},fe));for(var d=_.firstChild;d;){var h=d[V];L(d,y,t),d=h}}};return L(k,E,t),E[ve]&&E[ve](),{unmount:()=>{for(var e in E[ie]&&E[ie][D](E),t[j](e=>e()),a)k.removeEventListener(e,n);k._m=!1}}}}};return{data:(e,r)=>{u[e]=r},start:()=>{for(var e=$.querySelectorAll("[s-data]"),r=0;r<e[O];r++)_e(e[r])},store:(e,r)=>void 0===r?x[e]:x[e]=r,raw:e=>e&&e._p||e}})();window.spiki=e})();
1
+ (()=>{"use strict";var r=(()=>{var L=Object,$=Array,s=Reflect,r=Promise,o=Node,q=document,j="length",D="value",F="push",K="forEach",M="indexOf",B="split",H="slice",R="call",i="get",W="prototype",f="hasOwnProperty",p="getPrototypeOf",t="defineProperty",z="create",G="isArray",I="getAttribute",J="removeAttribute",Q="hasAttribute",U="tagName",V="type",X="name",c="checked",Y="parentNode",Z="nextSibling",a="textContent",n="innerHTML",rr="replaceWith",er="insertBefore",tr="cloneNode",ar="remove",nr="createTextNode",or="addEventListener",ir="input",lr="checkbox",vr="function",sr="class",fr="object",pr="unshift",ur="trim",cr="cleanups",dr="nodes",l="deps",_r="className",yr="destroy",hr="init",mr="charCodeAt",v="sched",u=L[z](null),d=[],_=!1,y=null,h=!1,e=r.resolve(),gr=r=>{r._q||(r._q=!0,d[F](r),_||(_=!0,e.then(()=>{var r=d;_=!(d=[]);for(var e=r[j];e--;)r[e]._q=!1,r[e]()})))},br=(r,e)=>{if("string"==typeof e)return{ctx:r,val:r?r[e]:void 0};for(var t=0,a=e[j];t<a-1&&r;)r=r[e[t++]];return{ctx:r,val:r?r[e[a-1]]:void 0}},m={};[F,"pop","shift",pr,"splice","sort","reverse"][K](r=>{m[r]=function(){h=!0;try{return $[W][r].apply(this,arguments)}finally{h=!1,g(this,j)}}});var xr=(r,e)=>{!y||-1===(e=(r=r._d||(L[t](r,"_d",{value:L[z](null),writable:!0}),r._d))[e]||(r[e]=[]))[M](y)&&(e[F](y),y[l][F](e))},g=(r,e)=>{if(!h&&r._d&&r._d[e])for(var t=r._d[e][H](),a=0,n=t[j];a<n;a++){var o=t[a];o[v]?o[v](o):o()}},b=r=>{for(var e=r[l][j];e--;){var t=r[l][e],a=t[M](r);-1!==a&&(t[a]=t[t[j]-1],t.pop())}r[l]=[]},Ar=(e,r)=>{var t=()=>{b(t);var r=y;y=t;try{e()}finally{y=r}};return t[l]=[],t[v]=r,t(),()=>b(t)},Pr=r=>{if(!r||typeof r!=fr||r._y||r instanceof o)return r;if(r._p)return r._p;var e=new Proxy(r,{get:(r,e,t)=>{if("_y"===e)return!0;if("_d"===e)return r._d;if($[G](r)&&m[f](e))return m[e];var a=L.getOwnPropertyDescriptor(r,e);if(a&&a[i]){var n="_"+e;return n in r||Ar(()=>t[n]=a[i][R](t)),t[n]}return xr(r,e),!(e=s[i](r,e,t))||typeof e!=fr||e instanceof o?e:Pr(e)},set:(r,e,t,a)=>{var n=r[e],o=$[G](r),i=o?Number(e)<r[j]:L[W][f][R](r,e);if(!o&&!i)for(var l=L[p](r);l&&l!==L[W];){if(L[W][f][R](l,e)){var v=s.set(l,e,t);return h||t===n||g(r,e),v}l=L[p](l)}return v=s.set(r,e,t,a),!h&&v&&(i&&t===n||(g(r,e),o?g(r,j):i||g(r,"_k"))),v},deleteProperty:(r,e)=>{var t=L[W][f][R](r,e),a=s.deleteProperty(r,e);return a&&t&&(g(r,e),$[G](r)?g(r,j):g(r,"_k")),a},ownKeys:r=>(xr(r,"_k"),s.ownKeys(r))});return L[t](r,"_p",{value:e,enumerable:!1}),e},x=Pr({}),wr=L[z](null);wr.text=(r,e)=>{e=null==e?"":e,r[a]!==String(e)&&(r[a]=e)},wr.html=(r,e)=>{r[n]!=e&&(r[n]=null==e?"":e)},wr[D]=(r,e)=>{r[V]===lr?r[c]=!!e:"radio"===r[V]?r[c]=r[D]==e:r[D]!=e&&(r[D]=null==e?"":e)},wr.attr=(r,e,t)=>{null==e||!1===e?r[J](t):(e=!0===e?"":String(e),r[I](t)!==e&&r.setAttribute(t,e))},wr[sr]=(r,e)=>{var t=r._n||"",a="";if("string"==typeof e)a=e;else if(e)for(var n in e)e[n]&&(a+=(a?" ":"")+n);t=t+(t&&a?" ":"")+a,r[_r]!==t&&(r[_r]=t)};var Nr=(E,r)=>{if(!E._m){var e=E[I]("s-data");if(u[e]){E._m=!0,e=u[e](),r&&L.setPrototypeOf(e,r);var S=Pr(e);S.$refs={},S.$root=E,S.$store=x,S.$parent=r;var t=[],a=L[z](null),O=r=>{var e=r.target;if(r[V]!==ir||!e._c)for(var t=E[Y],a=r[V];e&&e!==t;){var n=e._h&&e._h[a];if(n)for(var o=e._s,i=n[j];i--;){var l=n[i],v=l.p;if(l.model){var s=e[V]===lr?e[c]:e[D];if("string"!=typeof s||(l=s[ur]())&&isFinite(l)&&(48===l[mr](0)&&1!==l[j]&&46!==l[mr](1)||(s=Number(l))),"string"==typeof v)o&&(o[v]=s);else{for(var f=o,p=0,u=v[j]-1;p<u&&f;)f=f[v[p++]];f&&(f[v[u]]=s)}}else typeof(s=br(o,v)).val==vr&&s.val[R](s.ctx,r)}e=e[Y]}},T=r=>{a[r]||(a[r]=!0,E[or](r,O))},C=(h,m,t)=>{if(1===h.nodeType&&!h[Q]("s-ignore"))if(h!==E&&h[Q]("s-data"))(r=Nr(h,m))&&t[F](r.unmount);else{var r=!(v=h[I]("s-if"))&&"TEMPLATE"===h[U]&&h[I]("s-for"),a=[];if(h[Q](sr)&&!h._n&&(h._n=h[_r]),v){var g=q[nr](""),e=null,n=[];h[rr](g);var o="!"===v[0],i=-1===(l=o?v[H](1):v)[M](".")?l:l[B](".");return t[F](()=>{n[K](r=>r())}),t[F](Ar(()=>{var r=br(m,i).val;o&&(r=!r),r?e||((e=h[tr](!0))[J]("s-if"),C(e,m,n),g[Y][er](e,g)):e&&(n[K](r=>r()),n=[],e[ar](),e=null)},gr))}if(r&&-1!==(v=r[M](" in "))){var b,l=r[H](0,v)[ur](),v=r[H](v+4)[ur](),x=(l=l.replace(/[()]/g,"")[B](","))[0][ur](),A=l[1]?l[1][ur]():null,P=-1===v[M](".")?v:v[B]("."),w=(v=h[I]("s-key"))?-1===v[M](".")?v:v[B]("."):null,g=q[nr](""),N=L[z](null);return h[rr](g),t[F](()=>{for(var r in N)N[r][cr][K](r=>r())}),t[F](Ar(()=>{var r=br(m,P).val||[];$[G](r)&&xr(r,j);var e=q.createDocumentFragment(),t=g;b=L[z](null);for(var a,n=$[G](r),o=n?r:L.keys(r),i=(n?r:o)[j],l=0;l<i;l++){var v=n?l:o[l],s=n?r[l]:r[v],f=null==s||typeof s!=fr?String(s):w?br(s,w).val:String(v)+"_o";b[f]&&(f+="_"+l);var p=N[f];if(p)p.scope[x]=s,A&&(p.scope[A]=v);else{var u=h.content[tr](!0),c=Pr(L[z](m));c[x]=s,A&&(c[A]=v);for(var d=$[W][H][R](u.childNodes),_=[],y=0;y<d[j];y++)C(d[y],c,_);p={nodes:d,scope:c,cleanups:_},N[f]=p}if(p[dr][0]!==t[Z]){for(y=0;y<p[dr][j];y++)e.appendChild(p[dr][y]);t[Y][er](e,t[Z])}t=p[dr][p[dr][j]-1],b[f]=!0}for(a in N)b[a]||(N[a][cr][K](r=>r()),N[a][dr][K](r=>r[ar]()),delete N[a])},gr))}if(h.hasAttributes())for(var s=h.attributes,f=s[j];f--;){var p,u,c=s[f],d=c[X],_=c[D];58===d[mr](0)?(p=d[H](1),c=(u=33===_[mr](0))?_[H](1):_,i=-1===c[M](".")?c:c[B]("."),a[F]({type:"attr",name:p,path:i,neg:u})):115===d[mr](0)&&45===d[mr](1)&&(u=d[H](2),i=-1===_[M](".")?_:_[B]("."),u===hr||u===yr?(r=>{var e=br(m,i);typeof e.val==vr&&(r===hr?gr(()=>e.val[R](e.ctx,h)):t[F](()=>e.val[R](e.ctx,h)))})(u):"effect"===u?t[F](Ar(()=>{var r=br(m,i);typeof r.val==vr&&r.val[R](r.ctx,h)},gr)):"model"===u?(a[F]({type:D,path:i}),h._s=m,h._h=h._h||{},(d=h[V]===lr||"radio"===h[V]||"SELECT"===h[U]?"change":ir)==ir&&(h[or]("compositionstart",()=>h._c=!0),h[or]("compositionend",()=>{h._c=!1,O({target:h,type:ir})})),(h._h[d]=h._h[d]||[])[pr]({model:!0,p:i}),T(d)):"ref"===u?S.$refs[_]=h:wr[u]?a[F]({type:u,path:i}):(h._s=m,h._h=h._h||{},(h._h[u]=h._h[u]||[])[F]({p:i}),T(u)))}a[j]&&t[F](Ar(()=>{for(var r=a[j];r--;){var e=a[r],t=(t=br(m,e.path)).val&&typeof t.val==vr?t.val[R](t.ctx,h):t.val;"attr"===e[V]?(e.neg&&(t=!t),e[X]===sr?wr[sr](h,t):wr.attr(h,t,e[X])):wr[e[V]](h,t)}},gr));for(var y=h.firstChild;y;){var k=y[Z];C(y,m,t),y=k}}};return C(E,S,t),S[hr]&&S[hr](),{unmount:()=>{for(var r in S[yr]&&S[yr][R](S),t[K](r=>r()),a)E.removeEventListener(r,O);E._m=!1}}}}};return{data:(r,e)=>{u[r]=e},start:()=>{for(var r=q.querySelectorAll("[s-data]"),e=r[j];e--;)Nr(r[e])},store:(r,e)=>void 0===e?x[r]:x[r]=e,raw:r=>r&&r._p||r}})();window.spiki=r})();