universal-stores
Advanced tools
Comparing version 1.1.4 to 2.0.0
@@ -44,3 +44,3 @@ /** | ||
* const source2$ = makeStore(-10); | ||
* const derived$ = makeDerivedStore([source1$, source2$], ([v1, v2]) => v1 + v2); | ||
* const derived$ = makeDerivedStore({v1: source1$, v2: source2$}, ({v1, v2}) => v1 + v2); | ||
* source1$.subscribe((v) => console.log(v)); // prints 10 | ||
@@ -55,4 +55,6 @@ * source2$.subscribe((v) => console.log(v)); // prints -10 | ||
*/ | ||
export declare function makeDerivedStore<TIn extends [unknown, ...unknown[]], TOut>(readonlyStores: { | ||
[P in keyof TIn]: ReadonlyStore<TIn[P]>; | ||
}, map: (values: TIn) => TOut, config?: DerivedStoreConfig<TOut>): ReadonlyStore<TOut>; | ||
export declare function makeDerivedStore<TIn extends Record<string, unknown>, TOut>(readonlyStores: { | ||
[K in keyof TIn]: ReadonlyStore<TIn[K]>; | ||
}, map: (value: { | ||
[K in keyof TIn]: TIn[K]; | ||
}) => TOut, config?: DerivedStoreConfig<TOut>): ReadonlyStore<TOut>; |
@@ -48,7 +48,7 @@ /** | ||
*/ | ||
get nOfSubscriptions(): number; | ||
nOfSubscriptions(): number; | ||
/** | ||
* Get the current value of the store. | ||
* Get the current value wrapped by the store. | ||
*/ | ||
get value(): T; | ||
content(): T; | ||
}; | ||
@@ -90,3 +90,3 @@ /** | ||
* const store$ = makeStore(0); | ||
* console.log(store$.value); // 0 | ||
* console.log(store$.content()); // 0 | ||
* store$.subscribe((v) => console.log(v)); | ||
@@ -106,3 +106,3 @@ * store$.set(10); // will trigger the above console log, printing 10 | ||
* const store$ = makeStore(0); | ||
* console.log(store$.value); // 0 | ||
* console.log(store$.content()); // 0 | ||
* store$.subscribe((v) => console.log(v)); | ||
@@ -122,3 +122,3 @@ * store$.set(10); // will trigger the above console log, printing 10 | ||
* const store$ = makeStore(0); | ||
* console.log(store$.value); // 0 | ||
* console.log(store$.content()); // 0 | ||
* store$.subscribe((v) => console.log(v)); | ||
@@ -142,5 +142,5 @@ * store$.set(10); // will trigger the above console log, printing 10 | ||
* }); | ||
* console.log(store$.value); // 1 | ||
* console.log(store$.content()); // 1 | ||
* store$.subscribe((v) => console.log(v)); // immediately prints 2 | ||
* console.log(store$.value); // 2 | ||
* console.log(store$.content()); // 2 | ||
* ``` | ||
@@ -179,5 +179,5 @@ * @param initialValue the initial value of the store. | ||
* }); | ||
* console.log(store$.value); // 1 | ||
* console.log(store$.content()); // 1 | ||
* store$.subscribe((v) => console.log(v)); // immediately prints 2 | ||
* console.log(store$.value); // 2 | ||
* console.log(store$.content()); // 2 | ||
* ``` | ||
@@ -184,0 +184,0 @@ * @param initialValue the initial value of the store. |
@@ -0,1 +1,17 @@ | ||
var __defProp = Object.defineProperty; | ||
var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
var __spreadValues = (a, b) => { | ||
for (var prop in b || (b = {})) | ||
if (__hasOwnProp.call(b, prop)) | ||
__defNormalProp(a, prop, b[prop]); | ||
if (__getOwnPropSymbols) | ||
for (var prop of __getOwnPropSymbols(b)) { | ||
if (__propIsEnum.call(b, prop)) | ||
__defNormalProp(a, prop, b[prop]); | ||
} | ||
return a; | ||
}; | ||
function makeSignal() { | ||
@@ -32,3 +48,3 @@ const subscribers = []; | ||
subscribeOnce, | ||
get nOfSubscriptions() { | ||
nOfSubscriptions() { | ||
return subscribers.length; | ||
@@ -48,25 +64,20 @@ } | ||
*/ | ||
function makeDerivedStore(storeOrStores, map, config) { | ||
const isArray = Array.isArray(storeOrStores); | ||
const readonlyStores = isArray ? storeOrStores : [storeOrStores]; | ||
const deriveValues = (values) => { | ||
if (isArray) { | ||
return map(values); | ||
} else { | ||
return map(values[0]); | ||
} | ||
}; | ||
const derived = makeReadonlyStore(void 0, { | ||
function makeDerivedStore(readonlyStoreOrStores, map, config) { | ||
const hasMultipleSources = !("subscribe" in readonlyStoreOrStores); | ||
const sources = hasMultipleSources ? readonlyStoreOrStores : { source: readonlyStoreOrStores }; | ||
const nOfSources = Object.keys(sources).length; | ||
const deriveValues = hasMultipleSources ? (values) => map(values) : ({ source }) => map(source); | ||
const derived$ = makeReadonlyStore(void 0, { | ||
comparator: config == null ? void 0 : config.comparator, | ||
start: (set) => { | ||
let cache = new Array(readonlyStores.length); | ||
let cache = {}; | ||
let subscriptionCounter = 0; | ||
const subscriptions = readonlyStores.map((r, i) => r.subscribe((newValue) => { | ||
if (subscriptionCounter < readonlyStores.length) { | ||
cache[i] = newValue; | ||
const subscriptions = Object.entries(sources).map(([name, store$]) => store$.subscribe((newValue) => { | ||
if (subscriptionCounter < nOfSources) { | ||
cache[name] = newValue; | ||
subscriptionCounter++; | ||
} | ||
if (subscriptionCounter === readonlyStores.length) { | ||
const updatedCached = [...cache]; | ||
updatedCached[i] = newValue; | ||
if (subscriptionCounter === nOfSources) { | ||
const updatedCached = __spreadValues({}, cache); | ||
updatedCached[name] = newValue; | ||
set(deriveValues(updatedCached)); | ||
@@ -84,3 +95,3 @@ cache = updatedCached; | ||
}); | ||
return derived; | ||
return derived$; | ||
} | ||
@@ -105,3 +116,3 @@ /** | ||
const get = () => { | ||
if (signal.nOfSubscriptions > 0) { | ||
if (signal.nOfSubscriptions() > 0) { | ||
return mutableValue; | ||
@@ -122,3 +133,3 @@ } | ||
const subscribe = (s) => { | ||
if (signal.nOfSubscriptions === 0) { | ||
if (signal.nOfSubscriptions() === 0) { | ||
stopHandler = startHandler == null ? void 0 : startHandler(set); | ||
@@ -130,3 +141,3 @@ } | ||
unsubscribe(); | ||
if (signal.nOfSubscriptions === 0) { | ||
if (signal.nOfSubscriptions() === 0) { | ||
stopHandler == null ? void 0 : stopHandler(); | ||
@@ -141,25 +152,17 @@ stopHandler = void 0; | ||
return { | ||
get value() { | ||
return get(); | ||
}, | ||
content: get, | ||
set, | ||
subscribe, | ||
update, | ||
get nOfSubscriptions() { | ||
return signal.nOfSubscriptions; | ||
} | ||
nOfSubscriptions: signal.nOfSubscriptions | ||
}; | ||
} | ||
function makeReadonlyStore(initialValue, startOrConfig) { | ||
const base$ = makeStore(initialValue, startOrConfig); | ||
const { content, nOfSubscriptions, subscribe } = makeStore(initialValue, startOrConfig); | ||
return { | ||
get value() { | ||
return base$.value; | ||
}, | ||
subscribe: base$.subscribe, | ||
get nOfSubscriptions() { | ||
return base$.nOfSubscriptions; | ||
} | ||
content, | ||
nOfSubscriptions, | ||
subscribe | ||
}; | ||
} | ||
export { makeDerivedStore, makeReadonlyStore, makeStore }; |
@@ -1,2 +0,2 @@ | ||
(function(o,a){typeof exports=="object"&&typeof module!="undefined"?a(exports):typeof define=="function"&&define.amd?define(["exports"],a):(o=typeof globalThis!="undefined"?globalThis:o||self,a(o.universalStores={}))})(this,function(o){"use strict";function a(){const i=[];function e(t){for(const c of[...i])c(t)}function n(t){const c=i.indexOf(t);c!==-1&&i.splice(c,1)}function s(t){return i.indexOf(t)===-1&&i.push(t),()=>n(t)}function r(t){const c=s(b=>{c(),t(b)});return c}return{emit:e,subscribe:s,subscribeOnce:r,get nOfSubscriptions(){return i.length}}}/** | ||
var T=Object.defineProperty;var j=Object.getOwnPropertySymbols;var D=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable;var x=(e,t,r)=>t in e?T(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,M=(e,t)=>{for(var r in t||(t={}))D.call(t,r)&&x(e,r,t[r]);if(j)for(var r of j(t))R.call(t,r)&&x(e,r,t[r]);return e};(function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(exports):typeof define=="function"&&define.amd?define(["exports"],t):(e=typeof globalThis!="undefined"?globalThis:e||self,t(e.universalStores={}))})(this,function(e){"use strict";function t(){const c=[];function s(u){for(const d of[...c])d(u)}function i(u){const d=c.indexOf(u);d!==-1&&c.splice(d,1)}function o(u){return c.indexOf(u)===-1&&c.push(u),()=>i(u)}function b(u){const d=o(m=>{d(),u(m)});return d}return{emit:s,subscribe:o,subscribeOnce:b,nOfSubscriptions(){return c.length}}}/** | ||
* @license | ||
@@ -10,3 +10,3 @@ * Copyright (c) 2016-22 [these people](https://github.com/sveltejs/svelte/graphs/contributors) | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
*/function h(i,e,n){const s=Array.isArray(i),r=s?i:[i],t=b=>e(s?b:b[0]);return v(void 0,{comparator:n==null?void 0:n.comparator,start:b=>{let d=new Array(r.length),f=0;const y=r.map((l,u)=>l.subscribe(p=>{if(f<r.length&&(d[u]=p,f++),f===r.length){const m=[...d];m[u]=p,b(t(m)),d=m}}));return()=>{for(const l of y)l();f=0}}})}/** | ||
*/function r(c,s,i){const o=!("subscribe"in c),b=o?c:{source:c},u=Object.keys(b).length,d=o?f=>s(f):({source:f})=>s(f);return y(void 0,{comparator:i==null?void 0:i.comparator,start:f=>{let p={},S=0;const a=Object.entries(b).map(([n,l])=>l.subscribe(v=>{if(S<u&&(p[n]=v,S++),S===u){const h=M({},p);h[n]=v,f(d(h)),p=h}}));return()=>{for(const n of a)n();S=0}}})}/** | ||
* @license | ||
@@ -20,2 +20,2 @@ * Copyright (c) 2016-22 [these people](https://github.com/sveltejs/svelte/graphs/contributors) | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
*/function S(i,e){var l;let n=i;const s=a();let r;const t=typeof e=="function"?e:e==null?void 0:e.start,c=(l=typeof e=="function"||e==null?void 0:e.comparator)!=null?l:(u,p)=>u===p,b=()=>{if(s.nOfSubscriptions>0)return n;let u;return f(m=>u=m)(),u},d=u=>{n!==void 0&&c(n,u)||(n=u,s.emit(n))},f=u=>{s.nOfSubscriptions===0&&(r=t==null?void 0:t(d));const p=s.subscribe(u);return u(n),()=>{p(),s.nOfSubscriptions===0&&(r==null||r(),r=void 0)}};return{get value(){return b()},set:d,subscribe:f,update:u=>{d(u(b()))},get nOfSubscriptions(){return s.nOfSubscriptions}}}function v(i,e){const n=S(i,e);return{get value(){return n.value},subscribe:n.subscribe,get nOfSubscriptions(){return n.nOfSubscriptions}}}o.makeDerivedStore=h,o.makeReadonlyStore=v,o.makeStore=S,Object.defineProperty(o,"__esModule",{value:!0}),o[Symbol.toStringTag]="Module"}); | ||
*/function k(c,s){var a;let i=c;const o=t();let b;const u=typeof s=="function"?s:s==null?void 0:s.start,d=(a=typeof s=="function"||s==null?void 0:s.comparator)!=null?a:(n,l)=>n===l,m=()=>{if(o.nOfSubscriptions()>0)return i;let n;return p(v=>n=v)(),n},f=n=>{i!==void 0&&d(i,n)||(i=n,o.emit(i))},p=n=>{o.nOfSubscriptions()===0&&(b=u==null?void 0:u(f));const l=o.subscribe(n);return n(i),()=>{l(),o.nOfSubscriptions()===0&&(b==null||b(),b=void 0)}};return{content:m,set:f,subscribe:p,update:n=>{f(n(m()))},nOfSubscriptions:o.nOfSubscriptions}}function y(c,s){const{content:i,nOfSubscriptions:o,subscribe:b}=k(c,s);return{content:i,nOfSubscriptions:o,subscribe:b}}e.makeDerivedStore=r,e.makeReadonlyStore=y,e.makeStore=k,Object.defineProperty(e,"__esModule",{value:!0}),e[Symbol.toStringTag]="Module"}); |
@@ -5,3 +5,3 @@ { | ||
"description": "State management made simple", | ||
"version": "1.1.4", | ||
"version": "2.0.0", | ||
"type": "module", | ||
@@ -71,4 +71,4 @@ "types": "dist/index.d.ts", | ||
"dependencies": { | ||
"@cdellacqua/signals": "^4.1.1" | ||
"@cdellacqua/signals": "^5.0.0" | ||
} | ||
} |
@@ -16,2 +16,6 @@ # universal-stores | ||
## Migrating to V2 | ||
Please refer to the [changelog](./CHANGELOG.md). | ||
## Store | ||
@@ -33,5 +37,5 @@ | ||
const store$ = makeStore(0); | ||
console.log(store$.value); // 0 | ||
console.log(store$.content()); // 0 | ||
store$.set(1); | ||
console.log(store$.value); // 1 | ||
console.log(store$.content()); // 1 | ||
``` | ||
@@ -51,3 +55,3 @@ | ||
const store$ = makeStore(0); | ||
console.log(store$.value); // 0 | ||
console.log(store$.content()); // 0 | ||
const unsubscribe = store$.subscribe((v) => console.log(v)); // immediately prints 0 | ||
@@ -86,7 +90,7 @@ store$.set(1); // triggers the above subscriber, printing 1 | ||
const unsubscribe3 = store$.subscribe(subscriber); // prints 0 | ||
console.log(store$.nOfSubscriptions); // 1 | ||
console.log(store$.nOfSubscriptions()); // 1 | ||
unsubscribe3(); // will remove "subscriber" | ||
unsubscribe2(); // won't do anything, "subscriber" has already been removed | ||
unsubscribe1(); // won't do anything, "subscriber" has already been removed | ||
console.log(store$.nOfSubscriptions); // 0 | ||
console.log(store$.nOfSubscriptions()); // 0 | ||
``` | ||
@@ -102,11 +106,11 @@ | ||
const subscriber = (v: number) => console.log(v); | ||
console.log(store$.nOfSubscriptions); // 0 | ||
console.log(store$.nOfSubscriptions()); // 0 | ||
const unsubscribe1 = store$.subscribe(subscriber); // prints 0 | ||
console.log(store$.nOfSubscriptions); // 1 | ||
console.log(store$.nOfSubscriptions()); // 1 | ||
const unsubscribe2 = store$.subscribe((v) => subscriber(v)); // prints 0 | ||
console.log(store$.nOfSubscriptions); // 2 | ||
console.log(store$.nOfSubscriptions()); // 2 | ||
unsubscribe2(); | ||
console.log(store$.nOfSubscriptions); // 1 | ||
console.log(store$.nOfSubscriptions()); // 1 | ||
unsubscribe1(); | ||
console.log(store$.nOfSubscriptions); // 0 | ||
console.log(store$.nOfSubscriptions()); // 0 | ||
``` | ||
@@ -138,3 +142,3 @@ | ||
const secondWord$ = makeStore('world!'); | ||
const derived$ = makeDerivedStore([firstWord$, secondWord$], ([first, second]) => `${first} ${second}`); | ||
const derived$ = makeDerivedStore({first: firstWord$, second: secondWord$}, ({first, second}) => `${first} ${second}`); | ||
derived$.subscribe((v) => console.log(v)); // prints "hello world!" | ||
@@ -174,2 +178,3 @@ firstWord$.set('hi'); // will trigger console.log, printing "hi world!" | ||
console.log('start'); | ||
set(performance.now()); | ||
const interval = setInterval(() => { | ||
@@ -240,2 +245,30 @@ set(performance.now()); | ||
## Adding behaviour | ||
If you need to encapsulate behaviour in a custom store, you | ||
can simply destructure a regular store and add your | ||
custom methods to the already existing ones. | ||
Example: | ||
```ts | ||
import {makeStore} from 'universal-stores'; | ||
function makeCounterStore(): ReadonlyStore<number> & {increment(): void} { | ||
const {subscribe, content, update, nOfSubscriptions} = makeStore(0); | ||
return { | ||
subscribe, | ||
content, | ||
nOfSubscriptions, | ||
increment() { | ||
update((n) => n + 1); | ||
}, | ||
}; | ||
} | ||
const counter$ = makeCounterStore(); | ||
counter$.subscribe(console.log); // immediately prints 0 | ||
counter$.increment(); // will trigger the above console.log, printing 1 | ||
``` | ||
## Motivation | ||
@@ -242,0 +275,0 @@ |
Sorry, the diff of this file is not supported yet
40223
468
291
+ Added@cdellacqua/signals@5.0.4(transitive)
- Removed@cdellacqua/signals@4.1.2(transitive)
Updated@cdellacqua/signals@^5.0.0