@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.
- package/build/cjs/index.js +17 -15
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +17 -15
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +7 -7
- package/build/types/index.d.ts +8 -6
- package/build/umd/index.development.js +17 -15
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +21 -20
package/build/cjs/index.js
CHANGED
|
@@ -14,14 +14,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
14
14
|
|
|
15
15
|
class Store {
|
|
16
16
|
listeners = new Set();
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
34
|
+
|
|
35
|
+
// Always run onUpdate, regardless of batching
|
|
36
|
+
this.options?.onUpdate?.();
|
|
37
|
+
|
|
38
|
+
// Attempt to flush
|
|
39
|
+
this._flush();
|
|
38
40
|
};
|
|
39
|
-
|
|
40
|
-
if (this
|
|
41
|
-
const flushId = ++this
|
|
41
|
+
_flush = () => {
|
|
42
|
+
if (this._batching) return;
|
|
43
|
+
const flushId = ++this._flushing;
|
|
42
44
|
this.listeners.forEach(listener => {
|
|
43
|
-
if (this
|
|
44
|
-
listener(
|
|
45
|
+
if (this._flushing !== flushId) return;
|
|
46
|
+
listener();
|
|
45
47
|
});
|
|
46
48
|
};
|
|
47
49
|
batch = cb => {
|
|
48
|
-
if (this
|
|
49
|
-
this
|
|
50
|
+
if (this._batching) return cb();
|
|
51
|
+
this._batching = true;
|
|
50
52
|
cb();
|
|
51
|
-
this
|
|
52
|
-
this
|
|
53
|
+
this._batching = false;
|
|
54
|
+
this._flush();
|
|
53
55
|
};
|
|
54
56
|
}
|
|
55
57
|
|
package/build/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener
|
|
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;;;;"}
|
package/build/esm/index.js
CHANGED
|
@@ -10,14 +10,11 @@
|
|
|
10
10
|
*/
|
|
11
11
|
class Store {
|
|
12
12
|
listeners = new Set();
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
30
|
+
|
|
31
|
+
// Always run onUpdate, regardless of batching
|
|
32
|
+
this.options?.onUpdate?.();
|
|
33
|
+
|
|
34
|
+
// Attempt to flush
|
|
35
|
+
this._flush();
|
|
34
36
|
};
|
|
35
|
-
|
|
36
|
-
if (this
|
|
37
|
-
const flushId = ++this
|
|
37
|
+
_flush = () => {
|
|
38
|
+
if (this._batching) return;
|
|
39
|
+
const flushId = ++this._flushing;
|
|
38
40
|
this.listeners.forEach(listener => {
|
|
39
|
-
if (this
|
|
40
|
-
listener(
|
|
41
|
+
if (this._flushing !== flushId) return;
|
|
42
|
+
listener();
|
|
41
43
|
});
|
|
42
44
|
};
|
|
43
45
|
batch = cb => {
|
|
44
|
-
if (this
|
|
45
|
-
this
|
|
46
|
+
if (this._batching) return cb();
|
|
47
|
+
this._batching = true;
|
|
46
48
|
cb();
|
|
47
|
-
this
|
|
48
|
-
this
|
|
49
|
+
this._batching = false;
|
|
50
|
+
this._flush();
|
|
49
51
|
};
|
|
50
52
|
}
|
|
51
53
|
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener
|
|
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;;;;"}
|
package/build/stats-html.html
CHANGED
|
@@ -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":"
|
|
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;
|
package/build/stats-react.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"children": [
|
|
9
9
|
{
|
|
10
10
|
"name": "packages/store/src/index.ts",
|
|
11
|
-
"uid": "
|
|
11
|
+
"uid": "a441-3"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -16,18 +16,18 @@
|
|
|
16
16
|
"isRoot": true
|
|
17
17
|
},
|
|
18
18
|
"nodeParts": {
|
|
19
|
-
"
|
|
20
|
-
"renderedLength":
|
|
21
|
-
"gzipLength":
|
|
19
|
+
"a441-3": {
|
|
20
|
+
"renderedLength": 1119,
|
|
21
|
+
"gzipLength": 412,
|
|
22
22
|
"brotliLength": 0,
|
|
23
|
-
"mainUid": "
|
|
23
|
+
"mainUid": "a441-2"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"nodeMetas": {
|
|
27
|
-
"
|
|
27
|
+
"a441-2": {
|
|
28
28
|
"id": "/packages/store/src/index.ts",
|
|
29
29
|
"moduleParts": {
|
|
30
|
-
"index.production.js": "
|
|
30
|
+
"index.production.js": "a441-3"
|
|
31
31
|
},
|
|
32
32
|
"imported": [],
|
|
33
33
|
"importedBy": [],
|
package/build/types/index.d.ts
CHANGED
|
@@ -9,20 +9,22 @@
|
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
11
|
type AnyUpdater = (...args: any[]) => any;
|
|
12
|
-
type Listener
|
|
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
|
|
16
|
-
onUpdate?: (
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
36
|
+
|
|
37
|
+
// Always run onUpdate, regardless of batching
|
|
38
|
+
this.options?.onUpdate?.();
|
|
39
|
+
|
|
40
|
+
// Attempt to flush
|
|
41
|
+
this._flush();
|
|
40
42
|
};
|
|
41
|
-
|
|
42
|
-
if (this
|
|
43
|
-
const flushId = ++this
|
|
43
|
+
_flush = () => {
|
|
44
|
+
if (this._batching) return;
|
|
45
|
+
const flushId = ++this._flushing;
|
|
44
46
|
this.listeners.forEach(listener => {
|
|
45
|
-
if (this
|
|
46
|
-
listener(
|
|
47
|
+
if (this._flushing !== flushId) return;
|
|
48
|
+
listener();
|
|
47
49
|
});
|
|
48
50
|
};
|
|
49
51
|
batch = cb => {
|
|
50
|
-
if (this
|
|
51
|
-
this
|
|
52
|
+
if (this._batching) return cb();
|
|
53
|
+
this._batching = true;
|
|
52
54
|
cb();
|
|
53
|
-
this
|
|
54
|
-
this
|
|
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
|
|
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
|
|
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
|
|
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
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type AnyUpdater = (...args: any[]) => any
|
|
2
2
|
|
|
3
|
-
export type Listener
|
|
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
|
|
11
|
+
listener: Listener,
|
|
12
12
|
store: Store<TState, TUpdater>,
|
|
13
13
|
) => () => void
|
|
14
|
-
onUpdate?: (
|
|
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
|
|
21
|
+
listeners = new Set<Listener>()
|
|
22
22
|
state: TState
|
|
23
23
|
options?: StoreOptions<TState, TUpdater>
|
|
24
|
-
|
|
25
|
-
|
|
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
|
|
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
|
-
|
|
47
|
+
// Always run onUpdate, regardless of batching
|
|
48
|
+
this.options?.onUpdate?.()
|
|
49
|
+
|
|
50
|
+
// Attempt to flush
|
|
51
|
+
this._flush()
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
if (this
|
|
55
|
-
const flushId = ++this
|
|
54
|
+
_flush = () => {
|
|
55
|
+
if (this._batching) return
|
|
56
|
+
const flushId = ++this._flushing
|
|
56
57
|
this.listeners.forEach((listener) => {
|
|
57
|
-
if (this
|
|
58
|
-
listener(
|
|
58
|
+
if (this._flushing !== flushId) return
|
|
59
|
+
listener()
|
|
59
60
|
})
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
batch = (cb: () => void) => {
|
|
63
|
-
if (this
|
|
64
|
-
this
|
|
64
|
+
if (this._batching) return cb()
|
|
65
|
+
this._batching = true
|
|
65
66
|
cb()
|
|
66
|
-
this
|
|
67
|
-
this
|
|
67
|
+
this._batching = false
|
|
68
|
+
this._flush()
|
|
68
69
|
}
|
|
69
70
|
}
|