@tanstack/store 0.0.1-beta.88 → 0.0.1-beta.90

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.
@@ -14,14 +14,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
14
14
 
15
15
  class Store {
16
16
  listeners = new Set();
17
- #batching = false;
18
- #flushing = 0;
17
+ _batching = false;
18
+ _flushing = 0;
19
19
  constructor(initialState, options) {
20
20
  this.state = initialState;
21
21
  this.options = options;
22
- if (this.options?.onUpdate) {
23
- this.subscribe(this.options?.onUpdate);
24
- }
25
22
  }
26
23
  subscribe = listener => {
27
24
  this.listeners.add(listener);
@@ -34,22 +31,27 @@ class Store {
34
31
  setState = updater => {
35
32
  const previous = this.state;
36
33
  this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);
37
- this.#flush();
34
+
35
+ // Always run onUpdate, regardless of batching
36
+ this.options?.onUpdate?.();
37
+
38
+ // Attempt to flush
39
+ this._flush();
38
40
  };
39
- #flush = () => {
40
- if (this.#batching) return;
41
- const flushId = ++this.#flushing;
41
+ _flush = () => {
42
+ if (this._batching) return;
43
+ const flushId = ++this._flushing;
42
44
  this.listeners.forEach(listener => {
43
- if (this.#flushing !== flushId) return;
44
- listener(this.state);
45
+ if (this._flushing !== flushId) return;
46
+ listener();
45
47
  });
46
48
  };
47
49
  batch = cb => {
48
- if (this.#batching) return cb();
49
- this.#batching = true;
50
+ if (this._batching) return cb();
51
+ this._batching = true;
50
52
  cb();
51
- this.#batching = false;
52
- this.#flush();
53
+ this._batching = false;
54
+ this._flush();
53
55
  };
54
56
  }
55
57
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;EAGvC,SAAS,GAAG,KAAK,CAAA;EACjB,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACtB,IAAA,IAAI,IAAI,CAACA,OAAO,EAAEE,QAAQ,EAAE;MAC1B,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,OAAO,EAAEE,QAAQ,CAAC,CAAA;AACxC,KAAA;AACF,GAAA;EAEAC,SAAS,GAAIC,QAA0B,IAAK;AAC1C,IAAA,IAAI,CAACR,SAAS,CAACS,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACN,OAAO,EAAEO,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACR,SAAS,CAACY,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACV,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEY,QAAQ,GAC/B,IAAI,CAACZ,OAAO,CAACY,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;EAED,MAAM,GAAG,MAAM;AACb,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;AACpB,IAAA,MAAME,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;AAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEV,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKS,OAAO,EAAE,OAAA;AAChCT,MAAAA,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAC,CAAA;AACtB,KAAC,CAAC,CAAA;GACH,CAAA;EAEDc,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrBA,IAAAA,EAAE,EAAE,CAAA;AACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACtB,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener = () => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: () => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n _batching = false\n _flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n // Always run onUpdate, regardless of batching\n this.options?.onUpdate?.()\n\n // Attempt to flush\n this._flush()\n }\n\n _flush = () => {\n if (this._batching) return\n const flushId = ++this._flushing\n this.listeners.forEach((listener) => {\n if (this._flushing !== flushId) return\n listener()\n })\n }\n\n batch = (cb: () => void) => {\n if (this._batching) return cb()\n this._batching = true\n cb()\n this._batching = false\n this._flush()\n }\n}\n"],"names":["Store","listeners","Set","_batching","_flushing","constructor","initialState","options","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","_flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAY,CAAA;AAG/BC,EAAAA,SAAS,GAAG,KAAK,CAAA;AACjBC,EAAAA,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACxB,GAAA;EAEAE,SAAS,GAAIC,QAAkB,IAAK;AAClC,IAAA,IAAI,CAACT,SAAS,CAACU,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACL,OAAO,EAAEM,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACT,SAAS,CAACa,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEW,QAAQ,GAC/B,IAAI,CAACX,OAAO,CAACW,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;;AAE9B;AACA,IAAA,IAAI,CAACV,OAAO,EAAEY,QAAQ,IAAI,CAAA;;AAE1B;IACA,IAAI,CAACC,MAAM,EAAE,CAAA;GACd,CAAA;AAEDA,EAAAA,MAAM,GAAG,MAAM;IACb,IAAI,IAAI,CAACjB,SAAS,EAAE,OAAA;AACpB,IAAA,MAAMkB,OAAO,GAAG,EAAE,IAAI,CAACjB,SAAS,CAAA;AAChC,IAAA,IAAI,CAACH,SAAS,CAACqB,OAAO,CAAEZ,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAACN,SAAS,KAAKiB,OAAO,EAAE,OAAA;AAChCX,MAAAA,QAAQ,EAAE,CAAA;AACZ,KAAC,CAAC,CAAA;GACH,CAAA;EAEDa,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAACrB,SAAS,EAAE,OAAOqB,EAAE,EAAE,CAAA;IAC/B,IAAI,CAACrB,SAAS,GAAG,IAAI,CAAA;AACrBqB,IAAAA,EAAE,EAAE,CAAA;IACJ,IAAI,CAACrB,SAAS,GAAG,KAAK,CAAA;IACtB,IAAI,CAACiB,MAAM,EAAE,CAAA;GACd,CAAA;AACH;;;;"}
@@ -10,14 +10,11 @@
10
10
  */
11
11
  class Store {
12
12
  listeners = new Set();
13
- #batching = false;
14
- #flushing = 0;
13
+ _batching = false;
14
+ _flushing = 0;
15
15
  constructor(initialState, options) {
16
16
  this.state = initialState;
17
17
  this.options = options;
18
- if (this.options?.onUpdate) {
19
- this.subscribe(this.options?.onUpdate);
20
- }
21
18
  }
22
19
  subscribe = listener => {
23
20
  this.listeners.add(listener);
@@ -30,22 +27,27 @@ class Store {
30
27
  setState = updater => {
31
28
  const previous = this.state;
32
29
  this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);
33
- this.#flush();
30
+
31
+ // Always run onUpdate, regardless of batching
32
+ this.options?.onUpdate?.();
33
+
34
+ // Attempt to flush
35
+ this._flush();
34
36
  };
35
- #flush = () => {
36
- if (this.#batching) return;
37
- const flushId = ++this.#flushing;
37
+ _flush = () => {
38
+ if (this._batching) return;
39
+ const flushId = ++this._flushing;
38
40
  this.listeners.forEach(listener => {
39
- if (this.#flushing !== flushId) return;
40
- listener(this.state);
41
+ if (this._flushing !== flushId) return;
42
+ listener();
41
43
  });
42
44
  };
43
45
  batch = cb => {
44
- if (this.#batching) return cb();
45
- this.#batching = true;
46
+ if (this._batching) return cb();
47
+ this._batching = true;
46
48
  cb();
47
- this.#batching = false;
48
- this.#flush();
49
+ this._batching = false;
50
+ this._flush();
49
51
  };
50
52
  }
51
53
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;EAGvC,SAAS,GAAG,KAAK,CAAA;EACjB,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACtB,IAAA,IAAI,IAAI,CAACA,OAAO,EAAEE,QAAQ,EAAE;MAC1B,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,OAAO,EAAEE,QAAQ,CAAC,CAAA;AACxC,KAAA;AACF,GAAA;EAEAC,SAAS,GAAIC,QAA0B,IAAK;AAC1C,IAAA,IAAI,CAACR,SAAS,CAACS,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACN,OAAO,EAAEO,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACR,SAAS,CAACY,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACV,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEY,QAAQ,GAC/B,IAAI,CAACZ,OAAO,CAACY,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;EAED,MAAM,GAAG,MAAM;AACb,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;AACpB,IAAA,MAAME,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;AAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEV,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKS,OAAO,EAAE,OAAA;AAChCT,MAAAA,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAC,CAAA;AACtB,KAAC,CAAC,CAAA;GACH,CAAA;EAEDc,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrBA,IAAAA,EAAE,EAAE,CAAA;AACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACtB,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener = () => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: () => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n _batching = false\n _flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n // Always run onUpdate, regardless of batching\n this.options?.onUpdate?.()\n\n // Attempt to flush\n this._flush()\n }\n\n _flush = () => {\n if (this._batching) return\n const flushId = ++this._flushing\n this.listeners.forEach((listener) => {\n if (this._flushing !== flushId) return\n listener()\n })\n }\n\n batch = (cb: () => void) => {\n if (this._batching) return cb()\n this._batching = true\n cb()\n this._batching = false\n this._flush()\n }\n}\n"],"names":["Store","listeners","Set","_batching","_flushing","constructor","initialState","options","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","_flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAY,CAAA;AAG/BC,EAAAA,SAAS,GAAG,KAAK,CAAA;AACjBC,EAAAA,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACxB,GAAA;EAEAE,SAAS,GAAIC,QAAkB,IAAK;AAClC,IAAA,IAAI,CAACT,SAAS,CAACU,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACL,OAAO,EAAEM,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACT,SAAS,CAACa,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEW,QAAQ,GAC/B,IAAI,CAACX,OAAO,CAACW,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;;AAE9B;AACA,IAAA,IAAI,CAACV,OAAO,EAAEY,QAAQ,IAAI,CAAA;;AAE1B;IACA,IAAI,CAACC,MAAM,EAAE,CAAA;GACd,CAAA;AAEDA,EAAAA,MAAM,GAAG,MAAM;IACb,IAAI,IAAI,CAACjB,SAAS,EAAE,OAAA;AACpB,IAAA,MAAMkB,OAAO,GAAG,EAAE,IAAI,CAACjB,SAAS,CAAA;AAChC,IAAA,IAAI,CAACH,SAAS,CAACqB,OAAO,CAAEZ,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAACN,SAAS,KAAKiB,OAAO,EAAE,OAAA;AAChCX,MAAAA,QAAQ,EAAE,CAAA;AACZ,KAAC,CAAC,CAAA;GACH,CAAA;EAEDa,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAACrB,SAAS,EAAE,OAAOqB,EAAE,EAAE,CAAA;IAC/B,IAAI,CAACrB,SAAS,GAAG,IAAI,CAAA;AACrBqB,IAAAA,EAAE,EAAE,CAAA;IACJ,IAAI,CAACrB,SAAS,GAAG,KAAK,CAAA;IACtB,IAAI,CAACiB,MAAM,EAAE,CAAA;GACd,CAAA;AACH;;;;"}
@@ -4024,7 +4024,7 @@ var drawChart = (function (exports) {
4024
4024
  </script>
4025
4025
  <script>
4026
4026
  /*<!--*/
4027
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/store/src/index.ts","uid":"3f9a-1"}]}],"isRoot":true},"nodeParts":{"3f9a-1":{"renderedLength":1106,"gzipLength":376,"brotliLength":0,"mainUid":"3f9a-0"}},"nodeMetas":{"3f9a-0":{"id":"/packages/store/src/index.ts","moduleParts":{"index.production.js":"3f9a-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.79.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4027
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/store/src/index.ts","uid":"a441-1"}]}],"isRoot":true},"nodeParts":{"a441-1":{"renderedLength":1119,"gzipLength":412,"brotliLength":0,"mainUid":"a441-0"}},"nodeMetas":{"a441-0":{"id":"/packages/store/src/index.ts","moduleParts":{"index.production.js":"a441-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.79.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4028
4028
 
4029
4029
  const run = () => {
4030
4030
  const width = window.innerWidth;
@@ -8,7 +8,7 @@
8
8
  "children": [
9
9
  {
10
10
  "name": "packages/store/src/index.ts",
11
- "uid": "3f9a-3"
11
+ "uid": "a441-3"
12
12
  }
13
13
  ]
14
14
  }
@@ -16,18 +16,18 @@
16
16
  "isRoot": true
17
17
  },
18
18
  "nodeParts": {
19
- "3f9a-3": {
20
- "renderedLength": 1106,
21
- "gzipLength": 376,
19
+ "a441-3": {
20
+ "renderedLength": 1119,
21
+ "gzipLength": 412,
22
22
  "brotliLength": 0,
23
- "mainUid": "3f9a-2"
23
+ "mainUid": "a441-2"
24
24
  }
25
25
  },
26
26
  "nodeMetas": {
27
- "3f9a-2": {
27
+ "a441-2": {
28
28
  "id": "/packages/store/src/index.ts",
29
29
  "moduleParts": {
30
- "index.production.js": "3f9a-3"
30
+ "index.production.js": "a441-3"
31
31
  },
32
32
  "imported": [],
33
33
  "importedBy": [],
@@ -9,20 +9,22 @@
9
9
  * @license MIT
10
10
  */
11
11
  type AnyUpdater = (...args: any[]) => any;
12
- type Listener<TState> = (next: TState) => void;
12
+ type Listener = () => void;
13
13
  interface StoreOptions<TState, TUpdater extends AnyUpdater = (cb: TState) => TState> {
14
14
  updateFn?: (previous: TState) => (updater: TUpdater) => TState;
15
- onSubscribe?: (listener: Listener<TState>, store: Store<TState, TUpdater>) => () => void;
16
- onUpdate?: (next: TState) => TState;
15
+ onSubscribe?: (listener: Listener, store: Store<TState, TUpdater>) => () => void;
16
+ onUpdate?: () => void;
17
17
  }
18
18
  declare class Store<TState, TUpdater extends AnyUpdater = (cb: TState) => TState> {
19
- #private;
20
- listeners: Set<Listener<TState>>;
19
+ listeners: Set<Listener>;
21
20
  state: TState;
22
21
  options?: StoreOptions<TState, TUpdater>;
22
+ _batching: boolean;
23
+ _flushing: number;
23
24
  constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>);
24
- subscribe: (listener: Listener<TState>) => () => void;
25
+ subscribe: (listener: Listener) => () => void;
25
26
  setState: (updater: TUpdater) => void;
27
+ _flush: () => void;
26
28
  batch: (cb: () => void) => void;
27
29
  }
28
30
 
@@ -16,14 +16,11 @@
16
16
 
17
17
  class Store {
18
18
  listeners = new Set();
19
- #batching = false;
20
- #flushing = 0;
19
+ _batching = false;
20
+ _flushing = 0;
21
21
  constructor(initialState, options) {
22
22
  this.state = initialState;
23
23
  this.options = options;
24
- if (this.options?.onUpdate) {
25
- this.subscribe(this.options?.onUpdate);
26
- }
27
24
  }
28
25
  subscribe = listener => {
29
26
  this.listeners.add(listener);
@@ -36,22 +33,27 @@
36
33
  setState = updater => {
37
34
  const previous = this.state;
38
35
  this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);
39
- this.#flush();
36
+
37
+ // Always run onUpdate, regardless of batching
38
+ this.options?.onUpdate?.();
39
+
40
+ // Attempt to flush
41
+ this._flush();
40
42
  };
41
- #flush = () => {
42
- if (this.#batching) return;
43
- const flushId = ++this.#flushing;
43
+ _flush = () => {
44
+ if (this._batching) return;
45
+ const flushId = ++this._flushing;
44
46
  this.listeners.forEach(listener => {
45
- if (this.#flushing !== flushId) return;
46
- listener(this.state);
47
+ if (this._flushing !== flushId) return;
48
+ listener();
47
49
  });
48
50
  };
49
51
  batch = cb => {
50
- if (this.#batching) return cb();
51
- this.#batching = true;
52
+ if (this._batching) return cb();
53
+ this._batching = true;
52
54
  cb();
53
- this.#batching = false;
54
- this.#flush();
55
+ this._batching = false;
56
+ this._flush();
55
57
  };
56
58
  }
57
59
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;;;EAgBO,MAAMA,KAAK,CAGhB;IACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;IAGvC,SAAS,GAAG,KAAK,CAAA;IACjB,SAAS,GAAG,CAAC,CAAA;EAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;MAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;MACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;EACtB,IAAA,IAAI,IAAI,CAACA,OAAO,EAAEE,QAAQ,EAAE;QAC1B,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,OAAO,EAAEE,QAAQ,CAAC,CAAA;EACxC,KAAA;EACF,GAAA;IAEAC,SAAS,GAAIC,QAA0B,IAAK;EAC1C,IAAA,IAAI,CAACR,SAAS,CAACS,GAAG,CAACD,QAAQ,CAAC,CAAA;MAC5B,MAAME,KAAK,GAAG,IAAI,CAACN,OAAO,EAAEO,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;EACzD,IAAA,OAAO,MAAM;EACX,MAAA,IAAI,CAACR,SAAS,CAACY,MAAM,CAACJ,QAAQ,CAAC,CAAA;EAC/BE,MAAAA,KAAK,IAAI,CAAA;OACV,CAAA;KACF,CAAA;IAEDG,QAAQ,GAAIC,OAAiB,IAAK;EAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACV,KAAK,CAAA;MAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEY,QAAQ,GAC/B,IAAI,CAACZ,OAAO,CAACY,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;MAE9B,IAAI,CAAC,MAAM,EAAE,CAAA;KACd,CAAA;IAED,MAAM,GAAG,MAAM;EACb,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;EACpB,IAAA,MAAME,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;EAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEV,QAAQ,IAAK;EACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKS,OAAO,EAAE,OAAA;EAChCT,MAAAA,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAC,CAAA;EACtB,KAAC,CAAC,CAAA;KACH,CAAA;IAEDc,KAAK,GAAIC,EAAc,IAAK;EAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;EAC/B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;EACrBA,IAAAA,EAAE,EAAE,CAAA;EACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;MACtB,IAAI,CAAC,MAAM,EAAE,CAAA;KACd,CAAA;EACH;;;;;;;;;;"}
1
+ {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener = () => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: () => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n _batching = false\n _flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n // Always run onUpdate, regardless of batching\n this.options?.onUpdate?.()\n\n // Attempt to flush\n this._flush()\n }\n\n _flush = () => {\n if (this._batching) return\n const flushId = ++this._flushing\n this.listeners.forEach((listener) => {\n if (this._flushing !== flushId) return\n listener()\n })\n }\n\n batch = (cb: () => void) => {\n if (this._batching) return cb()\n this._batching = true\n cb()\n this._batching = false\n this._flush()\n }\n}\n"],"names":["Store","listeners","Set","_batching","_flushing","constructor","initialState","options","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","_flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;;;EAgBO,MAAMA,KAAK,CAGhB;IACAC,SAAS,GAAG,IAAIC,GAAG,EAAY,CAAA;EAG/BC,EAAAA,SAAS,GAAG,KAAK,CAAA;EACjBC,EAAAA,SAAS,GAAG,CAAC,CAAA;EAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;MAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;MACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;EACxB,GAAA;IAEAE,SAAS,GAAIC,QAAkB,IAAK;EAClC,IAAA,IAAI,CAACT,SAAS,CAACU,GAAG,CAACD,QAAQ,CAAC,CAAA;MAC5B,MAAME,KAAK,GAAG,IAAI,CAACL,OAAO,EAAEM,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;EACzD,IAAA,OAAO,MAAM;EACX,MAAA,IAAI,CAACT,SAAS,CAACa,MAAM,CAACJ,QAAQ,CAAC,CAAA;EAC/BE,MAAAA,KAAK,IAAI,CAAA;OACV,CAAA;KACF,CAAA;IAEDG,QAAQ,GAAIC,OAAiB,IAAK;EAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;MAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEW,QAAQ,GAC/B,IAAI,CAACX,OAAO,CAACW,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;;EAE9B;EACA,IAAA,IAAI,CAACV,OAAO,EAAEY,QAAQ,IAAI,CAAA;;EAE1B;MACA,IAAI,CAACC,MAAM,EAAE,CAAA;KACd,CAAA;EAEDA,EAAAA,MAAM,GAAG,MAAM;MACb,IAAI,IAAI,CAACjB,SAAS,EAAE,OAAA;EACpB,IAAA,MAAMkB,OAAO,GAAG,EAAE,IAAI,CAACjB,SAAS,CAAA;EAChC,IAAA,IAAI,CAACH,SAAS,CAACqB,OAAO,CAAEZ,QAAQ,IAAK;EACnC,MAAA,IAAI,IAAI,CAACN,SAAS,KAAKiB,OAAO,EAAE,OAAA;EAChCX,MAAAA,QAAQ,EAAE,CAAA;EACZ,KAAC,CAAC,CAAA;KACH,CAAA;IAEDa,KAAK,GAAIC,EAAc,IAAK;EAC1B,IAAA,IAAI,IAAI,CAACrB,SAAS,EAAE,OAAOqB,EAAE,EAAE,CAAA;MAC/B,IAAI,CAACrB,SAAS,GAAG,IAAI,CAAA;EACrBqB,IAAAA,EAAE,EAAE,CAAA;MACJ,IAAI,CAACrB,SAAS,GAAG,KAAK,CAAA;MACtB,IAAI,CAACiB,MAAM,EAAE,CAAA;KACd,CAAA;EACH;;;;;;;;;;"}
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- !function(t,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).Store={})}(this,(function(t){"use strict";t.Store=class{listeners=new Set;#t=!1;#s=0;constructor(t,s){this.state=t,this.options=s,this.options?.onUpdate&&this.subscribe(this.options?.onUpdate)}subscribe=t=>{this.listeners.add(t);const s=this.options?.onSubscribe?.(t,this);return()=>{this.listeners.delete(t),s?.()}};setState=t=>{const s=this.state;this.state=this.options?.updateFn?this.options.updateFn(s)(t):t(s),this.#e()};#e=()=>{if(this.#t)return;const t=++this.#s;this.listeners.forEach((s=>{this.#s===t&&s(this.state)}))};batch=t=>{if(this.#t)return t();this.#t=!0,t(),this.#t=!1,this.#e()}},Object.defineProperty(t,"__esModule",{value:!0})}));
11
+ !function(t,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).Store={})}(this,(function(t){"use strict";t.Store=class{listeners=new Set;_batching=!1;_flushing=0;constructor(t,s){this.state=t,this.options=s}subscribe=t=>{this.listeners.add(t);const s=this.options?.onSubscribe?.(t,this);return()=>{this.listeners.delete(t),s?.()}};setState=t=>{const s=this.state;this.state=this.options?.updateFn?this.options.updateFn(s)(t):t(s),this.options?.onUpdate?.(),this._flush()};_flush=()=>{if(this._batching)return;const t=++this._flushing;this.listeners.forEach((s=>{this._flushing===t&&s()}))};batch=t=>{if(this._batching)return t();this._batching=!0,t(),this._batching=!1,this._flush()}},Object.defineProperty(t,"__esModule",{value:!0})}));
12
12
  //# sourceMappingURL=index.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["listeners","Set","batching","flushing","constructor","initialState","options","this","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;qPAgBO,MAILA,UAAY,IAAIC,IAGhBC,IAAY,EACZC,GAAY,EAEZC,YAAYC,EAAsBC,GAChCC,KAAKC,MAAQH,EACbE,KAAKD,QAAUA,EACXC,KAAKD,SAASG,UAChBF,KAAKG,UAAUH,KAAKD,SAASG,SAEjC,CAEAC,UAAaC,IACXJ,KAAKP,UAAUY,IAAID,GACnB,MAAME,EAAQN,KAAKD,SAASQ,cAAcH,EAAUJ,MACpD,MAAO,KACLA,KAAKP,UAAUe,OAAOJ,GACtBE,KAAS,CACV,EAGHG,SAAYC,IACV,MAAMC,EAAWX,KAAKC,MACtBD,KAAKC,MAAQD,KAAKD,SAASa,SACvBZ,KAAKD,QAAQa,SAASD,EAAtBX,CAAgCU,GAC/BA,EAAgBC,GAErBX,MAAKa,GAAQ,EAGfA,GAAS,KACP,GAAIb,MAAKL,EAAW,OACpB,MAAMmB,IAAYd,MAAKJ,EACvBI,KAAKP,UAAUsB,SAASX,IAClBJ,MAAKJ,IAAckB,GACvBV,EAASJ,KAAKC,MAAM,GACpB,EAGJe,MAASC,IACP,GAAIjB,MAAKL,EAAW,OAAOsB,IAC3BjB,MAAKL,GAAY,EACjBsB,IACAjB,MAAKL,GAAY,EACjBK,MAAKa,GAAQ"}
1
+ {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener = () => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: () => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n _batching = false\n _flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n // Always run onUpdate, regardless of batching\n this.options?.onUpdate?.()\n\n // Attempt to flush\n this._flush()\n }\n\n _flush = () => {\n if (this._batching) return\n const flushId = ++this._flushing\n this.listeners.forEach((listener) => {\n if (this._flushing !== flushId) return\n listener()\n })\n }\n\n batch = (cb: () => void) => {\n if (this._batching) return cb()\n this._batching = true\n cb()\n this._batching = false\n this._flush()\n }\n}\n"],"names":["listeners","Set","_batching","_flushing","constructor","initialState","options","this","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","_flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;qPAgBO,MAILA,UAAY,IAAIC,IAGhBC,WAAY,EACZC,UAAY,EAEZC,YAAYC,EAAsBC,GAChCC,KAAKC,MAAQH,EACbE,KAAKD,QAAUA,CACjB,CAEAG,UAAaC,IACXH,KAAKP,UAAUW,IAAID,GACnB,MAAME,EAAQL,KAAKD,SAASO,cAAcH,EAAUH,MACpD,MAAO,KACLA,KAAKP,UAAUc,OAAOJ,GACtBE,KAAS,CACV,EAGHG,SAAYC,IACV,MAAMC,EAAWV,KAAKC,MACtBD,KAAKC,MAAQD,KAAKD,SAASY,SACvBX,KAAKD,QAAQY,SAASD,EAAtBV,CAAgCS,GAC/BA,EAAgBC,GAGrBV,KAAKD,SAASa,aAGdZ,KAAKa,QAAQ,EAGfA,OAAS,KACP,GAAIb,KAAKL,UAAW,OACpB,MAAMmB,IAAYd,KAAKJ,UACvBI,KAAKP,UAAUsB,SAASZ,IAClBH,KAAKJ,YAAckB,GACvBX,GAAU,GACV,EAGJa,MAASC,IACP,GAAIjB,KAAKL,UAAW,OAAOsB,IAC3BjB,KAAKL,WAAY,EACjBsB,IACAjB,KAAKL,WAAY,EACjBK,KAAKa,QAAQ"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/store",
3
3
  "author": "Tanner Linsley",
4
- "version": "0.0.1-beta.88",
4
+ "version": "0.0.1-beta.90",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/store",
7
7
  "homepage": "https://tanstack.com/store",
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type AnyUpdater = (...args: any[]) => any
2
2
 
3
- export type Listener<TState> = (next: TState) => void
3
+ export type Listener = () => void
4
4
 
5
5
  interface StoreOptions<
6
6
  TState,
@@ -8,31 +8,28 @@ interface StoreOptions<
8
8
  > {
9
9
  updateFn?: (previous: TState) => (updater: TUpdater) => TState
10
10
  onSubscribe?: (
11
- listener: Listener<TState>,
11
+ listener: Listener,
12
12
  store: Store<TState, TUpdater>,
13
13
  ) => () => void
14
- onUpdate?: (next: TState) => TState
14
+ onUpdate?: () => void
15
15
  }
16
16
 
17
17
  export class Store<
18
18
  TState,
19
19
  TUpdater extends AnyUpdater = (cb: TState) => TState,
20
20
  > {
21
- listeners = new Set<Listener<TState>>()
21
+ listeners = new Set<Listener>()
22
22
  state: TState
23
23
  options?: StoreOptions<TState, TUpdater>
24
- #batching = false
25
- #flushing = 0
24
+ _batching = false
25
+ _flushing = 0
26
26
 
27
27
  constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {
28
28
  this.state = initialState
29
29
  this.options = options
30
- if (this.options?.onUpdate) {
31
- this.subscribe(this.options?.onUpdate)
32
- }
33
30
  }
34
31
 
35
- subscribe = (listener: Listener<TState>) => {
32
+ subscribe = (listener: Listener) => {
36
33
  this.listeners.add(listener)
37
34
  const unsub = this.options?.onSubscribe?.(listener, this)
38
35
  return () => {
@@ -47,23 +44,27 @@ export class Store<
47
44
  ? this.options.updateFn(previous)(updater)
48
45
  : (updater as any)(previous)
49
46
 
50
- this.#flush()
47
+ // Always run onUpdate, regardless of batching
48
+ this.options?.onUpdate?.()
49
+
50
+ // Attempt to flush
51
+ this._flush()
51
52
  }
52
53
 
53
- #flush = () => {
54
- if (this.#batching) return
55
- const flushId = ++this.#flushing
54
+ _flush = () => {
55
+ if (this._batching) return
56
+ const flushId = ++this._flushing
56
57
  this.listeners.forEach((listener) => {
57
- if (this.#flushing !== flushId) return
58
- listener(this.state)
58
+ if (this._flushing !== flushId) return
59
+ listener()
59
60
  })
60
61
  }
61
62
 
62
63
  batch = (cb: () => void) => {
63
- if (this.#batching) return cb()
64
- this.#batching = true
64
+ if (this._batching) return cb()
65
+ this._batching = true
65
66
  cb()
66
- this.#batching = false
67
- this.#flush()
67
+ this._batching = false
68
+ this._flush()
68
69
  }
69
70
  }