@preact/signals
Advanced tools
Comparing version 2.0.0 to 2.0.1
# @preact/signals | ||
## 2.0.1 | ||
### Patch Changes | ||
- [#647](https://github.com/preactjs/signals/pull/647) [`655905b`](https://github.com/preactjs/signals/commit/655905bc6e5ee8ba30d578e2a7bf02a9c83ee38c) Thanks [@jviide](https://github.com/jviide)! - Ensure that text effects get disposed | ||
- [#630](https://github.com/preactjs/signals/pull/630) [`4b9144f`](https://github.com/preactjs/signals/commit/4b9144f7f13815013f78299dd487344d3750fd8f) Thanks [@JoviDeCroock](https://github.com/JoviDeCroock)! - Change the way we deal with state settling hooks, when we know we are dealing with hooks that can settle their A -> B -> A state (and wind up at the same value). We should not verbatim rerender in our custom shouldComponentUpdate. Instead we should trust that hooks have handled their own state settling. | ||
## 2.0.0 | ||
@@ -4,0 +12,0 @@ |
@@ -1,1 +0,1 @@ | ||
var i,n,r=require("preact"),t=require("preact/hooks"),f=require("@preact/signals-core");function o(i,n){r.options[i]=n.bind(null,r.options[i]||function(){})}function e(i){if(n)n();n=i&&i.S()}function u(i){var n=this,o=i.data,e=useSignal(o);e.value=o;var u=t.useMemo(function(){var i=n,t=n.__v;while(t=t.__)if(t.__c){t.__c.__$f|=4;break}var o=f.computed(function(){var i=e.value.value;return 0===i?0:!0===i?"":i||""}),a=f.computed(function(){var i;return r.isValidElement(o.value)||3!==(null==(i=n.base)?void 0:i.nodeType)});n.__$u.c=function(){var i;if(!r.isValidElement(u.peek())&&3===(null==(i=n.base)?void 0:i.nodeType))n.base.data=u.peek();else{n.__$f|=1;n.setState({})}};f.effect(function(){if(!c)c=this.N;this.N=g;if(a.value&&i.base)i.base.data=o.value});return o},[]);return u.value}u.displayName="_st";Object.defineProperties(f.Signal.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:u},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});o("__b",function(i,n){if("string"==typeof n.type){var r,t=n.props;for(var o in t)if("children"!==o){var e=t[o];if(e instanceof f.Signal){if(!r)n.__np=r={};r[o]=e;t[o]=e.peek()}}}i(n)});o("__r",function(n,r){e();var t,o=r.__c;if(o){o.__$f&=-2;if(void 0===(t=o.__$u))o.__$u=t=function(i){var n;f.effect(function(){n=this});n.c=function(){o.__$f|=1;o.setState({})};return n}()}i=o;e(t);n(r)});o("__e",function(n,r,t,f){e();i=void 0;n(r,t,f)});o("diffed",function(n,r){e();i=void 0;var t;if("string"==typeof r.type&&(t=r.__e)){var f=r.__np,o=r.props;if(f){var u=t.U;if(u)for(var c in u){var v=u[c];if(void 0!==v&&!(c in f)){v.d();u[c]=void 0}}else t.U=u={};for(var s in f){var l=u[s],h=f[s];if(void 0===l){l=a(t,s,h,o);u[s]=l}else l.o(h,o)}}}n(r)});function a(i,n,r,t){var o=n in i&&void 0===i.ownerSVGElement,e=f.signal(r);return{o:function(i,n){e.value=i;t=n},d:f.effect(function(){if(!c)c=this.N;this.N=g;var r=e.value.value;if(t[n]!==r){t[n]=r;if(o)i[n]=r;else if(r)i.setAttribute(n,r);else i.removeAttribute(n)}})}}o("unmount",function(i,n){if("string"==typeof n.type){var r=n.__e;if(r){var t=r.U;if(t){r.U=void 0;for(var f in t){var o=t[f];if(o)o.d()}}}}else{var e=n.__c;if(e){var u=e.__$u;if(u){e.__$u=void 0;u.d()}}}i(n)});o("__h",function(i,n,r,t){if(t<3||9===t)n.__$f|=2;i(n,r,t)});r.Component.prototype.shouldComponentUpdate=function(i,n){var r=this.__$u;if(!(r&&void 0!==r.s||4&this.__$f))return!0;if(3&this.__$f)return!0;for(var t in n)return!0;for(var f in i)if("__source"!==f&&i[f]!==this.props[f])return!0;for(var o in this.props)if(!(o in i))return!0;return!1};function useSignal(i){return t.useMemo(function(){return f.signal(i)},[])}var c,v=[],s=[],l="undefined"==typeof requestAnimationFrame?setTimeout:requestAnimationFrame,h=function(i){queueMicrotask(function(){queueMicrotask(i)})};function d(){f.batch(function(){var i;while(i=v.shift())c.call(i)})}function p(){if(1===v.push(this))(r.options.requestAnimationFrame||l)(d)}function _(){f.batch(function(){var i;while(i=s.shift())c.call(i)})}function g(){if(1===s.push(this))(r.options.requestAnimationFrame||h)(_)}exports.Signal=f.Signal;exports.batch=f.batch;exports.computed=f.computed;exports.effect=f.effect;exports.signal=f.signal;exports.untracked=f.untracked;exports.useComputed=function(n){var r=t.useRef(n);r.current=n;i.__$f|=4;return t.useMemo(function(){return f.computed(function(){return r.current()})},[])};exports.useSignal=useSignal;exports.useSignalEffect=function(i){var n=t.useRef(i);n.current=i;t.useEffect(function(){return f.effect(function(){if(!c)c=this.N;this.N=p;return n.current()})},[])};//# sourceMappingURL=signals.js.map | ||
var i,n,r,t=require("preact"),e=require("preact/hooks"),f=require("@preact/signals-core"),o=[],u=[];f.effect(function(){i=this.N})();function a(i,n){t.options[i]=n.bind(null,t.options[i]||function(){})}function c(i){if(r)r();r=i&&i.S()}function s(i){var n=this,r=i.data,o=useSignal(r);o.value=r;var u=e.useMemo(function(){var i=n,r=n.__v;while(r=r.__)if(r.__c){r.__c.__$f|=4;break}var e=f.computed(function(){var i=o.value.value;return 0===i?0:!0===i?"":i||""}),u=f.computed(function(){return!t.isValidElement(e.value)}),a=f.effect(function(){this.N=b;if(u.value){var n=e.value;if(i.base&&3===i.base.nodeType)i.base.data=n}}),c=n.__$u.d;n.__$u.d=function(){a();c.call(this)};return[u,e]},[]),a=u[0],c=u[1];return a.value?c.peek():c.value}s.displayName="_st";Object.defineProperties(f.Signal.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:s},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});a("__b",function(i,n){if("string"==typeof n.type){var r,t=n.props;for(var e in t)if("children"!==e){var o=t[e];if(o instanceof f.Signal){if(!r)n.__np=r={};r[e]=o;t[e]=o.peek()}}}i(n)});a("__r",function(i,r){c();var t,e=r.__c;if(e){e.__$f&=-2;if(void 0===(t=e.__$u))e.__$u=t=function(i){var n;f.effect(function(){n=this});n.c=function(){e.__$f|=1;e.setState({})};return n}()}n=e;c(t);i(r)});a("__e",function(i,r,t,e){c();n=void 0;i(r,t,e)});a("diffed",function(i,r){c();n=void 0;var t;if("string"==typeof r.type&&(t=r.__e)){var e=r.__np,f=r.props;if(e){var o=t.U;if(o)for(var u in o){var a=o[u];if(void 0!==a&&!(u in e)){a.d();o[u]=void 0}}else{o={};t.U=o}for(var s in e){var h=o[s],p=e[s];if(void 0===h){h=v(t,s,p,f);o[s]=h}else h.o(p,f)}}}i(r)});function v(i,n,r,t){var e=n in i&&void 0===i.ownerSVGElement,o=f.signal(r);return{o:function(i,n){o.value=i;t=n},d:f.effect(function(){this.N=b;var r=o.value.value;if(t[n]!==r){t[n]=r;if(e)i[n]=r;else if(r)i.setAttribute(n,r);else i.removeAttribute(n)}})}}a("unmount",function(i,n){if("string"==typeof n.type){var r=n.__e;if(r){var t=r.U;if(t){r.U=void 0;for(var e in t){var f=t[e];if(f)f.d()}}}}else{var o=n.__c;if(o){var u=o.__$u;if(u){o.__$u=void 0;u.d()}}}i(n)});a("__h",function(i,n,r,t){if(t<3||9===t)n.__$f|=2;i(n,r,t)});t.Component.prototype.shouldComponentUpdate=function(i,n){var r=this.__$u,t=r&&void 0!==r.s;for(var e in n)return!0;if(this.__f||"boolean"==typeof this.u&&!0===this.u){var f=2&this.__$f;if(!(t||f||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(t||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var o in i)if("__source"!==o&&i[o]!==this.props[o])return!0;for(var u in this.props)if(!(u in i))return!0;return!1};function useSignal(i){return e.useMemo(function(){return f.signal(i)},[])}var h="undefined"==typeof requestAnimationFrame?setTimeout:requestAnimationFrame,p=function(i){queueMicrotask(function(){queueMicrotask(i)})};function l(){f.batch(function(){var n;while(n=o.shift())i.call(n)})}function d(){if(1===o.push(this))(t.options.requestAnimationFrame||h)(l)}function _(){f.batch(function(){var n;while(n=u.shift())i.call(n)})}function b(){if(1===u.push(this))(t.options.requestAnimationFrame||p)(_)}exports.Signal=f.Signal;exports.batch=f.batch;exports.computed=f.computed;exports.effect=f.effect;exports.signal=f.signal;exports.untracked=f.untracked;exports.useComputed=function(i){var r=e.useRef(i);r.current=i;n.__$f|=4;return e.useMemo(function(){return f.computed(function(){return r.current()})},[])};exports.useSignal=useSignal;exports.useSignalEffect=function(i){var n=e.useRef(i);n.current=i;e.useEffect(function(){return f.effect(function(){this.N=d;return n.current()})},[])};//# sourceMappingURL=signals.js.map |
@@ -1,1 +0,1 @@ | ||
!function(i,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("preact"),require("preact/hooks"),require("@preact/signals-core")):"function"==typeof define&&define.amd?define(["exports","preact","preact/hooks","@preact/signals-core"],n):n((i||self).preactSignals={},i.preact,i.preactHooks,i.preactSignalsCore)}(this,function(i,n,r,t){var e,f;function o(i,r){n.options[i]=r.bind(null,n.options[i]||function(){})}function u(i){if(f)f();f=i&&i.S()}function a(i){var e=this,f=i.data,o=useSignal(f);o.value=f;var u=r.useMemo(function(){var i=e,r=e.__v;while(r=r.__)if(r.__c){r.__c.__$f|=4;break}var f=t.computed(function(){var i=o.value.value;return 0===i?0:!0===i?"":i||""}),a=t.computed(function(){var i;return n.isValidElement(f.value)||3!==(null==(i=e.base)?void 0:i.nodeType)});e.__$u.c=function(){var i;if(!n.isValidElement(u.peek())&&3===(null==(i=e.base)?void 0:i.nodeType))e.base.data=u.peek();else{e.__$f|=1;e.setState({})}};t.effect(function(){if(!v)v=this.N;this.N=b;if(a.value&&i.base)i.base.data=f.value});return f},[]);return u.value}a.displayName="_st";Object.defineProperties(t.Signal.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:a},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});o("__b",function(i,n){if("string"==typeof n.type){var r,e=n.props;for(var f in e)if("children"!==f){var o=e[f];if(o instanceof t.Signal){if(!r)n.__np=r={};r[f]=o;e[f]=o.peek()}}}i(n)});o("__r",function(i,n){u();var r,f=n.__c;if(f){f.__$f&=-2;if(void 0===(r=f.__$u))f.__$u=r=function(i){var n;t.effect(function(){n=this});n.c=function(){f.__$f|=1;f.setState({})};return n}()}e=f;u(r);i(n)});o("__e",function(i,n,r,t){u();e=void 0;i(n,r,t)});o("diffed",function(i,n){u();e=void 0;var r;if("string"==typeof n.type&&(r=n.__e)){var t=n.__np,f=n.props;if(t){var o=r.U;if(o)for(var a in o){var v=o[a];if(void 0!==v&&!(a in t)){v.d();o[a]=void 0}}else r.U=o={};for(var s in t){var l=o[s],d=t[s];if(void 0===l){l=c(r,s,d,f);o[s]=l}else l.o(d,f)}}}i(n)});function c(i,n,r,e){var f=n in i&&void 0===i.ownerSVGElement,o=t.signal(r);return{o:function(i,n){o.value=i;e=n},d:t.effect(function(){if(!v)v=this.N;this.N=b;var r=o.value.value;if(e[n]!==r){e[n]=r;if(f)i[n]=r;else if(r)i.setAttribute(n,r);else i.removeAttribute(n)}})}}o("unmount",function(i,n){if("string"==typeof n.type){var r=n.__e;if(r){var t=r.U;if(t){r.U=void 0;for(var e in t){var f=t[e];if(f)f.d()}}}}else{var o=n.__c;if(o){var u=o.__$u;if(u){o.__$u=void 0;u.d()}}}i(n)});o("__h",function(i,n,r,t){if(t<3||9===t)n.__$f|=2;i(n,r,t)});n.Component.prototype.shouldComponentUpdate=function(i,n){var r=this.__$u;if(!(r&&void 0!==r.s||4&this.__$f))return!0;if(3&this.__$f)return!0;for(var t in n)return!0;for(var e in i)if("__source"!==e&&i[e]!==this.props[e])return!0;for(var f in this.props)if(!(f in i))return!0;return!1};function useSignal(i){return r.useMemo(function(){return t.signal(i)},[])}var v,s=[],l=[],d="undefined"==typeof requestAnimationFrame?setTimeout:requestAnimationFrame,h=function(i){queueMicrotask(function(){queueMicrotask(i)})};function p(){t.batch(function(){var i;while(i=s.shift())v.call(i)})}function _(){if(1===s.push(this))(n.options.requestAnimationFrame||d)(p)}function g(){t.batch(function(){var i;while(i=l.shift())v.call(i)})}function b(){if(1===l.push(this))(n.options.requestAnimationFrame||h)(g)}i.Signal=t.Signal;i.batch=t.batch;i.computed=t.computed;i.effect=t.effect;i.signal=t.signal;i.untracked=t.untracked;i.useComputed=function(i){var n=r.useRef(i);n.current=i;e.__$f|=4;return r.useMemo(function(){return t.computed(function(){return n.current()})},[])};i.useSignal=useSignal;i.useSignalEffect=function(i){var n=r.useRef(i);n.current=i;r.useEffect(function(){return t.effect(function(){if(!v)v=this.N;this.N=_;return n.current()})},[])}});//# sourceMappingURL=signals.min.js.map | ||
!function(i,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("preact"),require("preact/hooks"),require("@preact/signals-core")):"function"==typeof define&&define.amd?define(["exports","preact","preact/hooks","@preact/signals-core"],n):n((i||self).preactSignals={},i.preact,i.preactHooks,i.preactSignalsCore)}(this,function(i,n,t,r){var e,f,o,u=[],a=[];r.effect(function(){e=this.N})();function c(i,t){n.options[i]=t.bind(null,n.options[i]||function(){})}function s(i){if(o)o();o=i&&i.S()}function v(i){var e=this,f=i.data,o=useSignal(f);o.value=f;var u=t.useMemo(function(){var i=e,t=e.__v;while(t=t.__)if(t.__c){t.__c.__$f|=4;break}var f=r.computed(function(){var i=o.value.value;return 0===i?0:!0===i?"":i||""}),u=r.computed(function(){return!n.isValidElement(f.value)}),a=r.effect(function(){this.N=g;if(u.value){var n=f.value;if(i.base&&3===i.base.nodeType)i.base.data=n}}),c=e.__$u.d;e.__$u.d=function(){a();c.call(this)};return[u,f]},[]),a=u[0],c=u[1];return a.value?c.peek():c.value}v.displayName="_st";Object.defineProperties(r.Signal.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:v},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});c("__b",function(i,n){if("string"==typeof n.type){var t,e=n.props;for(var f in e)if("children"!==f){var o=e[f];if(o instanceof r.Signal){if(!t)n.__np=t={};t[f]=o;e[f]=o.peek()}}}i(n)});c("__r",function(i,n){s();var t,e=n.__c;if(e){e.__$f&=-2;if(void 0===(t=e.__$u))e.__$u=t=function(i){var n;r.effect(function(){n=this});n.c=function(){e.__$f|=1;e.setState({})};return n}()}f=e;s(t);i(n)});c("__e",function(i,n,t,r){s();f=void 0;i(n,t,r)});c("diffed",function(i,n){s();f=void 0;var t;if("string"==typeof n.type&&(t=n.__e)){var r=n.__np,e=n.props;if(r){var o=t.U;if(o)for(var u in o){var a=o[u];if(void 0!==a&&!(u in r)){a.d();o[u]=void 0}}else{o={};t.U=o}for(var c in r){var v=o[c],l=r[c];if(void 0===v){v=h(t,c,l,e);o[c]=v}else v.o(l,e)}}}i(n)});function h(i,n,t,e){var f=n in i&&void 0===i.ownerSVGElement,o=r.signal(t);return{o:function(i,n){o.value=i;e=n},d:r.effect(function(){this.N=g;var t=o.value.value;if(e[n]!==t){e[n]=t;if(f)i[n]=t;else if(t)i.setAttribute(n,t);else i.removeAttribute(n)}})}}c("unmount",function(i,n){if("string"==typeof n.type){var t=n.__e;if(t){var r=t.U;if(r){t.U=void 0;for(var e in r){var f=r[e];if(f)f.d()}}}}else{var o=n.__c;if(o){var u=o.__$u;if(u){o.__$u=void 0;u.d()}}}i(n)});c("__h",function(i,n,t,r){if(r<3||9===r)n.__$f|=2;i(n,t,r)});n.Component.prototype.shouldComponentUpdate=function(i,n){var t=this.__$u,r=t&&void 0!==t.s;for(var e in n)return!0;if(this.__f||"boolean"==typeof this.u&&!0===this.u){var f=2&this.__$f;if(!(r||f||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(r||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var o in i)if("__source"!==o&&i[o]!==this.props[o])return!0;for(var u in this.props)if(!(u in i))return!0;return!1};function useSignal(i){return t.useMemo(function(){return r.signal(i)},[])}var l="undefined"==typeof requestAnimationFrame?setTimeout:requestAnimationFrame,d=function(i){queueMicrotask(function(){queueMicrotask(i)})};function p(){r.batch(function(){var i;while(i=u.shift())e.call(i)})}function _(){if(1===u.push(this))(n.options.requestAnimationFrame||l)(p)}function b(){r.batch(function(){var i;while(i=a.shift())e.call(i)})}function g(){if(1===a.push(this))(n.options.requestAnimationFrame||d)(b)}i.Signal=r.Signal;i.batch=r.batch;i.computed=r.computed;i.effect=r.effect;i.signal=r.signal;i.untracked=r.untracked;i.useComputed=function(i){var n=t.useRef(i);n.current=i;f.__$f|=4;return t.useMemo(function(){return r.computed(function(){return n.current()})},[])};i.useSignal=useSignal;i.useSignalEffect=function(i){var n=t.useRef(i);n.current=i;t.useEffect(function(){return r.effect(function(){this.N=_;return n.current()})},[])}});//# sourceMappingURL=signals.min.js.map |
@@ -1,1 +0,1 @@ | ||
import{Component as i,options as n,isValidElement as r}from"preact";import{useMemo as t,useRef as f,useEffect as o}from"preact/hooks";import{Signal as u,computed as e,effect as a,signal as c,batch as v}from"@preact/signals-core";export{Signal,batch,computed,effect,signal,untracked}from"@preact/signals-core";var s,l;function d(i,r){n[i]=r.bind(null,n[i]||function(){})}function h(i){if(l)l();l=i&&i.S()}function p(i){var n=this,f=i.data,o=useSignal(f);o.value=f;var u=t(function(){var i=n,t=n.__v;while(t=t.__)if(t.__c){t.__c.__$f|=4;break}var f=e(function(){var i=o.value.value;return 0===i?0:!0===i?"":i||""}),c=e(function(){var i;return r(f.value)||3!==(null==(i=n.base)?void 0:i.nodeType)});n.__$u.c=function(){var i;if(!r(u.peek())&&3===(null==(i=n.base)?void 0:i.nodeType))n.base.data=u.peek();else{n.__$f|=1;n.setState({})}};a(function(){if(!m)m=this.N;this.N=A;if(c.value&&i.base)i.base.data=f.value});return f},[]);return u.value}p.displayName="_st";Object.defineProperties(u.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:p},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});d("__b",function(i,n){if("string"==typeof n.type){var r,t=n.props;for(var f in t)if("children"!==f){var o=t[f];if(o instanceof u){if(!r)n.__np=r={};r[f]=o;t[f]=o.peek()}}}i(n)});d("__r",function(i,n){h();var r,t=n.__c;if(t){t.__$f&=-2;if(void 0===(r=t.__$u))t.__$u=r=function(i){var n;a(function(){n=this});n.c=function(){t.__$f|=1;t.setState({})};return n}()}s=t;h(r);i(n)});d("__e",function(i,n,r,t){h();s=void 0;i(n,r,t)});d("diffed",function(i,n){h();s=void 0;var r;if("string"==typeof n.type&&(r=n.__e)){var t=n.__np,f=n.props;if(t){var o=r.U;if(o)for(var u in o){var e=o[u];if(void 0!==e&&!(u in t)){e.d();o[u]=void 0}}else r.U=o={};for(var a in t){var c=o[a],v=t[a];if(void 0===c){c=_(r,a,v,f);o[a]=c}else c.o(v,f)}}}i(n)});function _(i,n,r,t){var f=n in i&&void 0===i.ownerSVGElement,o=c(r);return{o:function(i,n){o.value=i;t=n},d:a(function(){if(!m)m=this.N;this.N=A;var r=o.value.value;if(t[n]!==r){t[n]=r;if(f)i[n]=r;else if(r)i.setAttribute(n,r);else i.removeAttribute(n)}})}}d("unmount",function(i,n){if("string"==typeof n.type){var r=n.__e;if(r){var t=r.U;if(t){r.U=void 0;for(var f in t){var o=t[f];if(o)o.d()}}}}else{var u=n.__c;if(u){var e=u.__$u;if(e){u.__$u=void 0;e.d()}}}i(n)});d("__h",function(i,n,r,t){if(t<3||9===t)n.__$f|=2;i(n,r,t)});i.prototype.shouldComponentUpdate=function(i,n){var r=this.__$u;if(!(r&&void 0!==r.s||4&this.__$f))return!0;if(3&this.__$f)return!0;for(var t in n)return!0;for(var f in i)if("__source"!==f&&i[f]!==this.props[f])return!0;for(var o in this.props)if(!(o in i))return!0;return!1};function useSignal(i){return t(function(){return c(i)},[])}function useComputed(i){var n=f(i);n.current=i;s.__$f|=4;return t(function(){return e(function(){return n.current()})},[])}var m,g=[],b=[],k="undefined"==typeof requestAnimationFrame?setTimeout:requestAnimationFrame,y=function(i){queueMicrotask(function(){queueMicrotask(i)})};function q(){v(function(){var i;while(i=g.shift())m.call(i)})}function w(){if(1===g.push(this))(n.requestAnimationFrame||k)(q)}function x(){v(function(){var i;while(i=b.shift())m.call(i)})}function A(){if(1===b.push(this))(n.requestAnimationFrame||y)(x)}function useSignalEffect(i){var n=f(i);n.current=i;o(function(){return a(function(){if(!m)m=this.N;this.N=w;return n.current()})},[])}export{useComputed,useSignal,useSignalEffect};//# sourceMappingURL=signals.module.js.map | ||
import{Component as i,options as n,isValidElement as r}from"preact";import{useMemo as t,useRef as f,useEffect as o}from"preact/hooks";import{effect as e,Signal as u,computed as a,signal as c,batch as v}from"@preact/signals-core";export{Signal,batch,computed,effect,signal,untracked}from"@preact/signals-core";var s,h,l,d=[],p=[];e(function(){s=this.N})();function _(i,r){n[i]=r.bind(null,n[i]||function(){})}function m(i){if(l)l();l=i&&i.S()}function g(i){var n=this,f=i.data,o=useSignal(f);o.value=f;var u=t(function(){var i=n,t=n.__v;while(t=t.__)if(t.__c){t.__c.__$f|=4;break}var f=a(function(){var i=o.value.value;return 0===i?0:!0===i?"":i||""}),u=a(function(){return!r(f.value)}),c=e(function(){this.N=A;if(u.value){var n=f.value;if(i.base&&3===i.base.nodeType)i.base.data=n}}),v=n.__$u.d;n.__$u.d=function(){c();v.call(this)};return[u,f]},[]),c=u[0],v=u[1];return c.value?v.peek():v.value}g.displayName="_st";Object.defineProperties(u.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:g},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});_("__b",function(i,n){if("string"==typeof n.type){var r,t=n.props;for(var f in t)if("children"!==f){var o=t[f];if(o instanceof u){if(!r)n.__np=r={};r[f]=o;t[f]=o.peek()}}}i(n)});_("__r",function(i,n){m();var r,t=n.__c;if(t){t.__$f&=-2;if(void 0===(r=t.__$u))t.__$u=r=function(i){var n;e(function(){n=this});n.c=function(){t.__$f|=1;t.setState({})};return n}()}h=t;m(r);i(n)});_("__e",function(i,n,r,t){m();h=void 0;i(n,r,t)});_("diffed",function(i,n){m();h=void 0;var r;if("string"==typeof n.type&&(r=n.__e)){var t=n.__np,f=n.props;if(t){var o=r.U;if(o)for(var e in o){var u=o[e];if(void 0!==u&&!(e in t)){u.d();o[e]=void 0}}else{o={};r.U=o}for(var a in t){var c=o[a],v=t[a];if(void 0===c){c=b(r,a,v,f);o[a]=c}else c.o(v,f)}}}i(n)});function b(i,n,r,t){var f=n in i&&void 0===i.ownerSVGElement,o=c(r);return{o:function(i,n){o.value=i;t=n},d:e(function(){this.N=A;var r=o.value.value;if(t[n]!==r){t[n]=r;if(f)i[n]=r;else if(r)i.setAttribute(n,r);else i.removeAttribute(n)}})}}_("unmount",function(i,n){if("string"==typeof n.type){var r=n.__e;if(r){var t=r.U;if(t){r.U=void 0;for(var f in t){var o=t[f];if(o)o.d()}}}}else{var e=n.__c;if(e){var u=e.__$u;if(u){e.__$u=void 0;u.d()}}}i(n)});_("__h",function(i,n,r,t){if(t<3||9===t)n.__$f|=2;i(n,r,t)});i.prototype.shouldComponentUpdate=function(i,n){var r=this.__$u,t=r&&void 0!==r.s;for(var f in n)return!0;if(this.__f||"boolean"==typeof this.u&&!0===this.u){var o=2&this.__$f;if(!(t||o||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(t||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var e in i)if("__source"!==e&&i[e]!==this.props[e])return!0;for(var u in this.props)if(!(u in i))return!0;return!1};function useSignal(i){return t(function(){return c(i)},[])}function useComputed(i){var n=f(i);n.current=i;h.__$f|=4;return t(function(){return a(function(){return n.current()})},[])}var y="undefined"==typeof requestAnimationFrame?setTimeout:requestAnimationFrame,k=function(i){queueMicrotask(function(){queueMicrotask(i)})};function q(){v(function(){var i;while(i=d.shift())s.call(i)})}function w(){if(1===d.push(this))(n.requestAnimationFrame||y)(q)}function x(){v(function(){var i;while(i=p.shift())s.call(i)})}function A(){if(1===p.push(this))(n.requestAnimationFrame||k)(x)}function useSignalEffect(i){var n=f(i);n.current=i;o(function(){return e(function(){this.N=w;return n.current()})},[])}export{useComputed,useSignal,useSignalEffect};//# sourceMappingURL=signals.module.js.map |
{ | ||
"name": "@preact/signals", | ||
"version": "2.0.0", | ||
"version": "2.0.1", | ||
"license": "MIT", | ||
@@ -5,0 +5,0 @@ "description": "Manage state with style in Preact", |
122
src/index.ts
@@ -36,2 +36,13 @@ import { options, Component, isValidElement } from "preact"; | ||
let oldNotify: (this: Effect) => void, | ||
effectsQueue: Array<Effect> = [], | ||
domQueue: Array<Effect> = []; | ||
// Capture the original `Effect.prototype._notify` method so that we can install | ||
// custom `._notify`s for each different use-case but still call the original | ||
// implementation in the end. Dispose the temporary effect immediately afterwards. | ||
effect(function (this: Effect) { | ||
oldNotify = this._notify; | ||
})(); | ||
// Install a Preact options hook | ||
@@ -83,3 +94,3 @@ function hook<T extends OptionsTypes>(hookName: T, hookFn: HookFn<T>) { | ||
const s = useMemo(() => { | ||
const [isText, s] = useMemo(() => { | ||
let self = this; | ||
@@ -95,34 +106,47 @@ // mark the parent component as having computeds so it gets optimized | ||
const wrappedSignal = computed(function (this: Effect) { | ||
let data = currentSignal.value; | ||
let s = data.value; | ||
const wrappedSignal = computed(() => { | ||
let s = currentSignal.value.value; | ||
return s === 0 ? 0 : s === true ? "" : s || ""; | ||
}); | ||
const isText = computed( | ||
() => isValidElement(wrappedSignal.value) || this.base?.nodeType !== 3 | ||
); | ||
const isText = computed(() => !isValidElement(wrappedSignal.value)); | ||
this._updater!._callback = () => { | ||
if (isValidElement(s.peek()) || this.base?.nodeType !== 3) { | ||
this._updateFlags |= HAS_PENDING_UPDATE; | ||
this.setState({}); | ||
return; | ||
} | ||
(this.base as Text).data = s.peek(); | ||
}; | ||
// Update text nodes directly without rerendering when the new value | ||
// is also text. | ||
const dispose = effect(function (this: Effect) { | ||
this._notify = notifyDomUpdates; | ||
effect(function (this: Effect) { | ||
if (!oldNotify) oldNotify = this._notify; | ||
this._notify = notifyDomUpdates; | ||
const val = wrappedSignal.value; | ||
if (isText.value && self.base) { | ||
(self.base as Text).data = val; | ||
// Subscribe to wrappedSignal updates only when its values are text... | ||
if (isText.value) { | ||
// ...but regardless of `self.base`'s current value, as it can be | ||
// undefined before mounting or a non-text node. In both of those cases | ||
// the update gets handled by a full rerender. | ||
const value = wrappedSignal.value; | ||
if (self.base && self.base.nodeType === 3) { | ||
(self.base as Text).data = value; | ||
} | ||
} | ||
}); | ||
return wrappedSignal; | ||
// Piggyback this._updater's disposal to ensure that the text updater effect | ||
// above also gets disposed on unmount. | ||
const oldDispose = this._updater!._dispose; | ||
this._updater!._dispose = function () { | ||
dispose(); | ||
oldDispose.call(this); | ||
}; | ||
return [isText, wrappedSignal]; | ||
}, []); | ||
return s.value; | ||
// Rerender the component whenever `data.value` changes from a VNode | ||
// to another VNode, from text to a VNode, or from a VNode to text. | ||
// That is, everything else except text-to-text updates. | ||
// | ||
// This also ensures that the backing DOM node types gets updated to | ||
// text nodes and back when needed. | ||
// | ||
// For text-to-text updates, `.peek()` is used to skip full rerenders, | ||
// leaving them to the optimized path above. | ||
return isText.value ? s.peek() : s.value; | ||
} | ||
@@ -260,3 +284,2 @@ SignalValue.displayName = "_st"; | ||
_dispose: effect(function (this: Effect) { | ||
if (!oldNotify) oldNotify = this._notify; | ||
this._notify = notifyDomUpdates; | ||
@@ -327,33 +350,23 @@ const value = changeSignal.value.value; | ||
// let reason; | ||
// if (!hasSignals && !hasComputeds.has(this)) { | ||
// reason = "no signals or computeds"; | ||
// } else if (hasPendingUpdate.has(this)) { | ||
// reason = "has pending update"; | ||
// } else if (hasHookState.has(this)) { | ||
// reason = "has hook state"; | ||
// } | ||
// if (reason) { | ||
// if (!this) reason += " (`this` bug)"; | ||
// console.log("not optimizing", this?.constructor?.name, ": ", reason, { | ||
// details: { | ||
// hasSignals, | ||
// hasComputeds: hasComputeds.has(this), | ||
// hasPendingUpdate: hasPendingUpdate.has(this), | ||
// hasHookState: hasHookState.has(this), | ||
// deps: Array.from(updater._deps), | ||
// updater, | ||
// }, | ||
// }); | ||
// } | ||
// If this is a component using state, rerender | ||
// @ts-ignore | ||
for (let i in state) return true; | ||
// if this component used no signals or computeds, update: | ||
if (!hasSignals && !(this._updateFlags & HAS_COMPUTEDS)) return true; | ||
if (this.__f || (typeof this.u == "boolean" && this.u === true)) { | ||
const hasHooksState = this._updateFlags & HAS_HOOK_STATE; | ||
// if this component used no signals or computeds and no hooks state, update: | ||
if (!hasSignals && !hasHooksState && !(this._updateFlags & HAS_COMPUTEDS)) | ||
return true; | ||
// if there is a pending re-render triggered from Signals, | ||
// or if there is hook or class state, update: | ||
if (this._updateFlags & (HAS_PENDING_UPDATE | HAS_HOOK_STATE)) return true; | ||
// if there is a pending re-render triggered from Signals, | ||
// or if there is hooks state, update: | ||
if (this._updateFlags & HAS_PENDING_UPDATE) return true; | ||
} else { | ||
// if this component used no signals or computeds, update: | ||
if (!hasSignals && !(this._updateFlags & HAS_COMPUTEDS)) return true; | ||
// @ts-ignore | ||
for (let i in state) return true; | ||
// if there is a pending re-render triggered from Signals, | ||
// or if there is hooks state, update: | ||
if (this._updateFlags & (HAS_PENDING_UPDATE | HAS_HOOK_STATE)) return true; | ||
} | ||
@@ -383,6 +396,2 @@ // if any non-Signal props changed, update: | ||
let oldNotify: (this: Effect) => void, | ||
effectsQueue: Array<Effect> = [], | ||
domQueue: Array<Effect> = []; | ||
const deferEffects = | ||
@@ -435,3 +444,2 @@ typeof requestAnimationFrame === "undefined" | ||
return effect(function (this: Effect) { | ||
if (!oldNotify) oldNotify = this._notify; | ||
this._notify = notifyEffects; | ||
@@ -438,0 +446,0 @@ return callback.current(); |
@@ -22,2 +22,7 @@ import { Component } from "preact"; | ||
export interface AugmentedComponent extends Component<any, any> { | ||
// hasScuFromHooks | ||
// Preact 10.12 - Preact 10.25 | ||
u?: boolean; | ||
// Preact 10.26 and onwards | ||
__f?: boolean; | ||
__v: VNode; | ||
@@ -24,0 +29,0 @@ _updater?: Effect; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
139578
608