sprae 11.2.3 → 11.2.5
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/core.js +37 -36
- package/directive/default.js +6 -6
- package/directive/each.js +8 -6
- package/directive/if.js +2 -3
- package/dist/sprae.js +40 -48
- package/dist/sprae.js.map +2 -2
- package/dist/sprae.min.js +3 -3
- package/dist/sprae.min.js.map +3 -3
- package/dist/sprae.umd.js +61 -69
- package/dist/sprae.umd.js.map +3 -3
- package/dist/sprae.umd.min.js +2 -2
- package/dist/sprae.umd.min.js.map +3 -3
- package/package.json +1 -1
- package/store.js +42 -47
package/core.js
CHANGED
|
@@ -2,12 +2,12 @@ import { use, effect } from "./signal.js";
|
|
|
2
2
|
import { store, _signals } from './store.js';
|
|
3
3
|
|
|
4
4
|
// polyfill
|
|
5
|
-
const _dispose = (Symbol.dispose ||= Symbol("dispose"));
|
|
5
|
+
export const _dispose = (Symbol.dispose ||= Symbol("dispose"));
|
|
6
6
|
|
|
7
7
|
export const _state = Symbol("state"), _on = Symbol('on'), _off = Symbol('off')
|
|
8
8
|
|
|
9
9
|
// registered directives
|
|
10
|
-
const directive = {}
|
|
10
|
+
export const directive = {}
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Register a directive with a parsed expression and evaluator.
|
|
@@ -28,39 +28,39 @@ export const dir = (name, create, p = parse) => directive[name] = (el, expr, sta
|
|
|
28
28
|
* @param {Object} [values] - Initial values to populate the element's reactive state.
|
|
29
29
|
* @returns {Object} The reactive state object associated with the element.
|
|
30
30
|
*/
|
|
31
|
-
export
|
|
31
|
+
export const sprae = (el, values) => {
|
|
32
32
|
// repeated call can be caused by eg. :each with new objects with old keys
|
|
33
33
|
if (el[_state]) return Object.assign(el[_state], values)
|
|
34
34
|
|
|
35
35
|
// take over existing state instead of creating a clone
|
|
36
|
-
|
|
36
|
+
let state = store(values || {}), offs = [], fx = [],
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
init = (el, attrs = el.attributes) => {
|
|
39
|
+
// we iterate live collection (subsprae can init args)
|
|
40
|
+
if (attrs) for (let i = 0; i < attrs.length;) {
|
|
41
|
+
let { name, value } = attrs[i], pfx, update, dir
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
// if we have parts meaning there's attr needs to be spraed
|
|
44
|
+
// :id:name -> [,id,name]; s-text:id -> [,text,id]; ab-cd -> [ab-cd]
|
|
45
|
+
if (pfx = name[0] === ':' ? 1 : (name[0] === 's' && name[1] === '-') ? 2 : 0) {
|
|
46
|
+
el.removeAttribute(name);
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
// multiple attributes like :id:for=""
|
|
49
|
+
for (dir of name.slice(pfx).split(':')) {
|
|
50
|
+
update = (directive[dir] || directive.default)(el, value, state, dir)
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
// save & start effect
|
|
53
|
+
fx.push(update), offs.push(effect(update))
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
// stop after :each, :if, :with etc.
|
|
56
|
+
if (el[_state] === null) return
|
|
57
|
+
}
|
|
58
|
+
} else i++
|
|
59
|
+
}
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
// :if and :each replace element with text node, which tweaks .children length, but .childNodes length persists
|
|
62
|
+
for (let child of el.childNodes) child.nodeType == 1 && init(child)
|
|
63
|
+
};
|
|
64
64
|
|
|
65
65
|
init(el);
|
|
66
66
|
|
|
@@ -69,8 +69,8 @@ export default function sprae(el, values) {
|
|
|
69
69
|
el[_state] = state
|
|
70
70
|
|
|
71
71
|
// on/off all effects
|
|
72
|
-
el[_off] = () =>
|
|
73
|
-
el[_on] = () => offs
|
|
72
|
+
el[_off] = () => (offs.map(off => off()), offs = [])
|
|
73
|
+
el[_on] = () => offs = fx.map(f => effect(f))
|
|
74
74
|
|
|
75
75
|
// destroy
|
|
76
76
|
el[_dispose] = () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = null)
|
|
@@ -79,6 +79,13 @@ export default function sprae(el, values) {
|
|
|
79
79
|
return state;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
// configure signals/compile
|
|
83
|
+
// it's more compact than using sprae.signal = signal etc.
|
|
84
|
+
sprae.use = s => {
|
|
85
|
+
s.signal && use(s);
|
|
86
|
+
s.compile && (compile = s.compile);
|
|
87
|
+
}
|
|
88
|
+
|
|
82
89
|
/**
|
|
83
90
|
* Parses an expression into an evaluator function, caching the result for reuse.
|
|
84
91
|
*
|
|
@@ -105,7 +112,7 @@ const memo = {};
|
|
|
105
112
|
* @param {string} [expr=''] - The expression associated with the error, if any.
|
|
106
113
|
* @throws {Error} The enhanced error object with a formatted message.
|
|
107
114
|
*/
|
|
108
|
-
export const err = (e, dir='', expr='') => {
|
|
115
|
+
export const err = (e, dir = '', expr = '') => {
|
|
109
116
|
throw Object.assign(e, { message: `∴ ${e.message}\n\n${dir}${expr ? `="${expr}"\n\n` : ""}`, expr })
|
|
110
117
|
}
|
|
111
118
|
|
|
@@ -116,14 +123,6 @@ export const err = (e, dir='', expr='') => {
|
|
|
116
123
|
*/
|
|
117
124
|
export let compile
|
|
118
125
|
|
|
119
|
-
// configure signals/compile
|
|
120
|
-
// it's more compact than using sprae.signal = signal etc.
|
|
121
|
-
sprae.use = s => {
|
|
122
|
-
s.signal && use(s);
|
|
123
|
-
s.compile && (compile = s.compile);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
126
|
// instantiated <template> fragment holder, like persisting fragment but with minimal API surface
|
|
128
127
|
export const frag = (tpl) => {
|
|
129
128
|
if (!tpl.nodeType) return tpl // existing tpl
|
|
@@ -149,3 +148,5 @@ export const frag = (tpl) => {
|
|
|
149
148
|
// setAttributeNode() { }
|
|
150
149
|
}
|
|
151
150
|
}
|
|
151
|
+
|
|
152
|
+
export default sprae
|
package/directive/default.js
CHANGED
|
@@ -11,7 +11,7 @@ dir('default', (target, state, expr, name) => {
|
|
|
11
11
|
// bind event to a target
|
|
12
12
|
// NOTE: if you decide to remove chain of events, thing again - that's unique feature of sprae, don't diminish your own value.
|
|
13
13
|
// ona..onb
|
|
14
|
-
|
|
14
|
+
let ctxs = name.split('..').map(e => {
|
|
15
15
|
let ctx = { evt: '', target, test: () => true };
|
|
16
16
|
ctx.evt = (e.startsWith('on') ? e.slice(2) : e).replace(/\.(\w+)?-?([-\w]+)?/g,
|
|
17
17
|
(_, mod, param = '') => (ctx.test = mods[mod]?.(ctx, ...param.split('-')) || ctx.test, '')
|
|
@@ -20,10 +20,10 @@ dir('default', (target, state, expr, name) => {
|
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
// add listener with the context
|
|
23
|
-
|
|
23
|
+
let addListener = (fn, { evt, target, test, defer, stop, prevent, immediate, ...opts }, cb) => {
|
|
24
24
|
if (defer) fn = defer(fn)
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
cb = (e) => {
|
|
27
27
|
try {
|
|
28
28
|
test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.call(state, e))
|
|
29
29
|
} catch (error) { err(error, `:on${evt}`, fn) }
|
|
@@ -38,7 +38,7 @@ dir('default', (target, state, expr, name) => {
|
|
|
38
38
|
|
|
39
39
|
// events cycler
|
|
40
40
|
let startFn, nextFn, off, idx = 0
|
|
41
|
-
|
|
41
|
+
let nextListener = (fn) => {
|
|
42
42
|
off = addListener((e) => (
|
|
43
43
|
off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : (startFn && nextListener(startFn))
|
|
44
44
|
), ctxs[idx]);
|
|
@@ -68,8 +68,8 @@ const mods = {
|
|
|
68
68
|
document(ctx) { ctx.target = document; },
|
|
69
69
|
parent(ctx) { ctx.target = ctx.target.parentNode; },
|
|
70
70
|
|
|
71
|
-
throttle(ctx, limit) { ctx.defer = (fn) => throttle(fn, limit ?
|
|
72
|
-
debounce(ctx, wait) { ctx.defer = (fn) => debounce(fn, wait ?
|
|
71
|
+
throttle(ctx, limit) { ctx.defer = (fn) => throttle(fn, limit ? +limit || 0 : 108); },
|
|
72
|
+
debounce(ctx, wait) { ctx.defer = (fn) => debounce(fn, wait ? +wait || 0 : 108); },
|
|
73
73
|
|
|
74
74
|
// test
|
|
75
75
|
outside: (ctx) => (e) => {
|
package/directive/each.js
CHANGED
|
@@ -4,17 +4,15 @@ import { effect } from '../signal.js';
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
dir('each', (tpl, state, expr) => {
|
|
7
|
-
|
|
7
|
+
let [itemVar, idxVar = "$"] = expr.split(/\bin\b/)[0].trim().split(/\s*,\s*/);
|
|
8
8
|
|
|
9
9
|
// we need :if to be able to replace holder instead of tpl for :if :each case
|
|
10
|
-
|
|
11
|
-
tpl.replaceWith(holder);
|
|
12
|
-
tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template
|
|
10
|
+
let holder = document.createTextNode("");
|
|
13
11
|
|
|
14
12
|
// we re-create items any time new items are produced
|
|
15
13
|
let cur, keys, items, prevl = 0
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
let update = () => {
|
|
18
16
|
let i = 0, newItems = items, newl = newItems.length
|
|
19
17
|
|
|
20
18
|
// plain array update, not store (signal with array) - updates full list
|
|
@@ -56,7 +54,11 @@ dir('each', (tpl, state, expr) => {
|
|
|
56
54
|
prevl = newl
|
|
57
55
|
}
|
|
58
56
|
|
|
57
|
+
tpl.replaceWith(holder);
|
|
58
|
+
tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template
|
|
59
|
+
|
|
59
60
|
return value => {
|
|
61
|
+
// obtain new items
|
|
60
62
|
keys = null
|
|
61
63
|
if (typeof value === "number") items = Array.from({ length: value }, (_, i) => i + 1)
|
|
62
64
|
else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)
|
|
@@ -75,5 +77,5 @@ dir('each', (tpl, state, expr) => {
|
|
|
75
77
|
},
|
|
76
78
|
|
|
77
79
|
// redefine evaluator to take second part of expression
|
|
78
|
-
expr => parse(expr.split(/\
|
|
80
|
+
expr => parse(expr.split(/\bin\b/)[1])
|
|
79
81
|
)
|
package/directive/if.js
CHANGED
|
@@ -6,7 +6,7 @@ import sprae, { dir, _state, _on, _off, frag } from "../core.js";
|
|
|
6
6
|
const _prevIf = Symbol("if");
|
|
7
7
|
|
|
8
8
|
dir('if', (el, state) => {
|
|
9
|
-
|
|
9
|
+
let holder = document.createTextNode('')
|
|
10
10
|
|
|
11
11
|
let next = el.nextElementSibling,
|
|
12
12
|
curEl, ifEl, elseEl;
|
|
@@ -22,8 +22,7 @@ dir('if', (el, state) => {
|
|
|
22
22
|
if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, elseEl[_state] = null
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
return (value) => {
|
|
26
|
-
const newEl = value ? ifEl : el[_prevIf] ? null : elseEl;
|
|
25
|
+
return (value, newEl = value ? ifEl : el[_prevIf] ? null : elseEl) => {
|
|
27
26
|
if (next) next[_prevIf] = newEl === ifEl
|
|
28
27
|
if (curEl != newEl) {
|
|
29
28
|
// disable effects on child elements when element is not matched
|
package/dist/sprae.js
CHANGED
|
@@ -42,9 +42,8 @@ var _signals = Symbol("signals");
|
|
|
42
42
|
var _change = Symbol("change");
|
|
43
43
|
var store = (values, parent) => {
|
|
44
44
|
if (!values) return values;
|
|
45
|
-
if (values[_signals]) return values;
|
|
46
|
-
if (Array.isArray(values)
|
|
47
|
-
if (values.constructor !== Object || values[Symbol.toStringTag]) return values;
|
|
45
|
+
if (values[_signals] || values[Symbol.toStringTag]) return values;
|
|
46
|
+
if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values;
|
|
48
47
|
let signals = { ...parent?.[_signals] }, _len = signal(Object.values(values).length), state = new Proxy(signals, {
|
|
49
48
|
get: (_, key) => key === _change ? _len : key === _signals ? signals : signals[key]?.valueOf(),
|
|
50
49
|
set: (_, key, v, s) => (s = signals[key], set(signals, key, v), s ?? ++_len.value, 1),
|
|
@@ -62,10 +61,7 @@ var store = (values, parent) => {
|
|
|
62
61
|
return state;
|
|
63
62
|
};
|
|
64
63
|
var list = (values) => {
|
|
65
|
-
let lastProp
|
|
66
|
-
if (values[_signals]) return values;
|
|
67
|
-
let _len = signal(values.length), signals = Array(values.length).fill();
|
|
68
|
-
const state = new Proxy(signals, {
|
|
64
|
+
let lastProp, _len = signal(values.length), signals = Array(values.length).fill(), state = new Proxy(signals, {
|
|
69
65
|
get(_, key) {
|
|
70
66
|
if (typeof key === "symbol") return key === _change ? _len : key === _signals ? signals : signals[key];
|
|
71
67
|
if (key === "length") return mut.includes(lastProp) ? _len.peek() : _len.value;
|
|
@@ -77,11 +73,11 @@ var list = (values) => {
|
|
|
77
73
|
if (key === "length") {
|
|
78
74
|
for (let i = v; i < signals.length; i++) delete state[i];
|
|
79
75
|
_len.value = signals.length = v;
|
|
80
|
-
|
|
76
|
+
} else {
|
|
77
|
+
set(signals, key, v);
|
|
78
|
+
if (key >= _len.peek()) _len.value = signals.length = +key + 1;
|
|
81
79
|
}
|
|
82
|
-
|
|
83
|
-
if (key >= _len.peek()) _len.value = signals.length = +key + 1;
|
|
84
|
-
return true;
|
|
80
|
+
return 1;
|
|
85
81
|
},
|
|
86
82
|
deleteProperty: (_, key) => (signals[key]?.[Symbol.dispose]?.(), delete signals[key], 1)
|
|
87
83
|
});
|
|
@@ -89,13 +85,12 @@ var list = (values) => {
|
|
|
89
85
|
};
|
|
90
86
|
var mut = ["push", "pop", "shift", "unshift", "splice"];
|
|
91
87
|
var set = (signals, key, v) => {
|
|
92
|
-
let s = signals[key];
|
|
88
|
+
let s = signals[key], cur;
|
|
93
89
|
if (key[0] === "_") signals[key] = v;
|
|
94
90
|
else if (!s) signals[key] = s = v?.peek ? v : signal(store(v));
|
|
95
|
-
else if (v === s.peek()) ;
|
|
91
|
+
else if (v === (cur = s.peek())) ;
|
|
96
92
|
else if (s._set) s._set(v);
|
|
97
|
-
else if (Array.isArray(v) && Array.isArray(
|
|
98
|
-
const cur = s.peek();
|
|
93
|
+
else if (Array.isArray(v) && Array.isArray(cur)) {
|
|
99
94
|
if (cur[_change]) batch(() => {
|
|
100
95
|
for (let i = 0; i < v.length; i++) cur[i] = v[i];
|
|
101
96
|
cur.length = v.length;
|
|
@@ -112,10 +107,9 @@ var _on = Symbol("on");
|
|
|
112
107
|
var _off = Symbol("off");
|
|
113
108
|
var directive = {};
|
|
114
109
|
var dir = (name, create, p = parse) => directive[name] = (el, expr, state, name2, update, evaluate) => (evaluate = p(expr), update = create(el, state, expr, name2, evaluate), () => update(evaluate(state)));
|
|
115
|
-
|
|
110
|
+
var sprae = (el, values) => {
|
|
116
111
|
if (el[_state]) return Object.assign(el[_state], values);
|
|
117
|
-
|
|
118
|
-
const init = (el2, attrs = el2.attributes) => {
|
|
112
|
+
let state = store(values || {}), offs = [], fx = [], init = (el2, attrs = el2.attributes) => {
|
|
119
113
|
if (attrs) for (let i = 0; i < attrs.length; ) {
|
|
120
114
|
let { name, value } = attrs[i], pfx, update, dir2;
|
|
121
115
|
if (pfx = name[0] === ":" ? 1 : name[0] === "s" && name[1] === "-" ? 2 : 0) {
|
|
@@ -132,14 +126,16 @@ function sprae(el, values) {
|
|
|
132
126
|
init(el);
|
|
133
127
|
if (!(_state in el)) {
|
|
134
128
|
el[_state] = state;
|
|
135
|
-
el[_off] = () =>
|
|
136
|
-
|
|
137
|
-
};
|
|
138
|
-
el[_on] = () => offs.push(...fx.map((f) => effect(f)));
|
|
129
|
+
el[_off] = () => (offs.map((off) => off()), offs = []);
|
|
130
|
+
el[_on] = () => offs = fx.map((f) => effect(f));
|
|
139
131
|
el[_dispose] = () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = null);
|
|
140
132
|
}
|
|
141
133
|
return state;
|
|
142
|
-
}
|
|
134
|
+
};
|
|
135
|
+
sprae.use = (s) => {
|
|
136
|
+
s.signal && use(s);
|
|
137
|
+
s.compile && (compile = s.compile);
|
|
138
|
+
};
|
|
143
139
|
var parse = (expr, dir2, fn) => {
|
|
144
140
|
if (fn = memo[expr = expr.trim()]) return fn;
|
|
145
141
|
try {
|
|
@@ -158,10 +154,6 @@ ${dir2}${expr ? `="${expr}"
|
|
|
158
154
|
` : ""}`, expr });
|
|
159
155
|
};
|
|
160
156
|
var compile;
|
|
161
|
-
sprae.use = (s) => {
|
|
162
|
-
s.signal && use(s);
|
|
163
|
-
s.compile && (compile = s.compile);
|
|
164
|
-
};
|
|
165
157
|
var frag = (tpl) => {
|
|
166
158
|
if (!tpl.nodeType) return tpl;
|
|
167
159
|
let content = tpl.content.cloneNode(true), attributes = [...tpl.attributes], ref = document.createTextNode(""), childNodes = (content.append(ref), [...content.childNodes]);
|
|
@@ -182,11 +174,12 @@ var frag = (tpl) => {
|
|
|
182
174
|
// setAttributeNode() { }
|
|
183
175
|
};
|
|
184
176
|
};
|
|
177
|
+
var core_default = sprae;
|
|
185
178
|
|
|
186
179
|
// directive/if.js
|
|
187
180
|
var _prevIf = Symbol("if");
|
|
188
181
|
dir("if", (el, state) => {
|
|
189
|
-
|
|
182
|
+
let holder = document.createTextNode("");
|
|
190
183
|
let next = el.nextElementSibling, curEl, ifEl, elseEl;
|
|
191
184
|
el.replaceWith(holder);
|
|
192
185
|
ifEl = el.content ? frag(el) : el;
|
|
@@ -195,14 +188,13 @@ dir("if", (el, state) => {
|
|
|
195
188
|
next.removeAttribute(":else");
|
|
196
189
|
if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, elseEl[_state] = null;
|
|
197
190
|
}
|
|
198
|
-
return (value) => {
|
|
199
|
-
const newEl = value ? ifEl : el[_prevIf] ? null : elseEl;
|
|
191
|
+
return (value, newEl = value ? ifEl : el[_prevIf] ? null : elseEl) => {
|
|
200
192
|
if (next) next[_prevIf] = newEl === ifEl;
|
|
201
193
|
if (curEl != newEl) {
|
|
202
194
|
if (curEl) curEl.remove(), curEl[_off]?.();
|
|
203
195
|
if (curEl = newEl) {
|
|
204
196
|
holder.before(curEl.content || curEl);
|
|
205
|
-
curEl[_state] === null ? (delete curEl[_state],
|
|
197
|
+
curEl[_state] === null ? (delete curEl[_state], core_default(curEl, state)) : curEl[_on]();
|
|
206
198
|
}
|
|
207
199
|
}
|
|
208
200
|
};
|
|
@@ -212,12 +204,10 @@ dir("if", (el, state) => {
|
|
|
212
204
|
dir(
|
|
213
205
|
"each",
|
|
214
206
|
(tpl, state, expr) => {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
tpl.replaceWith(holder);
|
|
218
|
-
tpl[_state] = null;
|
|
207
|
+
let [itemVar, idxVar = "$"] = expr.split(/\bin\b/)[0].trim().split(/\s*,\s*/);
|
|
208
|
+
let holder = document.createTextNode("");
|
|
219
209
|
let cur, keys2, items, prevl = 0;
|
|
220
|
-
|
|
210
|
+
let update = () => {
|
|
221
211
|
var _a, _b;
|
|
222
212
|
let i = 0, newItems = items, newl = newItems.length;
|
|
223
213
|
if (cur && !cur[_change]) {
|
|
@@ -235,7 +225,7 @@ dir(
|
|
|
235
225
|
[idxVar]: keys2 ? keys2[idx] : idx
|
|
236
226
|
}, state), el = tpl.content ? frag(tpl) : tpl.cloneNode(true);
|
|
237
227
|
holder.before(el.content || el);
|
|
238
|
-
|
|
228
|
+
core_default(el, scope);
|
|
239
229
|
((_b = cur[_a = _signals] || (cur[_a] = []))[i] || (_b[i] = {}))[Symbol.dispose] = () => {
|
|
240
230
|
el[Symbol.dispose]?.(), el.remove();
|
|
241
231
|
};
|
|
@@ -243,6 +233,8 @@ dir(
|
|
|
243
233
|
}
|
|
244
234
|
prevl = newl;
|
|
245
235
|
};
|
|
236
|
+
tpl.replaceWith(holder);
|
|
237
|
+
tpl[_state] = null;
|
|
246
238
|
return (value) => {
|
|
247
239
|
keys2 = null;
|
|
248
240
|
if (typeof value === "number") items = Array.from({ length: value }, (_, i) => i + 1);
|
|
@@ -256,7 +248,7 @@ dir(
|
|
|
256
248
|
};
|
|
257
249
|
},
|
|
258
250
|
// redefine evaluator to take second part of expression
|
|
259
|
-
(expr) => parse(expr.split(/\
|
|
251
|
+
(expr) => parse(expr.split(/\bin\b/)[1])
|
|
260
252
|
);
|
|
261
253
|
|
|
262
254
|
// directive/default.js
|
|
@@ -265,7 +257,7 @@ dir("default", (target, state, expr, name) => {
|
|
|
265
257
|
return name ? (value) => attr(target, name, value) : (value) => {
|
|
266
258
|
for (let key in value) attr(target, dashcase(key), value[key]);
|
|
267
259
|
};
|
|
268
|
-
|
|
260
|
+
let ctxs = name.split("..").map((e) => {
|
|
269
261
|
let ctx = { evt: "", target, test: () => true };
|
|
270
262
|
ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
|
|
271
263
|
/\.(\w+)?-?([-\w]+)?/g,
|
|
@@ -273,9 +265,9 @@ dir("default", (target, state, expr, name) => {
|
|
|
273
265
|
);
|
|
274
266
|
return ctx;
|
|
275
267
|
});
|
|
276
|
-
|
|
268
|
+
let addListener = (fn, { evt, target: target2, test, defer, stop, prevent, immediate, ...opts }, cb) => {
|
|
277
269
|
if (defer) fn = defer(fn);
|
|
278
|
-
|
|
270
|
+
cb = (e) => {
|
|
279
271
|
try {
|
|
280
272
|
test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.call(state, e));
|
|
281
273
|
} catch (error) {
|
|
@@ -287,7 +279,7 @@ dir("default", (target, state, expr, name) => {
|
|
|
287
279
|
};
|
|
288
280
|
if (ctxs.length == 1) return (v) => addListener(v, ctxs[0]);
|
|
289
281
|
let startFn, nextFn, off, idx = 0;
|
|
290
|
-
|
|
282
|
+
let nextListener = (fn) => {
|
|
291
283
|
off = addListener((e) => (off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : startFn && nextListener(startFn)), ctxs[idx]);
|
|
292
284
|
};
|
|
293
285
|
return (value) => (startFn = value, !off && nextListener(startFn), () => startFn = null);
|
|
@@ -324,10 +316,10 @@ var mods = {
|
|
|
324
316
|
ctx.target = ctx.target.parentNode;
|
|
325
317
|
},
|
|
326
318
|
throttle(ctx, limit) {
|
|
327
|
-
ctx.defer = (fn) => throttle(fn, limit ?
|
|
319
|
+
ctx.defer = (fn) => throttle(fn, limit ? +limit || 0 : 108);
|
|
328
320
|
},
|
|
329
321
|
debounce(ctx, wait) {
|
|
330
|
-
ctx.defer = (fn) => debounce(fn, wait ?
|
|
322
|
+
ctx.defer = (fn) => debounce(fn, wait ? +wait || 0 : 108);
|
|
331
323
|
},
|
|
332
324
|
// test
|
|
333
325
|
outside: (ctx) => (e) => {
|
|
@@ -421,7 +413,7 @@ dir("value", (el, state, expr) => {
|
|
|
421
413
|
el.oninput = el.onchange = handleChange;
|
|
422
414
|
if (el.type?.startsWith("select")) {
|
|
423
415
|
new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });
|
|
424
|
-
|
|
416
|
+
core_default(el, state);
|
|
425
417
|
}
|
|
426
418
|
} catch {
|
|
427
419
|
}
|
|
@@ -440,7 +432,7 @@ var ensure = (state, expr, name = expr.match(/^\w+(?=\s*(?:\.|\[|$))/)) => {
|
|
|
440
432
|
dir("ref", (el, state, expr, _, ev) => (ensure(state, expr), ev(state) == null ? (setter(expr)(state, el), (_2) => _2) : (v) => v.call(null, el)));
|
|
441
433
|
|
|
442
434
|
// directive/with.js
|
|
443
|
-
dir("with", (el, rootState, state) => (state = null, (values) =>
|
|
435
|
+
dir("with", (el, rootState, state) => (state = null, (values) => core_default(el, state ? values : state = store_default(values, rootState))));
|
|
444
436
|
|
|
445
437
|
// directive/text.js
|
|
446
438
|
dir("text", (el) => (
|
|
@@ -490,8 +482,8 @@ dir("data", (el) => (value) => {
|
|
|
490
482
|
});
|
|
491
483
|
|
|
492
484
|
// sprae.js
|
|
493
|
-
|
|
494
|
-
var sprae_default =
|
|
485
|
+
core_default.use({ compile: (expr) => core_default.constructor(`with (arguments[0]) { return ${expr} };`) });
|
|
486
|
+
var sprae_default = core_default;
|
|
495
487
|
export {
|
|
496
488
|
sprae_default as default
|
|
497
489
|
};
|