1
0
mirror of https://github.com/jaandrle/deka-dom-el synced 2025-04-02 04:05: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 // src/memo.js
var memoMark = "__dde_memo_of"; var memoMark = "__dde_memo";
var memo_scope = []; var memo_scope = [];
function memo(key, generator) { function memo(key, generator) {
if (!memo_scope.length) return generator(key); 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)); return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
} }
memo.isScope = function(obj) { memo.isScope = function(obj) {
return Boolean(obj[memoMark]); return obj[memoMark];
}; };
memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) { memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) {
let cache = oCreate(); let cache = oCreate();
@ -667,7 +667,7 @@ memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) {
cache = cache_local; cache = cache_local;
return out; return out;
} }
memoScope[memoMark] = fun; memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate(); memoScope.clear = () => cache = oCreate();
if (signal2) signal2.addEventListener("abort", memoScope.clear); if (signal2) signal2.addEventListener("abort", memoScope.clear);
return memoScope; return memoScope;
@ -787,7 +787,7 @@ signal.clear = function(...signals2) {
}; };
var key_reactive = "__dde_reactive"; var key_reactive = "__dde_reactive";
signal.el = function(s, map) { 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 { current } = scope, { scope: sc } = current;
const mark_start = createElement.mark({ type: "reactive", component: sc && sc.name || "" }, true); const mark_start = createElement.mark({ type: "reactive", component: sc && sc.name || "" }, true);
const mark_end = mark_start.end; const mark_end = mark_start.end;
@ -797,7 +797,7 @@ signal.el = function(s, map) {
if (!mark_start.parentNode || !mark_end.parentNode) if (!mark_start.parentNode || !mark_end.parentNode)
return removeSignalListener(s, reRenderReactiveElement); return removeSignalListener(s, reRenderReactiveElement);
scope.push(current); scope.push(current);
let els = map(v); let els = mapScoped(v);
scope.pop(); scope.pop();
if (!Array.isArray(els)) if (!Array.isArray(els))
els = [els]; els = [els];
@ -817,7 +817,7 @@ signal.el = function(s, map) {
current.host(on.disconnected( current.host(on.disconnected(
() => ( () => (
/*! Clears cached elements for reactive element `S.el` */ /*! Clears cached elements for reactive element `S.el` */
map.clear() mapScoped.clear()
) )
)); ));
return out; return out;
@ -889,9 +889,8 @@ var signals_config = {
function removeSignalsFromElements(s, listener, ...notes) { function removeSignalsFromElements(s, listener, ...notes) {
const { current } = scope; const { current } = scope;
current.host(function(element) { current.host(function(element) {
if (element[key_reactive]) if (!element[key_reactive]) element[key_reactive] = [];
return element[key_reactive].push([[s, listener], ...notes]); element[key_reactive].push([[s, listener], ...notes]);
element[key_reactive] = [];
if (current.prevent) return; if (current.prevent) return;
on.disconnected( 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 // src/memo.js
var memoMark = "__dde_memo_of"; var memoMark = "__dde_memo";
var memo_scope = []; var memo_scope = [];
function memo(key, generator) { function memo(key, generator) {
if (!memo_scope.length) return generator(key); 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)); return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
} }
memo.isScope = function(obj) { memo.isScope = function(obj) {
return Boolean(obj[memoMark]); return obj[memoMark];
}; };
memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) { memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) {
let cache = oCreate(); let cache = oCreate();
@ -651,7 +651,7 @@ memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) {
cache = cache_local; cache = cache_local;
return out; return out;
} }
memoScope[memoMark] = fun; memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate(); memoScope.clear = () => cache = oCreate();
if (signal) signal.addEventListener("abort", memoScope.clear); if (signal) signal.addEventListener("abort", memoScope.clear);
return memoScope; 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 // src/memo.js
var memoMark = "__dde_memo_of"; var memoMark = "__dde_memo";
var memo_scope = []; var memo_scope = [];
function memo(key, generator) { function memo(key, generator) {
if (!memo_scope.length) return generator(key); if (!memo_scope.length) return generator(key);
@ -693,7 +693,7 @@ var DDE = (() => {
return after(k, hasOwn(cache, k) ? cache[k] : generator(key)); return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
} }
memo.isScope = function(obj) { memo.isScope = function(obj) {
return Boolean(obj[memoMark]); return obj[memoMark];
}; };
memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) { memo.scope = function memoScopeCreate(fun, { signal: signal2, onlyLast } = {}) {
let cache = oCreate(); let cache = oCreate();
@ -712,7 +712,7 @@ var DDE = (() => {
cache = cache_local; cache = cache_local;
return out; return out;
} }
memoScope[memoMark] = fun; memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate(); memoScope.clear = () => cache = oCreate();
if (signal2) signal2.addEventListener("abort", memoScope.clear); if (signal2) signal2.addEventListener("abort", memoScope.clear);
return memoScope; return memoScope;
@ -832,7 +832,7 @@ var DDE = (() => {
}; };
var key_reactive = "__dde_reactive"; var key_reactive = "__dde_reactive";
signal.el = function(s, map) { 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 { current } = scope, { scope: sc } = current;
const mark_start = createElement.mark({ type: "reactive", component: sc && sc.name || "" }, true); const mark_start = createElement.mark({ type: "reactive", component: sc && sc.name || "" }, true);
const mark_end = mark_start.end; const mark_end = mark_start.end;
@ -842,7 +842,7 @@ var DDE = (() => {
if (!mark_start.parentNode || !mark_end.parentNode) if (!mark_start.parentNode || !mark_end.parentNode)
return removeSignalListener(s, reRenderReactiveElement); return removeSignalListener(s, reRenderReactiveElement);
scope.push(current); scope.push(current);
let els = map(v); let els = mapScoped(v);
scope.pop(); scope.pop();
if (!Array.isArray(els)) if (!Array.isArray(els))
els = [els]; els = [els];
@ -862,7 +862,7 @@ var DDE = (() => {
current.host(on.disconnected( current.host(on.disconnected(
() => ( () => (
/*! Clears cached elements for reactive element `S.el` */ /*! Clears cached elements for reactive element `S.el` */
map.clear() mapScoped.clear()
) )
)); ));
return out; return out;
@ -934,9 +934,8 @@ var DDE = (() => {
function removeSignalsFromElements(s, listener, ...notes) { function removeSignalsFromElements(s, listener, ...notes) {
const { current } = scope; const { current } = scope;
current.host(function(element) { current.host(function(element) {
if (element[key_reactive]) if (!element[key_reactive]) element[key_reactive] = [];
return element[key_reactive].push([[s, listener], ...notes]); element[key_reactive].push([[s, listener], ...notes]);
element[key_reactive] = [];
if (current.prevent) return; if (current.prevent) return;
on.disconnected( 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 // src/memo.js
var memoMark = "__dde_memo_of"; var memoMark = "__dde_memo";
var memo_scope = []; var memo_scope = [];
function memo(key, generator) { function memo(key, generator) {
if (!memo_scope.length) return generator(key); if (!memo_scope.length) return generator(key);
@ -674,7 +674,7 @@ var DDE = (() => {
return after(k, hasOwn(cache, k) ? cache[k] : generator(key)); return after(k, hasOwn(cache, k) ? cache[k] : generator(key));
} }
memo.isScope = function(obj) { memo.isScope = function(obj) {
return Boolean(obj[memoMark]); return obj[memoMark];
}; };
memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) { memo.scope = function memoScopeCreate(fun, { signal, onlyLast } = {}) {
let cache = oCreate(); let cache = oCreate();
@ -693,7 +693,7 @@ var DDE = (() => {
cache = cache_local; cache = cache_local;
return out; return out;
} }
memoScope[memoMark] = fun; memoScope[memoMark] = true;
memoScope.clear = () => cache = oCreate(); memoScope.clear = () => cache = oCreate();
if (signal) signal.addEventListener("abort", memoScope.clear); if (signal) signal.addEventListener("abort", memoScope.clear);
return memoScope; 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"; import { hasOwn, oCreate } from "./helpers.js";
const memoMark= "__dde_memo_of"; const memoMark= "__dde_memo";
const memo_scope= []; const memo_scope= [];
/** /**
* ```js * ```js
@ -20,7 +20,7 @@ export function memo(key, generator){
const [ { cache, after } ]= memo_scope; const [ { cache, after } ]= memo_scope;
return after(k, hasOwn(cache, k) ? cache[k] : generator(key)); 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 {Function} fun
* @param {Object} [options={}] * @param {Object} [options={}]
@ -43,7 +43,7 @@ memo.scope= function memoScopeCreate(fun, { signal, onlyLast }= {}){
cache= cache_local; cache= cache_local;
return out; return out;
} }
memoScope[memoMark]= fun; memoScope[memoMark]= true;
memoScope.clear= ()=> cache= oCreate(); memoScope.clear= ()=> cache= oCreate();
if(signal) signal.addEventListener("abort", memoScope.clear); if(signal) signal.addEventListener("abort", memoScope.clear);
return memoScope; return memoScope;

View File

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