stroid 0.1.0 → 0.1.2

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.
Files changed (163) hide show
  1. package/CHANGELOG.md +232 -108
  2. package/README.md +157 -577
  3. package/dist/async.d.ts +5 -3
  4. package/dist/async.js +28 -23
  5. package/dist/async.js.map +1 -0
  6. package/dist/cache.d.ts +12 -0
  7. package/dist/computed.d.ts +19 -8
  8. package/dist/computed.js +12 -10
  9. package/dist/computed.js.map +1 -0
  10. package/dist/core.d.ts +5 -5
  11. package/dist/core.js +16 -23
  12. package/dist/core.js.map +1 -0
  13. package/dist/devtools.d.ts +12 -1
  14. package/dist/devtools.js +2 -1
  15. package/dist/devtools.js.map +1 -0
  16. package/dist/feature.d.ts +92 -0
  17. package/dist/feature.js +2 -0
  18. package/dist/feature.js.map +1 -0
  19. package/dist/helpers.d.ts +13 -5
  20. package/dist/helpers.js +16 -13
  21. package/dist/helpers.js.map +1 -0
  22. package/dist/index-internal.d.ts +44 -0
  23. package/dist/index.d.cts +91 -52
  24. package/dist/index.d.ts +91 -52
  25. package/dist/index.js +27 -21
  26. package/dist/index.js.map +1 -0
  27. package/dist/install.d.ts +6 -0
  28. package/dist/install.js +2 -0
  29. package/dist/install.js.map +1 -0
  30. package/dist/{options-CB35e3Xo.d.cts → options.d.ts} +52 -2
  31. package/dist/persist.d.ts +1 -2
  32. package/dist/persist.js +2 -1
  33. package/dist/persist.js.map +1 -0
  34. package/dist/{react.d.cts → react/index.d.ts} +28 -10
  35. package/dist/react/index.js +38 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/registry.d.ts +117 -0
  38. package/dist/runtime-admin.js +2 -1
  39. package/dist/runtime-admin.js.map +1 -0
  40. package/dist/runtime-tools.d.ts +44 -17
  41. package/dist/runtime-tools.js +3 -2
  42. package/dist/runtime-tools.js.map +1 -0
  43. package/dist/selectors.js +2 -1
  44. package/dist/selectors.js.map +1 -0
  45. package/dist/server.d.ts +27 -11
  46. package/dist/server.js +12 -9
  47. package/dist/server.js.map +1 -0
  48. package/dist/store-registry.d.ts +80 -0
  49. package/dist/sync.d.ts +1 -2
  50. package/dist/sync.js +2 -1
  51. package/dist/sync.js.map +1 -0
  52. package/dist/testing.d.ts +1 -1
  53. package/dist/testing.js +16 -13
  54. package/dist/testing.js.map +1 -0
  55. package/dist/tsdoc-metadata.json +11 -0
  56. package/dist/types/adapters/options.d.ts +90 -2
  57. package/dist/types/async/cache.d.ts +39 -0
  58. package/dist/types/async/clone.d.ts +9 -1
  59. package/dist/types/{async-fetch.d.ts → async/fetch.d.ts} +2 -2
  60. package/dist/types/async/inflight.d.ts +1 -1
  61. package/dist/types/{async-registry.d.ts → async/registry.d.ts} +25 -5
  62. package/dist/types/async/request.d.ts +9 -1
  63. package/dist/types/async.d.ts +10 -2
  64. package/dist/types/{computed-graph.d.ts → computed/computed-graph.d.ts} +4 -6
  65. package/dist/types/{computed.d.ts → computed/index.d.ts} +3 -2
  66. package/dist/types/config.d.ts +9 -1
  67. package/dist/types/core/index.d.ts +11 -0
  68. package/dist/types/core/lifecycle-hooks.d.ts +16 -0
  69. package/dist/types/core/store-admin-impl.d.ts +9 -0
  70. package/dist/types/core/store-admin.d.ts +9 -0
  71. package/dist/types/core/store-core.d.ts +13 -0
  72. package/dist/types/core/store-create.d.ts +16 -0
  73. package/dist/types/core/store-hydrate-impl.d.ts +35 -0
  74. package/dist/types/core/store-hydrate.d.ts +9 -0
  75. package/dist/types/core/store-lifecycle/hooks.d.ts +19 -0
  76. package/dist/types/{store-lifecycle → core/store-lifecycle}/identity.d.ts +3 -3
  77. package/dist/types/{store-lifecycle → core/store-lifecycle}/registry.d.ts +22 -8
  78. package/dist/types/{store-lifecycle → core/store-lifecycle}/types.d.ts +29 -1
  79. package/dist/types/{store-lifecycle → core/store-lifecycle}/validation.d.ts +11 -3
  80. package/dist/types/core/store-name.d.ts +28 -0
  81. package/dist/types/{store-notify.d.ts → core/store-notify.d.ts} +1 -1
  82. package/dist/types/{store-read.d.ts → core/store-read.d.ts} +8 -2
  83. package/dist/types/{store-registry.d.ts → core/store-registry.d.ts} +44 -10
  84. package/dist/types/core/store-replace-impl.d.ts +11 -0
  85. package/dist/types/core/store-replace.d.ts +9 -0
  86. package/dist/types/core/store-set-impl.d.ts +13 -0
  87. package/dist/types/core/store-set.d.ts +9 -0
  88. package/dist/types/core/store-shared/core.d.ts +13 -0
  89. package/dist/types/core/store-shared/notify.d.ts +12 -0
  90. package/dist/types/{store-transaction.d.ts → core/store-transaction.d.ts} +15 -1
  91. package/dist/types/core/store-write-shared.d.ts +19 -0
  92. package/dist/types/core/store-write.d.ts +13 -0
  93. package/dist/types/features/feature-registry.d.ts +91 -0
  94. package/dist/types/features/lifecycle.d.ts +12 -0
  95. package/dist/types/index.d.ts +13 -2
  96. package/dist/types/integrations/query.d.ts +2 -2
  97. package/dist/types/internals/computed-order.d.ts +3 -0
  98. package/dist/types/internals/config.d.ts +56 -2
  99. package/dist/types/internals/reporting.d.ts +1 -0
  100. package/dist/types/internals/store-admin.d.ts +1 -1
  101. package/dist/types/internals/store-ops.d.ts +13 -3
  102. package/dist/types/internals/test-reset.d.ts +2 -0
  103. package/dist/types/internals/write-context.d.ts +15 -0
  104. package/dist/types/notification/delivery.d.ts +3 -0
  105. package/dist/types/notification/index.d.ts +10 -0
  106. package/dist/types/notification/metrics.d.ts +12 -0
  107. package/dist/types/notification/priority.d.ts +9 -0
  108. package/dist/types/notification/scheduler.d.ts +11 -0
  109. package/dist/types/notification/snapshot.d.ts +8 -0
  110. package/dist/types/runtime-tools/index.d.ts +58 -0
  111. package/dist/types/store.d.ts +16 -7
  112. package/dist/types/types/utility.d.ts +17 -0
  113. package/dist/types/utils/devfreeze.d.ts +2 -0
  114. package/dist/types/utils.d.ts +8 -0
  115. package/dist/{types-grvlY4BX.d.cts → types.d.ts} +30 -2
  116. package/dist/utility.d.ts +15 -0
  117. package/package.json +35 -11
  118. package/dist/async-cache-DFHwcBQL.d.cts +0 -52
  119. package/dist/async-cache-DFHwcBQL.d.ts +0 -52
  120. package/dist/async.cjs +0 -29
  121. package/dist/async.d.cts +0 -40
  122. package/dist/computed-BbAZm1Dq.d.cts +0 -17
  123. package/dist/computed-CccdgY5j.d.ts +0 -17
  124. package/dist/computed.cjs +0 -11
  125. package/dist/computed.d.cts +0 -29
  126. package/dist/core.cjs +0 -30
  127. package/dist/core.d.cts +0 -5
  128. package/dist/devtools.cjs +0 -1
  129. package/dist/devtools.d.cts +0 -19
  130. package/dist/helpers.cjs +0 -20
  131. package/dist/helpers.d.cts +0 -29
  132. package/dist/index.cjs +0 -30
  133. package/dist/options-CB35e3Xo.d.ts +0 -245
  134. package/dist/persist.cjs +0 -1
  135. package/dist/persist.d.cts +0 -2
  136. package/dist/react.cjs +0 -31
  137. package/dist/react.d.ts +0 -52
  138. package/dist/react.js +0 -31
  139. package/dist/runtime-admin.cjs +0 -1
  140. package/dist/runtime-admin.d.cts +0 -4
  141. package/dist/runtime-tools.cjs +0 -3
  142. package/dist/runtime-tools.d.cts +0 -39
  143. package/dist/selectors.cjs +0 -1
  144. package/dist/selectors.d.cts +0 -4
  145. package/dist/server.cjs +0 -10
  146. package/dist/server.d.cts +0 -14
  147. package/dist/sync.cjs +0 -1
  148. package/dist/sync.d.cts +0 -2
  149. package/dist/testing.cjs +0 -20
  150. package/dist/testing.d.cts +0 -16
  151. package/dist/types/async-cache.d.ts +0 -57
  152. package/dist/types/core.d.ts +0 -1
  153. package/dist/types/devfreeze.d.ts +0 -1
  154. package/dist/types/feature-registry.d.ts +0 -69
  155. package/dist/types/internals/hooks-warnings.d.ts +0 -6
  156. package/dist/types/store-lifecycle/bind.d.ts +0 -3
  157. package/dist/types/store-lifecycle/hooks.d.ts +0 -44
  158. package/dist/types/store-lifecycle.d.ts +0 -20
  159. package/dist/types/store-name.d.ts +0 -19
  160. package/dist/types/store-write.d.ts +0 -45
  161. package/dist/types-grvlY4BX.d.ts +0 -37
  162. /package/dist/types/{async-retry.d.ts → async/retry.d.ts} +0 -0
  163. /package/dist/types/{runtime-admin.d.ts → runtime-admin/index.d.ts} +0 -0
package/README.md CHANGED
@@ -1,608 +1,188 @@
1
1
  # Stroid
2
2
 
3
- [![npm](https://img.shields.io/npm/v/stroid)](https://www.npmjs.com/package/stroid)
4
- [![npm downloads](https://img.shields.io/npm/dm/stroid)](https://www.npmjs.com/package/stroid)
3
+ [![npm](https://img.shields.io/npm/v/stroid)](https://npmjs.com/package/stroid)
5
4
  [![bundle size](https://img.shields.io/bundlephobia/minzip/stroid)](https://bundlephobia.com/package/stroid)
6
- [![types](https://img.shields.io/npm/types/stroid)](https://www.npmjs.com/package/stroid)
7
- [![license](https://img.shields.io/npm/l/stroid)](https://github.com/Himesh-Bhattarai/stroid/blob/main/LICENSE)
8
- [![CI](https://img.shields.io/github/actions/workflow/status/Himesh-Bhattarai/stroid/ci.yml?branch=main)](https://github.com/Himesh-Bhattarai/stroid/actions)
9
- [![issues](https://img.shields.io/github/issues/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid/issues)
10
- [![stars](https://img.shields.io/github/stars/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid)
11
- [![forks](https://img.shields.io/github/forks/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid)
12
- [![contributors](https://img.shields.io/github/contributors/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid/graphs/contributors)
13
- [![last commit](https://img.shields.io/github/last-commit/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid/commits/main)
14
- [![commit activity](https://img.shields.io/github/commit-activity/m/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid/commits/main)
15
- [![code size](https://img.shields.io/github/languages/code-size/Himesh-Bhattarai/stroid)](https://github.com/Himesh-Bhattarai/stroid)
16
- [![node](https://img.shields.io/node/v/stroid)](https://www.npmjs.com/package/stroid)
17
-
18
- Stroid is a named-store state library for JavaScript and React. Core stays small; optional layers unlock persist, async caching, sync, and devtools.
19
-
20
- ## Table of Contents
21
-
22
- - [Install](#install)
23
- - [Minimal Usage](#minimal-usage)
24
- - [Module Imports](#module-imports)
25
- - [Stroid At a Glance](#stroid-at-a-glance)
26
- - [Public API Index](#public-api-index)
27
- - [Subpath API Index](#subpath-api-index)
28
- - [Options Index](#options-index)
29
- - [Types Index](#types-index)
30
- - [Behavior Notes](#behavior-notes)
31
- - [Short Recipes](#short-recipes)
32
- - [Docs](#docs)
33
- - [Docs Index (Full)](#docs-index-full)
34
- - [Changelog and License](#changelog-and-license)
5
+ [![types](https://img.shields.io/npm/types/stroid)](https://npmjs.com/package/stroid)
6
+ [![license](https://img.shields.io/npm/l/stroid)](./LICENSE)
7
+ [![CI](https://img.shields.io/github/actions/workflow/status/Himesh-Bhattarai/stroid/ci.yml)](https://github.com/Himesh-Bhattarai/stroid/actions)
35
8
 
36
- ## Install
37
-
38
- ```bash
39
- npm install stroid
40
- ```
41
-
42
- ## Minimal Usage
43
-
44
- ```ts
45
- import { createStore, getStore, setStore } from "stroid";
46
-
47
- createStore("counter", { count: 0 });
48
- setStore("counter", "count", 1);
49
-
50
- console.log(getStore("counter"));
51
- ```
52
-
53
- ## Module Imports
54
-
55
- Core (root) entry:
56
-
57
- ```ts
58
- import { createStore, setStore, getStore } from "stroid";
59
- ```
60
-
61
- Subpath modules:
62
-
63
- ```ts
64
- import { useStore } from "stroid/react";
65
- import { fetchStore } from "stroid/async";
66
- import { createSelector } from "stroid/selectors";
67
- import { createComputed } from "stroid/computed";
68
- import { createEntityStore } from "stroid/helpers";
69
- import { createMockStore } from "stroid/testing";
70
- import { listStores } from "stroid/runtime-tools";
71
- import { clearAllStores } from "stroid/runtime-admin";
72
- import { createStoreForRequest } from "stroid/server";
73
- ```
74
-
75
- Feature registration (side-effect imports):
76
-
77
- ```ts
78
- import "stroid/persist";
79
- import "stroid/sync";
80
- import "stroid/devtools";
81
- ```
82
-
83
- ## Stroid At a Glance
84
-
85
- Core API:
86
- - createStore, createStoreStrict, setStore, setStoreBatch, getStore, deleteStore, resetStore, hasStore, hydrateStores
87
- - store(name) and namespace(ns) helpers for typed handles
88
- - createComputed, invalidateComputed, deleteComputed, isComputedStore
89
- - configureStroid and queryIntegrations helpers
90
-
91
- Runtime layers:
92
- - stroid/react: useStore, useStoreField, useSelector, useStoreStatic, useAsyncStore, useFormStore, useAsyncStoreSuspense
93
- - stroid/async: fetchStore, refetchStore, enableRevalidateOnFocus, getAsyncMetrics
94
- - stroid/selectors: createSelector, subscribeWithSelector
95
-
96
- Store-attached features (side-effect imports):
97
- - stroid/persist
98
- - stroid/sync
99
- - stroid/devtools
100
-
101
- Operational tools:
102
- - stroid/runtime-tools
103
- - stroid/runtime-admin
104
- - stroid/server
105
- - stroid/helpers
106
- - stroid/testing
107
- - stroid/computed
108
-
109
- ## Public API Index
110
-
111
- Root export names (stroid and stroid/core):
112
- - `createStore(name, initialState, options?)`
113
- - `createStoreStrict(name, initialState, options?)`
114
- - `setStore(nameOrHandle, updateOrPath, value?)`
115
- - `setStoreBatch(fn)`
116
- - `getStore(nameOrHandle, path?)`
117
- - `deleteStore(nameOrHandle)`
118
- - `resetStore(nameOrHandle)`
119
- - `hasStore(nameOrHandle)`
120
- - `hydrateStores(snapshot, options?, trustOptions?)`
121
- - `store(name)`
122
- - `namespace(ns)`
123
- - `createComputed(name, deps, compute, options?)`
124
- - `invalidateComputed(name)`
125
- - `deleteComputed(name)`
126
- - `isComputedStore(name)`
127
- - `configureStroid(config)`
128
- - `queryIntegrations (reactQueryKey, createReactQueryFetcher, swrKey, createSwrFetcher)`
129
-
130
- Root exported types:
131
- - `Path`
132
- - `PathValue`
133
- - `PartialDeep`
134
- - `StoreDefinition`
135
- - `StoreValue`
136
- - `StoreKey`
137
- - `StoreName`
138
- - `StateFor`
139
- - `StoreStateMap`
140
- - `StrictStoreMap`
141
- - `WriteResult`
142
- - `PersistOptions`
143
- - `StoreOptions`
144
- - `SyncOptions`
145
-
146
- ## Subpath API Index
147
-
148
- ### stroid/react
149
-
150
- - `useStore`
151
- - `useStoreField`
152
- - `useSelector`
153
- - `useStoreStatic`
154
- - `useAsyncStore`
155
- - `useFormStore`
156
- - `useAsyncStoreSuspense`
157
-
158
- ### stroid/async
159
-
160
- - `fetchStore`
161
- - `refetchStore`
162
- - `enableRevalidateOnFocus`
163
- - `getAsyncMetrics`
164
- - `_resetAsyncStateForTests`
165
- - `FetchOptions (type)`
166
- - `FetchInput (type)`
167
- - `AsyncStateSnapshot (type)`
168
- - `AsyncStateAdapter (type)`
169
-
170
- ### stroid/selectors
171
-
172
- - `createSelector`
173
- - `subscribeWithSelector`
174
-
175
- ### stroid/computed
176
-
177
- - `createComputed`
178
- - `invalidateComputed`
179
- - `deleteComputed`
180
- - `isComputedStore`
181
- - `_resetComputedForTests`
182
- - `getFullComputedGraph`
183
- - `getComputedDepsFor`
184
-
185
- ### stroid/helpers
186
-
187
- - `createCounterStore`
188
- - `createListStore`
189
- - `createEntityStore`
190
-
191
- ### stroid/testing
192
-
193
- - `createMockStore`
194
- - `withMockedTime`
195
- - `resetAllStoresForTest`
196
- - `benchmarkStoreSet`
197
-
198
- ### stroid/runtime-tools
199
-
200
- - `listStores`
201
- - `getStoreMeta`
202
- - `getInitialState`
203
- - `getMetrics`
204
- - `getSubscriberCount`
205
- - `getAsyncInflightCount`
206
- - `getPersistQueueDepth`
207
- - `getComputedGraph`
208
- - `getComputedDeps`
209
-
210
- ### stroid/runtime-admin
211
-
212
- - `clearAllStores`
213
- - `clearStores`
214
-
215
- ### stroid/server
216
-
217
- - `createStoreForRequest`
218
-
219
- ### stroid/persist
220
-
221
- - `side-effect only (registers persistence feature)`
222
-
223
- ### stroid/sync
224
-
225
- - `side-effect only (registers sync feature)`
226
-
227
- ### stroid/devtools
228
-
229
- - `side-effect only (registers devtools feature)`
230
-
231
- ## Behavior Notes
232
-
233
- - Feature layers are explicit: persist, sync, and devtools require side-effect imports.
234
- - Default store scope is request; global stores must be opted in.
235
- - Snapshot mode defaults to deep cloning for subscriptions and selector snapshots.
236
- - hydrateStores requires trust options; use allowUntrusted or validate for SSR data.
237
- - fetchStore writes the AsyncStateSnapshot shape by default unless stateAdapter is provided.
238
- - Auto-create for fetchStore is controlled by FetchOptions.autoCreate or global config.
239
- - Persist defaults to localStorage when enabled in the browser.
240
- - Sync uses BroadcastChannel and warns if unavailable.
241
- - Computed deps can be store names or handles; missing deps yield null until created.
242
- - Store option validate replaces legacy schema and validator options.
243
-
244
- ## Short Recipes
245
-
246
- ### Create and update a store
247
-
248
- ```ts
249
- import { createStore, setStore, getStore } from "stroid";
250
-
251
- createStore("profile", { name: "Ava", age: 30 });
252
- setStore("profile", "age", 31);
253
-
254
- console.log(getStore("profile"));
255
- ```
9
+ **Named-store state engine for TypeScript and React.**
256
10
 
257
- ### Use a typed store handle
11
+ Every store has a name. Write to it from anywhere — hooks, utilities, server, tests. Optional layers add persistence, sync, async fetch, SSR isolation, and devtools without coupling to your core logic.
258
12
 
259
13
  ```ts
260
- import { createStore, store, setStore, getStore } from "stroid";
261
-
262
- const counter = store<"counter", { count: number }>("counter");
263
- createStore("counter", { count: 0 });
264
- setStore(counter, (draft) => { draft.count += 1; });
265
-
266
- console.log(getStore(counter, "count"));
267
- ```
268
-
269
- ### Batch multiple writes
270
-
271
- ```ts
272
- import { setStoreBatch, setStore } from "stroid";
273
-
274
- setStoreBatch(() => {
275
- setStore("a", { value: 1 });
276
- setStore("b", { value: 2 });
277
- });
278
- ```
279
-
280
- ### Path updates with strict keys
281
-
282
- ```ts
283
- import { createStore, setStore } from "stroid";
284
-
285
- createStore("user", { profile: { name: "Ava" } });
286
- setStore("user", "profile.name", "Kai");
287
- ```
288
-
289
- ### Path updates with pathCreate
290
-
291
- ```ts
292
- import { createStore, setStore } from "stroid";
293
-
294
- createStore("user", { profile: { name: "Ava" } }, { pathCreate: true });
295
- setStore("user", "profile.age", 32);
296
- ```
297
-
298
- ### React hooks
299
-
300
- ```ts
301
- import { useStore } from "stroid/react";
302
-
303
- function Counter() {
304
- const state = useStore("counter");
305
- return <div>{state?.count ?? 0}</div>;
306
- }
307
- ```
308
-
309
- ### Selectors
310
-
311
- ```ts
312
- import { createSelector } from "stroid/selectors";
313
-
314
- const selectName = createSelector("profile", (state) => state.name);
315
- console.log(selectName());
316
- ```
317
-
318
- ### Computed stores
319
-
320
- ```ts
321
- import { createComputed } from "stroid/computed";
322
-
323
- createComputed("total", ["cart"], (cart) => {
324
- return cart ? cart.items.reduce((sum, item) => sum + item.price, 0) : 0;
325
- });
326
- ```
327
-
328
- ### Persisted store
329
-
330
- ```ts
331
- import { createStore } from "stroid";
332
- import "stroid/persist";
333
-
334
- createStore("prefs", { theme: "dark" }, {
335
- persist: { key: "prefs", allowPlaintext: true },
336
- });
14
+ createStore("user", { name: "Ava", role: "admin" }) // define once
15
+ setStore("user", "name", "Kai") // write from anywhere
16
+ const name = useStore("user", s => s.name) // React hook (stroid/react)
337
17
  ```
338
18
 
339
- ### Sync across tabs
19
+ ---
340
20
 
341
- ```ts
342
- import { createStore } from "stroid";
343
- import "stroid/sync";
21
+ ## Install
344
22
 
345
- createStore("shared", { value: 0 }, { sync: true });
23
+ ```bash
24
+ npm install stroid
346
25
  ```
347
26
 
348
- ### Async fetch store
349
-
350
- ```ts
351
- import { createStore } from "stroid";
352
- import { fetchStore } from "stroid/async";
27
+ **Requirements:** Node `>=18`. React `>=18` (only if using `stroid/react`).
28
+
29
+ **ESM-only:** Stroid ships ESM only. If your toolchain requires CJS, use a bundler with ESM support (Vite, webpack 5, esbuild).
30
+
31
+ ---
32
+
33
+ ## Layer Map
353
34
 
354
- createStore("user", { data: null, loading: false, error: null, status: "idle" });
355
- fetchStore("user", "/api/user");
356
35
  ```
36
+ ┌─────────────────────────────────────────────────────────┐
37
+ │ your app │
38
+ ├─────────────────────────────────────────────────────────┤
39
+ │ useStore useSelector useAsyncStore useFormStore │ stroid/react
40
+ ├─────────────────────────────────────────────────────────┤
41
+ │ createStore setStore getStore setStoreBatch │ stroid ← core
42
+ │ createComputed createSelector createEntityStore │
43
+ ├──────────────┬──────────────┬───────────────────────────┤
44
+ │ stroid/persist│ stroid/sync │ stroid/async │ opt-in features
45
+ │ localStorage │ BroadcastCh │ fetch + cache + retry │
46
+ ├──────────────┴──────────────┴───────────────────────────┤
47
+ │ stroid/server createStoreForRequest (AsyncLocalStorage)│ SSR
48
+ ├─────────────────────────────────────────────────────────┤
49
+ │ stroid/devtools stroid/testing stroid/runtime-tools │ tooling
50
+ └─────────────────────────────────────────────────────────┘
51
+ ```
52
+
53
+ Each row is independent. Use only what you need.
54
+
55
+ `stroid/core` exports only `createStore`, `setStore`, `getStore`, `hasStore`, `resetStore`, and `deleteStore`. Import from `stroid` for the full runtime (batching, hydration, computed). React hooks live in `stroid/react`.
56
+
57
+ ## What Each Import Contains
58
+
59
+ - `stroid`: Full runtime (batching, hydration, computed, async metrics, runtime tools). No React hooks.
60
+ - `stroid/core`: Minimal CRUD only (`createStore`, `setStore`, `getStore`, `hasStore`, `resetStore`, `deleteStore`).
61
+ - `stroid/react`: React hooks (`useStore`, `useSelector`, `useAsyncStore`, `useFormStore`, `useAsyncStoreSuspense`) + `RegistryScope`.
62
+ - `stroid/async`: `fetchStore`, cache, retry, revalidate helpers.
63
+ - `stroid/selectors`: `createSelector`, `subscribeWithSelector`.
64
+ - `stroid/computed`: `createComputed`, `invalidateComputed`, `deleteComputed`, `isComputedStore`.
65
+ - `stroid/persist`: Side-effect registration for persistence (localStorage/sessionStorage). Not tree-shakeable.
66
+ - `stroid/sync`: Side-effect registration for BroadcastChannel sync. Not tree-shakeable.
67
+ - `stroid/devtools`: Side-effect registration for Redux DevTools bridge. Not tree-shakeable.
68
+ - `stroid/server`: SSR registry helpers (`createStoreForRequest`).
69
+ - `stroid/helpers`: Entity/list/counter store helpers.
70
+ - `stroid/runtime-tools`: Observability and diagnostics.
71
+ - `stroid/runtime-admin`: Admin utilities (clear/flush).
72
+ - `stroid/testing`: Testing utilities (mocks, reset helpers, benchmarks).
357
73
 
358
- ### Async fetch with adapter
74
+ ---
359
75
 
360
- ```ts
361
- import { fetchStore } from "stroid/async";
76
+ ## Quick API Reference
362
77
 
363
- fetchStore("user", "/api/user", {
364
- stateAdapter: ({ next, set }) => set({ user: next.data, status: next.status }),
365
- });
366
- ```
78
+ | API | Purpose |
79
+ |-----|---------|
80
+ | `createStore(name, state, options?)` | Define a store. Returns `StoreDefinition \| undefined`. |
81
+ | `createStoreStrict(name, state, options?)` | Define a store; throw synchronously on failure. |
82
+ | `setStore(name, update)` | Shallow-merge an object update into the store. |
83
+ | `setStore(name, path, value)` | Write a value by dot-path or array path. |
84
+ | `setStore(name, draft => { })` | Mutate with a function (optional Immer support). |
85
+ | `replaceStore(name, value)` | Replace the entire store value. |
86
+ | `getStore(name, path?)` | Read a store (or a nested path). |
87
+ | `deleteStore(name)` | Remove a store from the registry. |
88
+ | `resetStore(name)` | Restore a store to its initial state. |
89
+ | `hasStore(name)` | Check if a store exists. |
90
+ | `setStoreBatch(fn)` | Atomic multi-store write — rolls back all writes on failure. |
91
+ | `hydrateStores(snapshot, options?, trust)` | Rehydrate on client from a server snapshot. |
92
+ | `useStore(name, selector?)` | React hook — subscribes to a store. |
93
+ | `useSelector(name, fn)` | React hook — fine-grained derived value. |
94
+ | `fetchStore(name, url, options?)` | Async fetch wired to store state. |
95
+ | `createComputed(name, deps, fn)` | Reactive derived store. |
96
+ | `createStoreForRequest(fn)` | Per-request SSR registry. |
367
97
 
368
- ### SSR request scope
369
-
370
- ```ts
371
- import { createStoreForRequest } from "stroid/server";
98
+ ---
372
99
 
373
- const requestStore = createStoreForRequest(({ create, set }) => {
374
- create("session", { id: null });
375
- set("session", (draft) => { draft.id = "abc"; });
376
- });
377
-
378
- requestStore.hydrate(() => renderApp());
379
- ```
380
-
381
- ### Helpers
100
+ ## Module Import Map
382
101
 
383
102
  ```ts
384
- import { createEntityStore } from "stroid/helpers";
103
+ // Core
104
+ import { createStore, setStore, getStore, hasStore,
105
+ deleteStore, resetStore, setStoreBatch, hydrateStores } from "stroid"
385
106
 
386
- const users = createEntityStore("users");
387
- users.upsert({ id: "1", name: "Ava" });
388
- console.log(users.get("1"));
389
- ```
107
+ // Minimal core (bundle-size-sensitive)
108
+ import { createStore, setStore, getStore, hasStore,
109
+ resetStore, deleteStore } from "stroid/core"
390
110
 
391
- ### Runtime inspection
111
+ // React
112
+ import { useStore, useSelector, useStoreField, useStoreStatic,
113
+ useAsyncStore, useFormStore, useAsyncStoreSuspense,
114
+ RegistryScope } from "stroid/react"
392
115
 
393
- ```ts
394
- import { listStores, getMetrics } from "stroid/runtime-tools";
116
+ // Async
117
+ import { fetchStore, refetchStore, enableRevalidateOnFocus } from "stroid/async"
395
118
 
396
- const names = listStores();
397
- const metrics = getMetrics(names[0]);
398
- console.log(metrics);
399
- ```
400
-
401
- ### Runtime cleanup
119
+ // Selectors & Computed
120
+ import { createSelector, subscribeWithSelector } from "stroid/selectors"
121
+ import { createComputed, invalidateComputed,
122
+ deleteComputed, isComputedStore } from "stroid/computed"
402
123
 
403
- ```ts
404
- import { clearAllStores } from "stroid/runtime-admin";
405
-
406
- clearAllStores();
407
- ```
408
-
409
- ### React Query integration
410
-
411
- ```ts
412
- import { queryIntegrations } from "stroid";
413
-
414
- const key = queryIntegrations.reactQueryKey("user", 1);
415
- const fetcher = queryIntegrations.createReactQueryFetcher("user", "/api/user");
416
-
417
- console.log(key, fetcher);
418
- ```
124
+ // Features (side-effect imports — register once at app entry)
125
+ import "stroid/persist"
126
+ import "stroid/sync"
127
+ import "stroid/devtools"
128
+
129
+ // Note: stroid/persist and stroid/sync are side-effect entrypoints only.
130
+ // All types live on the main "stroid" entry.
131
+
132
+ // Server / SSR
133
+ import { createStoreForRequest } from "stroid/server"
134
+
135
+ // Helpers & Testing
136
+ import { createEntityStore, createListStore, createCounterStore } from "stroid/helpers"
137
+ import { createMockStore, resetAllStoresForTest,
138
+ withMockedTime, benchmarkStoreSet } from "stroid/testing"
139
+
140
+ // Runtime Observability
141
+ import { listStores, getStoreMeta, getMetrics,
142
+ getSubscriberCount, getStoreHealth, findColdStores,
143
+ getComputedGraph, getComputedDeps,
144
+ getPersistQueueDepth } from "stroid/runtime-tools"
145
+ import { clearAllStores, clearStores } from "stroid/runtime-admin"
146
+
147
+ // Devtools API (after `import "stroid/devtools"`)
148
+ import { getHistory, clearHistory } from "stroid/devtools"
149
+
150
+ // Config
151
+ import { configureStroid, resetConfig,
152
+ registerMutatorProduce } from "stroid"
153
+
154
+ // Feature plugin API
155
+ import { registerStoreFeature,
156
+ hasRegisteredStoreFeature,
157
+ getRegisteredFeatureNames } from "stroid/feature"
158
+ ```
159
+
160
+ ---
419
161
 
420
162
  ## Docs
421
163
 
422
- Quick links:
423
- - [Book Contents](docs/FRONT_MATTER/CONTENTS.md)
424
- - [Start Here](docs/BODY_MATTER/BEGINNER_GUIDE/START_HERE.md)
425
- - [Install and Imports](docs/BODY_MATTER/BEGINNER_GUIDE/INSTALL_AND_IMPORTS.md)
426
- - [Core of Stroid](docs/BODY_MATTER/CORE_OF_STROID/INTRODUCTION.md)
427
- - [React Layer](docs/BODY_MATTER/REACT_OF_STROID/INTRODUCTION.md)
428
- - [Async Layer](docs/BODY_MATTER/ASYNC_OF_STROID/INTRODUCTION.md)
429
- - [Persistence](docs/BODY_MATTER/PERSIST_OF_STROID/INTRODUCTION.md)
430
- - [Sync](docs/BODY_MATTER/SYNC_OF_STROID/INTRODUCTION.md)
431
- - [Runtime Operations](docs/BODY_MATTER/RUNTIME_OPERATIONS_OF_STROID/INTRODUCTION.md)
432
- - [Server and SSR](docs/BODY_MATTER/SERVER_OF_STROID/INTRODUCTION.md)
433
- - [Helpers](docs/BODY_MATTER/HELPERS_AND_CHAIN_OF_STROID/INTRODUCTION.md)
434
- - [Testing](docs/BODY_MATTER/TESTING_OF_STROID/INTRODUCTION.md)
435
- - [Selectors](docs/BODY_MATTER/SELECTORS_OF_STROID/INTRODUCTION.md)
436
- - [Devtools](docs/BODY_MATTER/DEVTOOLS_OF_STROID/INTRODUCTION.md)
437
-
438
- ## Docs Index (Full)
439
-
440
- ### Architecture
441
-
442
- - [Architecture](docs/ARCHITECTURE/ARCHITECTURE.md)
443
-
444
- ### Back Matter
445
-
446
- - [Appendices](docs/BACK_MATTER/APPENDICES.md)
447
- - [Back Cover](docs/BACK_MATTER/BACK_COVER.md)
448
- - [Bibliography](docs/BACK_MATTER/Bibliography.md)
449
- - [Colophon](docs/BACK_MATTER/Colophon.md)
450
- - [Contact Information](docs/BACK_MATTER/Contact_Information.md)
451
-
452
- ### Body Matter
453
-
454
- - [Back Cover](docs/BODY_MATTER/BACK_COVER.md)
455
-
456
- ### Body Matter - Async Of Stroid
457
-
458
- - [Cache And Revalidation](docs/BODY_MATTER/ASYNC_OF_STROID/CACHE_AND_REVALIDATION.md)
459
- - [Fetch Flow](docs/BODY_MATTER/ASYNC_OF_STROID/FETCH_FLOW.md)
460
- - [Introduction](docs/BODY_MATTER/ASYNC_OF_STROID/INTRODUCTION.md)
461
- - [Real Use](docs/BODY_MATTER/ASYNC_OF_STROID/REAL_USE.md)
462
-
463
- ### Body Matter - Beginner Guide
464
-
465
- - [First Store](docs/BODY_MATTER/BEGINNER_GUIDE/FIRST_STORE.md)
466
- - [From Basic To Real](docs/BODY_MATTER/BEGINNER_GUIDE/FROM_BASIC_TO_REAL.md)
467
- - [Install And Imports](docs/BODY_MATTER/BEGINNER_GUIDE/INSTALL_AND_IMPORTS.md)
468
- - [React Usage](docs/BODY_MATTER/BEGINNER_GUIDE/REACT_USAGE.md)
469
- - [Start Here](docs/BODY_MATTER/BEGINNER_GUIDE/START_HERE.md)
470
-
471
- ### Body Matter - Binary To Being
472
-
473
- - [Async Layer](docs/BODY_MATTER/BINARY_TO_BEING/ASYNC_LAYER.md)
474
- - [Design Principles Of Stroid](docs/BODY_MATTER/BINARY_TO_BEING/DESIGN_PRINCIPLES_OF_STROID.md)
475
- - [Persistence Layer](docs/BODY_MATTER/BINARY_TO_BEING/PERSISTENCE_LAYER.md)
476
- - [Production Patterns](docs/BODY_MATTER/BINARY_TO_BEING/PRODUCTION_PATTERNS.md)
477
- - [React Bindings](docs/BODY_MATTER/BINARY_TO_BEING/REACT_BINDINGS.md)
478
- - [Runtime Architecture](docs/BODY_MATTER/BINARY_TO_BEING/RUNTIME_ARCHITECTURE.md)
479
- - [Selectors](docs/BODY_MATTER/BINARY_TO_BEING/SELECTORS.md)
480
- - [Store System](docs/BODY_MATTER/BINARY_TO_BEING/STORE_SYSTEM.md)
481
- - [Tooling And Debugging](docs/BODY_MATTER/BINARY_TO_BEING/TOOLING_AND_DEBUGGING.md)
482
- - [Why State Management Fails In Large Apps](docs/BODY_MATTER/BINARY_TO_BEING/WHY_STATE_MANAGEMENT_FAILS_IN_LARGE_APPS.md)
483
-
484
- ### Body Matter - Bug As Helper
485
-
486
- - [Intentional Bugs](docs/BODY_MATTER/BUG_AS_HELPER/INTENTIONAL_BUGS.md)
487
- - [Introduction](docs/BODY_MATTER/BUG_AS_HELPER/INTRODUCTION.md)
488
- - [No Need To Fix](docs/BODY_MATTER/BUG_AS_HELPER/NO_NEED_TO_FIX.md)
489
- - [Real Use](docs/BODY_MATTER/BUG_AS_HELPER/REAL_USE.md)
490
-
491
- ### Body Matter - Core Of Stroid
492
-
493
- - [Core Options](docs/BODY_MATTER/CORE_OF_STROID/CORE_OPTIONS.md)
494
- - [Example](docs/BODY_MATTER/CORE_OF_STROID/EXAMPLE.md)
495
- - [Introduction](docs/BODY_MATTER/CORE_OF_STROID/INTRODUCTION.md)
496
- - [Real Use](docs/BODY_MATTER/CORE_OF_STROID/REAL_USE.md)
497
-
498
- ### Body Matter - Devtools Of Stroid
499
-
500
- - [History And Redaction](docs/BODY_MATTER/DEVTOOLS_OF_STROID/HISTORY_AND_REDACTION.md)
501
- - [Introduction](docs/BODY_MATTER/DEVTOOLS_OF_STROID/INTRODUCTION.md)
502
- - [Real Use](docs/BODY_MATTER/DEVTOOLS_OF_STROID/REAL_USE.md)
503
- - [Redux Devtools And Boundaries](docs/BODY_MATTER/DEVTOOLS_OF_STROID/REDUX_DEVTOOLS_AND_BOUNDARIES.md)
504
-
505
- ### Body Matter - Helpers And Chain Of Stroid
506
-
507
- - [Chain Api](docs/BODY_MATTER/HELPERS_AND_CHAIN_OF_STROID/CHAIN_API.md)
508
- - [Helper Factories](docs/BODY_MATTER/HELPERS_AND_CHAIN_OF_STROID/HELPER_FACTORIES.md)
509
- - [Introduction](docs/BODY_MATTER/HELPERS_AND_CHAIN_OF_STROID/INTRODUCTION.md)
510
- - [Real Use](docs/BODY_MATTER/HELPERS_AND_CHAIN_OF_STROID/REAL_USE.md)
511
-
512
- ### Body Matter - Opt In Features Of Stroid
513
-
514
- - [Introduction](docs/BODY_MATTER/OPT_IN_FEATURES_OF_STROID/INTRODUCTION.md)
515
- - [Power Tools](docs/BODY_MATTER/OPT_IN_FEATURES_OF_STROID/POWER_TOOLS.md)
516
- - [Runtime Layers](docs/BODY_MATTER/OPT_IN_FEATURES_OF_STROID/RUNTIME_LAYERS.md)
517
- - [Store Features](docs/BODY_MATTER/OPT_IN_FEATURES_OF_STROID/STORE_FEATURES.md)
518
-
519
- ### Body Matter - Persist Of Stroid
520
-
521
- - [Failure And Recovery](docs/BODY_MATTER/PERSIST_OF_STROID/FAILURE_AND_RECOVERY.md)
522
- - [Introduction](docs/BODY_MATTER/PERSIST_OF_STROID/INTRODUCTION.md)
523
- - [Real Use](docs/BODY_MATTER/PERSIST_OF_STROID/REAL_USE.md)
524
- - [Storage And Migrations](docs/BODY_MATTER/PERSIST_OF_STROID/STORAGE_AND_MIGRATIONS.md)
525
-
526
- ### Body Matter - Philosophy Of Stroid
527
-
528
- - [Minimal Abstraction](docs/BODY_MATTER/PHILOSOPHY_OF_STROID/MINIMAL_ABSTRACTION.md)
529
- - [Optional Complexity And Comparison](docs/BODY_MATTER/PHILOSOPHY_OF_STROID/OPTIONAL_COMPLEXITY_AND_COMPARISON.md)
530
- - [Predictable State Mutation](docs/BODY_MATTER/PHILOSOPHY_OF_STROID/PREDICTABLE_STATE_MUTATION.md)
531
- - [Runtime Observability](docs/BODY_MATTER/PHILOSOPHY_OF_STROID/RUNTIME_OBSERVABILITY.md)
532
- - [Why The Mind Needs Structure](docs/BODY_MATTER/PHILOSOPHY_OF_STROID/WHY_THE_MIND_NEEDS_STRUCTURE.md)
533
-
534
- ### Body Matter - React Of Stroid
535
-
536
- - [Form And Async](docs/BODY_MATTER/REACT_OF_STROID/FORM_AND_ASYNC.md)
537
- - [Hooks](docs/BODY_MATTER/REACT_OF_STROID/HOOKS.md)
538
- - [Introduction](docs/BODY_MATTER/REACT_OF_STROID/INTRODUCTION.md)
539
- - [Real Use](docs/BODY_MATTER/REACT_OF_STROID/REAL_USE.md)
540
-
541
- ### Body Matter - Roadmap Of Stroid
542
-
543
- - [Roadmap](docs/BODY_MATTER/ROADMAP_OF_STROID/ROADMAP.md)
544
-
545
- ### Body Matter - Runtime Operations Of Stroid
546
-
547
- - [Admin Operations](docs/BODY_MATTER/RUNTIME_OPERATIONS_OF_STROID/ADMIN_OPERATIONS.md)
548
- - [Inspection Tools](docs/BODY_MATTER/RUNTIME_OPERATIONS_OF_STROID/INSPECTION_TOOLS.md)
549
- - [Introduction](docs/BODY_MATTER/RUNTIME_OPERATIONS_OF_STROID/INTRODUCTION.md)
550
- - [Real Use](docs/BODY_MATTER/RUNTIME_OPERATIONS_OF_STROID/REAL_USE.md)
551
-
552
- ### Body Matter - Selectors Of Stroid
553
-
554
- - [Create Selector](docs/BODY_MATTER/SELECTORS_OF_STROID/CREATE_SELECTOR.md)
555
- - [Introduction](docs/BODY_MATTER/SELECTORS_OF_STROID/INTRODUCTION.md)
556
- - [Real Use](docs/BODY_MATTER/SELECTORS_OF_STROID/REAL_USE.md)
557
- - [Subscribe With Selector](docs/BODY_MATTER/SELECTORS_OF_STROID/SUBSCRIBE_WITH_SELECTOR.md)
558
-
559
- ### Body Matter - Server Of Stroid
560
-
561
- - [Hydrate Flow](docs/BODY_MATTER/SERVER_OF_STROID/HYDRATE_FLOW.md)
562
- - [Introduction](docs/BODY_MATTER/SERVER_OF_STROID/INTRODUCTION.md)
563
- - [Real Use](docs/BODY_MATTER/SERVER_OF_STROID/REAL_USE.md)
564
- - [Request Scope](docs/BODY_MATTER/SERVER_OF_STROID/REQUEST_SCOPE.md)
565
-
566
- ### Body Matter - Sync Of Stroid
567
-
568
- - [Conflicts And Recovery](docs/BODY_MATTER/SYNC_OF_STROID/CONFLICTS_AND_RECOVERY.md)
569
- - [Introduction](docs/BODY_MATTER/SYNC_OF_STROID/INTRODUCTION.md)
570
- - [Real Use](docs/BODY_MATTER/SYNC_OF_STROID/REAL_USE.md)
571
- - [Sync Options](docs/BODY_MATTER/SYNC_OF_STROID/SYNC_OPTIONS.md)
572
-
573
- ### Body Matter - Testing Of Stroid
574
-
575
- - [Introduction](docs/BODY_MATTER/TESTING_OF_STROID/INTRODUCTION.md)
576
- - [Mocks And Time](docs/BODY_MATTER/TESTING_OF_STROID/MOCKS_AND_TIME.md)
577
- - [Real Use](docs/BODY_MATTER/TESTING_OF_STROID/REAL_USE.md)
578
- - [Resets And Benchmarks](docs/BODY_MATTER/TESTING_OF_STROID/RESETS_AND_BENCHMARKS.md)
579
-
580
- ### Body Matter - The Glitch In Matrix
581
-
582
- - [Introduction](docs/BODY_MATTER/THE_GLITCH_IN_MATRIX/INTRODUCTION.md)
583
- - [Performance And Reality](docs/BODY_MATTER/THE_GLITCH_IN_MATRIX/PERFORMANCE_AND_REALITY.md)
584
- - [Real Use](docs/BODY_MATTER/THE_GLITCH_IN_MATRIX/REAL_USE.md)
585
- - [Tradeoffs And Limits](docs/BODY_MATTER/THE_GLITCH_IN_MATRIX/TRADEOFFS_AND_LIMITS.md)
586
-
587
- ### Front Matter
588
-
589
- - [About Author](docs/FRONT_MATTER/ABOUT_AUTHOR.md)
590
- - [Acknowledge](docs/FRONT_MATTER/ACKNOWLEDGE.md)
591
- - [Contents](docs/FRONT_MATTER/CONTENTS.md)
592
- - [Copyright](docs/FRONT_MATTER/COPYRIGHT.md)
593
- - [Dedication](docs/FRONT_MATTER/DEDICATION.md)
594
- - [Epigraph](docs/FRONT_MATTER/EPIGRAPH.md)
595
- - [Foreword](docs/FRONT_MATTER/FOREWORD.md)
596
- - [Front Cover Page](docs/FRONT_MATTER/FRONT_COVER_PAGE.md)
597
- - [How To Use](docs/FRONT_MATTER/HOW_TO_USE.md)
598
- - [Introduction](docs/FRONT_MATTER/INTRODUCTION.md)
599
- - [List Of Table](docs/FRONT_MATTER/LIST_OF_TABLE.md)
600
- - [Praise](docs/FRONT_MATTER/PRAISE.md)
601
- - [Preface](docs/FRONT_MATTER/PREFACE.md)
602
- - [Title Page](docs/FRONT_MATTER/TITLE_PAGE.md)
603
-
604
- ## Changelog and License
605
-
606
- - [CHANGELOG](CHANGELOG.md)
607
- - [LICENSE](LICENSE)
164
+ Full documentation in [`/docs`](./docs/):
165
+
166
+ - [Architecture](./docs/architecture/ARCHITECTURE.md) — layers, data flow, registry model
167
+ - [Core Concepts](./docs/core-concepts/STORES.md) — store lifecycle, options, write modes
168
+ - [React Layer](./docs/guides/REACT.md) — hooks, selectors, SSR
169
+ - [Async Layer](./docs/guides/ASYNC.md) — `fetchStore`, caching, revalidation
170
+ - [Persistence](./docs/guides/PERSIST.md) — `localStorage`, encryption, migrations
171
+ - [Cross-tab Sync](./docs/guides/SYNC.md) — `BroadcastChannel`, conflict resolution
172
+ - [Computed Stores](./docs/guides/COMPUTED.md) — reactive derived values
173
+ - [Server & SSR](./docs/guides/SERVER.md) — request-scoped stores, hydration
174
+ - [Testing](./docs/guides/TESTING.md) — mock stores, resets, benchmarks
175
+ - [Devtools](./docs/guides/DEVTOOLS.md) — history, redaction
176
+ - [Runtime Tools](./docs/guides/RUNTIME_TOOLS.md) — observability, health checks
177
+ - [Full API Reference](./docs/api/API_REFERENCE.md)
178
+ - [Project Status](./STATUS.MD)
179
+ - [Contributing](./CONTRIBUTING.md)
180
+
181
+ ---
182
+
183
+ ## Changelog & License
184
+
185
+ - [CHANGELOG](./CHANGELOG.md)
186
+ - [MIT License](./LICENSE)
608
187
  - [Issues](https://github.com/Himesh-Bhattarai/stroid/issues)
188
+