1
0
mirror of https://github.com/jaandrle/deka-dom-el synced 2025-03-31 11:35:52 +02:00

🐛 __dde_reactive

This commit is contained in:
Jan Andrle 2025-03-17 10:32:02 +01:00
parent 992370b4e3
commit d1b017c1a1
Signed by: jaandrle
GPG Key ID: B3A25AED155AFFAB
10 changed files with 37 additions and 40 deletions

View File

@ -639,7 +639,7 @@ function wrapMethod(obj, method, apply) {
}
// src/memo.js
var memoMark = "__dde_memo_of";
var memoMark = "__dde_memo";
var memo_scope = [];
function memo(key, generator) {
if (!memo_scope.length) return generator(key);
@ -648,7 +648,7 @@ function memo(key, generator) {
return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
}
memo.isScope = function(obj) {
return Boolean(obj[memoMark]);
return obj[memoMark];
};
memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) {
let cache = oCreate();
@ -667,7 +667,7 @@ memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) {
cache = cache_local;
return out;
}
memoScope[memoMark] = fun;
memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate();
if (signal2) signal2.addEventListener("abort", memoScope.clear);
return memoScope;
@ -787,7 +787,7 @@ signal.clear = function(...signals2) {
};
var key_reactive = "__dde_reactive";
signal.el = function(s, map) {
map = memo.isScope(map) ? map : memo.scope(map, { onlyLast: true });
const mapScoped = memo.isScope(map) ? map : memo.scope(map, { onlyLast: true });
const { current } = scope, { scope: sc } = current;
const mark_start = createElement.mark({ type: "reactive", component: sc && sc.name || "" }, true);
const mark_end = mark_start.end;
@ -797,7 +797,7 @@ signal.el = function(s, map) {
if (!mark_start.parentNode || !mark_end.parentNode)
return removeSignalListener(s, reRenderReactiveElement);
scope.push(current);
let els = map(v);
let els = mapScoped(v);
scope.pop();
if (!Array.isArray(els))
els = [els];
@ -817,7 +817,7 @@ signal.el = function(s, map) {
current.host(on.disconnected(
() => (
/*! Clears cached elements for reactive element `S.el` */
map.clear()
mapScoped.clear()
)
));
return out;
@ -889,9 +889,8 @@ var signals_config = {
function removeSignalsFromElements(s, listener, ...notes) {
const { current } = scope;
current.host(function(element) {
if (element[key_reactive])
return element[key_reactive].push([[s, listener], ...notes]);
element[key_reactive] = [];
if (!element[key_reactive]) element[key_reactive] = [];
element[key_reactive].push([[s, listener], ...notes]);
if (current.prevent) return;
on.disconnected(
() => (

File diff suppressed because one or more lines are too long

6
dist/esm.js vendored
View File

@ -623,7 +623,7 @@ function wrapMethod(obj, method, apply) {
}
// src/memo.js
var memoMark = "__dde_memo_of";
var memoMark = "__dde_memo";
var memo_scope = [];
function memo(key, generator) {
if (!memo_scope.length) return generator(key);
@ -632,7 +632,7 @@ function memo(key, generator) {
return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
}
memo.isScope = function(obj) {
return Boolean(obj[memoMark]);
return obj[memoMark];
};
memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) {
let cache = oCreate();
@ -651,7 +651,7 @@ memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) {
cache = cache_local;
return out;
}
memoScope[memoMark] = fun;
memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate();
if (signal) signal.addEventListener("abort", memoScope.clear);
return memoScope;

2
dist/esm.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -684,7 +684,7 @@ var DDE = (() => {
}
// src/memo.js
var memoMark = "__dde_memo_of";
var memoMark = "__dde_memo";
var memo_scope = [];
function memo(key, generator) {
if (!memo_scope.length) return generator(key);
@ -693,7 +693,7 @@ var DDE = (() => {
return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
}
memo.isScope = function(obj) {
return Boolean(obj[memoMark]);
return obj[memoMark];
};
memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) {
let cache = oCreate();
@ -712,7 +712,7 @@ var DDE = (() => {
cache = cache_local;
return out;
}
memoScope[memoMark] = fun;
memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate();
if (signal2) signal2.addEventListener("abort", memoScope.clear);
return memoScope;
@ -832,7 +832,7 @@ var DDE = (() => {
};
var key_reactive = "__dde_reactive";
signal.el = function(s, map) {
map = memo.isScope(map) ? map : memo.scope(map, { onlyLast: true });
const mapScoped = memo.isScope(map) ? map : memo.scope(map, { onlyLast: true });
const { current } = scope, { scope: sc } = current;
const mark_start = createElement.mark({ type: "reactive", component: sc && sc.name || "" }, true);
const mark_end = mark_start.end;
@ -842,7 +842,7 @@ var DDE = (() => {
if (!mark_start.parentNode || !mark_end.parentNode)
return removeSignalListener(s, reRenderReactiveElement);
scope.push(current);
let els = map(v);
let els = mapScoped(v);
scope.pop();
if (!Array.isArray(els))
els = [els];
@ -862,7 +862,7 @@ var DDE = (() => {
current.host(on.disconnected(
() => (
/*! Clears cached elements for reactive element `S.el` */
map.clear()
mapScoped.clear()
)
));
return out;
@ -934,9 +934,8 @@ var DDE = (() => {
function removeSignalsFromElements(s, listener, ...notes) {
const { current } = scope;
current.host(function(element) {
if (element[key_reactive])
return element[key_reactive].push([[s, listener], ...notes]);
element[key_reactive] = [];
if (!element[key_reactive]) element[key_reactive] = [];
element[key_reactive].push([[s, listener], ...notes]);
if (current.prevent) return;
on.disconnected(
() => (

File diff suppressed because one or more lines are too long

6
dist/iife.js vendored
View File

@ -665,7 +665,7 @@ var DDE = (() => {
}
// src/memo.js
var memoMark = "__dde_memo_of";
var memoMark = "__dde_memo";
var memo_scope = [];
function memo(key, generator) {
if (!memo_scope.length) return generator(key);
@ -674,7 +674,7 @@ var DDE = (() => {
return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
}
memo.isScope = function(obj) {
return Boolean(obj[memoMark]);
return obj[memoMark];
};
memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) {
let cache = oCreate();
@ -693,7 +693,7 @@ var DDE = (() => {
cache = cache_local;
return out;
}
memoScope[memoMark] = fun;
memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate();
if (signal) signal.addEventListener("abort", memoScope.clear);
return memoScope;

2
dist/iife.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
import { hasOwn, oCreate } from "./helpers.js";
const memoMark= "__dde_memo_of";
const memoMark= "__dde_memo";
const memo_scope= [];
/**
* ```js
@ -20,7 +20,7 @@ export function memo(key, generator){
const [ { cache, after } ]= memo_scope;
return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
}
memo.isScope= function(obj){ return Boolean(obj[memoMark]); };
memo.isScope= function(obj){ return obj[memoMark]; };
/**
* @param {Function} fun
* @param {Object} [options={}]
@ -43,7 +43,7 @@ memo.scope= function memoScopeCreate(fun, { signal, onlyLast }= {}){
cache= cache_local;
return out;
}
memoScope[memoMark]= fun;
memoScope[memoMark]= true;
memoScope.clear= ()=> cache= oCreate();
if(signal) signal.addEventListener("abort", memoScope.clear);
return memoScope;

View File

@ -169,11 +169,11 @@ import { memo } from "../memo.js";
* Creates a reactive DOM element that re-renders when signal changes
*
* @param {Object} s - Signal object to watch
* @param {Function} map - Function mapping signal value to DOM elements
* @param {Function} mapScoped - Function mapping signal value to DOM elements
* @returns {DocumentFragment} Fragment containing reactive elements
*/
signal.el= function(s, map){
map= memo.isScope(map) ? map : memo.scope(map, { onlyLast: true });
const mapScoped= memo.isScope(map) ? map : memo.scope(map, { onlyLast: true });
const { current }= scope, { scope: sc }= current;
const mark_start= el.mark({ type: "reactive", component: sc && sc.name || "" }, true);
const mark_end= mark_start.end;
@ -183,7 +183,7 @@ signal.el= function(s, map){
if(!mark_start.parentNode || !mark_end.parentNode) // === `isConnected` or wasnt yet rendered
return removeSignalListener(s, reRenderReactiveElement);
scope.push(current);
let els= map(v);
let els= mapScoped(v);
scope.pop();
if(!Array.isArray(els))
els= [ els ];
@ -202,7 +202,7 @@ signal.el= function(s, map){
reRenderReactiveElement(s.get());
current.host(on.disconnected(()=>
/*! Clears cached elements for reactive element `S.el` */
map.clear()
mapScoped.clear()
));
return out;
};
@ -314,9 +314,8 @@ export const signals_config= {
function removeSignalsFromElements(s, listener, ...notes){
const { current }= scope;
current.host(function(element){
if(element[key_reactive])
return element[key_reactive].push([ [ s, listener ], ...notes ]);
element[key_reactive]= [];
if(!element[key_reactive]) element[key_reactive]= [];
element[key_reactive].push([ [ s, listener ], ...notes ]);
if(current.prevent) return; // typically document.body, doenst need auto-remove as it should happen on page leave
on.disconnected(()=>
/*! Clears all Signals listeners added in the current scope/host (`S.el`, `assign`, ?).