sprae 10.1.4 → 10.2.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/core.js +7 -2
- package/directive/default.js +7 -4
- package/directive/each.js +3 -3
- package/dist/sprae.js +16 -6
- package/dist/sprae.min.js +1 -1
- package/package.json +1 -1
- package/store.js +5 -1
package/core.js
CHANGED
|
@@ -76,13 +76,18 @@ const parse = (expr, dir, fn) => {
|
|
|
76
76
|
if (fn = evalMemo[expr = expr.trim()]) return fn
|
|
77
77
|
|
|
78
78
|
// static-time errors
|
|
79
|
-
try { fn = compile(expr)
|
|
80
|
-
catch (e) {
|
|
79
|
+
try { fn = compile(expr) }
|
|
80
|
+
catch (e) { err(e, dir, expr) }
|
|
81
81
|
|
|
82
82
|
// runtime errors
|
|
83
83
|
return evalMemo[expr] = fn
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
+
// wrapped call
|
|
87
|
+
export let err = (e, dir, expr = '') => {
|
|
88
|
+
throw Object.assign(e, { message: `∴ ${e.message}\n\n${dir}${expr ? `="${expr}"\n\n` : ""}`, expr })
|
|
89
|
+
}
|
|
90
|
+
|
|
86
91
|
export let compile
|
|
87
92
|
|
|
88
93
|
// configure signals/compile
|
package/directive/default.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { directive } from "../core.js";
|
|
1
|
+
import { directive, err } from "../core.js";
|
|
2
2
|
import { effect } from "../signal.js";
|
|
3
3
|
|
|
4
4
|
// set generic property directive
|
|
@@ -20,7 +20,7 @@ directive.default = (el, evaluate, state, name) => {
|
|
|
20
20
|
|
|
21
21
|
// bind event to a target
|
|
22
22
|
const on = (el, e, fn = () => { }) => {
|
|
23
|
-
const ctx = { evt:
|
|
23
|
+
const ctx = { evt: '', target: el, test: () => true };
|
|
24
24
|
|
|
25
25
|
// onevt.debounce-108 -> evt.debounce-108
|
|
26
26
|
ctx.evt = e.replace(
|
|
@@ -33,8 +33,11 @@ const on = (el, e, fn = () => { }) => {
|
|
|
33
33
|
|
|
34
34
|
if (defer) fn = defer(fn);
|
|
35
35
|
|
|
36
|
-
const cb = (e) =>
|
|
37
|
-
|
|
36
|
+
const cb = (e) => {
|
|
37
|
+
try {
|
|
38
|
+
test(e) && (stop && e.stopPropagation(), prevent && e.preventDefault(), fn.call(target, e))
|
|
39
|
+
} catch (error) { err(error, `:on${evt}`, fn) }
|
|
40
|
+
};
|
|
38
41
|
|
|
39
42
|
target.addEventListener(evt, cb, opts);
|
|
40
43
|
|
package/directive/each.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import sprae, { directive } from "../core.js";
|
|
2
2
|
import store, { _change, _signals } from "../store.js";
|
|
3
|
-
import { effect, untracked, computed
|
|
3
|
+
import { effect, untracked, computed } from '../signal.js';
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
export const _each = Symbol(":each");
|
|
@@ -55,12 +55,12 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
|
|
|
55
55
|
cur[i] = newItems[i]
|
|
56
56
|
let idx = i,
|
|
57
57
|
scope = store({
|
|
58
|
-
[itemVar]:
|
|
58
|
+
[itemVar]: cur[_signals]?.[idx] || cur[idx],
|
|
59
59
|
[idxVar]: keys ? keys[idx] : idx
|
|
60
60
|
}, state),
|
|
61
61
|
el = (tpl.content || tpl).cloneNode(true),
|
|
62
62
|
frag = tpl.content ?
|
|
63
|
-
// fake fragment to
|
|
63
|
+
// fake fragment to allow sprae multiple elements
|
|
64
64
|
{ children: [...el.children], remove() { this.children.map(el => el.remove()) } } :
|
|
65
65
|
el;
|
|
66
66
|
|
package/dist/sprae.js
CHANGED
|
@@ -51,6 +51,7 @@ function store(values, parent) {
|
|
|
51
51
|
}
|
|
52
52
|
return state;
|
|
53
53
|
}
|
|
54
|
+
var mut = { push: 1, pop: 1, shift: 1, unshift: 1, splice: 1 };
|
|
54
55
|
function list(values) {
|
|
55
56
|
let lastProp;
|
|
56
57
|
if (values[_signals])
|
|
@@ -61,7 +62,7 @@ function list(values) {
|
|
|
61
62
|
if (typeof key === "symbol")
|
|
62
63
|
return key === _change ? _len : key === _signals ? signals : signals[key];
|
|
63
64
|
if (key === "length")
|
|
64
|
-
return
|
|
65
|
+
return mut[lastProp] ? _len.peek() : _len.value;
|
|
65
66
|
lastProp = key;
|
|
66
67
|
if (signals[key])
|
|
67
68
|
return signals[key].valueOf();
|
|
@@ -172,13 +173,16 @@ var parse = (expr, dir, fn) => {
|
|
|
172
173
|
try {
|
|
173
174
|
fn = compile(expr);
|
|
174
175
|
} catch (e) {
|
|
175
|
-
|
|
176
|
+
err(e, dir, expr);
|
|
177
|
+
}
|
|
178
|
+
return evalMemo[expr] = fn;
|
|
179
|
+
};
|
|
180
|
+
var err = (e, dir, expr = "") => {
|
|
181
|
+
throw Object.assign(e, { message: `\u2234 ${e.message}
|
|
176
182
|
|
|
177
183
|
${dir}${expr ? `="${expr}"
|
|
178
184
|
|
|
179
185
|
` : ""}`, expr });
|
|
180
|
-
}
|
|
181
|
-
return evalMemo[expr] = fn;
|
|
182
186
|
};
|
|
183
187
|
var compile;
|
|
184
188
|
sprae.use = (s) => {
|
|
@@ -287,7 +291,7 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
|
|
|
287
291
|
for (; i < newl; i++) {
|
|
288
292
|
cur[i] = newItems[i];
|
|
289
293
|
let idx = i, scope = store({
|
|
290
|
-
[itemVar]:
|
|
294
|
+
[itemVar]: cur[_signals]?.[idx] || cur[idx],
|
|
291
295
|
[idxVar]: keys2 ? keys2[idx] : idx
|
|
292
296
|
}, state), el = (tpl.content || tpl).cloneNode(true), frag = tpl.content ? { children: [...el.children], remove() {
|
|
293
297
|
this.children.map((el2) => el2.remove());
|
|
@@ -375,7 +379,13 @@ var on = (el, e, fn = () => {
|
|
|
375
379
|
const { evt, target, test, defer, stop, prevent, ...opts } = ctx;
|
|
376
380
|
if (defer)
|
|
377
381
|
fn = defer(fn);
|
|
378
|
-
const cb = (e2) =>
|
|
382
|
+
const cb = (e2) => {
|
|
383
|
+
try {
|
|
384
|
+
test(e2) && (stop && e2.stopPropagation(), prevent && e2.preventDefault(), fn.call(target, e2));
|
|
385
|
+
} catch (error) {
|
|
386
|
+
err(error, `:on${evt}`, fn);
|
|
387
|
+
}
|
|
388
|
+
};
|
|
379
389
|
target.addEventListener(evt, cb, opts);
|
|
380
390
|
return () => target.removeEventListener(evt, cb, opts);
|
|
381
391
|
};
|
package/dist/sprae.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t,r,l,n,s=Object.defineProperty,a=Symbol("signals"),o=Symbol("length");function i(t,r){if(!t)return t;if(t[a])return t;if(Array.isArray(t))return function(t){let r;if(t[a])return t;let l=e(t.length),n=Array(t.length).fill(null);const s=new Proxy(n,{get:(s,
|
|
1
|
+
var e,t,r,l,n,s=Object.defineProperty,a=Symbol("signals"),o=Symbol("length");function i(t,r){if(!t)return t;if(t[a])return t;if(Array.isArray(t))return function(t){let r;if(t[a])return t;let l=e(t.length),n=Array(t.length).fill(null);const s=new Proxy(n,{get:(s,u)=>"symbol"==typeof u?u===o?l:u===a?n:n[u]:"length"===u?c[r]?l.peek():l.value:(r=u,n[u]?n[u].valueOf():u<n.length?(n[u]=e(i(t[u]))).value:void 0),set(e,t,r){if("length"===t){for(let e=r,t=n.length;e<t;e++)delete s[e];return l.value=n.length=r,!0}return u(n,t,r),t>=l.peek()&&(l.value=n.length=Number(t)+1),!0},deleteProperty:(e,t)=>(n[t]&&f(n,t),1)});return s}(t);if(t.constructor!==Object)return t;let l={...r?.[a]},s=e(Object.values(t).length);const p=new Proxy(l,{get:(e,t)=>t===o?s:t===a?l:l[t]?.valueOf(),set:(e,t,r,n)=>(n=l[t],u(l,t,r),n||++s.value),deleteProperty:(e,t)=>(l[t]&&(f(l,t),s.value--),1),ownKeys:()=>(s.value,Reflect.ownKeys(l))});for(let e in t){const r=Object.getOwnPropertyDescriptor(t,e);r?.get?(l[e]=n(r.get.bind(p)))._set=r.set?.bind(p):(l[e]=null,u(l,e,t[e]))}return p}var c={push:1,pop:1,shift:1,unshift:1,splice:1};function u(t,n,s){let a=t[n];if(a)if(s===a.peek());else if(a._set)a._set(s);else if(Array.isArray(s)&&Array.isArray(a.peek())){const e=a.peek();e[o]?r((()=>{l((()=>{let t=0,r=s.length;for(;t<r;t++)e[t]=s[t];e.length=r}))})):a.value=s}else a.value=i(s);else t[n]=a=s?.peek?s:e(i(s))}function f(e,t){const r=e[t],l=r[Symbol.dispose];l&&delete r[Symbol.dispose],delete e[t],l?.()}var p=Symbol.dispose||=Symbol("dispose"),d={},y=new WeakMap;function h(e,t){if(!e?.children)return;if(y.has(e))return Object.assign(y.get(e),t);const r=i(t||{}),l=[];return function e(t,n=t.parentNode){if(t.attributes)for(let e=0;e<t.attributes.length;){let s=t.attributes[e];if(":"===s.name[0]){t.removeAttribute(s.name);let e=s.name.slice(1).split(":");for(let n of e){let e=d[n]||d.default,a=e(t,(e.parse||g)(s.value,g),r,n);a&&l.push(a)}if(y.has(t))return l.push(t[p]);if(t.parentNode!==n)return}else e++}for(let r of[...t.children])e(r,t)}(e),y.has(e)||y.set(e,r),e[p]=()=>{for(;l.length;)l.pop()();y.delete(e)},r}var v,m={},g=(e,t,r)=>{if(r=m[e=e.trim()])return r;try{r=v(e)}catch(r){b(r,t,e)}return m[e]=r},b=(e,t,r="")=>{throw Object.assign(e,{message:`∴ ${e.message}\n\n${t}${r?`="${r}"\n\n`:""}`,expr:r})};h.use=s=>{s.signal&&function(s){e=s.signal,t=s.effect,n=s.computed,l=s.batch||(e=>e()),r=s.untracked||l}(s),s.compile&&(v=s.compile)};var k,A,S={};((e,t)=>{for(var r in t)s(e,r,{get:t[r],enumerable:!0})})(S,{batch:()=>x,computed:()=>N,effect:()=>O,signal:()=>w,untracked:()=>$});var w=(e,t,r=new Set)=>((t={get value(){return k?.deps.push(r.add(k)),e},set value(t){if(t!==e){e=t;for(let e of r)A?A.add(e):e()}},peek:()=>e}).toJSON=t.then=t.toString=t.valueOf=()=>t.value,t),O=(e,t,r,l)=>(l=(r=l=>{t?.call?.(),l=k,k=r;try{t=e()}finally{k=l}}).deps=[],r(),e=>{for(t?.call?.();e=l.pop();)e.delete(r)}),N=(e,t=w(),r,l)=>((r={get value(){return l||=O((()=>t.value=e())),t.value},peek:t.peek}).toJSON=r.then=r.toString=r.valueOf=()=>r.value,r),x=e=>{let t=A;t||(A=new Set);try{e()}finally{if(!t){t=A,A=null;for(const e of t)e()}}},$=(e,t,r)=>(t=k,k=null,r=e(),k=t,r),j=Symbol(":each");d.each=(e,[l,s,c],u)=>{const f=e[j]=document.createTextNode("");e.replaceWith(f);let p,d,y=0;const v=n((()=>{d=null;let e=c(u);return"number"==typeof e&&(e=Array.from({length:e},((e,t)=>t+1))),e?.constructor===Object&&(d=Object.keys(e),e=Object.values(e)),e||[]})),m=()=>{r((()=>{let t=0,r=v.value,n=r.length;if(p&&!p[o]){for(let e of p[a]||[])e[Symbol.dispose]();p=null,y=0}if(n<y)p.length=n;else{if(p)for(;t<y;t++)p[t]=r[t];else p=r;for(;t<n;t++){p[t]=r[t];let n=t,o=i({[l]:p[a]?.[n]||p[n],[s]:d?d[n]:n},u),c=(e.content||e).cloneNode(!0),y=e.content?{children:[...c.children],remove(){this.children.map((e=>e.remove()))}}:c;f.before(c),h(y,o),((p[a]||=[])[t]||={})[Symbol.dispose]=()=>{y[Symbol.dispose](),y.remove()}}}y=n}))};let g=0;return t((()=>{v.value[o]?.value,g?g++:(m(),queueMicrotask((()=>(g&&m(),g=0))))}))},d.each.parse=(e,t)=>{let[r,l]=e.split(/\s+in\s+/),[n,s="$"]=r.split(/\s*,\s*/);return[n,s,t(l)]};var E=Symbol("if");d.if=(e,r,l)=>{let n,s,a,o=e.parentNode,i=e.nextElementSibling,c=document.createTextNode(""),u=[];return e.after(c),e.content?(n=u,e.remove(),s=[...e.content.childNodes]):s=n=[e],i?.hasAttribute(":else")?(i.removeAttribute(":else"),i.hasAttribute(":if")?a=u:(i.remove(),a=i.content?[...i.content.childNodes]:[i])):a=u,t((()=>{const t=r(l)?s:e[E]?u:a;if(i&&(i[E]=t===s),n!=t){n[0]?.[j]&&(n=[n[0][j]]);for(let e of n)e.remove();n=t;for(let e of n)o.insertBefore(e,c),h(e,l)}}))},d.default=(e,r,l,n)=>{let s,a=n.startsWith("on")&&n.slice(2);return t(a?()=>(s?.(),s=T(e,a,r(l))):()=>{let t=r(l);if(n)W(e,n,L(t,l));else for(let r in t)W(e,K(r),L(t[r],l))})};var T=(e,t,r=(()=>{}))=>{const l={evt:"",target:e,test:()=>!0};l.evt=t.replace(/\.(\w+)?-?([-\w]+)?/g,((e,t,r="")=>(l.test=C[t]?.(l,...r.split("-"))||l.test,"")));const{evt:n,target:s,test:a,defer:o,stop:i,prevent:c,...u}=l;o&&(r=o(r));const f=e=>{try{a(e)&&(i&&e.stopPropagation(),c&&e.preventDefault(),r.call(s,e))}catch(e){b(e,`:on${n}`,r)}};return s.addEventListener(n,f,u),()=>s.removeEventListener(n,f,u)},C={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},throttle(e,t){e.defer=e=>_(e,t?Number(t)||0:108)},debounce(e,t){e.defer=e=>D(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=>P.ctrl(e)&&t.every((t=>P[t]?P[t](e):e.key===t)),shift:(e,...t)=>e=>P.shift(e)&&t.every((t=>P[t]?P[t](e):e.key===t)),alt:(e,...t)=>e=>P.alt(e)&&t.every((t=>P[t]?P[t](e):e.key===t)),meta:(e,...t)=>e=>P.meta(e)&&t.every((t=>P[t]?P[t](e):e.key===t)),arrow:()=>P.arrow,enter:()=>P.enter,escape:()=>P.escape,tab:()=>P.tab,space:()=>P.space,backspace:()=>P.backspace,delete:()=>P.delete,digit:()=>P.digit,letter:()=>P.letter,character:()=>P.character},P={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,r)=>{null==r||!1===r?e.removeAttribute(t):e.setAttribute(t,!0===r?"":"number"==typeof r||"string"==typeof r?r:"")},_=(e,t)=>{let r,l,n=s=>{r=!0,setTimeout((()=>{if(r=!1,l)return l=!1,n(s),e(s)}),t)};return t=>r?l=!0:(n(t),e(t))},D=(e,t)=>{let r;return l=>{clearTimeout(r),r=setTimeout((()=>{r=null,e(l)}),t)}},K=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(e=>"-"+e.toLowerCase())),L=(e,t)=>e?.replace?e.replace(/\$<([^>]+)>/g,((e,r)=>t[r]??"")):e;d.ref=(e,t,r)=>{r[L(t,r)]=e},d.ref.parse=e=>e,d.with=(e,r,l)=>{let n;return t((()=>{let t=r(l);h(e,n?t:n=i(t,l))}))},d.html=(e,t,r)=>{let l=t(r);if(!l)return;let n=(l.content||l).cloneNode(!0);e.replaceChildren(n),h(e,r)},d.text=(e,r,l)=>(e.content&&e.replaceWith(e=document.createTextNode("")),t((()=>{let t=r(l);e.textContent=null==t?"":t}))),d.class=(e,r,l)=>{let n=new Set;return t((()=>{let t=r(l),s=new Set;t&&("string"==typeof t?L(t,l).split(" ").map((e=>s.add(e))):Array.isArray(t)?t.map((e=>(e=L(e,l))&&s.add(e))):Object.entries(t).map((([e,t])=>t&&s.add(e))));for(let t of n)s.has(t)?s.delete(t):e.classList.remove(t);for(let t of n=s)e.classList.add(t)}))},d.style=(e,r,l)=>{let n=e.getAttribute("style")||"";return n.endsWith(";")||(n+="; "),t((()=>{let t=r(l);if("string"==typeof t)e.setAttribute("style",n+L(t,l));else{e.setAttribute("style",n);for(let r in t)e.style.setProperty(r,L(t[r],l))}}))},d.value=(e,r,l)=>{let n,s,a="text"===e.type||""===e.type?t=>e.setAttribute("value",e.value=null==t?"":t):"TEXTAREA"===e.tagName||"text"===e.type||""===e.type?t=>(n=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=null==t?"":t),n&&e.setSelectionRange(n,s)):"checkbox"===e.type?t=>(e.checked=t,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 t((()=>a(r(l))))},d.fx=(e,r,l)=>t((()=>r(l))),h.use(S),h.use({compile:e=>h.constructor("__scope",`with (__scope) { return ${e} };`)});var M=h;export{M as default};
|
package/package.json
CHANGED
package/store.js
CHANGED
|
@@ -50,6 +50,8 @@ export default function store(values, parent) {
|
|
|
50
50
|
return state
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
// length mutator methods
|
|
54
|
+
const mut = { push: 1, pop: 1, shift: 1, unshift: 1, splice: 1 }
|
|
53
55
|
|
|
54
56
|
// array store - signals are lazy since arrays can be very large & expensive
|
|
55
57
|
export function list(values) {
|
|
@@ -72,7 +74,9 @@ export function list(values) {
|
|
|
72
74
|
|
|
73
75
|
// console.log('get', key)
|
|
74
76
|
// if .length is read within .push/etc - peek signal to avoid recursive subscription
|
|
75
|
-
|
|
77
|
+
// FIXME: is there a better way to maybe to detect writing .length by an array method and ignoring reactions?
|
|
78
|
+
// maybe somethign via batching?
|
|
79
|
+
if (key === 'length') return mut[lastProp] ? _len.peek() : _len.value;
|
|
76
80
|
|
|
77
81
|
lastProp = key;
|
|
78
82
|
|