atomirx 0.0.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 +1666 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +1440 -0
- package/coverage/coverage-final.json +14 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +131 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/core/atom.ts.html +889 -0
- package/coverage/src/core/batch.ts.html +223 -0
- package/coverage/src/core/define.ts.html +805 -0
- package/coverage/src/core/emitter.ts.html +919 -0
- package/coverage/src/core/equality.ts.html +631 -0
- package/coverage/src/core/hook.ts.html +460 -0
- package/coverage/src/core/index.html +281 -0
- package/coverage/src/core/isAtom.ts.html +100 -0
- package/coverage/src/core/isPromiseLike.ts.html +133 -0
- package/coverage/src/core/onCreateHook.ts.html +136 -0
- package/coverage/src/core/scheduleNotifyHook.ts.html +94 -0
- package/coverage/src/core/types.ts.html +523 -0
- package/coverage/src/core/withUse.ts.html +253 -0
- package/coverage/src/index.html +116 -0
- package/coverage/src/index.ts.html +106 -0
- package/dist/core/atom.d.ts +63 -0
- package/dist/core/atom.test.d.ts +1 -0
- package/dist/core/atomState.d.ts +104 -0
- package/dist/core/atomState.test.d.ts +1 -0
- package/dist/core/batch.d.ts +126 -0
- package/dist/core/batch.test.d.ts +1 -0
- package/dist/core/define.d.ts +173 -0
- package/dist/core/define.test.d.ts +1 -0
- package/dist/core/derived.d.ts +102 -0
- package/dist/core/derived.test.d.ts +1 -0
- package/dist/core/effect.d.ts +120 -0
- package/dist/core/effect.test.d.ts +1 -0
- package/dist/core/emitter.d.ts +237 -0
- package/dist/core/emitter.test.d.ts +1 -0
- package/dist/core/equality.d.ts +62 -0
- package/dist/core/equality.test.d.ts +1 -0
- package/dist/core/hook.d.ts +134 -0
- package/dist/core/hook.test.d.ts +1 -0
- package/dist/core/isAtom.d.ts +9 -0
- package/dist/core/isPromiseLike.d.ts +9 -0
- package/dist/core/isPromiseLike.test.d.ts +1 -0
- package/dist/core/onCreateHook.d.ts +79 -0
- package/dist/core/promiseCache.d.ts +134 -0
- package/dist/core/promiseCache.test.d.ts +1 -0
- package/dist/core/scheduleNotifyHook.d.ts +51 -0
- package/dist/core/select.d.ts +151 -0
- package/dist/core/selector.test.d.ts +1 -0
- package/dist/core/types.d.ts +279 -0
- package/dist/core/withUse.d.ts +38 -0
- package/dist/core/withUse.test.d.ts +1 -0
- package/dist/index-2ok7ilik.js +1217 -0
- package/dist/index-B_5SFzfl.cjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +20 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/react/index.cjs +30 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/index.js +823 -0
- package/dist/react/rx.d.ts +250 -0
- package/dist/react/rx.test.d.ts +1 -0
- package/dist/react/strictModeTest.d.ts +10 -0
- package/dist/react/useAction.d.ts +381 -0
- package/dist/react/useAction.test.d.ts +1 -0
- package/dist/react/useStable.d.ts +183 -0
- package/dist/react/useStable.test.d.ts +1 -0
- package/dist/react/useValue.d.ts +134 -0
- package/dist/react/useValue.test.d.ts +1 -0
- package/package.json +57 -0
- package/scripts/publish.js +198 -0
- package/src/core/atom.test.ts +369 -0
- package/src/core/atom.ts +189 -0
- package/src/core/atomState.test.ts +342 -0
- package/src/core/atomState.ts +256 -0
- package/src/core/batch.test.ts +257 -0
- package/src/core/batch.ts +172 -0
- package/src/core/define.test.ts +342 -0
- package/src/core/define.ts +243 -0
- package/src/core/derived.test.ts +381 -0
- package/src/core/derived.ts +339 -0
- package/src/core/effect.test.ts +196 -0
- package/src/core/effect.ts +184 -0
- package/src/core/emitter.test.ts +364 -0
- package/src/core/emitter.ts +392 -0
- package/src/core/equality.test.ts +392 -0
- package/src/core/equality.ts +182 -0
- package/src/core/hook.test.ts +227 -0
- package/src/core/hook.ts +177 -0
- package/src/core/isAtom.ts +27 -0
- package/src/core/isPromiseLike.test.ts +72 -0
- package/src/core/isPromiseLike.ts +16 -0
- package/src/core/onCreateHook.ts +92 -0
- package/src/core/promiseCache.test.ts +239 -0
- package/src/core/promiseCache.ts +279 -0
- package/src/core/scheduleNotifyHook.ts +53 -0
- package/src/core/select.ts +454 -0
- package/src/core/selector.test.ts +257 -0
- package/src/core/types.ts +311 -0
- package/src/core/withUse.test.ts +249 -0
- package/src/core/withUse.ts +56 -0
- package/src/index.test.ts +80 -0
- package/src/index.ts +51 -0
- package/src/react/index.ts +20 -0
- package/src/react/rx.test.tsx +416 -0
- package/src/react/rx.tsx +300 -0
- package/src/react/strictModeTest.tsx +71 -0
- package/src/react/useAction.test.ts +989 -0
- package/src/react/useAction.ts +605 -0
- package/src/react/useStable.test.ts +553 -0
- package/src/react/useStable.ts +288 -0
- package/src/react/useValue.test.ts +182 -0
- package/src/react/useValue.ts +261 -0
- package/tsconfig.json +9 -0
- package/v2.md +725 -0
- package/vite.config.ts +39 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/core/withUse.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/core</a> withUse.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">100% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>56/56</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>9/9</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>2/2</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">100% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>56/56</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
123
|
+
<span class="cline-any cline-yes">1x</span>
|
|
124
|
+
<span class="cline-any cline-yes">1x</span>
|
|
125
|
+
<span class="cline-any cline-yes">1x</span>
|
|
126
|
+
<span class="cline-any cline-yes">1x</span>
|
|
127
|
+
<span class="cline-any cline-yes">1x</span>
|
|
128
|
+
<span class="cline-any cline-yes">1x</span>
|
|
129
|
+
<span class="cline-any cline-yes">1x</span>
|
|
130
|
+
<span class="cline-any cline-yes">1x</span>
|
|
131
|
+
<span class="cline-any cline-yes">1x</span>
|
|
132
|
+
<span class="cline-any cline-yes">1x</span>
|
|
133
|
+
<span class="cline-any cline-yes">1x</span>
|
|
134
|
+
<span class="cline-any cline-yes">1x</span>
|
|
135
|
+
<span class="cline-any cline-yes">1x</span>
|
|
136
|
+
<span class="cline-any cline-yes">1x</span>
|
|
137
|
+
<span class="cline-any cline-yes">1x</span>
|
|
138
|
+
<span class="cline-any cline-yes">1x</span>
|
|
139
|
+
<span class="cline-any cline-yes">1x</span>
|
|
140
|
+
<span class="cline-any cline-yes">1x</span>
|
|
141
|
+
<span class="cline-any cline-yes">1x</span>
|
|
142
|
+
<span class="cline-any cline-yes">1x</span>
|
|
143
|
+
<span class="cline-any cline-yes">1x</span>
|
|
144
|
+
<span class="cline-any cline-yes">1x</span>
|
|
145
|
+
<span class="cline-any cline-yes">1x</span>
|
|
146
|
+
<span class="cline-any cline-yes">1x</span>
|
|
147
|
+
<span class="cline-any cline-yes">1x</span>
|
|
148
|
+
<span class="cline-any cline-yes">1x</span>
|
|
149
|
+
<span class="cline-any cline-yes">1x</span>
|
|
150
|
+
<span class="cline-any cline-yes">1x</span>
|
|
151
|
+
<span class="cline-any cline-yes">1x</span>
|
|
152
|
+
<span class="cline-any cline-yes">1x</span>
|
|
153
|
+
<span class="cline-any cline-yes">1x</span>
|
|
154
|
+
<span class="cline-any cline-yes">1x</span>
|
|
155
|
+
<span class="cline-any cline-yes">1x</span>
|
|
156
|
+
<span class="cline-any cline-yes">1x</span>
|
|
157
|
+
<span class="cline-any cline-yes">1x</span>
|
|
158
|
+
<span class="cline-any cline-yes">1x</span>
|
|
159
|
+
<span class="cline-any cline-yes">1x</span>
|
|
160
|
+
<span class="cline-any cline-yes">1x</span>
|
|
161
|
+
<span class="cline-any cline-yes">82x</span>
|
|
162
|
+
<span class="cline-any cline-yes">82x</span>
|
|
163
|
+
<span class="cline-any cline-yes">25x</span>
|
|
164
|
+
<span class="cline-any cline-yes">25x</span>
|
|
165
|
+
<span class="cline-any cline-yes">25x</span>
|
|
166
|
+
<span class="cline-any cline-yes">18x</span>
|
|
167
|
+
<span class="cline-any cline-yes">25x</span>
|
|
168
|
+
<span class="cline-any cline-yes">15x</span>
|
|
169
|
+
<span class="cline-any cline-yes">11x</span>
|
|
170
|
+
<span class="cline-any cline-yes">11x</span>
|
|
171
|
+
<span class="cline-any cline-yes">4x</span>
|
|
172
|
+
<span class="cline-any cline-yes">4x</span>
|
|
173
|
+
<span class="cline-any cline-yes">3x</span>
|
|
174
|
+
<span class="cline-any cline-yes">3x</span>
|
|
175
|
+
<span class="cline-any cline-yes">25x</span>
|
|
176
|
+
<span class="cline-any cline-yes">82x</span>
|
|
177
|
+
<span class="cline-any cline-yes">82x</span>
|
|
178
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { Pipeable } from "./types";
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Adds a chainable `.use()` method to any object, enabling plugin-based transformations.
|
|
182
|
+
*
|
|
183
|
+
* The `.use()` method accepts a plugin function that receives the source object
|
|
184
|
+
* and can return a transformed version. Supports several return patterns:
|
|
185
|
+
*
|
|
186
|
+
* - **Void/falsy**: Returns the original source unchanged (side-effect only plugins)
|
|
187
|
+
* - **Object/function with `.use`**: Returns as-is (already chainable)
|
|
188
|
+
* - **Object/function without `.use`**: Wraps with `withUse()` for continued chaining
|
|
189
|
+
* - **Primitive**: Returns the value directly
|
|
190
|
+
*
|
|
191
|
+
* @template TSource - The type of the source object being enhanced
|
|
192
|
+
* @param source - The object to add `.use()` method to
|
|
193
|
+
* @returns The source object with `.use()` method attached
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* // Basic usage with atom tuple
|
|
197
|
+
* const mappable = withUse([signal, setter]);
|
|
198
|
+
* const transformed = mappable.use(([sig, set]) => ({
|
|
199
|
+
* sig,
|
|
200
|
+
* set: (v: string) => set(Number(v))
|
|
201
|
+
* }));
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* // Chaining multiple transformations
|
|
205
|
+
* atom(0)
|
|
206
|
+
* .use(([sig, set]) => [sig, (v: number) => set(v * 2)])
|
|
207
|
+
* .use(([sig, set]) => [sig, (v: number) => set(v + 1)]);
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* // Side-effect only plugin (returns void)
|
|
211
|
+
* mappable.use((source) => {
|
|
212
|
+
* console.log('Source:', source);
|
|
213
|
+
* // returns undefined - original source is returned
|
|
214
|
+
* });
|
|
215
|
+
*/
|
|
216
|
+
export function withUse<TSource extends object>(source: TSource) {
|
|
217
|
+
return Object.assign(source, {
|
|
218
|
+
use<TNew = void>(plugin: (source: TSource) => TNew): any {
|
|
219
|
+
const result = plugin(source);
|
|
220
|
+
// Void/falsy: return original source (side-effect only plugins)
|
|
221
|
+
if (!result) return source;
|
|
222
|
+
// Object or function: check if already has .use(), otherwise wrap
|
|
223
|
+
if (typeof result === "object" || typeof result === "function") {
|
|
224
|
+
if ("use" in result) {
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
return withUse(result);
|
|
228
|
+
}
|
|
229
|
+
// Primitive values: return directly (not chainable)
|
|
230
|
+
return result;
|
|
231
|
+
},
|
|
232
|
+
}) as TSource & Pipeable;
|
|
233
|
+
}
|
|
234
|
+
</pre></td></tr></table></pre>
|
|
235
|
+
|
|
236
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
237
|
+
</div><!-- /wrapper -->
|
|
238
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
239
|
+
Code coverage generated by
|
|
240
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
241
|
+
at 2026-01-16T14:35:38.788Z
|
|
242
|
+
</div>
|
|
243
|
+
<script src="../../prettify.js"></script>
|
|
244
|
+
<script>
|
|
245
|
+
window.onload = function () {
|
|
246
|
+
prettyPrint();
|
|
247
|
+
};
|
|
248
|
+
</script>
|
|
249
|
+
<script src="../../sorter.js"></script>
|
|
250
|
+
<script src="../../block-navigation.js"></script>
|
|
251
|
+
</body>
|
|
252
|
+
</html>
|
|
253
|
+
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> src</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/7</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/1</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/1</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/7</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<div class="pad1">
|
|
66
|
+
<table class="coverage-summary">
|
|
67
|
+
<thead>
|
|
68
|
+
<tr>
|
|
69
|
+
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
|
|
70
|
+
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
|
|
71
|
+
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
|
|
72
|
+
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
73
|
+
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
|
|
74
|
+
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
75
|
+
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
|
|
76
|
+
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
77
|
+
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
|
|
78
|
+
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
|
|
79
|
+
</tr>
|
|
80
|
+
</thead>
|
|
81
|
+
<tbody><tr>
|
|
82
|
+
<td class="file low" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
|
|
83
|
+
<td data-value="0" class="pic low">
|
|
84
|
+
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
|
|
85
|
+
</td>
|
|
86
|
+
<td data-value="0" class="pct low">0%</td>
|
|
87
|
+
<td data-value="7" class="abs low">0/7</td>
|
|
88
|
+
<td data-value="0" class="pct low">0%</td>
|
|
89
|
+
<td data-value="1" class="abs low">0/1</td>
|
|
90
|
+
<td data-value="0" class="pct low">0%</td>
|
|
91
|
+
<td data-value="1" class="abs low">0/1</td>
|
|
92
|
+
<td data-value="0" class="pct low">0%</td>
|
|
93
|
+
<td data-value="7" class="abs low">0/7</td>
|
|
94
|
+
</tr>
|
|
95
|
+
|
|
96
|
+
</tbody>
|
|
97
|
+
</table>
|
|
98
|
+
</div>
|
|
99
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
100
|
+
</div><!-- /wrapper -->
|
|
101
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
102
|
+
Code coverage generated by
|
|
103
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
104
|
+
at 2026-01-16T14:35:38.788Z
|
|
105
|
+
</div>
|
|
106
|
+
<script src="../prettify.js"></script>
|
|
107
|
+
<script>
|
|
108
|
+
window.onload = function () {
|
|
109
|
+
prettyPrint();
|
|
110
|
+
};
|
|
111
|
+
</script>
|
|
112
|
+
<script src="../sorter.js"></script>
|
|
113
|
+
<script src="../block-navigation.js"></script>
|
|
114
|
+
</body>
|
|
115
|
+
</html>
|
|
116
|
+
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/index.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">src</a> index.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/7</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/1</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/1</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/7</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
74
|
+
<span class="cline-any cline-no"> </span>
|
|
75
|
+
<span class="cline-any cline-no"> </span>
|
|
76
|
+
<span class="cline-any cline-no"> </span>
|
|
77
|
+
<span class="cline-any cline-no"> </span>
|
|
78
|
+
<span class="cline-any cline-no"> </span>
|
|
79
|
+
<span class="cline-any cline-no"> </span>
|
|
80
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >export const sum = (a: number, b: number) => {<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
|
|
81
|
+
<span class="cstat-no" title="statement not covered" > return a + b;</span>
|
|
82
|
+
<span class="cstat-no" title="statement not covered" >};</span>
|
|
83
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
84
|
+
<span class="cstat-no" title="statement not covered" >export const atomirx = () => {</span>
|
|
85
|
+
<span class="cstat-no" title="statement not covered" > console.log("Atomirx initialized");</span>
|
|
86
|
+
<span class="cstat-no" title="statement not covered" >};</span>
|
|
87
|
+
</pre></td></tr></table></pre>
|
|
88
|
+
|
|
89
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
90
|
+
</div><!-- /wrapper -->
|
|
91
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
92
|
+
Code coverage generated by
|
|
93
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
94
|
+
at 2026-01-16T14:35:38.788Z
|
|
95
|
+
</div>
|
|
96
|
+
<script src="../prettify.js"></script>
|
|
97
|
+
<script>
|
|
98
|
+
window.onload = function () {
|
|
99
|
+
prettyPrint();
|
|
100
|
+
};
|
|
101
|
+
</script>
|
|
102
|
+
<script src="../sorter.js"></script>
|
|
103
|
+
<script src="../block-navigation.js"></script>
|
|
104
|
+
</body>
|
|
105
|
+
</html>
|
|
106
|
+
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AtomOptions, MutableAtom } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a mutable atom - a reactive state container that holds a single value.
|
|
4
|
+
*
|
|
5
|
+
* MutableAtom is a raw storage container. It stores values as-is, including Promises.
|
|
6
|
+
* If you store a Promise, `.value` returns the Promise object itself.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Raw storage: stores any value including Promises
|
|
10
|
+
* - Lazy initialization: pass a function to defer computation
|
|
11
|
+
* - Equality checking: configurable equality for reducer-based updates
|
|
12
|
+
* - Plugin system: chainable `.use()` method for extensions
|
|
13
|
+
* - Subscriptions: `.on()` for change notifications
|
|
14
|
+
*
|
|
15
|
+
* @template T - The type of value stored in the atom
|
|
16
|
+
* @param valueOrInit - Initial value or lazy initializer function `() => T`
|
|
17
|
+
* @param options - Configuration options
|
|
18
|
+
* @param options.meta - Optional metadata for debugging/devtools
|
|
19
|
+
* @param options.equals - Equality strategy for change detection (default: strict)
|
|
20
|
+
* @returns A mutable atom with value, set/reset methods
|
|
21
|
+
*
|
|
22
|
+
* @example Synchronous value
|
|
23
|
+
* ```ts
|
|
24
|
+
* const count = atom(0);
|
|
25
|
+
* count.set(1);
|
|
26
|
+
* count.set(prev => prev + 1);
|
|
27
|
+
* console.log(count.value); // 2
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example Lazy initialization
|
|
31
|
+
* ```ts
|
|
32
|
+
* // Initial value computed at creation
|
|
33
|
+
* const config = atom(() => parseExpensiveConfig());
|
|
34
|
+
*
|
|
35
|
+
* // reset() re-runs the initializer for fresh values
|
|
36
|
+
* const timestamp = atom(() => Date.now());
|
|
37
|
+
* timestamp.reset(); // Gets new timestamp
|
|
38
|
+
*
|
|
39
|
+
* // To store a function as value, wrap it:
|
|
40
|
+
* const callback = atom(() => () => console.log('hello'));
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example Async value (stores Promise as-is)
|
|
44
|
+
* ```ts
|
|
45
|
+
* const posts = atom(fetchPosts());
|
|
46
|
+
* posts.value; // Promise<Post[]>
|
|
47
|
+
*
|
|
48
|
+
* // Refetch - set a new Promise
|
|
49
|
+
* posts.set(fetchPosts());
|
|
50
|
+
*
|
|
51
|
+
* // Reset with direct value - restores original Promise (does NOT refetch)
|
|
52
|
+
* // Reset with lazy init - re-runs initializer (DOES refetch)
|
|
53
|
+
* const lazyPosts = atom(() => fetchPosts());
|
|
54
|
+
* lazyPosts.reset(); // Refetches!
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example With equals option
|
|
58
|
+
* ```ts
|
|
59
|
+
* const state = atom({ count: 0 }, { equals: "shallow" });
|
|
60
|
+
* state.set(prev => ({ ...prev })); // No notification (shallow equal)
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function atom<T>(valueOrInit: T | (() => T), options?: AtomOptions<T>): MutableAtom<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Emitter } from './emitter';
|
|
2
|
+
import { Equality } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Options for creating an atomState.
|
|
5
|
+
*/
|
|
6
|
+
export interface AtomStateOptions<T, TFallback = undefined> {
|
|
7
|
+
/** Equality strategy for change detection (default: "strict") */
|
|
8
|
+
equals?: Equality<T>;
|
|
9
|
+
/**
|
|
10
|
+
* Fallback value to use during loading or error states.
|
|
11
|
+
* When set, enables "stale" mode where value is never undefined.
|
|
12
|
+
*/
|
|
13
|
+
fallback?: TFallback;
|
|
14
|
+
/**
|
|
15
|
+
* Whether fallback mode is enabled.
|
|
16
|
+
* When true, getValue() returns fallback/lastResolved during loading/error.
|
|
17
|
+
*/
|
|
18
|
+
hasFallback?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* API for managing atom state with async support.
|
|
22
|
+
*/
|
|
23
|
+
export interface AtomStateAPI<T, TFallback = undefined> {
|
|
24
|
+
/** Get the current value (undefined if loading or error, unless fallback mode) */
|
|
25
|
+
getValue(): TFallback extends undefined ? T | undefined : T | TFallback;
|
|
26
|
+
/** Get the loading state */
|
|
27
|
+
getLoading(): boolean;
|
|
28
|
+
/** Get the error (undefined if no error) */
|
|
29
|
+
getError(): any;
|
|
30
|
+
/** Get the current promise */
|
|
31
|
+
getPromise(): PromiseLike<T>;
|
|
32
|
+
/** Set the value (clears loading and error, notifies if changed) */
|
|
33
|
+
setValue(value: T, silent?: boolean): void;
|
|
34
|
+
/** Set loading state with a promise (clears value and error, notifies) */
|
|
35
|
+
setLoading(promise: PromiseLike<T>, silent?: boolean): void;
|
|
36
|
+
/** Set error state (clears value and loading, notifies if changed) */
|
|
37
|
+
setError(error: any, silent?: boolean): void;
|
|
38
|
+
/** Reset to initial state (notifies if was not already initial) */
|
|
39
|
+
reset(): void;
|
|
40
|
+
/** Get current version (for race condition handling) */
|
|
41
|
+
getVersion(): number;
|
|
42
|
+
/** Check if a version is stale (older than current) */
|
|
43
|
+
isVersionStale(version: number): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Returns true if fallback mode is enabled AND (loading OR error).
|
|
46
|
+
* When true, getValue() returns fallback or last resolved value.
|
|
47
|
+
*/
|
|
48
|
+
stale(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Returns true if value has been changed by setValue() (not during init).
|
|
51
|
+
*/
|
|
52
|
+
isDirty(): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Marks the state as dirty (called when set() is used).
|
|
55
|
+
*/
|
|
56
|
+
markDirty(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Clears the dirty flag (called on reset).
|
|
59
|
+
*/
|
|
60
|
+
clearDirty(): void;
|
|
61
|
+
/** Subscribe to state changes */
|
|
62
|
+
on: Emitter["on"];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a state container for atoms with async support.
|
|
66
|
+
*
|
|
67
|
+
* Handles:
|
|
68
|
+
* - Value, loading, and error states
|
|
69
|
+
* - Version tracking for race condition handling
|
|
70
|
+
* - Equality checking for change detection
|
|
71
|
+
* - Notification scheduling
|
|
72
|
+
* - Fallback mode for stale-while-revalidate pattern
|
|
73
|
+
*
|
|
74
|
+
* @template T - The type of value stored
|
|
75
|
+
* @template TFallback - The type of fallback value (default: undefined)
|
|
76
|
+
* @param options - Configuration options
|
|
77
|
+
* @returns AtomStateAPI for managing the state
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* const state = atomState<number>();
|
|
82
|
+
*
|
|
83
|
+
* state.setValue(42);
|
|
84
|
+
* console.log(state.getValue()); // 42
|
|
85
|
+
*
|
|
86
|
+
* state.setLoading(fetchData());
|
|
87
|
+
* console.log(state.getLoading()); // true
|
|
88
|
+
*
|
|
89
|
+
* state.on(() => console.log('State changed!'));
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @example With fallback
|
|
93
|
+
* ```ts
|
|
94
|
+
* const state = atomState<User, User>({
|
|
95
|
+
* fallback: { name: 'Guest' },
|
|
96
|
+
* hasFallback: true
|
|
97
|
+
* });
|
|
98
|
+
*
|
|
99
|
+
* state.setLoading(fetchUser());
|
|
100
|
+
* console.log(state.getValue()); // { name: 'Guest' }
|
|
101
|
+
* console.log(state.isStale()); // true
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function atomState<T, TFallback = undefined>(options?: AtomStateOptions<T, TFallback>): AtomStateAPI<T, TFallback>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|