value-enhancer
Advanced tools
Comparing version 1.2.1 to 1.3.0
@@ -1,2 +0,2 @@ | ||
"use strict";var E=Object.defineProperty,z=Object.defineProperties;var y=Object.getOwnPropertyDescriptors;var p=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var l=(r,e,s)=>e in r?E(r,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):r[e]=s,_=(r,e)=>{for(var s in e||(e={}))$.call(e,s)&&l(r,s,e[s]);if(p)for(var s of p(e))j.call(e,s)&&l(r,s,e[s]);return r},d=(r,e)=>z(r,y(e));var u=(r,e,s)=>(l(r,typeof e!="symbol"?e+"":e,s),s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});class O{constructor(e){u(this,"_subscribers");u(this,"_bSub");u(this,"_bSubDisposer");this._bSub=e}get size(){return this._subscribers?this._subscribers.size:0}invoke(e,s){this._subscribers&&this._subscribers.forEach(i=>i(e,s))}add(e){this._bSub&&(!this._subscribers||this._subscribers.size<=0)&&(this._bSubDisposer=this._bSub()),this._subscribers||(this._subscribers=new Set),this._subscribers.add(e)}remove(e){if(this._subscribers&&this._subscribers.delete(e),this._subscribers&&this._subscribers.size<=0&&this._bSubDisposer){const s=this._bSubDisposer;this._bSubDisposer=null,s()}}clear(){if(this._subscribers&&this._subscribers.clear(),this._bSubDisposer){const e=this._bSubDisposer;this._bSubDisposer=null,e()}}destroy(){this.clear()}}class h{constructor(e,s){u(this,"_subscribers");u(this,"_value");this._value=e;let i;if(s&&(s.compare&&(this.compare=s.compare),s.beforeSubscribe)){const t=s.beforeSubscribe,b=this._setValue.bind(this);i=()=>t(b)}this._subscribers=new O(i)}_setValue(e,s){this.compare(e,this._value)||(this._value=e,this._subscribers.invoke(e,s))}get value(){return this._value}reaction(e){return this._subscribers.add(e),()=>{this._subscribers.remove(e)}}subscribe(e,s){const i=this.reaction(e);return e(this._value,s),i}destroy(){this._subscribers.destroy()}unsubscribe(e){this._subscribers.remove(e)}compare(e,s){return e===s}}class R extends h{constructor(){super(...arguments);u(this,"setValue",this._setValue)}}class S extends h{constructor(s,i,t={}){super(i(s.value),d(_({},t),{beforeSubscribe:b=>{const c=s.subscribe((a,o)=>b(i(a),o));if(t.beforeSubscribe){const a=t.beforeSubscribe(b);if(a)return()=>{c(),a()}}return c}}));u(this,"_srcValue");this._srcValue=()=>i(s.value)}get value(){if(this._subscribers.size<=0){const s=this._srcValue();return this.compare(s,this._value)?this._value:s}return this._value}}function x(r,e=i=>i,s={}){return new S(r,e,s)}class V extends h{constructor(s,i,t={}){super(i(f(s)),d(_({},t),{beforeSubscribe:b=>{let c=f(s);b(i(c));const a=s.map((n,D)=>n.reaction((m,w)=>{c=c.slice(),c[D]=m,b(i(c),w)})),o=()=>a.forEach(n=>n());if(t.beforeSubscribe){const n=t.beforeSubscribe(b);if(n)return()=>{o(),n()}}return o}}));u(this,"_srcValue");this._srcValue=()=>i(f(s))}get value(){if(this._subscribers.size<=0){const s=this._srcValue();return this.compare(s,this._value)?this._value:s}return this._value}}function f(r){return r.map(C)}function C(r){return r.value}function P(r,e=i=>i,s={}){return new V(r,e,s)}function M(r,e,s){Object.keys(e).forEach(i=>{I(r,i,e[i]),s&&s.attach(e[i])})}function I(r,e,s){return Object.defineProperties(r,{[e]:{get(){return s.value}},[`_${e}$`]:{value:s}}),r}function T(r,e,s){Object.keys(e).forEach(i=>{v(r,i,e[i]),s&&s.attach(e[i])})}function v(r,e,s){return Object.defineProperties(r,{[e]:{get(){return s.value},set(i){s.setValue(i)}},[`_${e}$`]:{value:s},[`set${U(e)}`]:{value:(i,t)=>s.setValue(i,t)}}),r}function U(r){return r[0].toUpperCase()+r.slice(1)}class q{constructor(){u(this,"vals",new Set)}attach(e){return this.vals.add(e),e}detach(e){return this.vals.delete(e),e}destroy(){this.vals.forEach(A),this.vals.clear()}}function A(r){r.destroy()}exports.CombinedVal=V;exports.DerivedVal=S;exports.ReadonlyVal=h;exports.Val=R;exports.ValManager=q;exports.bindInstance=v;exports.combine=P;exports.derive=x;exports.withReadonlyValueEnhancer=M;exports.withValueEnhancer=T; | ||
"use strict";var $=Object.defineProperty,z=Object.defineProperties;var C=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var O=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var l=(r,e,s)=>e in r?$(r,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):r[e]=s,_=(r,e)=>{for(var s in e||(e={}))O.call(e,s)&&l(r,s,e[s]);if(V)for(var s of V(e))j.call(e,s)&&l(r,s,e[s]);return r},d=(r,e)=>z(r,C(e));var u=(r,e,s)=>(l(r,typeof e!="symbol"?e+"":e,s),s);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});class y{constructor(e){u(this,"_subscribers");u(this,"_bSub");u(this,"_bSubDisposer");this._bSub=e}get size(){return this._subscribers?this._subscribers.size:0}invoke(e,s){this._subscribers&&this._subscribers.forEach(i=>i(e,s))}add(e){this._bSub&&(!this._subscribers||this._subscribers.size<=0)&&(this._bSubDisposer=this._bSub()),this._subscribers||(this._subscribers=new Set),this._subscribers.add(e)}remove(e){if(this._subscribers&&this._subscribers.delete(e),this._subscribers&&this._subscribers.size<=0&&this._bSubDisposer){const s=this._bSubDisposer;this._bSubDisposer=null,s()}}clear(){if(this._subscribers&&this._subscribers.clear(),this._bSubDisposer){const e=this._bSubDisposer;this._bSubDisposer=null,e()}}destroy(){this.clear()}}class h{constructor(e,s){u(this,"_subscribers");u(this,"_value");this._value=e;let i;if(s&&(s.compare&&(this.compare=s.compare),s.beforeSubscribe)){const t=s.beforeSubscribe,b=this._setValue.bind(this);i=()=>t(b)}this._subscribers=new y(i)}_setValue(e,s){this.compare(e,this._value)||(this._value=e,this._subscribers.invoke(e,s))}get value(){return this._value}reaction(e){return this._subscribers.add(e),()=>{this._subscribers.remove(e)}}subscribe(e,s){const i=this.reaction(e);return e(this._value,s),i}destroy(){this._subscribers.destroy()}unsubscribe(e){this._subscribers.remove(e)}compare(e,s){return e===s}}class R extends h{constructor(){super(...arguments);u(this,"setValue",this._setValue)}}class p extends h{constructor(s,i,t={}){super(i(s.value),d(_({},t),{beforeSubscribe:b=>{const c=s.subscribe((a,o)=>b(i(a),o));if(t.beforeSubscribe){const a=t.beforeSubscribe(b);if(a)return()=>{c(),a()}}return c}}));u(this,"_srcValue");this._srcValue=()=>i(s.value)}get value(){if(this._subscribers.size<=0){const s=this._srcValue();return this.compare(s,this._value)?this._value:s}return this._value}}function x(r,e=i=>i,s={}){return new p(r,e,s)}class S extends h{constructor(s,i,t={}){super(i(f(s)),d(_({},t),{beforeSubscribe:b=>{let c=f(s);b(i(c));const a=s.map((n,m)=>n.reaction((w,E)=>{c=c.slice(),c[m]=w,b(i(c),E)})),o=()=>a.forEach(n=>n());if(t.beforeSubscribe){const n=t.beforeSubscribe(b);if(n)return()=>{o(),n()}}return o}}));u(this,"_srcValue");this._srcValue=()=>i(f(s))}get value(){if(this._subscribers.size<=0){const s=this._srcValue();return this.compare(s,this._value)?this._value:s}return this._value}}function f(r){return r.map(P)}function P(r){return r.value}function g(r,e=i=>i,s={}){return new S(r,e,s)}function v(r){r.onValChanged||(r.onValChanged=M)}function M(r,e){const s=this[`_${r}$`]||this[r];if(!(s!=null&&s.reaction))throw new TypeError(`"${r}" is not related to a Val in this instance`);return s.reaction(e)}function T(r,e,s){Object.keys(e).forEach(i=>{I(r,i,e[i]),s&&s.attach(e[i])}),v(r)}function I(r,e,s){return Object.defineProperties(r,{[e]:{get(){return s.value}},[`_${e}$`]:{value:s}}),r}function U(r,e,s){Object.keys(e).forEach(i=>{D(r,i,e[i]),s&&s.attach(e[i])}),v(r)}function D(r,e,s){return Object.defineProperties(r,{[e]:{get(){return s.value},set(i){s.setValue(i)}},[`_${e}$`]:{value:s},[`set${q(e)}`]:{value:(i,t)=>s.setValue(i,t)}}),r}function q(r){return r[0].toUpperCase()+r.slice(1)}class A{constructor(){u(this,"vals",new Set)}attach(e){return this.vals.add(e),e}detach(e){return this.vals.delete(e),e}destroy(){this.vals.forEach(B),this.vals.clear()}}function B(r){r.destroy()}exports.CombinedVal=S;exports.DerivedVal=p;exports.ReadonlyVal=h;exports.Val=R;exports.ValManager=A;exports.bindInstance=D;exports.combine=g;exports.derive=x;exports.withReadonlyValueEnhancer=T;exports.withValueEnhancer=U; | ||
//# sourceMappingURL=value-enhancer.cjs.js.map |
@@ -203,2 +203,14 @@ var __defProp = Object.defineProperty; | ||
} | ||
function withOnValChanged(instance) { | ||
if (!instance.onValChanged) { | ||
instance.onValChanged = onValChanged; | ||
} | ||
} | ||
function onValChanged(key, listener) { | ||
const val = this[`_${key}$`] || this[key]; | ||
if (!(val == null ? void 0 : val.reaction)) { | ||
throw new TypeError(`"${key}" is not related to a Val in this instance`); | ||
} | ||
return val.reaction(listener); | ||
} | ||
function withReadonlyValueEnhancer(instance, config, valManager) { | ||
@@ -211,2 +223,3 @@ Object.keys(config).forEach((key) => { | ||
}); | ||
withOnValChanged(instance); | ||
} | ||
@@ -233,2 +246,3 @@ function bindInstance$1(instance, key, val) { | ||
}); | ||
withOnValChanged(instance); | ||
} | ||
@@ -235,0 +249,0 @@ function bindInstance(instance, key, val) { |
import type { ExtractValValue } from "./combine"; | ||
import type { ReadonlyVal } from "./readonly-val"; | ||
import type { ValManager } from "./val-manager"; | ||
import type { WithOnValChanged } from "./with-on-val-changed"; | ||
declare type IntersectionFromUnion<TUnion> = (TUnion extends any ? (arg: TUnion) => void : never) extends (arg: infer TArg) => void ? TArg : never; | ||
declare type ExtractReadonlyValKeys<TInstance, TKey = keyof TInstance> = TKey extends Extract<keyof TInstance, string> ? TInstance[TKey] extends ReadonlyVal ? TKey : never : never; | ||
export declare type ReadonlyValEnhancer<TVal, TKey extends string> = Readonly<Record<TKey, ExtractValValue<TVal>> & Record<`_${TKey}$`, TVal>>; | ||
export declare type ReadonlyValEnhancedProps<TVal, TKey extends string> = Readonly<Record<TKey, ExtractValValue<TVal>> & Record<`_${TKey}$`, TVal>>; | ||
export declare type ReadonlyValEnhancerConfig = Record<string, ReadonlyVal>; | ||
declare type ToReadonlyValUnion<TConfig, TKey = ExtractReadonlyValKeys<TConfig>> = TKey extends ExtractReadonlyValKeys<TConfig> ? ReadonlyValEnhancer<TConfig[TKey], TKey> : never; | ||
export declare type ReadonlyValEnhancedResult<TConfig> = IntersectionFromUnion<ToReadonlyValUnion<TConfig>>; | ||
declare type ToReadonlyValUnion<TConfig, TKey = ExtractReadonlyValKeys<TConfig>> = TKey extends ExtractReadonlyValKeys<TConfig> ? ReadonlyValEnhancedProps<TConfig[TKey], TKey> : never; | ||
export declare type ReadonlyValEnhancedResult<TConfig> = WithOnValChanged<TConfig, IntersectionFromUnion<ToReadonlyValUnion<TConfig>>>; | ||
/** | ||
@@ -43,4 +44,5 @@ * Bind ReadonlyVals/Vals `value` and itself to properties of an instance. | ||
* - `obj._isApple$`, the `isApple$` | ||
* - `obj.onValChanged(key: "apple" | "isApple", listener)`, equals to calling <code>obj[\`_${key}$\`].reaction</code> | ||
*/ | ||
export declare function withReadonlyValueEnhancer<TInstance, TConfig extends ReadonlyValEnhancerConfig>(instance: TInstance, config: TConfig, valManager?: ValManager): void; | ||
export declare function withReadonlyValueEnhancer<TInstance extends ReadonlyValEnhancedResult<TConfig>, TConfig extends ReadonlyValEnhancerConfig>(instance: TInstance, config: TConfig, valManager?: ValManager): void; | ||
export {}; |
import type { ExtractValMeta, ExtractValValue } from "./combine"; | ||
import type { Val } from "./val"; | ||
import type { ValManager } from "./val-manager"; | ||
import type { WithOnValChanged } from "./with-on-val-changed"; | ||
declare type IntersectionFromUnion<TUnion> = (TUnion extends any ? (arg: TUnion) => void : never) extends (arg: infer TArg) => void ? TArg : never; | ||
declare type ExtractValKeys<TInstance, TKey = keyof TInstance> = TKey extends Extract<keyof TInstance, string> ? TInstance[TKey] extends Val ? TKey : never : never; | ||
export declare type ValEnhancer<TVal, TKey extends string> = Readonly<Record<`_${TKey}$`, TVal> & Record<`set${Capitalize<TKey>}`, (value: ExtractValValue<TVal>, meta?: ExtractValMeta<TVal>) => void>> & Record<TKey, ExtractValValue<TVal>>; | ||
declare type ValEnhancedProps<TVal, TKey extends string> = Readonly<Record<`_${TKey}$`, TVal> & Record<`set${Capitalize<TKey>}`, (value: ExtractValValue<TVal>, meta?: ExtractValMeta<TVal>) => void>> & Record<TKey, ExtractValValue<TVal>>; | ||
export declare type ValEnhancerConfig = Record<string, Val>; | ||
declare type ToValUnion<TConfig, TKey = ExtractValKeys<TConfig>> = TKey extends ExtractValKeys<TConfig> ? ValEnhancer<TConfig[TKey], TKey> : never; | ||
export declare type ValEnhancedResult<TConfig> = IntersectionFromUnion<ToValUnion<TConfig>>; | ||
declare type ToValUnion<TConfig, TKey = ExtractValKeys<TConfig>> = TKey extends ExtractValKeys<TConfig> ? ValEnhancedProps<TConfig[TKey], TKey> : never; | ||
export declare type ValEnhancedResult<TConfig> = WithOnValChanged<TConfig, IntersectionFromUnion<ToValUnion<TConfig>>>; | ||
/** | ||
@@ -45,4 +46,5 @@ * Bind Vals `value`, `setValue` and itself to properties of an instance. | ||
* - `obj._banana$`, the `banana$` | ||
* - `obj.onValChanged(key: "apple" | "isApple", listener)`, equals to calling <code>obj[\`_${key}$\`].reaction</code> | ||
*/ | ||
export declare function withValueEnhancer<TInstance, TConfig extends ValEnhancerConfig>(instance: TInstance, config: TConfig, valManager?: ValManager): void; | ||
export declare function withValueEnhancer<TInstance extends ValEnhancedResult<TConfig>, TConfig extends ValEnhancerConfig>(instance: TInstance, config: TConfig, valManager?: ValManager): void; | ||
export declare type BindVal = <TKey extends string, TValue, TMeta>(key: TKey, val: Val<TValue, TMeta>) => Val<TValue, TMeta>; | ||
@@ -59,3 +61,3 @@ /** | ||
*/ | ||
export declare function bindInstance<TInstance, TKey extends string, TValue, TMeta>(instance: TInstance, key: TKey, val: Val<TValue, TMeta>): ValEnhancer<TValue, TKey> & TInstance; | ||
export declare function bindInstance<TInstance, TKey extends string, TValue, TMeta>(instance: TInstance, key: TKey, val: Val<TValue, TMeta>): ValEnhancedProps<TValue, TKey> & TInstance; | ||
export {}; |
{ | ||
"name": "value-enhancer", | ||
"version": "1.2.1", | ||
"version": "1.3.0", | ||
"private": false, | ||
@@ -5,0 +5,0 @@ "description": "A tiny library to enhance value with reactive wrapper.", |
@@ -103,2 +103,3 @@ # value-enhancer | ||
- `obj._banana$`, the `banana$` | ||
- `obj.onValChanged(key: "apple" | "banana", listener)`, equals to calling <code>obj[\`_${key}$\`].reaction</code> | ||
@@ -139,2 +140,3 @@ ### Bind ReadonlyVals/Vals To An Instance | ||
- `obj._isApple$`, the `isApple$` | ||
- `obj.onValChanged(key: "apple" | "isApple", listener)`, equals to calling <code>obj[\`_${key}$\`].reaction</code> | ||
@@ -141,0 +143,0 @@ ### ValManager |
@@ -6,2 +6,4 @@ /* eslint-disable @typescript-eslint/ban-types */ | ||
import type { ValManager } from "./val-manager"; | ||
import type { WithOnValChanged } from "./with-on-val-changed"; | ||
import { withOnValChanged } from "./with-on-val-changed"; | ||
@@ -23,3 +25,3 @@ type IntersectionFromUnion<TUnion> = ( | ||
export type ReadonlyValEnhancer<TVal, TKey extends string> = Readonly< | ||
export type ReadonlyValEnhancedProps<TVal, TKey extends string> = Readonly< | ||
Record<TKey, ExtractValValue<TVal>> & Record<`_${TKey}$`, TVal> | ||
@@ -34,7 +36,8 @@ >; | ||
> = TKey extends ExtractReadonlyValKeys<TConfig> | ||
? ReadonlyValEnhancer<TConfig[TKey], TKey> | ||
? ReadonlyValEnhancedProps<TConfig[TKey], TKey> | ||
: never; | ||
export type ReadonlyValEnhancedResult<TConfig> = IntersectionFromUnion< | ||
ToReadonlyValUnion<TConfig> | ||
export type ReadonlyValEnhancedResult<TConfig> = WithOnValChanged< | ||
TConfig, | ||
IntersectionFromUnion<ToReadonlyValUnion<TConfig>> | ||
>; | ||
@@ -75,5 +78,6 @@ | ||
* - `obj._isApple$`, the `isApple$` | ||
* - `obj.onValChanged(key: "apple" | "isApple", listener)`, equals to calling <code>obj[\`_${key}$\`].reaction</code> | ||
*/ | ||
export function withReadonlyValueEnhancer< | ||
TInstance, | ||
TInstance extends ReadonlyValEnhancedResult<TConfig>, | ||
TConfig extends ReadonlyValEnhancerConfig | ||
@@ -87,2 +91,3 @@ >(instance: TInstance, config: TConfig, valManager?: ValManager): void { | ||
}); | ||
withOnValChanged(instance); | ||
} | ||
@@ -103,3 +108,3 @@ | ||
val: ReadonlyVal<TValue, TMeta> | ||
): ReadonlyValEnhancer<TValue, TKey> & TInstance { | ||
): ReadonlyValEnhancedProps<TValue, TKey> & TInstance { | ||
Object.defineProperties(instance, { | ||
@@ -115,3 +120,3 @@ [key]: { | ||
}); | ||
return instance as ReadonlyValEnhancer<TValue, TKey> & TInstance; | ||
return instance as ReadonlyValEnhancedProps<TValue, TKey> & TInstance; | ||
} |
@@ -6,2 +6,4 @@ /* eslint-disable @typescript-eslint/ban-types */ | ||
import type { ValManager } from "./val-manager"; | ||
import type { WithOnValChanged } from "./with-on-val-changed"; | ||
import { withOnValChanged } from "./with-on-val-changed"; | ||
@@ -23,3 +25,3 @@ type IntersectionFromUnion<TUnion> = ( | ||
export type ValEnhancer<TVal, TKey extends string> = Readonly< | ||
type ValEnhancedProps<TVal, TKey extends string> = Readonly< | ||
Record<`_${TKey}$`, TVal> & | ||
@@ -39,7 +41,8 @@ Record< | ||
> = TKey extends ExtractValKeys<TConfig> | ||
? ValEnhancer<TConfig[TKey], TKey> | ||
? ValEnhancedProps<TConfig[TKey], TKey> | ||
: never; | ||
export type ValEnhancedResult<TConfig> = IntersectionFromUnion< | ||
ToValUnion<TConfig> | ||
export type ValEnhancedResult<TConfig> = WithOnValChanged< | ||
TConfig, | ||
IntersectionFromUnion<ToValUnion<TConfig>> | ||
>; | ||
@@ -82,8 +85,8 @@ | ||
* - `obj._banana$`, the `banana$` | ||
* - `obj.onValChanged(key: "apple" | "isApple", listener)`, equals to calling <code>obj[\`_${key}$\`].reaction</code> | ||
*/ | ||
export function withValueEnhancer<TInstance, TConfig extends ValEnhancerConfig>( | ||
instance: TInstance, | ||
config: TConfig, | ||
valManager?: ValManager | ||
): void { | ||
export function withValueEnhancer< | ||
TInstance extends ValEnhancedResult<TConfig>, | ||
TConfig extends ValEnhancerConfig | ||
>(instance: TInstance, config: TConfig, valManager?: ValManager): void { | ||
Object.keys(config).forEach(key => { | ||
@@ -95,2 +98,3 @@ bindInstance(instance, key, config[key]); | ||
}); | ||
withOnValChanged(instance); | ||
} | ||
@@ -117,3 +121,3 @@ | ||
val: Val<TValue, TMeta> | ||
): ValEnhancer<TValue, TKey> & TInstance { | ||
): ValEnhancedProps<TValue, TKey> & TInstance { | ||
Object.defineProperties(instance, { | ||
@@ -135,3 +139,3 @@ [key]: { | ||
}); | ||
return instance as ValEnhancer<TValue, TKey> & TInstance; | ||
return instance as ValEnhancedProps<TValue, TKey> & TInstance; | ||
} | ||
@@ -138,0 +142,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
103126
29
1169
216