spikijs 1.0.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 novver
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # Spikijs
2
+
3
+ A lightweight and reactive JavaScript micro-framework
4
+
5
+ ---
6
+
7
+ ## Documentation
8
+ Read the full documentation on [GitHub](https://github.com/novver/spikijs)
9
+
10
+ ---
11
+
12
+ ## Installation
13
+
14
+ ### via NPM
15
+ ```bash
16
+ npm install spikijs
17
+
18
+ ```
19
+
20
+ ### via CDN
21
+
22
+ For quick prototyping, you can use the CDN directly in your HTML:
23
+
24
+ ```html
25
+ <script src="[https://unpkg.com/spikijs](https://unpkg.com/spikijs)"></script>
26
+
27
+ ```
28
+
29
+ ---
30
+
31
+ ## Quick Start
32
+
33
+ Here is a simple "Counter" example to show how Spikijs works.
34
+
35
+ ### 1. HTML Layout
36
+
37
+ Use special `s-` attributes to bind data and events to your HTML.
38
+
39
+ ```html
40
+ <div s-data="counter">
41
+ <h1 s-text="title"></h1>
42
+ <h2 s-text="count"></h2>
43
+
44
+ <button s-click="decrement">-</button>
45
+ <button s-click="increment">+</button>
46
+ </div>
47
+
48
+ ```
49
+
50
+ ### 2. JavaScript Logic
51
+
52
+ Register your component logic and start the framework.
53
+
54
+ ```javascript
55
+ import spiki from 'spikijs';
56
+
57
+ // Register the 'counter' component
58
+ spiki.data('counter', () => ({
59
+ count: 0,
60
+ title: 'Hello Spiki',
61
+
62
+ increment() {
63
+ this.count++;
64
+ },
65
+ decrement() {
66
+ this.count--;
67
+ }
68
+ }));
69
+
70
+ // Initialize the framework
71
+ spiki.start();
72
+
73
+ ```
74
+
75
+ ---
76
+
77
+ ## License
78
+
79
+ MIT
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "spikijs",
3
+ "license": "MIT",
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/novver/spikijs.git"
9
+ },
10
+ "homepage": "https://github.com/novver/spikijs#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/novver/spikijs/issues"
13
+ },
14
+ "main": "./spiki.esm.min.js",
15
+ "unpkg": "./spiki.min.js",
16
+ "jsdelivr": "./spiki.min.js",
17
+ "exports": {
18
+ ".": {
19
+ "development": "./spiki.esm.js",
20
+ "default": "./spiki.esm.min.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "spiki.esm.js",
25
+ "spiki.esm.min.js",
26
+ "spiki.js",
27
+ "spiki.min.js"
28
+ ]
29
+ }
package/spiki.esm.js ADDED
@@ -0,0 +1,457 @@
1
+ var spiki = (function () {
2
+ var registry = Object.create(null);
3
+ var metaMap = new WeakMap();
4
+ var targetMap = new WeakMap();
5
+ var proxyMap = new WeakMap();
6
+ var pathCache = new Map();
7
+ var queue = new Set();
8
+ var loopRE = /^\s*(.*?)\s+in\s+(.+)\s*$/;
9
+
10
+ var activeEffect, isFlushing, globalStore;
11
+ var shouldTrigger = true;
12
+ var p = Promise.resolve();
13
+
14
+ // 1. Array Interceptors
15
+ var arrayInstrumentations = {};
16
+ ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (m) {
17
+ arrayInstrumentations[m] = function () {
18
+ var args = [];
19
+ for (var _i = 0; _i < arguments.length; _i++) {
20
+ args[_i] = arguments[_i];
21
+ }
22
+ shouldTrigger = false;
23
+ try {
24
+ var res = Array.prototype[m].apply(this, args);
25
+ return res;
26
+ } finally {
27
+ shouldTrigger = true;
28
+ trigger(this, 'length');
29
+ }
30
+ };
31
+ });
32
+
33
+ // 2. Helpers
34
+ var createScope = function (parent) {
35
+ var proto = Object.create(parent);
36
+ return new Proxy(proto, {
37
+ set: function (target, key, value, receiver) {
38
+ if (target.hasOwnProperty(key)) return Reflect.set(target, key, value, receiver);
39
+ var cursor = target;
40
+ while (cursor && !Object.prototype.hasOwnProperty.call(cursor, key)) {
41
+ cursor = Object.getPrototypeOf(cursor);
42
+ }
43
+ return Reflect.set(cursor || target, key, value);
44
+ }
45
+ });
46
+ };
47
+
48
+ var evaluate = function (scope, path) {
49
+ if (typeof path !== 'string') return { val: path, ctx: scope };
50
+
51
+ if (path.indexOf('.') === -1) {
52
+ return { val: scope ? scope[path] : undefined, ctx: scope };
53
+ }
54
+
55
+ var parts = pathCache.get(path);
56
+ if (!parts) {
57
+ if (pathCache.size > 1000) pathCache.clear();
58
+ parts = path.split('.');
59
+ pathCache.set(path, parts);
60
+ }
61
+
62
+ var val = scope, ctx = scope;
63
+ for (var i = 0; i < parts.length; i++) {
64
+ var part = parts[i];
65
+ if (val == null) {
66
+ return { val: val, ctx: null };
67
+ }
68
+ ctx = val;
69
+ val = val[part];
70
+ }
71
+ return { val: val, ctx: ctx };
72
+ };
73
+
74
+ var nextTick = function (fn) {
75
+ return !queue.has(fn) && queue.add(fn) && !isFlushing && (isFlushing = true) &&
76
+ p.then(function () {
77
+ queue.forEach(function (j) { j(); });
78
+ queue.clear();
79
+ isFlushing = false;
80
+ });
81
+ };
82
+
83
+ // 3. Reactivity
84
+ var track = function (t, k) {
85
+ if (!activeEffect) return;
86
+ var deps = targetMap.get(t);
87
+ if (!deps) {
88
+ deps = new Map();
89
+ targetMap.set(t, deps);
90
+ }
91
+ var dep = deps.get(k);
92
+ if (!dep) {
93
+ dep = new Set();
94
+ deps.set(k, dep);
95
+ }
96
+ dep.add(activeEffect);
97
+ activeEffect.d.add(dep);
98
+ };
99
+
100
+ var trigger = function (t, k) {
101
+ var depsMap, dep;
102
+ if (shouldTrigger && (depsMap = targetMap.get(t)) && (dep = depsMap.get(k))) {
103
+ dep.forEach(function (e) {
104
+ e.x ? e.x(e) : e();
105
+ });
106
+ }
107
+ };
108
+
109
+ var effect = function (fn, scheduler) {
110
+ var runner = function () {
111
+ runner.d.forEach(function (d) { d.delete(runner); });
112
+ runner.d.clear();
113
+ var prev = activeEffect;
114
+ activeEffect = runner;
115
+ try { fn(); } finally { activeEffect = prev; }
116
+ };
117
+ runner.d = new Set();
118
+ runner.x = scheduler;
119
+ runner();
120
+ return function () {
121
+ runner.d.forEach(function (d) { d.delete(runner); });
122
+ runner.d.clear();
123
+ queue.delete(runner);
124
+ };
125
+ };
126
+
127
+ var reactive = function (obj) {
128
+ if (!obj || typeof obj !== 'object' || obj._p || obj instanceof Node) return obj;
129
+ var existing = proxyMap.get(obj);
130
+ if (existing) return existing;
131
+
132
+ var proxy = new Proxy(obj, {
133
+ get: function (t, k, r) {
134
+ if (k === '_p') return true;
135
+ if (Array.isArray(t) && arrayInstrumentations.hasOwnProperty(k)) return arrayInstrumentations[k];
136
+ track(t, k);
137
+ var res = Reflect.get(t, k, r);
138
+ return res && typeof res === 'object' && !(res instanceof Node) ? reactive(res) : res;
139
+ },
140
+ set: function (t, k, v, r) {
141
+ var old = t[k];
142
+ var hadKey = Array.isArray(t) ? Number(k) < t.length : Object.prototype.hasOwnProperty.call(t, k);
143
+ var res = Reflect.set(t, k, v, r);
144
+ if (shouldTrigger) {
145
+ if (!hadKey) {
146
+ trigger(t, k);
147
+ if (Array.isArray(t)) trigger(t, 'length');
148
+ } else if (old !== v) {
149
+ trigger(t, k);
150
+ }
151
+ }
152
+ return res;
153
+ },
154
+ deleteProperty: function (t, k) {
155
+ var hadKey = Object.prototype.hasOwnProperty.call(t, k);
156
+ var res = Reflect.deleteProperty(t, k);
157
+ if (res && hadKey) {
158
+ trigger(t, k);
159
+ if (Array.isArray(t)) trigger(t, 'length');
160
+ }
161
+ return res;
162
+ }
163
+ });
164
+ proxyMap.set(obj, proxy);
165
+ return proxy;
166
+ };
167
+
168
+ globalStore = reactive({});
169
+
170
+ // 4. DOM Ops
171
+ var ops = {
172
+ text: function (el, v) { el.textContent = (v !== null && v !== undefined) ? v : ''; },
173
+ html: function (el, v) { el.innerHTML = (v !== null && v !== undefined) ? v : ''; },
174
+ value: function (el, v) {
175
+ if (el.type === 'checkbox') {
176
+ el.checked = !!v;
177
+ } else if (el.type === 'radio' && el.name) {
178
+ el.checked = el.value == v;
179
+ } else {
180
+ if (el.value != v) el.value = (v !== null && v !== undefined) ? v : '';
181
+ }
182
+ },
183
+ attr: function (el, v, arg) {
184
+ (v == null || v === false) ? el.removeAttribute(arg) : el.setAttribute(arg, v === true ? '' : v);
185
+ },
186
+ class: function (el, v) {
187
+ if (typeof v === 'string') {
188
+ v.split(/\s+/).forEach(function (c) {
189
+ if (c) el.classList[c[0] === '!' ? 'remove' : 'add'](c[0] === '!' ? c.slice(1) : c);
190
+ });
191
+ }
192
+ },
193
+ init: function () { },
194
+ destroy: function () { }
195
+ };
196
+
197
+ // 5. Engine
198
+ var mount = function (root) {
199
+ if (root._m) return;
200
+ root._m = 1;
201
+ var fac = registry[root.getAttribute('s-data')];
202
+ if (!fac) return;
203
+
204
+ var state = reactive(fac());
205
+ state.$refs = {};
206
+ state.$root = root;
207
+ state.$store = globalStore;
208
+
209
+ var rootK = [];
210
+
211
+ var handleEvent = function (e) {
212
+ var t = e.target;
213
+ if (t._m && (e.type === 'input' || e.type === 'change')) {
214
+ var path = t._m;
215
+ var v = t.type === 'checkbox' ? t.checked : t.value;
216
+ var evaluated = evaluate(t._s || state, path);
217
+ var parentObj = evaluated.ctx;
218
+
219
+ if (path.indexOf('.') === -1) {
220
+ (t._s || state)[path] = v;
221
+ } else if (parentObj) {
222
+ var parts = path.split('.');
223
+ parentObj[parts[parts.length - 1]] = v;
224
+ }
225
+ }
226
+
227
+ var hn;
228
+ while (t && t !== root.parentNode) {
229
+ var meta = metaMap.get(t);
230
+ if (meta && (hn = meta[e.type])) {
231
+ var evRes = evaluate(t._s || state, hn);
232
+ var fn = evRes.val;
233
+ var ctx = evRes.ctx;
234
+ if (typeof fn === 'function') fn.call(ctx, e);
235
+ }
236
+ t = t.parentNode;
237
+ }
238
+ };
239
+
240
+ var walk = function (el, scope, kList) {
241
+ if (el.nodeType !== 1 || el.hasAttribute('s-ignore')) return;
242
+
243
+ if (el !== root && el.hasAttribute('s-data')) {
244
+ var child = mount(el);
245
+ if (child) kList.push(child.unmount);
246
+ return;
247
+ }
248
+
249
+ var val;
250
+ if ((val = el.getAttribute('s-if'))) {
251
+ var anchor = document.createTextNode('');
252
+ var branchK = [];
253
+ el.replaceWith(anchor);
254
+ var node;
255
+
256
+ kList.push(function () { branchK.forEach(function (s) { s(); }); });
257
+
258
+ return kList.push(effect(function () {
259
+ var ev = evaluate(scope, val);
260
+ var res = ev.val;
261
+ var ctx = ev.ctx;
262
+ var truthy = typeof res === 'function' ? res.call(ctx, el) : res;
263
+
264
+ if (truthy) {
265
+ if (!node) {
266
+ node = el.cloneNode(true);
267
+ node.removeAttribute('s-if');
268
+ walk(node, scope, branchK);
269
+ anchor.parentNode.insertBefore(node, anchor);
270
+ }
271
+ } else if (node) {
272
+ branchK.forEach(function (s) { s(); });
273
+ branchK.length = 0;
274
+ node.remove();
275
+ node = null;
276
+ }
277
+ }, nextTick));
278
+ }
279
+
280
+ if (el.tagName === 'TEMPLATE' && (val = el.getAttribute('s-for'))) {
281
+ var match = val.match(loopRE);
282
+ if (!match) return;
283
+ var lhs = match[1].replace(/[()]/g, '');
284
+ var listKey = match[2];
285
+ var splitLhs = lhs.split(',');
286
+ var alias = splitLhs[0].trim();
287
+ var idx = splitLhs[1] ? splitLhs[1].trim() : null;
288
+
289
+ var keyAttr = el.getAttribute('s-key');
290
+ var anchor_1 = document.createTextNode('');
291
+ el.replaceWith(anchor_1);
292
+ var pool = new Map();
293
+
294
+ kList.push(function () {
295
+ pool.forEach(function (r) {
296
+ r.k.forEach(function (s) { s(); });
297
+ });
298
+ });
299
+
300
+ return kList.push(effect(function () {
301
+ var ev = evaluate(scope, listKey);
302
+ var rawItems = ev.val;
303
+ var items = rawItems;
304
+ if (Array.isArray(items)) track(items, 'length');
305
+
306
+ var cursor = anchor_1;
307
+ var iterable = Array.isArray(items) ? items : items ? Object.keys(items) : [];
308
+ var nextPool = new Map();
309
+
310
+ iterable.forEach(function (raw, i) {
311
+ var key = Array.isArray(items) ? i : raw;
312
+ var item = Array.isArray(items) ? raw : items[raw];
313
+
314
+ var rowKey;
315
+ if (keyAttr && item) rowKey = item[keyAttr];
316
+ else rowKey = (typeof item === 'object' && item) ? item : key + '_' + item;
317
+
318
+ var row = pool.get(rowKey);
319
+
320
+ var defineAlias = function (targetObj) {
321
+ Object.defineProperty(targetObj, alias, {
322
+ configurable: true, enumerable: true,
323
+ get: function () { return items[key]; },
324
+ set: function (v) { items[key] = v; }
325
+ });
326
+ };
327
+
328
+ if (!row) {
329
+ var clone = el.content.cloneNode(true);
330
+ var s = createScope(scope);
331
+ var rowK = [];
332
+
333
+ defineAlias(s);
334
+ if (idx) s[idx] = key;
335
+
336
+ var nodes = [];
337
+ var c = clone.firstChild;
338
+ while (c) {
339
+ nodes.push(c);
340
+ var next = c.nextSibling;
341
+ walk(c, s, rowK);
342
+ c = next;
343
+ }
344
+ row = { n: nodes, s: s, k: rowK };
345
+ } else {
346
+ defineAlias(row.s);
347
+ if (idx) row.s[idx] = key;
348
+ }
349
+
350
+ if (row.n[0] !== cursor.nextSibling) {
351
+ var frag = document.createDocumentFragment();
352
+ row.n.forEach(function (n) { frag.appendChild(n); });
353
+ cursor.parentNode.insertBefore(frag, cursor.nextSibling);
354
+ }
355
+ cursor = row.n[row.n.length - 1];
356
+ nextPool.set(rowKey, row);
357
+ pool.delete(rowKey);
358
+ });
359
+ pool.forEach(function (row) {
360
+ row.k.forEach(function (s) { s(); });
361
+ row.n.forEach(function (n) { n.remove(); });
362
+ });
363
+ pool = nextPool;
364
+ }, nextTick));
365
+ }
366
+
367
+ var attrs = el.attributes;
368
+ for (var i = attrs.length - 1; i >= 0; i--) {
369
+ (function (attr) {
370
+ var name = attr.name;
371
+ var value = attr.value;
372
+
373
+ if (name[0] === ':') {
374
+ kList.push(effect(function () {
375
+ var ev = evaluate(scope, value);
376
+ var res = ev.val;
377
+ var ctx = ev.ctx;
378
+ ops[name.slice(1) === 'class' ? 'class' : 'attr'](el, typeof res === 'function' ? res.call(ctx, el) : res, name.slice(1));
379
+ }, nextTick));
380
+
381
+ } else if (name[0] === 's' && name[1] === '-') {
382
+ var type = name.slice(2);
383
+ if (type === 'ref') {
384
+ state.$refs[value] = el;
385
+ } else if (type === 'model') {
386
+ kList.push(effect(function () {
387
+ var ev = evaluate(scope, value);
388
+ ops.value(el, ev.val);
389
+ }, nextTick));
390
+ if (/^(INPUT|SELECT|TEXTAREA)$/.test(el.tagName)) {
391
+ el._s = scope; el._m = value;
392
+ var evt = (el.type === 'checkbox' || el.type === 'radio' || el.tagName === 'SELECT') ? 'change' : 'input';
393
+ if (!root._e) root._e = new Set();
394
+ if (!root._e.has(evt)) {
395
+ root._e.add(evt);
396
+ root.addEventListener(evt, handleEvent);
397
+ }
398
+ }
399
+ } else if (ops[type]) {
400
+ kList.push(effect(function () {
401
+ var ev = evaluate(scope, value);
402
+ var res = ev.val;
403
+ var ctx = ev.ctx;
404
+ ops[type](el, typeof res === 'function' ? res.call(ctx, el) : res);
405
+ }, nextTick));
406
+ } else {
407
+ el._s = scope;
408
+ var meta = metaMap.get(el);
409
+ if (!meta) {
410
+ meta = {};
411
+ metaMap.set(el, meta);
412
+ }
413
+ meta[type] = value;
414
+ if (!root._e) root._e = new Set();
415
+ if (!root._e.has(type)) {
416
+ root._e.add(type);
417
+ root.addEventListener(type, handleEvent);
418
+ }
419
+ }
420
+ }
421
+ })(attrs[i]);
422
+ }
423
+
424
+ var child = el.firstElementChild;
425
+ while (child) {
426
+ var next = child.nextElementSibling;
427
+ walk(child, scope, kList);
428
+ child = next;
429
+ }
430
+ };
431
+
432
+ walk(root, state, rootK);
433
+ if (state.init) state.init();
434
+
435
+ return {
436
+ unmount: function () {
437
+ if (state.destroy) state.destroy.call(state);
438
+ rootK.forEach(function (s) { s(); });
439
+ if (root._e) root._e.forEach(function (k) { root.removeEventListener(k, handleEvent); });
440
+ root._m = 0;
441
+ }
442
+ };
443
+ };
444
+
445
+ return {
446
+ data: function (n, f) { registry[n] = f; },
447
+ start: function () {
448
+ var els = document.querySelectorAll('[s-data]');
449
+ for (var i = 0; i < els.length; i++) {
450
+ mount(els[i]);
451
+ }
452
+ },
453
+ store: function (k, v) { return v === undefined ? globalStore[k] : (globalStore[k] = v); }
454
+ };
455
+ })();
456
+
457
+ export default spiki;
@@ -0,0 +1 @@
1
+ var spiki=(()=>{var n,r,w=Object,x=Array,k=Reflect,e=Promise,E=Map,P=Set,t=WeakMap,T="length",N="slice",L="split",C="push",S="forEach",$="delete",o="clear",O="add",j="has",M="get",R="set",W="value",q="input",z="change",B="parentNode",D="nextSibling",F="prototype",H="hasOwnProperty",I="getAttribute",U="removeAttribute",X="addEventListener",G="insertBefore",J="replaceWith",K="remove",Q="createTextNode",V="cloneNode",Y="tagName",Z="s-data",ee="s-if",a=w.create(null),re=new t,i=new t,l=new t,s=new E,c=new P,te=/^\s*(.*?)\s+in\s+(.+)\s*$/,v=!0,f=e.resolve(),u={};[C,"pop","shift","unshift","splice","sort","reverse"][S](function(t){u[t]=function(){for(var e=[],r=arguments[T];r--;)e[r]=arguments[r];v=!1;try{return x[F][t].apply(this,e)}finally{v=!0,y(this,T)}}});var ne=(e,r)=>{if("string"!=typeof r)return{v:r,c:e};if(-1===r.indexOf("."))return{v:e?e[r]:void 0,c:e};var t=s[M](r);t||(1e3<s.size&&s[o](),t=r[L]("."),s[R](r,t));for(var n=e,a=e,i=0;i<t[T];i++){if(null==n)return{v:n,c:null};n=(a=n)[t[i]]}return{v:n,c:a}},ae=e=>!c[j](e)&&c[O](e)&&!r&&(r=!0)&&f.then(()=>{c[S](e=>e()),c[o](),r=!1}),ie=(e,r)=>{var t;n&&((t=i[M](e))||i[R](e,t=new E),(e=t[M](r))||t[R](r,e=new P),e[O](n),n.d[O](e))},y=(e,r)=>{var t,n;v&&(t=i[M](e))&&(n=t[M](r))&&n[S](e=>e.x?e.x(e):e())},oe=(r,e)=>{var t=()=>{t.d[S](e=>e[$](t)),t.d[o]();var e=n;n=t;try{r()}finally{n=e}};return t.d=new P,t.x=e,t(),()=>{t.d[S](e=>e[$](t)),t.d[o](),c[$](t)}},d=e=>{if(!e||"object"!=typeof e||e._p||e instanceof Node)return e;var r=l[M](e);return r||(r=new Proxy(e,{get:(e,r,t)=>{if("_p"===r)return!0;if(x.isArray(e)&&w[F][H].call(u,r))return u[r];ie(e,r);t=k[M](e,r,t);return!t||"object"!=typeof t||t instanceof Node?t:d(t)},set:(e,r,t,n)=>{var a=e[r],i=x.isArray(e)?Number(r)<e[T]:w[F][H].call(e,r),n=k[R](e,r,t,n);return v&&(i?a!==t&&y(e,r):(y(e,r),x.isArray(e)&&y(e,T))),n},deleteProperty:(e,r)=>{var t=w[F][H].call(e,r),n=k.deleteProperty(e,r);return n&&t&&(y(e,r),x.isArray(e)&&y(e,T)),n}}),l[R](e,r),r)},p=d({}),le={text:(e,r)=>{e.textContent=null!=r?r:""},html:(e,r)=>{e.innerHTML=null!=r?r:""},value:(e,r)=>{"checkbox"===e.type?e.checked=!!r:"radio"===e.type&&e.name?e.checked=e[W]==r:e[W]!=r&&(e[W]=null!=r?r:"")},attr:(e,r,t)=>{null==r||!1===r?e[U](t):e.setAttribute(t,!0===r?"":r)},class:(r,e)=>{"string"==typeof e&&e[L](/\s+/)[S](e=>{e&&r.classList["!"===e[0]?K:O]("!"===e[0]?e[N](1):e)})},init:()=>{},destroy:()=>{}},se=u=>{if(!u._m){u._m=1;var e=a[u[I](Z)];if(e){var y=d(e());y.$refs={},y.$root=u,y.$store=p;var r=[],b=e=>{var r,t,n,a,i=e.target;for(!i._m||e.type!==q&&e.type!==z||(n=i._m,r="checkbox"===i.type?i.checked:i[W],t=ne(i._s||y,n),-1===n.indexOf(".")?(i._s||y)[n]=r:t.c&&(n=n[L]("."),t.c[n[n[T]-1]]=r));i&&i!==u[B];){var o=re[M](i);o&&(a=o[e.type])&&("function"==typeof(o=ne(i._s||y,a)).v&&o.v.call(o.c,e)),i=i[B]}},A=(d,p,i)=>{if(1===d.nodeType&&!d[I]("s-ignore"))if(d!==u&&d[I](Z)){var e=se(d);e&&i[C](e.unmount)}else{var r;if(r=d[I](ee)){var t,n=document[Q](""),a=[];return d[J](n),i[C](()=>{a[S](e=>e())}),i[C](oe(()=>{var e=ne(p,r);("function"==typeof e.v?e.v.call(e.c,d):e.v)?t||((t=d[V](!0))[U](ee),A(t,p,a),n[B][G](t,n)):t&&(a[S](e=>e()),a[T]=0,t[K](),t=null)},ae))}if("TEMPLATE"===d[Y]&&(r=d[I]("s-for"))){var o=r.match(te);if(!o)return;var e=o[1].replace(/[()]/g,"")[L](","),l=o[2],m=e[0].trim(),_=e[1]?e[1].trim():null,h=d[I]("s-key"),n=document[Q]("");d[J](n);var g=new E;return i[C](()=>{g[S](e=>e.k[S](e=>e()))}),i[C](oe(()=>{var f=ne(p,l).v;x.isArray(f)&&ie(f,T);var u=n,e=x.isArray(f)?f:f?w.keys(f):[],y=new E;e[S]((e,r)=>{var t,n=x.isArray(f)?r:e,a=x.isArray(f)?e:f[e],i=h&&a?a[h]:"object"==typeof a&&a?a:n+"_"+a,r=g[M](i),e=e=>{w.defineProperty(e,m,{configurable:!0,enumerable:!0,get:()=>f[n],set:e=>{f[n]=e}})};if(r)e(r.s),_&&(r.s[_]=n);else{var a=d.content[V](!0),o=(e=>{e=w.create(e);return new Proxy(e,{set:(e,r,t,n)=>{if(w[F][H].call(e,r))return k[R](e,r,t,n);for(var a=e;a&&!w[F][H].call(a,r);)a=w.getPrototypeOf(a);return k[R](a||e,r,t)}})})(p),l=[];e(o),_&&(o[_]=n);for(var s=[],c=a.firstChild;c;){s[C](c);var v=c[D];A(c,o,l),c=v}r={n:s,s:o,k:l}}r.n[0]!==u[D]&&(t=document.createDocumentFragment(),r.n[S](e=>t.appendChild(e)),u[B][G](t,u[D])),u=r.n[r.n[T]-1],y[R](i,r),g[$](i)}),g[S](e=>{e.k[S](e=>e()),e.n[S](e=>e[K]())}),g=y},ae))}for(var s=d.attributes,c=s[T]-1;0<=c;c--)(e=>{var r,t,n=e.name,a=e[W];":"===n[0]?i[C](oe(()=>{var e=ne(p,a);le["class"===n[N](1)?"class":"attr"](d,"function"==typeof e.v?e.v.call(e.c,d):e.v,n[N](1))},ae)):"s"===n[0]&&"-"===n[1]&&("ref"===(r=n[N](2))?y.$refs[a]=d:"model"===r?(i[C](oe(()=>{le.value(d,ne(p,a).v)},ae)),/^(INPUT|SELECT|TEXTAREA)$/.test(d[Y])&&(d._s=p,d._m=a,t="checkbox"===d.type||"radio"===d.type||"SELECT"===d[Y]?z:q,u._e||(u._e=new P),u._e[j](t)||(u._e[O](t),u[X](t,b)))):le[r]?i[C](oe(()=>{var e=ne(p,a);le[r](d,"function"==typeof e.v?e.v.call(e.c,d):e.v)},ae)):(d._s=p,(t=re[M](d))||re[R](d,t={}),t[r]=a,u._e||(u._e=new P),u._e[j](r)||(u._e[O](r),u[X](r,b))))})(s[c]);for(var v=d.firstElementChild;v;){var f=v.nextElementSibling;A(v,p,i),v=f}}};return A(u,y,r),y.init&&y.init(),{unmount:()=>{y.destroy&&y.destroy.call(y),r[S](e=>e()),u._e&&u._e[S](e=>u.removeEventListener(e,b)),u._m=0}}}}};return{data:(e,r)=>{a[e]=r},start:()=>{for(var e=document.querySelectorAll("["+Z+"]"),r=0;r<e[T];r++)se(e[r])},store:(e,r)=>void 0===r?p[e]:p[e]=r}})();export default spiki;
package/spiki.js ADDED
@@ -0,0 +1,461 @@
1
+ (function () {
2
+ "use strict";
3
+
4
+ var spiki = (function () {
5
+ var registry = Object.create(null);
6
+ var metaMap = new WeakMap();
7
+ var targetMap = new WeakMap();
8
+ var proxyMap = new WeakMap();
9
+ var pathCache = new Map();
10
+ var queue = new Set();
11
+ var loopRE = /^\s*(.*?)\s+in\s+(.+)\s*$/;
12
+
13
+ var activeEffect, isFlushing, globalStore;
14
+ var shouldTrigger = true;
15
+ var p = Promise.resolve();
16
+
17
+ // 1. Array Interceptors
18
+ var arrayInstrumentations = {};
19
+ ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (m) {
20
+ arrayInstrumentations[m] = function () {
21
+ var args = [];
22
+ for (var _i = 0; _i < arguments.length; _i++) {
23
+ args[_i] = arguments[_i];
24
+ }
25
+ shouldTrigger = false;
26
+ try {
27
+ var res = Array.prototype[m].apply(this, args);
28
+ return res;
29
+ } finally {
30
+ shouldTrigger = true;
31
+ trigger(this, 'length');
32
+ }
33
+ };
34
+ });
35
+
36
+ // 2. Helpers
37
+ var createScope = function (parent) {
38
+ var proto = Object.create(parent);
39
+ return new Proxy(proto, {
40
+ set: function (target, key, value, receiver) {
41
+ if (target.hasOwnProperty(key)) return Reflect.set(target, key, value, receiver);
42
+ var cursor = target;
43
+ while (cursor && !Object.prototype.hasOwnProperty.call(cursor, key)) {
44
+ cursor = Object.getPrototypeOf(cursor);
45
+ }
46
+ return Reflect.set(cursor || target, key, value);
47
+ }
48
+ });
49
+ };
50
+
51
+ var evaluate = function (scope, path) {
52
+ if (typeof path !== 'string') return { val: path, ctx: scope };
53
+
54
+ if (path.indexOf('.') === -1) {
55
+ return { val: scope ? scope[path] : undefined, ctx: scope };
56
+ }
57
+
58
+ var parts = pathCache.get(path);
59
+ if (!parts) {
60
+ if (pathCache.size > 1000) pathCache.clear();
61
+ parts = path.split('.');
62
+ pathCache.set(path, parts);
63
+ }
64
+
65
+ var val = scope, ctx = scope;
66
+ for (var i = 0; i < parts.length; i++) {
67
+ var part = parts[i];
68
+ if (val == null) {
69
+ return { val: val, ctx: null };
70
+ }
71
+ ctx = val;
72
+ val = val[part];
73
+ }
74
+ return { val: val, ctx: ctx };
75
+ };
76
+
77
+ var nextTick = function (fn) {
78
+ return !queue.has(fn) && queue.add(fn) && !isFlushing && (isFlushing = true) &&
79
+ p.then(function () {
80
+ queue.forEach(function (j) { j(); });
81
+ queue.clear();
82
+ isFlushing = false;
83
+ });
84
+ };
85
+
86
+ // 3. Reactivity
87
+ var track = function (t, k) {
88
+ if (!activeEffect) return;
89
+ var deps = targetMap.get(t);
90
+ if (!deps) {
91
+ deps = new Map();
92
+ targetMap.set(t, deps);
93
+ }
94
+ var dep = deps.get(k);
95
+ if (!dep) {
96
+ dep = new Set();
97
+ deps.set(k, dep);
98
+ }
99
+ dep.add(activeEffect);
100
+ activeEffect.d.add(dep);
101
+ };
102
+
103
+ var trigger = function (t, k) {
104
+ var depsMap, dep;
105
+ if (shouldTrigger && (depsMap = targetMap.get(t)) && (dep = depsMap.get(k))) {
106
+ dep.forEach(function (e) {
107
+ e.x ? e.x(e) : e();
108
+ });
109
+ }
110
+ };
111
+
112
+ var effect = function (fn, scheduler) {
113
+ var runner = function () {
114
+ runner.d.forEach(function (d) { d.delete(runner); });
115
+ runner.d.clear();
116
+ var prev = activeEffect;
117
+ activeEffect = runner;
118
+ try { fn(); } finally { activeEffect = prev; }
119
+ };
120
+ runner.d = new Set();
121
+ runner.x = scheduler;
122
+ runner();
123
+ return function () {
124
+ runner.d.forEach(function (d) { d.delete(runner); });
125
+ runner.d.clear();
126
+ queue.delete(runner);
127
+ };
128
+ };
129
+
130
+ var reactive = function (obj) {
131
+ if (!obj || typeof obj !== 'object' || obj._p || obj instanceof Node) return obj;
132
+ var existing = proxyMap.get(obj);
133
+ if (existing) return existing;
134
+
135
+ var proxy = new Proxy(obj, {
136
+ get: function (t, k, r) {
137
+ if (k === '_p') return true;
138
+ if (Array.isArray(t) && arrayInstrumentations.hasOwnProperty(k)) return arrayInstrumentations[k];
139
+ track(t, k);
140
+ var res = Reflect.get(t, k, r);
141
+ return res && typeof res === 'object' && !(res instanceof Node) ? reactive(res) : res;
142
+ },
143
+ set: function (t, k, v, r) {
144
+ var old = t[k];
145
+ var hadKey = Array.isArray(t) ? Number(k) < t.length : Object.prototype.hasOwnProperty.call(t, k);
146
+ var res = Reflect.set(t, k, v, r);
147
+ if (shouldTrigger) {
148
+ if (!hadKey) {
149
+ trigger(t, k);
150
+ if (Array.isArray(t)) trigger(t, 'length');
151
+ } else if (old !== v) {
152
+ trigger(t, k);
153
+ }
154
+ }
155
+ return res;
156
+ },
157
+ deleteProperty: function (t, k) {
158
+ var hadKey = Object.prototype.hasOwnProperty.call(t, k);
159
+ var res = Reflect.deleteProperty(t, k);
160
+ if (res && hadKey) {
161
+ trigger(t, k);
162
+ if (Array.isArray(t)) trigger(t, 'length');
163
+ }
164
+ return res;
165
+ }
166
+ });
167
+ proxyMap.set(obj, proxy);
168
+ return proxy;
169
+ };
170
+
171
+ globalStore = reactive({});
172
+
173
+ // 4. DOM Ops
174
+ var ops = {
175
+ text: function (el, v) { el.textContent = (v !== null && v !== undefined) ? v : ''; },
176
+ html: function (el, v) { el.innerHTML = (v !== null && v !== undefined) ? v : ''; },
177
+ value: function (el, v) {
178
+ if (el.type === 'checkbox') {
179
+ el.checked = !!v;
180
+ } else if (el.type === 'radio' && el.name) {
181
+ el.checked = el.value == v;
182
+ } else {
183
+ if (el.value != v) el.value = (v !== null && v !== undefined) ? v : '';
184
+ }
185
+ },
186
+ attr: function (el, v, arg) {
187
+ (v == null || v === false) ? el.removeAttribute(arg) : el.setAttribute(arg, v === true ? '' : v);
188
+ },
189
+ class: function (el, v) {
190
+ if (typeof v === 'string') {
191
+ v.split(/\s+/).forEach(function (c) {
192
+ if (c) el.classList[c[0] === '!' ? 'remove' : 'add'](c[0] === '!' ? c.slice(1) : c);
193
+ });
194
+ }
195
+ },
196
+ init: function () { },
197
+ destroy: function () { }
198
+ };
199
+
200
+ // 5. Engine
201
+ var mount = function (root) {
202
+ if (root._m) return;
203
+ root._m = 1;
204
+ var fac = registry[root.getAttribute('s-data')];
205
+ if (!fac) return;
206
+
207
+ var state = reactive(fac());
208
+ state.$refs = {};
209
+ state.$root = root;
210
+ state.$store = globalStore;
211
+
212
+ var rootK = [];
213
+
214
+ var handleEvent = function (e) {
215
+ var t = e.target;
216
+ if (t._m && (e.type === 'input' || e.type === 'change')) {
217
+ var path = t._m;
218
+ var v = t.type === 'checkbox' ? t.checked : t.value;
219
+ var evaluated = evaluate(t._s || state, path);
220
+ var parentObj = evaluated.ctx;
221
+
222
+ if (path.indexOf('.') === -1) {
223
+ (t._s || state)[path] = v;
224
+ } else if (parentObj) {
225
+ var parts = path.split('.');
226
+ parentObj[parts[parts.length - 1]] = v;
227
+ }
228
+ }
229
+
230
+ var hn;
231
+ while (t && t !== root.parentNode) {
232
+ var meta = metaMap.get(t);
233
+ if (meta && (hn = meta[e.type])) {
234
+ var evRes = evaluate(t._s || state, hn);
235
+ var fn = evRes.val;
236
+ var ctx = evRes.ctx;
237
+ if (typeof fn === 'function') fn.call(ctx, e);
238
+ }
239
+ t = t.parentNode;
240
+ }
241
+ };
242
+
243
+ var walk = function (el, scope, kList) {
244
+ if (el.nodeType !== 1 || el.hasAttribute('s-ignore')) return;
245
+
246
+ if (el !== root && el.hasAttribute('s-data')) {
247
+ var child = mount(el);
248
+ if (child) kList.push(child.unmount);
249
+ return;
250
+ }
251
+
252
+ var val;
253
+ if ((val = el.getAttribute('s-if'))) {
254
+ var anchor = document.createTextNode('');
255
+ var branchK = [];
256
+ el.replaceWith(anchor);
257
+ var node;
258
+
259
+ kList.push(function () { branchK.forEach(function (s) { s(); }); });
260
+
261
+ return kList.push(effect(function () {
262
+ var ev = evaluate(scope, val);
263
+ var res = ev.val;
264
+ var ctx = ev.ctx;
265
+ var truthy = typeof res === 'function' ? res.call(ctx, el) : res;
266
+
267
+ if (truthy) {
268
+ if (!node) {
269
+ node = el.cloneNode(true);
270
+ node.removeAttribute('s-if');
271
+ walk(node, scope, branchK);
272
+ anchor.parentNode.insertBefore(node, anchor);
273
+ }
274
+ } else if (node) {
275
+ branchK.forEach(function (s) { s(); });
276
+ branchK.length = 0;
277
+ node.remove();
278
+ node = null;
279
+ }
280
+ }, nextTick));
281
+ }
282
+
283
+ if (el.tagName === 'TEMPLATE' && (val = el.getAttribute('s-for'))) {
284
+ var match = val.match(loopRE);
285
+ if (!match) return;
286
+ var lhs = match[1].replace(/[()]/g, '');
287
+ var listKey = match[2];
288
+ var splitLhs = lhs.split(',');
289
+ var alias = splitLhs[0].trim();
290
+ var idx = splitLhs[1] ? splitLhs[1].trim() : null;
291
+
292
+ var keyAttr = el.getAttribute('s-key');
293
+ var anchor_1 = document.createTextNode('');
294
+ el.replaceWith(anchor_1);
295
+ var pool = new Map();
296
+
297
+ kList.push(function () {
298
+ pool.forEach(function (r) {
299
+ r.k.forEach(function (s) { s(); });
300
+ });
301
+ });
302
+
303
+ return kList.push(effect(function () {
304
+ var ev = evaluate(scope, listKey);
305
+ var rawItems = ev.val;
306
+ var items = rawItems;
307
+ if (Array.isArray(items)) track(items, 'length');
308
+
309
+ var cursor = anchor_1;
310
+ var iterable = Array.isArray(items) ? items : items ? Object.keys(items) : [];
311
+ var nextPool = new Map();
312
+
313
+ iterable.forEach(function (raw, i) {
314
+ var key = Array.isArray(items) ? i : raw;
315
+ var item = Array.isArray(items) ? raw : items[raw];
316
+
317
+ var rowKey;
318
+ if (keyAttr && item) rowKey = item[keyAttr];
319
+ else rowKey = (typeof item === 'object' && item) ? item : key + '_' + item;
320
+
321
+ var row = pool.get(rowKey);
322
+
323
+ var defineAlias = function (targetObj) {
324
+ Object.defineProperty(targetObj, alias, {
325
+ configurable: true, enumerable: true,
326
+ get: function () { return items[key]; },
327
+ set: function (v) { items[key] = v; }
328
+ });
329
+ };
330
+
331
+ if (!row) {
332
+ var clone = el.content.cloneNode(true);
333
+ var s = createScope(scope);
334
+ var rowK = [];
335
+
336
+ defineAlias(s);
337
+ if (idx) s[idx] = key;
338
+
339
+ var nodes = [];
340
+ var c = clone.firstChild;
341
+ while (c) {
342
+ nodes.push(c);
343
+ var next = c.nextSibling;
344
+ walk(c, s, rowK);
345
+ c = next;
346
+ }
347
+ row = { n: nodes, s: s, k: rowK };
348
+ } else {
349
+ defineAlias(row.s);
350
+ if (idx) row.s[idx] = key;
351
+ }
352
+
353
+ if (row.n[0] !== cursor.nextSibling) {
354
+ var frag = document.createDocumentFragment();
355
+ row.n.forEach(function (n) { frag.appendChild(n); });
356
+ cursor.parentNode.insertBefore(frag, cursor.nextSibling);
357
+ }
358
+ cursor = row.n[row.n.length - 1];
359
+ nextPool.set(rowKey, row);
360
+ pool.delete(rowKey);
361
+ });
362
+ pool.forEach(function (row) {
363
+ row.k.forEach(function (s) { s(); });
364
+ row.n.forEach(function (n) { n.remove(); });
365
+ });
366
+ pool = nextPool;
367
+ }, nextTick));
368
+ }
369
+
370
+ var attrs = el.attributes;
371
+ for (var i = attrs.length - 1; i >= 0; i--) {
372
+ (function (attr) {
373
+ var name = attr.name;
374
+ var value = attr.value;
375
+
376
+ if (name[0] === ':') {
377
+ kList.push(effect(function () {
378
+ var ev = evaluate(scope, value);
379
+ var res = ev.val;
380
+ var ctx = ev.ctx;
381
+ ops[name.slice(1) === 'class' ? 'class' : 'attr'](el, typeof res === 'function' ? res.call(ctx, el) : res, name.slice(1));
382
+ }, nextTick));
383
+
384
+ } else if (name[0] === 's' && name[1] === '-') {
385
+ var type = name.slice(2);
386
+ if (type === 'ref') {
387
+ state.$refs[value] = el;
388
+ } else if (type === 'model') {
389
+ kList.push(effect(function () {
390
+ var ev = evaluate(scope, value);
391
+ ops.value(el, ev.val);
392
+ }, nextTick));
393
+ if (/^(INPUT|SELECT|TEXTAREA)$/.test(el.tagName)) {
394
+ el._s = scope; el._m = value;
395
+ var evt = (el.type === 'checkbox' || el.type === 'radio' || el.tagName === 'SELECT') ? 'change' : 'input';
396
+ if (!root._e) root._e = new Set();
397
+ if (!root._e.has(evt)) {
398
+ root._e.add(evt);
399
+ root.addEventListener(evt, handleEvent);
400
+ }
401
+ }
402
+ } else if (ops[type]) {
403
+ kList.push(effect(function () {
404
+ var ev = evaluate(scope, value);
405
+ var res = ev.val;
406
+ var ctx = ev.ctx;
407
+ ops[type](el, typeof res === 'function' ? res.call(ctx, el) : res);
408
+ }, nextTick));
409
+ } else {
410
+ el._s = scope;
411
+ var meta = metaMap.get(el);
412
+ if (!meta) {
413
+ meta = {};
414
+ metaMap.set(el, meta);
415
+ }
416
+ meta[type] = value;
417
+ if (!root._e) root._e = new Set();
418
+ if (!root._e.has(type)) {
419
+ root._e.add(type);
420
+ root.addEventListener(type, handleEvent);
421
+ }
422
+ }
423
+ }
424
+ })(attrs[i]);
425
+ }
426
+
427
+ var child = el.firstElementChild;
428
+ while (child) {
429
+ var next = child.nextElementSibling;
430
+ walk(child, scope, kList);
431
+ child = next;
432
+ }
433
+ };
434
+
435
+ walk(root, state, rootK);
436
+ if (state.init) state.init();
437
+
438
+ return {
439
+ unmount: function () {
440
+ if (state.destroy) state.destroy.call(state);
441
+ rootK.forEach(function (s) { s(); });
442
+ if (root._e) root._e.forEach(function (k) { root.removeEventListener(k, handleEvent); });
443
+ root._m = 0;
444
+ }
445
+ };
446
+ };
447
+
448
+ return {
449
+ data: function (n, f) { registry[n] = f; },
450
+ start: function () {
451
+ var els = document.querySelectorAll('[s-data]');
452
+ for (var i = 0; i < els.length; i++) {
453
+ mount(els[i]);
454
+ }
455
+ },
456
+ store: function (k, v) { return v === undefined ? globalStore[k] : (globalStore[k] = v); }
457
+ };
458
+ })();
459
+
460
+ window.spiki = spiki;
461
+ })();
package/spiki.min.js ADDED
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e=(()=>{var n,r,A=Object,x=Array,k=Reflect,e=Promise,E=Map,P=Set,t=WeakMap,T="length",N="slice",L="split",C="push",S="forEach",$="delete",o="clear",O="add",j="has",M="get",R="set",W="value",q="input",z="change",B="parentNode",D="nextSibling",F="prototype",H="hasOwnProperty",I="getAttribute",U="removeAttribute",X="addEventListener",G="insertBefore",J="replaceWith",K="remove",Q="createTextNode",V="cloneNode",Y="tagName",Z="s-data",ee="s-if",a=A.create(null),re=new t,i=new t,s=new t,l=new E,c=new P,te=/^\s*(.*?)\s+in\s+(.+)\s*$/,v=!0,f=e.resolve(),u={};[C,"pop","shift","unshift","splice","sort","reverse"][S](function(t){u[t]=function(){for(var e=[],r=arguments[T];r--;)e[r]=arguments[r];v=!1;try{return x[F][t].apply(this,e)}finally{v=!0,y(this,T)}}});var ne=(e,r)=>{if("string"!=typeof r)return{v:r,c:e};if(-1===r.indexOf("."))return{v:e?e[r]:void 0,c:e};var t=l[M](r);t||(1e3<l.size&&l[o](),t=r[L]("."),l[R](r,t));for(var n=e,a=e,i=0;i<t[T];i++){if(null==n)return{v:n,c:null};n=(a=n)[t[i]]}return{v:n,c:a}},ae=e=>!c[j](e)&&c[O](e)&&!r&&(r=!0)&&f.then(()=>{c[S](e=>e()),c[o](),r=!1}),ie=(e,r)=>{var t;n&&((t=i[M](e))||i[R](e,t=new E),(e=t[M](r))||t[R](r,e=new P),e[O](n),n.d[O](e))},y=(e,r)=>{var t,n;v&&(t=i[M](e))&&(n=t[M](r))&&n[S](e=>e.x?e.x(e):e())},oe=(r,e)=>{var t=()=>{t.d[S](e=>e[$](t)),t.d[o]();var e=n;n=t;try{r()}finally{n=e}};return t.d=new P,t.x=e,t(),()=>{t.d[S](e=>e[$](t)),t.d[o](),c[$](t)}},p=e=>{if(!e||"object"!=typeof e||e._p||e instanceof Node)return e;var r=s[M](e);return r||(r=new Proxy(e,{get:(e,r,t)=>"_p"===r||(x.isArray(e)&&A[F][H].call(u,r)?u[r]:(ie(e,r),!(t=k[M](e,r,t))||"object"!=typeof t||t instanceof Node?t:p(t))),set:(e,r,t,n)=>{var a=e[r],i=x.isArray(e)?Number(r)<e[T]:A[F][H].call(e,r),n=k[R](e,r,t,n);return v&&(i?a!==t&&y(e,r):(y(e,r),x.isArray(e)&&y(e,T))),n},deleteProperty:(e,r)=>{var t=A[F][H].call(e,r),n=k.deleteProperty(e,r);return n&&t&&(y(e,r),x.isArray(e)&&y(e,T)),n}}),s[R](e,r),r)},m=p({}),se={text:(e,r)=>{e.textContent=null!=r?r:""},html:(e,r)=>{e.innerHTML=null!=r?r:""},value:(e,r)=>{"checkbox"===e.type?e.checked=!!r:"radio"===e.type&&e.name?e.checked=e[W]==r:e[W]!=r&&(e[W]=null!=r?r:"")},attr:(e,r,t)=>{null==r||!1===r?e[U](t):e.setAttribute(t,!0===r?"":r)},class:(r,e)=>{"string"==typeof e&&e[L](/\s+/)[S](e=>{e&&r.classList["!"===e[0]?K:O]("!"===e[0]?e[N](1):e)})},init:()=>{},destroy:()=>{}},le=u=>{if(!u._m){u._m=1;var e=a[u[I](Z)];if(e){var y=p(e());y.$refs={},y.$root=u,y.$store=m;var r=[],d=e=>{var r,t,n,a,i=e.target;for(!i._m||e.type!==q&&e.type!==z||(n=i._m,r="checkbox"===i.type?i.checked:i[W],t=ne(i._s||y,n),-1===n.indexOf(".")?(i._s||y)[n]=r:t.c&&(n=n[L]("."),t.c[n[n[T]-1]]=r));i&&i!==u[B];){var o=re[M](i);o&&(a=o[e.type])&&"function"==typeof(o=ne(i._s||y,a)).v&&o.v.call(o.c,e),i=i[B]}},b=(p,m,i)=>{if(1===p.nodeType&&!p[I]("s-ignore"))if(p!==u&&p[I](Z))(o=le(p))&&i[C](o.unmount);else{var r;if(r=p[I](ee)){var t,n=document[Q](""),a=[];return p[J](n),i[C](()=>{a[S](e=>e())}),i[C](oe(()=>{var e=ne(m,r);("function"==typeof e.v?e.v.call(e.c,p):e.v)?t||((t=p[V](!0))[U](ee),b(t,m,a),n[B][G](t,n)):t&&(a[S](e=>e()),a[T]=0,t[K](),t=null)},ae))}if("TEMPLATE"===p[Y]&&(r=p[I]("s-for"))){var e=r.match(te);if(!e)return;var o=e[1].replace(/[()]/g,"")[L](","),s=e[2],_=o[0].trim(),h=o[1]?o[1].trim():null,g=p[I]("s-key"),n=document[Q]("");p[J](n);var w=new E;return i[C](()=>{w[S](e=>e.k[S](e=>e()))}),i[C](oe(()=>{var u=ne(m,s).v;x.isArray(u)&&ie(u,T);var y=n,e=x.isArray(u)?u:u?A.keys(u):[],d=new E;e[S]((e,r)=>{var t,n,a=x.isArray(u)?r:e,i=x.isArray(u)?e:u[e],o=g&&i?i[g]:"object"==typeof i&&i?i:a+"_"+i,e=e=>{A.defineProperty(e,_,{configurable:!0,enumerable:!0,get:()=>u[a],set:e=>{u[a]=e}})};if(r=w[M](o))e(r.s),h&&(r.s[h]=a);else{var i=p.content[V](!0),s=(n=m,n=A.create(n),new Proxy(n,{set:(e,r,t,n)=>{if(A[F][H].call(e,r))return k[R](e,r,t,n);for(var a=e;a&&!A[F][H].call(a,r);)a=A.getPrototypeOf(a);return k[R](a||e,r,t)}})),l=[];e(s),h&&(s[h]=a);for(var c=[],v=i.firstChild;v;){c[C](v);var f=v[D];b(v,s,l),v=f}r={n:c,s:s,k:l}}r.n[0]!==y[D]&&(t=document.createDocumentFragment(),r.n[S](e=>t.appendChild(e)),y[B][G](t,y[D])),y=r.n[r.n[T]-1],d[R](o,r),w[$](o)}),w[S](e=>{e.k[S](e=>e()),e.n[S](e=>e[K]())}),w=d},ae))}for(var l=p.attributes,c=l[T]-1;0<=c;c--)(e=>{var r,t,n=e.name,a=e[W];":"===n[0]?i[C](oe(()=>{var e=ne(m,a);se["class"===n[N](1)?"class":"attr"](p,"function"==typeof e.v?e.v.call(e.c,p):e.v,n[N](1))},ae)):"s"===n[0]&&"-"===n[1]&&("ref"===(r=n[N](2))?y.$refs[a]=p:"model"===r?(i[C](oe(()=>{se.value(p,ne(m,a).v)},ae)),/^(INPUT|SELECT|TEXTAREA)$/.test(p[Y])&&(p._s=m,p._m=a,t="checkbox"===p.type||"radio"===p.type||"SELECT"===p[Y]?z:q,u._e||(u._e=new P),u._e[j](t)||(u._e[O](t),u[X](t,d)))):se[r]?i[C](oe(()=>{var e=ne(m,a);se[r](p,"function"==typeof e.v?e.v.call(e.c,p):e.v)},ae)):(p._s=m,(t=re[M](p))||re[R](p,t={}),t[r]=a,u._e||(u._e=new P),u._e[j](r)||(u._e[O](r),u[X](r,d))))})(l[c]);for(var v=p.firstElementChild;v;){var f=v.nextElementSibling;b(v,m,i),v=f}}};return b(u,y,r),y.init&&y.init(),{unmount:()=>{y.destroy&&y.destroy.call(y),r[S](e=>e()),u._e&&u._e[S](e=>u.removeEventListener(e,d)),u._m=0}}}}};return{data:(e,r)=>{a[e]=r},start:()=>{for(var e=document.querySelectorAll("["+Z+"]"),r=0;r<e[T];r++)le(e[r])},store:(e,r)=>void 0===r?m[e]:m[e]=r}})();window.spiki=e})();