sprae 5.0.0 → 5.0.2
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/package.json +1 -1
- package/sprae.auto.js +48 -37
- package/sprae.auto.min.js +1 -1
- package/sprae.js +48 -37
- package/sprae.min.js +1 -1
- package/src/state.js +3 -1
- package/test/dom.js +14 -1
package/package.json
CHANGED
package/sprae.auto.js
CHANGED
|
@@ -1,4 +1,36 @@
|
|
|
1
1
|
(() => {
|
|
2
|
+
// src/util.js
|
|
3
|
+
var queueMicrotask = Promise.prototype.then.bind(Promise.resolve());
|
|
4
|
+
var refs = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
var set = (value) => {
|
|
6
|
+
const ref = new WeakRef(value);
|
|
7
|
+
refs.set(value, ref);
|
|
8
|
+
return ref;
|
|
9
|
+
};
|
|
10
|
+
var get = (value) => refs.get(value) || set(value);
|
|
11
|
+
var WeakishMap = class extends Map {
|
|
12
|
+
#registry = new FinalizationRegistry((key) => super.delete(key));
|
|
13
|
+
get size() {
|
|
14
|
+
return [...this].length;
|
|
15
|
+
}
|
|
16
|
+
constructor(entries = []) {
|
|
17
|
+
super();
|
|
18
|
+
for (const [key, value] of entries)
|
|
19
|
+
this.set(key, value);
|
|
20
|
+
}
|
|
21
|
+
get(key) {
|
|
22
|
+
return super.get(key)?.deref();
|
|
23
|
+
}
|
|
24
|
+
set(key, value) {
|
|
25
|
+
let ref = super.get(key);
|
|
26
|
+
if (ref)
|
|
27
|
+
this.#registry.unregister(ref);
|
|
28
|
+
ref = get(value);
|
|
29
|
+
this.#registry.register(value, key, ref);
|
|
30
|
+
return super.set(key, ref);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
2
34
|
// src/state.js
|
|
3
35
|
var currentFx;
|
|
4
36
|
var batch = /* @__PURE__ */ new Set();
|
|
@@ -27,6 +59,8 @@
|
|
|
27
59
|
return target[_parent]?.[prop];
|
|
28
60
|
if (Array.isArray(target) && prop in Array.prototype)
|
|
29
61
|
return target[prop];
|
|
62
|
+
if (prop in Object.prototype)
|
|
63
|
+
return target[prop];
|
|
30
64
|
let value = target[prop];
|
|
31
65
|
if (currentFx) {
|
|
32
66
|
let propFxs = targetFxs.get(target);
|
|
@@ -152,37 +186,6 @@
|
|
|
152
186
|
return b;
|
|
153
187
|
}
|
|
154
188
|
|
|
155
|
-
// src/weakish-map.js
|
|
156
|
-
var refs = /* @__PURE__ */ new WeakMap();
|
|
157
|
-
var set = (value) => {
|
|
158
|
-
const ref = new WeakRef(value);
|
|
159
|
-
refs.set(value, ref);
|
|
160
|
-
return ref;
|
|
161
|
-
};
|
|
162
|
-
var get = (value) => refs.get(value) || set(value);
|
|
163
|
-
var WeakishMap = class extends Map {
|
|
164
|
-
#registry = new FinalizationRegistry((key) => super.delete(key));
|
|
165
|
-
get size() {
|
|
166
|
-
return [...this].length;
|
|
167
|
-
}
|
|
168
|
-
constructor(entries = []) {
|
|
169
|
-
super();
|
|
170
|
-
for (const [key, value] of entries)
|
|
171
|
-
this.set(key, value);
|
|
172
|
-
}
|
|
173
|
-
get(key) {
|
|
174
|
-
return super.get(key)?.deref();
|
|
175
|
-
}
|
|
176
|
-
set(key, value) {
|
|
177
|
-
let ref = super.get(key);
|
|
178
|
-
if (ref)
|
|
179
|
-
this.#registry.unregister(ref);
|
|
180
|
-
ref = get(value);
|
|
181
|
-
this.#registry.register(value, key, ref);
|
|
182
|
-
return super.set(key, ref);
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
|
|
186
189
|
// src/directives.js
|
|
187
190
|
var primary = {};
|
|
188
191
|
var secondary = {};
|
|
@@ -213,8 +216,8 @@
|
|
|
213
216
|
}
|
|
214
217
|
};
|
|
215
218
|
};
|
|
216
|
-
primary["
|
|
217
|
-
let evaluate = parseExpr(el, expr, "
|
|
219
|
+
primary["with"] = (el, expr, rootState) => {
|
|
220
|
+
let evaluate = parseExpr(el, expr, ":with");
|
|
218
221
|
const localState = evaluate(rootState);
|
|
219
222
|
let state2 = state(localState, rootState);
|
|
220
223
|
sprae(el, state2);
|
|
@@ -223,12 +226,12 @@
|
|
|
223
226
|
primary["each"] = (tpl, expr) => {
|
|
224
227
|
let each = parseForExpression(expr);
|
|
225
228
|
if (!each)
|
|
226
|
-
return exprError(new Error(), tpl, expr);
|
|
229
|
+
return exprError(new Error(), tpl, expr, ":each");
|
|
227
230
|
const holder = tpl[_each] = document.createTextNode("");
|
|
228
231
|
tpl.replaceWith(holder);
|
|
229
232
|
const evaluate = parseExpr(tpl, each[2], ":each");
|
|
230
233
|
const keyExpr = tpl.getAttribute(":key");
|
|
231
|
-
const itemKey = keyExpr ? parseExpr(null, keyExpr) : null;
|
|
234
|
+
const itemKey = keyExpr ? parseExpr(null, keyExpr, ":each") : null;
|
|
232
235
|
tpl.removeAttribute(":key");
|
|
233
236
|
const refExpr = tpl.getAttribute(":ref");
|
|
234
237
|
const scopes = new WeakishMap();
|
|
@@ -287,6 +290,14 @@
|
|
|
287
290
|
];
|
|
288
291
|
return [item, "", items];
|
|
289
292
|
}
|
|
293
|
+
secondary["render"] = (el, expr, state2) => {
|
|
294
|
+
let evaluate = parseExpr(el, expr, ":render"), tpl = evaluate(state2);
|
|
295
|
+
if (!tpl)
|
|
296
|
+
exprError(new Error("Template not found"), el, expr, ":render");
|
|
297
|
+
let content = tpl.content.cloneNode(true);
|
|
298
|
+
el.replaceChildren(content);
|
|
299
|
+
sprae(el, state2);
|
|
300
|
+
};
|
|
290
301
|
secondary["ref"] = (el, expr, state2) => {
|
|
291
302
|
state2[expr] = el;
|
|
292
303
|
};
|
|
@@ -537,11 +548,11 @@
|
|
|
537
548
|
return result;
|
|
538
549
|
};
|
|
539
550
|
}
|
|
540
|
-
function exprError(error, element, expression,
|
|
551
|
+
function exprError(error, element, expression, directive) {
|
|
541
552
|
Object.assign(error, { element, expression });
|
|
542
553
|
console.warn(`\u2234 ${error.message}
|
|
543
554
|
|
|
544
|
-
${
|
|
555
|
+
${directive}=${expression ? `"${expression}"
|
|
545
556
|
|
|
546
557
|
` : ""}`, element);
|
|
547
558
|
queueMicrotask(() => {
|
package/sprae.auto.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var e,t,r=new
|
|
1
|
+
(()=>{var e,t,r=Promise.prototype.then.bind(Promise.resolve()),n=new WeakMap,l=class extends Map{#e=new FinalizationRegistry((e=>super.delete(e)));get size(){return[...this].length}constructor(e=[]){super();for(const[t,r]of e)this.set(t,r)}get(e){return super.get(e)?.deref()}set(e,t){let r=super.get(e);return r&&this.#e.unregister(r),r=(e=>n.get(e)||(e=>{const t=new WeakRef(e);return n.set(e,t),t})(e))(t),this.#e.register(t,e,r),super.set(e,r)}},s=new Set,i=new WeakMap,o=new WeakMap,a=new WeakMap,u=Symbol("parent"),c={Array:Array,Object:Object,Number:Number,String:String,Boolean:Boolean,Date:Date,console:console},f={has:()=>!0,get(t,r){if("symbol"==typeof r)return t[r];if(!(r in t))return t[u]?.[r];if(Array.isArray(t)&&r in Array.prototype)return t[r];if(r in Object.prototype)return t[r];let n=t[r];if(e){let n=i.get(t);n||i.set(t,n={}),n[r]?n[r].includes(e)||n[r].push(e):n[r]=[e]}if(n&&n.constructor===Object||Array.isArray(n)){let e=o.get(n);return e||o.set(n,e=new Proxy(n,f)),e}return n},set(e,t,r){if(!(t in e)&&e[u]&&t in e[u])return e[u][t]=r;if(Array.isArray(e)&&t in Array.prototype)return e[t]=r;const n=e[t];if(Object.is(n,r))return!0;e[t]=r;let l=i.get(e)?.[t];if(l)for(let e of l)s.add(e);return h(),!0},deleteProperty:(e,t)=>(e[t]=void 0,delete e[t],!0)},p=(e,t)=>{if(o.has(e))return o.get(e);if(a.has(e))return e;let r=new Proxy(e,f);return o.set(e,r),a.set(r,e),e[u]=t?p(t):c,r},y=t=>{const r=()=>{let n=e;e=r,t(),e=n};return r(),r},h=()=>{t||(t=!0,r((()=>{for(let e of s)e.call();s.clear(),t=!1})))},g={},d={};g.if=(e,t)=>{let r=document.createTextNode(""),n=[S(e,t,":if")],l=[e],s=e;for(;(s=e.nextElementSibling)&&s.hasAttribute(":else");)s.removeAttribute(":else"),(t=s.getAttribute(":if"))?(s.removeAttribute(":if"),s.remove(),l.push(s),n.push(S(e,t,":else :if"))):(s.remove(),l.push(s),n.push((()=>1)));return e.replaceWith(s=r),e=>{let t=n.findIndex((t=>t(e)));l[t]!=s&&((s[m]||s).replaceWith(s=l[t]||r),$(s,e))}},g.with=(e,t,r)=>{const n=S(e,t,":with")(r);$(e,p(n,r))};var m=Symbol(":each");g.each=(e,t)=>{let r=function(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,r=e.match(/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/);if(!r)return;let n=r[2].trim(),l=r[1].replace(/^\s*\(|\)\s*$/g,"").trim(),s=l.match(t);return s?[l.replace(t,"").trim(),s[1].trim(),n]:[l,"",n]}(t);if(!r)return E(new Error,e,t,":each");const n=e[m]=document.createTextNode("");e.replaceWith(n);const s=S(e,r[2],":each"),i=e.getAttribute(":key"),o=i?S(null,i,":each"):null;e.removeAttribute(":key");const a=e.getAttribute(":ref"),u=new l,c=new l;let f=[];return l=>{let i=s(l);i?"number"==typeof i?i=Array.from({length:i},((e,t)=>[t,t+1])):Array.isArray(i)?i=i.map(((e,t)=>[t+1,e])):"object"==typeof i?i=Object.entries(i):E(Error("Bad list value"),e,t,":each"):i=[];let y=[],h=[];for(let[t,n]of i){let s,i,f=o?.({[r[0]]:n,[r[1]]:t});null==f?s=e.cloneNode(!0):(s=c.get(f))||c.set(f,s=e.cloneNode(!0)),y.push(s),null!=f&&(i=u.get(f))?i[r[0]]=n:(i=p({[r[0]]:n,[a||""]:null,[r[1]]:t},l),null!=f&&u.set(f,i)),h.push(i)}!function(e,t,r,n){const l=new Map,s=new Map;let i,o;for(i=0;i<t.length;i++)l.set(t[i],i);for(i=0;i<r.length;i++)s.set(r[i],i);for(i=o=0;i!==t.length||o!==r.length;){var a=t[i],u=r[o];if(null===a)i++;else if(r.length<=o)e.removeChild(t[i]),i++;else if(t.length<=i)e.insertBefore(u,t[i]||n),o++;else if(a===u)i++,o++;else{var c=s.get(a),f=l.get(u);void 0===c?(e.removeChild(t[i]),i++):void 0===f?(e.insertBefore(u,t[i]||n),o++):(e.insertBefore(t[f],t[i]||n),t[f]=null,f>i+1&&i++,o++)}}}(n.parentNode,f,y,n),f=y;for(let e=0;e<y.length;e++)$(y[e],h[e])}},d.render=(e,t,r)=>{let n=S(e,t,":render")(r);n||E(new Error("Template not found"),e,t,":render");let l=n.content.cloneNode(!0);e.replaceChildren(l),$(e,r)},d.ref=(e,t,r)=>{r[t]=e},d.id=(e,t)=>{let r=S(e,t,":id");return t=>{return n=r(t),e.id=n||0===n?n:"";var n}},d.class=(e,t)=>{let r=S(e,t,":class"),n=e.className;return t=>{let l=r(t),s="string"==typeof l?l:(Array.isArray(l)?l:Object.entries(l).map((([e,t])=>t?e:""))).filter(Boolean).join(" ");e.className=[n,s].filter(Boolean).join(" ")}},d.style=(e,t)=>{let r=S(e,t,":style"),n=e.getAttribute("style")||"";return n.endsWith(";")||(n+="; "),t=>{let l=r(t);if("string"==typeof l)e.setAttribute("style",n+l);else{e.setAttribute("style",n);for(let t in l)e.style.setProperty(t,l[t])}}},d.text=(e,t)=>{let r=S(e,t,":text");return t=>{let n=r(t);e.textContent=null==n?"":n}},d[""]=(e,t)=>{let r=S(e,t,":");if(r)return t=>{let n=r(t);for(let t in n)W(e,t.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(e=>"-"+e.toLowerCase())),n[t])}},d.value=(e,t)=>{let r,n,l=S(e,t,":value"),s="text"===e.type||""===e.type?t=>e.setAttribute("value",e.value=null==t?"":t):"TEXTAREA"===e.tagName||"text"===e.type||""===e.type?t=>(r=e.selectionStart,n=e.selectionEnd,e.setAttribute("value",e.value=null==t?"":t),r&&e.setSelectionRange(r,n)):"checkbox"===e.type?t=>(e.value=t?"on":"",W(e,"checked",t)):"select-one"===e.type?t=>{for(let t in e.options)t.removeAttribute("selected");e.value=t,e.selectedOptions[0]?.setAttribute("selected","")}:t=>e.value=t;return e=>s(l(e))},d.on=(e,t)=>{let r=S(e,t,":on");return t=>{let n=r(t),l=[];for(let t in n)l.push(v(e,t,n[t]));return()=>{for(let e of l)e()}}};var b=(e,t,r,n)=>{let l=n.startsWith("on")&&n.slice(2),s=S(e,t,":"+n);if(s)return l?t=>{let r=s(t)||(()=>{});return v(e,l,r)}:t=>W(e,n,s(t))},v=(e,t,r)=>{if(!r)return;let n=t.split("..").map((t=>{let r={evt:"",target:e,test:()=>!0};return r.evt=(t.startsWith("on")?t.slice(2):t).replace(/\.(\w+)?-?([-\w]+)?/g,((e,t,n="")=>(r.test=A[t]?.(r,...n.split("-"))||r.test,""))),r}));if(1==n.length)return i(r,n[0]);const l=(t,r=0)=>{let s;return s=i((i=>{r&&s();let o=t.call(e,i);"function"!=typeof o&&(o=()=>{}),r+1<n.length&&l(o,r?r+1:1)}),n[r])};let s=l(r);return()=>s();function i(e,{evt:t,target:r,test:n,defer:l,stop:s,prevent:i,...o}){l&&(e=l(e));let a=t=>n(t)&&(s&&t.stopPropagation(),i&&t.preventDefault(),e.call(r,t));return r.addEventListener(t,a,o),()=>r.removeEventListener(t,a,o)}},A={prevent(e){e.prevent=!0},stop(e){e.stop=!0},once(e){e.once=!0},passive(e){e.passive=!0},capture(e){e.capture=!0},window(e){e.target=window},document(e){e.target=document},toggle(e){e.defer=(t,r)=>n=>r?(r.call?.(e.target,n),r=null):r=t()},throttle(e,t){e.defer=e=>w(e,t?Number(t)||0:108)},debounce(e,t){e.defer=e=>N(e,t?Number(t)||0:108)},outside:e=>t=>{let r=e.target;return!(r.contains(t.target)||!1===t.target.isConnected||r.offsetWidth<1&&r.offsetHeight<1)},self:e=>t=>t.target===e.target,ctrl:(e,...t)=>e=>k.ctrl(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),shift:(e,...t)=>e=>k.shift(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),alt:(e,...t)=>e=>k.alt(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),meta:(e,...t)=>e=>k.meta(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),arrow:e=>k.arrow,enter:e=>k.enter,escape:e=>k.escape,tab:e=>k.tab,space:e=>k.space,backspace:e=>k.backspace,delete:e=>k.delete,digit:e=>k.digit,letter:e=>k.letter,character:e=>k.character},k={ctrl:e=>e.ctrlKey||"Control"===e.key||"Ctrl"===e.key,shift:e=>e.shiftKey||"Shift"===e.key,alt:e=>e.altKey||"Alt"===e.key,meta:e=>e.metaKey||"Meta"===e.key||"Command"===e.key,arrow:e=>e.key.startsWith("Arrow"),enter:e=>"Enter"===e.key,escape:e=>e.key.startsWith("Esc"),tab:e=>"Tab"===e.key,space:e=>" "===e.key||"Space"===e.key||" "===e.key,backspace:e=>"Backspace"===e.key,delete:e=>"Delete"===e.key,digit:e=>/^\d$/.test(e.key),letter:e=>/^[a-zA-Z]$/.test(e.key),character:e=>/^\S$/.test(e.key)},w=(e,t)=>{let r,n,l=s=>{r=!0,setTimeout((()=>{if(r=!1,n)return n=!1,l(s),e(s)}),t)};return t=>r?n=!0:(l(t),e(t))},N=(e,t)=>{let r;return n=>{clearTimeout(r),r=setTimeout((()=>{r=null,e(n)}),t)}},W=(e,t,r)=>{null==r||!1===r?e.removeAttribute(t):e.setAttribute(t,!0===r?"":"number"==typeof r||"string"==typeof r?r:"")},x={};function S(e,t,r){let n=x[t];if(!n){let l=/^[\n\s]*if.*\(.*\)/.test(t)||/\b(let|const)\s/.test(t)&&!r.startsWith(":on")?`(() => {${t}})()`:t;try{n=x[t]=new Function("__scope",`with (__scope) { return ${l.trim()} };`)}catch(n){return E(n,e,t,r)}}return l=>{let s;try{s=n.call(e,l)}catch(n){return E(n,e,t,r)}return s}}function E(e,t,n,l){Object.assign(e,{element:t,expression:n}),console.warn(`∴ ${e.message}\n\n${l}=${n?`"${n}"\n\n`:""}`,t),r((()=>{throw e}),0)}$.globals=c;var j=new WeakMap;function $(e,t){if(!e.children)return;if(j.has(e))return Object.assign(j.get(e),t);const r=p(t||{}),n=[],l=(e,t=e.parentNode)=>{for(let l in g){let s=":"+l;if(e.hasAttribute?.(s)){let i=e.getAttribute(s);if(e.removeAttribute(s),n.push(g[l](e,i,r,l)),j.has(e)||e.parentNode!==t)return!1}}if(e.attributes)for(let l=0;l<e.attributes.length;){let s=e.attributes[l];if(":"!==s.name[0]){l++;continue}e.removeAttribute(s.name);let i=s.value,o=s.name.slice(1).split(":");for(let l of o){let s=d[l]||b;if(n.push(s(e,i,r,l)),j.has(e)||e.parentNode!==t)return!1}}for(let t,r=0;t=e.children[r];r++)!1===l(t,e)&&r--};l(e);for(let e of n)if(e){let t;y((()=>{"function"==typeof t&&t(),t=e(r)}))}return j.set(e,r),r}document.currentScript&&$(document.documentElement)})();
|
package/sprae.js
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
// src/util.js
|
|
2
|
+
var queueMicrotask = Promise.prototype.then.bind(Promise.resolve());
|
|
3
|
+
var refs = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
var set = (value) => {
|
|
5
|
+
const ref = new WeakRef(value);
|
|
6
|
+
refs.set(value, ref);
|
|
7
|
+
return ref;
|
|
8
|
+
};
|
|
9
|
+
var get = (value) => refs.get(value) || set(value);
|
|
10
|
+
var WeakishMap = class extends Map {
|
|
11
|
+
#registry = new FinalizationRegistry((key) => super.delete(key));
|
|
12
|
+
get size() {
|
|
13
|
+
return [...this].length;
|
|
14
|
+
}
|
|
15
|
+
constructor(entries = []) {
|
|
16
|
+
super();
|
|
17
|
+
for (const [key, value] of entries)
|
|
18
|
+
this.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
get(key) {
|
|
21
|
+
return super.get(key)?.deref();
|
|
22
|
+
}
|
|
23
|
+
set(key, value) {
|
|
24
|
+
let ref = super.get(key);
|
|
25
|
+
if (ref)
|
|
26
|
+
this.#registry.unregister(ref);
|
|
27
|
+
ref = get(value);
|
|
28
|
+
this.#registry.register(value, key, ref);
|
|
29
|
+
return super.set(key, ref);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
1
33
|
// src/state.js
|
|
2
34
|
var currentFx;
|
|
3
35
|
var batch = /* @__PURE__ */ new Set();
|
|
@@ -26,6 +58,8 @@ var handler = {
|
|
|
26
58
|
return target[_parent]?.[prop];
|
|
27
59
|
if (Array.isArray(target) && prop in Array.prototype)
|
|
28
60
|
return target[prop];
|
|
61
|
+
if (prop in Object.prototype)
|
|
62
|
+
return target[prop];
|
|
29
63
|
let value = target[prop];
|
|
30
64
|
if (currentFx) {
|
|
31
65
|
let propFxs = targetFxs.get(target);
|
|
@@ -151,37 +185,6 @@ function domdiff_default(parent, a, b, before) {
|
|
|
151
185
|
return b;
|
|
152
186
|
}
|
|
153
187
|
|
|
154
|
-
// src/weakish-map.js
|
|
155
|
-
var refs = /* @__PURE__ */ new WeakMap();
|
|
156
|
-
var set = (value) => {
|
|
157
|
-
const ref = new WeakRef(value);
|
|
158
|
-
refs.set(value, ref);
|
|
159
|
-
return ref;
|
|
160
|
-
};
|
|
161
|
-
var get = (value) => refs.get(value) || set(value);
|
|
162
|
-
var WeakishMap = class extends Map {
|
|
163
|
-
#registry = new FinalizationRegistry((key) => super.delete(key));
|
|
164
|
-
get size() {
|
|
165
|
-
return [...this].length;
|
|
166
|
-
}
|
|
167
|
-
constructor(entries = []) {
|
|
168
|
-
super();
|
|
169
|
-
for (const [key, value] of entries)
|
|
170
|
-
this.set(key, value);
|
|
171
|
-
}
|
|
172
|
-
get(key) {
|
|
173
|
-
return super.get(key)?.deref();
|
|
174
|
-
}
|
|
175
|
-
set(key, value) {
|
|
176
|
-
let ref = super.get(key);
|
|
177
|
-
if (ref)
|
|
178
|
-
this.#registry.unregister(ref);
|
|
179
|
-
ref = get(value);
|
|
180
|
-
this.#registry.register(value, key, ref);
|
|
181
|
-
return super.set(key, ref);
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
188
|
// src/directives.js
|
|
186
189
|
var primary = {};
|
|
187
190
|
var secondary = {};
|
|
@@ -212,8 +215,8 @@ primary["if"] = (el, expr) => {
|
|
|
212
215
|
}
|
|
213
216
|
};
|
|
214
217
|
};
|
|
215
|
-
primary["
|
|
216
|
-
let evaluate = parseExpr(el, expr, "
|
|
218
|
+
primary["with"] = (el, expr, rootState) => {
|
|
219
|
+
let evaluate = parseExpr(el, expr, ":with");
|
|
217
220
|
const localState = evaluate(rootState);
|
|
218
221
|
let state2 = state(localState, rootState);
|
|
219
222
|
sprae(el, state2);
|
|
@@ -222,12 +225,12 @@ var _each = Symbol(":each");
|
|
|
222
225
|
primary["each"] = (tpl, expr) => {
|
|
223
226
|
let each = parseForExpression(expr);
|
|
224
227
|
if (!each)
|
|
225
|
-
return exprError(new Error(), tpl, expr);
|
|
228
|
+
return exprError(new Error(), tpl, expr, ":each");
|
|
226
229
|
const holder = tpl[_each] = document.createTextNode("");
|
|
227
230
|
tpl.replaceWith(holder);
|
|
228
231
|
const evaluate = parseExpr(tpl, each[2], ":each");
|
|
229
232
|
const keyExpr = tpl.getAttribute(":key");
|
|
230
|
-
const itemKey = keyExpr ? parseExpr(null, keyExpr) : null;
|
|
233
|
+
const itemKey = keyExpr ? parseExpr(null, keyExpr, ":each") : null;
|
|
231
234
|
tpl.removeAttribute(":key");
|
|
232
235
|
const refExpr = tpl.getAttribute(":ref");
|
|
233
236
|
const scopes = new WeakishMap();
|
|
@@ -286,6 +289,14 @@ function parseForExpression(expression) {
|
|
|
286
289
|
];
|
|
287
290
|
return [item, "", items];
|
|
288
291
|
}
|
|
292
|
+
secondary["render"] = (el, expr, state2) => {
|
|
293
|
+
let evaluate = parseExpr(el, expr, ":render"), tpl = evaluate(state2);
|
|
294
|
+
if (!tpl)
|
|
295
|
+
exprError(new Error("Template not found"), el, expr, ":render");
|
|
296
|
+
let content = tpl.content.cloneNode(true);
|
|
297
|
+
el.replaceChildren(content);
|
|
298
|
+
sprae(el, state2);
|
|
299
|
+
};
|
|
289
300
|
secondary["ref"] = (el, expr, state2) => {
|
|
290
301
|
state2[expr] = el;
|
|
291
302
|
};
|
|
@@ -536,11 +547,11 @@ function parseExpr(el, expression, dir) {
|
|
|
536
547
|
return result;
|
|
537
548
|
};
|
|
538
549
|
}
|
|
539
|
-
function exprError(error, element, expression,
|
|
550
|
+
function exprError(error, element, expression, directive) {
|
|
540
551
|
Object.assign(error, { element, expression });
|
|
541
552
|
console.warn(`\u2234 ${error.message}
|
|
542
553
|
|
|
543
|
-
${
|
|
554
|
+
${directive}=${expression ? `"${expression}"
|
|
544
555
|
|
|
545
556
|
` : ""}`, element);
|
|
546
557
|
queueMicrotask(() => {
|
package/sprae.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t,r=new
|
|
1
|
+
var e,t,r=Promise.prototype.then.bind(Promise.resolve()),n=new WeakMap,l=class extends Map{#e=new FinalizationRegistry((e=>super.delete(e)));get size(){return[...this].length}constructor(e=[]){super();for(const[t,r]of e)this.set(t,r)}get(e){return super.get(e)?.deref()}set(e,t){let r=super.get(e);return r&&this.#e.unregister(r),r=(e=>n.get(e)||(e=>{const t=new WeakRef(e);return n.set(e,t),t})(e))(t),this.#e.register(t,e,r),super.set(e,r)}},s=new Set,i=new WeakMap,o=new WeakMap,a=new WeakMap,u=Symbol("parent"),c={Array:Array,Object:Object,Number:Number,String:String,Boolean:Boolean,Date:Date,console:console},f={has:()=>!0,get(t,r){if("symbol"==typeof r)return t[r];if(!(r in t))return t[u]?.[r];if(Array.isArray(t)&&r in Array.prototype)return t[r];if(r in Object.prototype)return t[r];let n=t[r];if(e){let n=i.get(t);n||i.set(t,n={}),n[r]?n[r].includes(e)||n[r].push(e):n[r]=[e]}if(n&&n.constructor===Object||Array.isArray(n)){let e=o.get(n);return e||o.set(n,e=new Proxy(n,f)),e}return n},set(e,t,r){if(!(t in e)&&e[u]&&t in e[u])return e[u][t]=r;if(Array.isArray(e)&&t in Array.prototype)return e[t]=r;const n=e[t];if(Object.is(n,r))return!0;e[t]=r;let l=i.get(e)?.[t];if(l)for(let e of l)s.add(e);return h(),!0},deleteProperty:(e,t)=>(e[t]=void 0,delete e[t],!0)},p=(e,t)=>{if(o.has(e))return o.get(e);if(a.has(e))return e;let r=new Proxy(e,f);return o.set(e,r),a.set(r,e),e[u]=t?p(t):c,r},y=t=>{const r=()=>{let n=e;e=r,t(),e=n};return r(),r},h=()=>{t||(t=!0,r((()=>{for(let e of s)e.call();s.clear(),t=!1})))},d={},g={};d.if=(e,t)=>{let r=document.createTextNode(""),n=[S(e,t,":if")],l=[e],s=e;for(;(s=e.nextElementSibling)&&s.hasAttribute(":else");)s.removeAttribute(":else"),(t=s.getAttribute(":if"))?(s.removeAttribute(":if"),s.remove(),l.push(s),n.push(S(e,t,":else :if"))):(s.remove(),l.push(s),n.push((()=>1)));return e.replaceWith(s=r),e=>{let t=n.findIndex((t=>t(e)));l[t]!=s&&((s[m]||s).replaceWith(s=l[t]||r),$(s,e))}},d.with=(e,t,r)=>{const n=S(e,t,":with")(r);$(e,p(n,r))};var m=Symbol(":each");d.each=(e,t)=>{let r=function(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,r=e.match(/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/);if(!r)return;let n=r[2].trim(),l=r[1].replace(/^\s*\(|\)\s*$/g,"").trim(),s=l.match(t);return s?[l.replace(t,"").trim(),s[1].trim(),n]:[l,"",n]}(t);if(!r)return E(new Error,e,t,":each");const n=e[m]=document.createTextNode("");e.replaceWith(n);const s=S(e,r[2],":each"),i=e.getAttribute(":key"),o=i?S(null,i,":each"):null;e.removeAttribute(":key");const a=e.getAttribute(":ref"),u=new l,c=new l;let f=[];return l=>{let i=s(l);i?"number"==typeof i?i=Array.from({length:i},((e,t)=>[t,t+1])):Array.isArray(i)?i=i.map(((e,t)=>[t+1,e])):"object"==typeof i?i=Object.entries(i):E(Error("Bad list value"),e,t,":each"):i=[];let y=[],h=[];for(let[t,n]of i){let s,i,f=o?.({[r[0]]:n,[r[1]]:t});null==f?s=e.cloneNode(!0):(s=c.get(f))||c.set(f,s=e.cloneNode(!0)),y.push(s),null!=f&&(i=u.get(f))?i[r[0]]=n:(i=p({[r[0]]:n,[a||""]:null,[r[1]]:t},l),null!=f&&u.set(f,i)),h.push(i)}!function(e,t,r,n){const l=new Map,s=new Map;let i,o;for(i=0;i<t.length;i++)l.set(t[i],i);for(i=0;i<r.length;i++)s.set(r[i],i);for(i=o=0;i!==t.length||o!==r.length;){var a=t[i],u=r[o];if(null===a)i++;else if(r.length<=o)e.removeChild(t[i]),i++;else if(t.length<=i)e.insertBefore(u,t[i]||n),o++;else if(a===u)i++,o++;else{var c=s.get(a),f=l.get(u);void 0===c?(e.removeChild(t[i]),i++):void 0===f?(e.insertBefore(u,t[i]||n),o++):(e.insertBefore(t[f],t[i]||n),t[f]=null,f>i+1&&i++,o++)}}}(n.parentNode,f,y,n),f=y;for(let e=0;e<y.length;e++)$(y[e],h[e])}},g.render=(e,t,r)=>{let n=S(e,t,":render")(r);n||E(new Error("Template not found"),e,t,":render");let l=n.content.cloneNode(!0);e.replaceChildren(l),$(e,r)},g.ref=(e,t,r)=>{r[t]=e},g.id=(e,t)=>{let r=S(e,t,":id");return t=>{return n=r(t),e.id=n||0===n?n:"";var n}},g.class=(e,t)=>{let r=S(e,t,":class"),n=e.className;return t=>{let l=r(t),s="string"==typeof l?l:(Array.isArray(l)?l:Object.entries(l).map((([e,t])=>t?e:""))).filter(Boolean).join(" ");e.className=[n,s].filter(Boolean).join(" ")}},g.style=(e,t)=>{let r=S(e,t,":style"),n=e.getAttribute("style")||"";return n.endsWith(";")||(n+="; "),t=>{let l=r(t);if("string"==typeof l)e.setAttribute("style",n+l);else{e.setAttribute("style",n);for(let t in l)e.style.setProperty(t,l[t])}}},g.text=(e,t)=>{let r=S(e,t,":text");return t=>{let n=r(t);e.textContent=null==n?"":n}},g[""]=(e,t)=>{let r=S(e,t,":");if(r)return t=>{let n=r(t);for(let t in n)W(e,t.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(e=>"-"+e.toLowerCase())),n[t])}},g.value=(e,t)=>{let r,n,l=S(e,t,":value"),s="text"===e.type||""===e.type?t=>e.setAttribute("value",e.value=null==t?"":t):"TEXTAREA"===e.tagName||"text"===e.type||""===e.type?t=>(r=e.selectionStart,n=e.selectionEnd,e.setAttribute("value",e.value=null==t?"":t),r&&e.setSelectionRange(r,n)):"checkbox"===e.type?t=>(e.value=t?"on":"",W(e,"checked",t)):"select-one"===e.type?t=>{for(let t in e.options)t.removeAttribute("selected");e.value=t,e.selectedOptions[0]?.setAttribute("selected","")}:t=>e.value=t;return e=>s(l(e))},g.on=(e,t)=>{let r=S(e,t,":on");return t=>{let n=r(t),l=[];for(let t in n)l.push(v(e,t,n[t]));return()=>{for(let e of l)e()}}};var b=(e,t,r,n)=>{let l=n.startsWith("on")&&n.slice(2),s=S(e,t,":"+n);if(s)return l?t=>{let r=s(t)||(()=>{});return v(e,l,r)}:t=>W(e,n,s(t))},v=(e,t,r)=>{if(!r)return;let n=t.split("..").map((t=>{let r={evt:"",target:e,test:()=>!0};return r.evt=(t.startsWith("on")?t.slice(2):t).replace(/\.(\w+)?-?([-\w]+)?/g,((e,t,n="")=>(r.test=A[t]?.(r,...n.split("-"))||r.test,""))),r}));if(1==n.length)return i(r,n[0]);const l=(t,r=0)=>{let s;return s=i((i=>{r&&s();let o=t.call(e,i);"function"!=typeof o&&(o=()=>{}),r+1<n.length&&l(o,r?r+1:1)}),n[r])};let s=l(r);return()=>s();function i(e,{evt:t,target:r,test:n,defer:l,stop:s,prevent:i,...o}){l&&(e=l(e));let a=t=>n(t)&&(s&&t.stopPropagation(),i&&t.preventDefault(),e.call(r,t));return r.addEventListener(t,a,o),()=>r.removeEventListener(t,a,o)}},A={prevent(e){e.prevent=!0},stop(e){e.stop=!0},once(e){e.once=!0},passive(e){e.passive=!0},capture(e){e.capture=!0},window(e){e.target=window},document(e){e.target=document},toggle(e){e.defer=(t,r)=>n=>r?(r.call?.(e.target,n),r=null):r=t()},throttle(e,t){e.defer=e=>w(e,t?Number(t)||0:108)},debounce(e,t){e.defer=e=>N(e,t?Number(t)||0:108)},outside:e=>t=>{let r=e.target;return!(r.contains(t.target)||!1===t.target.isConnected||r.offsetWidth<1&&r.offsetHeight<1)},self:e=>t=>t.target===e.target,ctrl:(e,...t)=>e=>k.ctrl(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),shift:(e,...t)=>e=>k.shift(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),alt:(e,...t)=>e=>k.alt(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),meta:(e,...t)=>e=>k.meta(e)&&t.every((t=>k[t]?k[t](e):e.key===t)),arrow:e=>k.arrow,enter:e=>k.enter,escape:e=>k.escape,tab:e=>k.tab,space:e=>k.space,backspace:e=>k.backspace,delete:e=>k.delete,digit:e=>k.digit,letter:e=>k.letter,character:e=>k.character},k={ctrl:e=>e.ctrlKey||"Control"===e.key||"Ctrl"===e.key,shift:e=>e.shiftKey||"Shift"===e.key,alt:e=>e.altKey||"Alt"===e.key,meta:e=>e.metaKey||"Meta"===e.key||"Command"===e.key,arrow:e=>e.key.startsWith("Arrow"),enter:e=>"Enter"===e.key,escape:e=>e.key.startsWith("Esc"),tab:e=>"Tab"===e.key,space:e=>" "===e.key||"Space"===e.key||" "===e.key,backspace:e=>"Backspace"===e.key,delete:e=>"Delete"===e.key,digit:e=>/^\d$/.test(e.key),letter:e=>/^[a-zA-Z]$/.test(e.key),character:e=>/^\S$/.test(e.key)},w=(e,t)=>{let r,n,l=s=>{r=!0,setTimeout((()=>{if(r=!1,n)return n=!1,l(s),e(s)}),t)};return t=>r?n=!0:(l(t),e(t))},N=(e,t)=>{let r;return n=>{clearTimeout(r),r=setTimeout((()=>{r=null,e(n)}),t)}},W=(e,t,r)=>{null==r||!1===r?e.removeAttribute(t):e.setAttribute(t,!0===r?"":"number"==typeof r||"string"==typeof r?r:"")},x={};function S(e,t,r){let n=x[t];if(!n){let l=/^[\n\s]*if.*\(.*\)/.test(t)||/\b(let|const)\s/.test(t)&&!r.startsWith(":on")?`(() => {${t}})()`:t;try{n=x[t]=new Function("__scope",`with (__scope) { return ${l.trim()} };`)}catch(n){return E(n,e,t,r)}}return l=>{let s;try{s=n.call(e,l)}catch(n){return E(n,e,t,r)}return s}}function E(e,t,n,l){Object.assign(e,{element:t,expression:n}),console.warn(`∴ ${e.message}\n\n${l}=${n?`"${n}"\n\n`:""}`,t),r((()=>{throw e}),0)}$.globals=c;var j=new WeakMap;function $(e,t){if(!e.children)return;if(j.has(e))return Object.assign(j.get(e),t);const r=p(t||{}),n=[],l=(e,t=e.parentNode)=>{for(let l in d){let s=":"+l;if(e.hasAttribute?.(s)){let i=e.getAttribute(s);if(e.removeAttribute(s),n.push(d[l](e,i,r,l)),j.has(e)||e.parentNode!==t)return!1}}if(e.attributes)for(let l=0;l<e.attributes.length;){let s=e.attributes[l];if(":"!==s.name[0]){l++;continue}e.removeAttribute(s.name);let i=s.value,o=s.name.slice(1).split(":");for(let l of o){let s=g[l]||b;if(n.push(s(e,i,r,l)),j.has(e)||e.parentNode!==t)return!1}}for(let t,r=0;t=e.children[r];r++)!1===l(t,e)&&r--};l(e);for(let e of n)if(e){let t;y((()=>{"function"==typeof t&&t(),t=e(r)}))}return j.set(e,r),r}var C=$;document.currentScript&&$(document.documentElement);export{C as default};
|
package/src/state.js
CHANGED
|
@@ -24,8 +24,10 @@ const handler = {
|
|
|
24
24
|
if (typeof prop === 'symbol') return target[prop]
|
|
25
25
|
if (!(prop in target)) return target[_parent]?.[prop]
|
|
26
26
|
if (Array.isArray(target) && prop in Array.prototype) return target[prop];
|
|
27
|
-
|
|
27
|
+
// .constructor etc
|
|
28
|
+
if (prop in Object.prototype) return target[prop];
|
|
28
29
|
|
|
30
|
+
let value = target[prop]
|
|
29
31
|
if (currentFx) {
|
|
30
32
|
// get actual target from prototype chain
|
|
31
33
|
// while (!target.hasOwnProperty(prop)) target = Object.getPrototypeOf(target)
|
package/test/dom.js
CHANGED
|
@@ -922,7 +922,7 @@ test(':render by ref', async () => {
|
|
|
922
922
|
is(a.outerHTML, `<template><div :text="123"></div></template><x><div>123</div></x>`)
|
|
923
923
|
})
|
|
924
924
|
|
|
925
|
-
test(':render
|
|
925
|
+
test(':render state', async () => {
|
|
926
926
|
let a = h`<template :ref="abc"><div :text="text"></div></template><x :render="abc" />`
|
|
927
927
|
let state = sprae(a, {text:'abc'})
|
|
928
928
|
is(a.outerHTML, `<template><div :text="text"></div></template><x><div>abc</div></x>`)
|
|
@@ -931,6 +931,19 @@ test(':render :with', async () => {
|
|
|
931
931
|
is(a.outerHTML, `<template><div :text="text"></div></template><x><div>def</div></x>`)
|
|
932
932
|
})
|
|
933
933
|
|
|
934
|
+
test(':render :with', async () => {
|
|
935
|
+
let a = h`<template :ref="tpl"><div :text="text"></div></template><x :render="tpl" :with="{text:'abc'}" />`
|
|
936
|
+
let state = sprae(a)
|
|
937
|
+
is(a.outerHTML, `<template><div :text="text"></div></template><x><div>abc</div></x>`)
|
|
938
|
+
})
|
|
939
|
+
|
|
940
|
+
test(':render multiples', async () => {
|
|
941
|
+
let el = h`<template :ref="tpl"><div :each="item in items" :text="item.id"></div></template><x :render="tpl" :with="{items:[{id:'a'},{id:'b'}]}" />`
|
|
942
|
+
let state = sprae(el)
|
|
943
|
+
is(el.outerHTML, `<template><div :each="item in items" :text="item.id"></div></template><x><div>a</div><div>b</div></x>`)
|
|
944
|
+
})
|
|
945
|
+
|
|
946
|
+
|
|
934
947
|
test('ref: base', async () => {
|
|
935
948
|
let a = h`<a :ref="a" :init="log.push(a), null" :text="b"></a>`
|
|
936
949
|
let state = sprae(a, {log:[], b:1})
|