@rkrupinski/stan 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,3 +10,16 @@ Minimal, type-safe state management
10
10
  - [Website](https://rkrupinski.github.io/stan)
11
11
  - [API docs](https://rkrupinski.github.io/stan/docs/api)
12
12
  - [Examples](https://rkrupinski.github.io/stan/docs/getting-started/examples)
13
+
14
+ ```tsx
15
+ import { atom } from '@rkrupinski/stan';
16
+ import { useStanValue } from '@rkrupinski/stan/react';
17
+
18
+ const ultimateQuestion = atom(42);
19
+
20
+ function MyApp() {
21
+ const answer = useStanValue(ultimateQuestion);
22
+
23
+ return <h1>{answer}</h1>;
24
+ }
25
+ ```
package/dist/cache.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ type Evictable<T> = (signal: AbortSignal) => T;
1
2
  export type CachePolicy = {
2
3
  type: 'keep-all';
3
4
  } | {
@@ -6,9 +7,10 @@ export type CachePolicy = {
6
7
  type: 'lru';
7
8
  maxSize: number;
8
9
  };
9
- export type KeyMaker<A> = (arg: A) => any;
10
- export type MemoizeOptions<A> = {
10
+ type KeyMaker<A> = (arg: A) => any;
11
+ type MemoizeOptions<A> = {
11
12
  cachePolicy?: CachePolicy;
12
13
  keyMaker?: KeyMaker<A>;
13
14
  };
14
- export declare const memoize: <A, R>(fn: (arg: A) => R, { cachePolicy, keyMaker, }?: MemoizeOptions<A>) => (arg: A) => R;
15
+ export declare const memoize: <A, R>(fn: (arg: A) => Evictable<R>, { cachePolicy, keyMaker, }?: MemoizeOptions<A>) => (arg: A) => NonNullable<R>;
16
+ export {};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{i as t,d as s,R as a,a as c,s as n,b as i,c as o}from"./store-P73VI2VP.js";export{D as DEFAULT_STORE,S as Store,m as makeStore,r as refresh,e as reset}from"./store-P73VI2VP.js";class l extends Error{}class h{#e;#t;constructor(e){this.#e=new Map,this.#t=e}#s(){const e=this.#e.keys().next().value;void 0!==e&&this.#e.delete(e)}has(e){return this.#e.has(e)}get(e){if(!this.has(e))return;const t=this.#e.get(e);return this.#e.delete(e),this.#e.set(e,t),t}set(e,t){this.#e.has(e)?this.#e.delete(e):this.#e.size>=this.#t&&this.#s(),this.#e.set(e,t)}delete(e){return this.#e.delete(e)}clear(){this.#e.clear()}}class u extends Map{}const d=(e,{cachePolicy:s={type:"keep-all"},keyMaker:a=t}={})=>{const r=(e=>{switch(e.type){case"keep-all":return new u;case"most-recent":return new h(1);case"lru":return new h(e.maxSize);default:return e}})(s);return t=>{const s=a(t);return r.has(s)||r.set(s,e(t)),r.get(s)}};let g=0;const f=(e,{tag:t,effects:r,areValuesEqual:n=s}={})=>{const i=e,o=`atom${t?`-${t}`:""}-${g++}`;return d((e=>{const t=new Set,s=new Set;e.value.set(o,i),e.version.set(o,1);const l=(a=!1)=>r=>{if(!e.initialized.get(o))return;const i=e.value.get(o),l=c(r)?r(i):r;n(i,l)||((()=>{const t=e.version.get(o)??0;e.version.set(o,t+1)})(),e.value.set(o,l),[...t].forEach((e=>e(l))),a||s.forEach((e=>e(l))))},h=l(),u=l(!0);return{key:o,get:()=>(e.initialized.get(o)||(e.value.set(o,i),r?.forEach((t=>t({init(t){e.initialized.get(o)||e.value.set(o,t)},set:u,onSet(e){s.add(e)}}))),e.initialized.set(o,!0)),e.value.get(o)),set:h,subscribe:e=>(t.add(e),()=>{t.delete(e)}),[a](){h(i)}}}))},v=(e,{tag:t,...s}={})=>d((a=>f(c(e)?e(a):e,{tag:c(t)?t(a):t,...s})),{keyMaker:n});let k=0;const y=(e,{tag:t,areValuesEqual:a=s}={})=>{const r=`selector${t?`-${t}`:""}-${k++}`;return d((t=>{const s=new Map;t.deps.set(r,s);const c=new Set,n=new Set;let h=null;const u=new Set,d=e=>{const s=t.deps.get(e);if(!s||!s.size)return!1;for(const[e,a]of s.entries())if(t.version.get(e)!==a)return!0;for(const e of s.keys())if(d(e))return!0;return!1};let g=0;const f=()=>{s.clear(),c.clear(),n.forEach((e=>e())),n.clear(),h?.abort(new l),h=new AbortController;const i=e({get:(d=++g,e=>{const a=e(t),i=a.get();if(!s.has(a.key)&&d===g){s.set(a.key,t.version.get(a.key)??0);const e=()=>a.subscribe((()=>{v()}));c.add(e),t.mounted.get(r)&&n.add(e())}return i}),signal:h.signal});var d;if(!(!t.value.has(r)||!a(t.value.get(r),i)))return;if((()=>{const e=t.version.get(r)??0;t.version.set(r,e+1)})(),t.value.set(r,i),[...u].forEach((e=>e(t.value.get(r)))),!o(i))return;const f=t.version.get(r);i.then(void 0,(()=>{f===t.version.get(r)&&t.initialized.set(r,!1)}))},v=()=>{t.mounted.get(r)?f():t.initialized.set(r,!1)};return{key:r,get(){switch(!0){case!t.initialized.get(r):f(),t.initialized.set(r,!0);break;case d(r):f()}return t.value.get(r)},subscribe:e=>(0===u.size&&(c.forEach((e=>{n.add(e())})),t.mounted.set(r,!0)),u.add(e),function(){u.delete(e),0===u.size&&(n.forEach((e=>{e()})),n.clear(),t.mounted.set(r,!1))}),[i](){v()}}}))},z=(e,{cachePolicy:t,tag:s,...a}={})=>d((t=>y(e(t),{tag:c(s)?s(t):s,...a})),{cachePolicy:t,keyMaker:n});export{l as Aborted,f as atom,v as atomFamily,y as selector,z as selectorFamily};
1
+ import{i as e,d as t,R as s,a,s as n,e as c,b as i,c as o,E as l}from"./store-BlOVE6Q3.js";export{D as DEFAULT_STORE,S as Store,m as makeStore,r as refresh,f as reset}from"./store-BlOVE6Q3.js";class u extends Error{}class h{#e;#t;constructor(e){this.#e=new Map,this.#t=e}#s(){const e=this.#e.keys().next().value;e&&(this.#e.get(e)?.controller.abort(),this.#e.delete(e))}has(e){return this.#e.has(e)}get(e){const t=this.#e.get(e);if(t)return this.#e.delete(e),this.#e.set(e,t),t.value}set(e,t){this.#e.has(e)?this.#e.delete(e):this.#e.size>=this.#t&&this.#s();const s=new AbortController;this.#e.set(e,{value:t(s.signal),controller:s})}delete(e){return this.#e.delete(e)}clear(){this.#e.clear()}}const d=(t,{cachePolicy:s={type:"keep-all"},keyMaker:a=e}={})=>{const r=(e=>{switch(e.type){case"keep-all":return new h(Number.POSITIVE_INFINITY);case"most-recent":return new h(1);case"lru":return new h(e.maxSize);default:return e}})(s);return e=>{const s=a(e);return r.has(s)||r.set(s,t(e)),r.get(s)}};let g=0;const v=(e,{tag:r,effects:n,areValuesEqual:c=t}={})=>{const i=e,o=`a${r?`-${r}`:""}-${g++}`;return d((e=>()=>{const t=new Set,r=new Set;e.value.set(o,i),e.version.set(o,1);const l=(s=!1)=>n=>{if(!e.initialized.get(o))return;const i=e.value.get(o),l=a(n)?n(i):n;c(i,l)||((()=>{const t=e.version.get(o)??0;e.version.set(o,t+1)})(),e.value.set(o,l),[...t].forEach((e=>e(l))),s||r.forEach((e=>e(l))))},u=l(),h=l(!0);return{key:o,get:()=>(e.initialized.get(o)||(e.value.set(o,i),n?.forEach((t=>t({init(t){e.initialized.get(o)||e.value.set(o,t)},set:h,onSet(e){r.add(e)}}))),e.initialized.set(o,!0)),e.value.get(o)),set:u,subscribe:e=>(t.add(e),()=>{t.delete(e)}),[s](){u(i)}}}))},k=(e,{tag:t,...s}={})=>d((r=>()=>v(a(e)?e(r):e,{tag:a(t)?t(r):t,...s})),{keyMaker:n});let y=0;const z=(e,{tag:s,areValuesEqual:a=t}={},{[l]:r}={})=>{const n=`s${s?`-${s}`:""}-${y++}`;return d((t=>()=>{const s=new Map;t.deps.set(n,s);const l=new Set,h=new Set;r?.addEventListener("abort",(()=>{c(t,n)}),{once:!0});let d=null;const g=new Set,v=e=>{const s=t.deps.get(e);if(!s||!s.size)return!1;for(const[e,a]of s.entries())if(t.version.get(e)!==a)return!0;for(const e of s.keys())if(v(e))return!0;return!1};let f=0;const k=()=>{s.clear(),l.clear(),h.forEach((e=>e())),h.clear(),d?.abort(new u),d=new AbortController;const r=e({get:(c=++f,e=>{const a=e(t),r=a.get();if(!s.has(a.key)&&c===f){s.set(a.key,t.version.get(a.key)??0);const e=()=>a.subscribe((()=>{y()}));l.add(e),t.mounted.get(n)&&h.add(e())}return r}),signal:d.signal});var c;if(!(!t.value.has(n)||!a(t.value.get(n),r)))return;if((()=>{const e=t.version.get(n)??0;t.version.set(n,e+1)})(),t.value.set(n,r),[...g].forEach((e=>e(t.value.get(n)))),!o(r))return;const i=t.version.get(n);r.then(void 0,(()=>{i===t.version.get(n)&&t.initialized.set(n,!1)}))},y=()=>{t.mounted.get(n)?k():t.initialized.set(n,!1)};return{key:n,get(){switch(!0){case!t.initialized.get(n):k(),t.initialized.set(n,!0);break;case v(n):k()}return t.value.get(n)},subscribe:e=>(0===g.size&&(l.forEach((e=>{h.add(e())})),t.mounted.set(n,!0)),g.add(e),function(){g.delete(e),0===g.size&&(h.forEach((e=>{e()})),h.clear(),t.mounted.set(n,!1))}),[i](){y()}}}))},w=(e,{cachePolicy:t,tag:s,...r}={})=>d((t=>n=>z(e(t),{tag:a(s)?s(t):s,...r},{[l]:n})),{cachePolicy:t,keyMaker:n});export{u as Aborted,v as atom,k as atomFamily,z as selector,w as selectorFamily};
@@ -1,8 +1,11 @@
1
+ import type { Store } from './store';
1
2
  export { default as stableStringify } from 'fast-json-stable-stringify';
2
3
  export declare const REFRESH_TAG: unique symbol;
3
4
  export declare const RESET_TAG: unique symbol;
4
- export declare const identity: <T>(arg: T) => T;
5
+ export declare const ERASE_TAG: unique symbol;
5
6
  export declare const dejaVu: <T>(a: T, b: T) => boolean;
7
+ export declare const identity: <T>(arg: T) => T;
6
8
  export type TypedOmit<T, K extends keyof T> = Omit<T, K>;
7
9
  export declare const isFunction: (candidate: any) => candidate is (...args: any[]) => any;
8
10
  export declare const isPromiseLike: (candidate: any) => candidate is PromiseLike<any>;
11
+ export declare const erase: (store: Store, key: string) => void;
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{jsx as r}from"react/jsx-runtime";import{createContext as e,useContext as t,useMemo as o,useRef as s,useState as n,useEffect as c,useCallback as u}from"react";import{D as a,m as i,r as m,e as p}from"./store-P73VI2VP.js";const l=e({store:a}),d=({store:e,children:t})=>{const s=o((()=>({store:e??i()})),[e]);return r(l.Provider,{value:s,children:t})},g=()=>t(l),y=r=>{const{store:e}=g(),t=r(e),o=s(t),[u,a]=n((()=>t.get()));return c((()=>(t!==o.current&&(o.current=t,a(t.get())),t.subscribe(a))),[t]),u},f=r=>{const{store:e}=g();return r(e).set},h=r=>[y(r),f(r)],v=r=>{const e=y(r),[t,o]=n({type:"loading"});return c((()=>{let r=!0;return o({type:"loading"}),e.then((e=>{r&&o({type:"ready",value:e})}),(e=>{r&&o({type:"error",reason:e?.message??"unknown"})})),()=>{r=!1}}),[e]),t},b=r=>{const{store:e}=g(),t=r(e);return u((()=>{m(t)}),[t])},j=r=>{const{store:e}=g(),t=r(e);return u((()=>{p(t)}),[t])};export{d as StanProvider,f as useSetStanValue,h as useStan,g as useStanCtx,b as useStanRefresh,j as useStanReset,y as useStanValue,v as useStanValueAsync};
1
+ import{jsx as r}from"react/jsx-runtime";import{createContext as e,useContext as t,useMemo as o,useRef as s,useState as n,useEffect as c,useCallback as u}from"react";import{D as a,m as i,r as m,f as p}from"./store-BlOVE6Q3.js";const l=e({store:a}),d=({store:e,children:t})=>{const s=o((()=>({store:e??i()})),[e]);return r(l.Provider,{value:s,children:t})},g=()=>t(l),y=r=>{const{store:e}=g(),t=r(e),o=s(t),[u,a]=n((()=>t.get()));return c((()=>(t!==o.current&&(o.current=t,a(t.get())),t.subscribe(a))),[t]),u},f=r=>{const{store:e}=g();return r(e).set},h=r=>[y(r),f(r)],v=r=>{const e=y(r),[t,o]=n({type:"loading"});return c((()=>{let r=!0;return o({type:"loading"}),e.then((e=>{r&&o({type:"ready",value:e})}),(e=>{r&&o({type:"error",reason:e?.message??"unknown"})})),()=>{r=!1}}),[e]),t},b=r=>{const{store:e}=g(),t=r(e);return u((()=>{m(t)}),[t])},j=r=>{const{store:e}=g(),t=r(e);return u((()=>{p(t)}),[t])};export{d as StanProvider,f as useSetStanValue,h as useStan,g as useStanCtx,b as useStanRefresh,j as useStanReset,y as useStanValue,v as useStanValueAsync};
@@ -1,4 +1,4 @@
1
- import { type TypedOmit } from './internal';
1
+ import { ERASE_TAG, type TypedOmit } from './internal';
2
2
  import type { SerializableParam, TagFromParam } from './types';
3
3
  import type { ReadonlyState, State, Scoped } from './state';
4
4
  import { type CachePolicy } from './cache';
@@ -13,7 +13,10 @@ export type SelectorOptions = {
13
13
  tag?: string;
14
14
  areValuesEqual?: <T>(a: T, b: T) => boolean;
15
15
  };
16
- export declare const selector: <T>(selectorFn: SelectorFn<T>, { tag, areValuesEqual }?: SelectorOptions) => Scoped<ReadonlyState<T>>;
16
+ export type SelectorCtx = {
17
+ [ERASE_TAG]?: AbortSignal;
18
+ };
19
+ export declare const selector: <T>(selectorFn: SelectorFn<T>, { tag, areValuesEqual }?: SelectorOptions, { [ERASE_TAG]: eraseSignal }?: SelectorCtx) => Scoped<ReadonlyState<T>>;
17
20
  export type SelectorFamilyFn<T, P extends SerializableParam> = (param: P) => SelectorFn<T>;
18
21
  export type SelectorFamilyOptions<P extends SerializableParam> = TypedOmit<SelectorOptions, 'tag'> & {
19
22
  tag?: string | TagFromParam<P>;
@@ -0,0 +1 @@
1
+ function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,n;var r=e(n?t:(n=1,t=function(e,t){t||(t={}),"function"==typeof t&&(t={cmp:t});var n,r="boolean"==typeof t.cycles&&t.cycles,o=t.cmp&&(n=t.cmp,function(e){return function(t,r){var o={key:t,value:e[t]},a={key:r,value:e[r]};return n(o,a)}}),a=[];return function e(t){if(t&&t.toJSON&&"function"==typeof t.toJSON&&(t=t.toJSON()),void 0!==t){if("number"==typeof t)return isFinite(t)?""+t:"null";if("object"!=typeof t)return JSON.stringify(t);var n,i;if(Array.isArray(t)){for(i="[",n=0;n<t.length;n++)n&&(i+=","),i+=e(t[n])||"null";return i+"]"}if(null===t)return"null";if(-1!==a.indexOf(t)){if(r)return JSON.stringify("__cycle__");throw new TypeError("Converting circular structure to JSON")}var s=a.push(t)-1,c=Object.keys(t).sort(o&&o(t));for(i="",n=0;n<c.length;n++){var u=c[n],l=e(t[u]);l&&(i&&(i+=","),i+=JSON.stringify(u)+":"+l)}return a.splice(s,1),"{"+i+"}"}}(e)}));const o=Symbol("@@refresh@@"),a=Symbol("@@reset@@"),i=Symbol("@@erase@@"),s=(e,t)=>e===t,c=e=>e,u=["[object AsyncFunction]","[object AsyncGeneratorFunction]","[object GeneratorFunction]","[object Function]"],l=e=>u.includes(Object.prototype.toString.call(e)),f=e=>!!e&&l(e.then),y=(e,t)=>{e.deps.delete(t),e.value.delete(t),e.version.delete(t),e.mounted.delete(t),e.initialized.delete(t)},p=e=>{e[o]()},d=e=>{e[a]()};class v{value=new Map;version=new Map;mounted=new Map;initialized=new Map;deps=new Map}const b=()=>new v,O=b();export{O as D,i as E,a as R,v as S,l as a,o as b,f as c,s as d,y as e,d as f,c as i,b as m,p as r,r as s};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rkrupinski/stan",
3
3
  "description": "Minimal, type-safe state management",
4
- "version": "1.3.0",
4
+ "version": "1.3.1",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
7
7
  ".": "./dist/index.js",
@@ -1 +0,0 @@
1
- function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var n,t;var r=e(t?n:(t=1,n=function(e,n){n||(n={}),"function"==typeof n&&(n={cmp:n});var t,r="boolean"==typeof n.cycles&&n.cycles,o=n.cmp&&(t=n.cmp,function(e){return function(n,r){var o={key:n,value:e[n]},a={key:r,value:e[r]};return t(o,a)}}),a=[];return function e(n){if(n&&n.toJSON&&"function"==typeof n.toJSON&&(n=n.toJSON()),void 0!==n){if("number"==typeof n)return isFinite(n)?""+n:"null";if("object"!=typeof n)return JSON.stringify(n);var t,c;if(Array.isArray(n)){for(c="[",t=0;t<n.length;t++)t&&(c+=","),c+=e(n[t])||"null";return c+"]"}if(null===n)return"null";if(-1!==a.indexOf(n)){if(r)return JSON.stringify("__cycle__");throw new TypeError("Converting circular structure to JSON")}var i=a.push(n)-1,s=Object.keys(n).sort(o&&o(n));for(c="",t=0;t<s.length;t++){var u=s[t],l=e(n[u]);l&&(c&&(c+=","),c+=JSON.stringify(u)+":"+l)}return a.splice(i,1),"{"+c+"}"}}(e)}));const o=Symbol("__refresh__"),a=Symbol("__reset__"),c=e=>e,i=(e,n)=>e===n,s=["[object AsyncFunction]","[object AsyncGeneratorFunction]","[object GeneratorFunction]","[object Function]"],u=e=>s.includes(Object.prototype.toString.call(e)),l=e=>!!e&&u(e.then),f=e=>{e[o]()},y=e=>{e[a]()};class p{value=new Map;version=new Map;mounted=new Map;initialized=new Map;deps=new Map}const _=()=>new p,b=_();export{b as D,a as R,p as S,u as a,o as b,l as c,i as d,y as e,c as i,_ as m,f as r,r as s};