@wirestate/react-mobx 0.6.1 → 0.6.3

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 (3) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +30 -287
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.6.3
2
+
3
+ - Update readme files for each module
4
+
5
+ ## 0.6.2
6
+
7
+ - Corrected build system, react package structure
8
+
1
9
  ## 0.6.1
2
10
 
3
11
  - React related types moved to react lib
package/README.md CHANGED
@@ -1,316 +1,59 @@
1
- # <a href='https://www.npmjs.com/package/wirestate'> ⚡ wirestate </a>
1
+ # @wirestate/react-mobx
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/wirestate.svg?style=flat-square)](https://www.npmjs.com/package/wirestate)
4
- [![language-ts](https://img.shields.io/badge/language-typescript-blue.svg?style=flat)](https://github.com/Neloreck/wirestate/search?l=typescript)
3
+ [![npm](https://img.shields.io/npm/v/@wirestate/react-mobx.svg?style=flat-square)](https://www.npmjs.com/package/@wirestate/react-mobx)
5
4
  [![license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/Neloreck/wirestate/blob/master/LICENSE)
6
5
 
7
- `wirestate` is a reactivity-independent state management framework for React. It integrates **InversifyJS** for robust Dependency Injection,
8
- providing IOC/DI/indirection based architecture based on concepts of Services, Events, Commands, and Queries.
9
-
10
- It optionally works with **MobX**, **Signals**, or other custom reactivity implementations.
11
-
12
- ## Architecture & Core Concepts
13
-
14
- Designed for complex applications, `wirestate` enforces a clear separation of concerns:
15
-
16
- - **Services**: Singleton-scoped logic units that hold state and business logic.
17
- - **Dependency Injection**: First-class InversifyJS integration for decoupled, testable code.
18
- - **Reactivity**: Independent state tracking (optional integration with MobX, Signals, etc.).
19
- - **Events**: Fire-and-forget communication for cross-service side effects.
20
- - **Commands**: Encapsulated write operations with standardized execution status (pending, settled, error).
21
- - **Queries**: Synchronous or asynchronous request-response patterns for data retrieval.
22
- - **Lifecycle Management**: Automated services provision within react tree, activation/deactivation lifecycle.
23
-
24
- ## Requirements
25
-
26
- - `react >= 16.8.0`
27
- - `reflect-metadata` (must be imported at application entry)
6
+ Re-exports MobX and `mobx-react-lite`, plus class decorator wrappers compatible with TypeScript's legacy decorators.
28
7
 
29
8
  ## Installation
30
9
 
31
10
  ```bash
32
- npm install --save @wirestate/core reflect-metadata
11
+ npm install @wirestate/react-mobx mobx mobx-react-lite
33
12
  ```
34
13
 
35
- ### For react-mobx
14
+ ## Usage
36
15
 
37
- ```bash
38
- npm install --save @wirestate/react @wirestate/react-mobx mobx mobx-react-lite
16
+ ```ts
17
+ import {
18
+ makeObservable,
19
+ observer,
20
+ Observable,
21
+ ShallowObservable,
22
+ Action,
23
+ Computed,
24
+ } from '@wirestate/react-mobx';
39
25
  ```
40
26
 
41
- ### For signals
27
+ ## Decorator wrappers
42
28
 
43
- ```bash
44
- npm install --save @wirestate/react @wirestate/react-signals @preact/signals-react
45
- npm install --save-dev @preact/signals-react-transform
46
- ```
47
-
48
- ## Quick Start with mobx
29
+ | Export | Wraps |
30
+ |---|---|
31
+ | `Observable()` | `observable` |
32
+ | `ShallowObservable()` | `observable.shallow` |
33
+ | `RefObservable()` | `observable.ref` |
34
+ | `DeepObservable()` | `observable.deep` |
35
+ | `Action()` | `action` |
36
+ | `Computed()` | `computed` |
49
37
 
50
- ### 1. Define a Service
38
+ Example:
51
39
 
52
- Services are standard classes decorated with `@Injectable`. Use `WireScope` to interact with the framework.
53
-
54
- ```typescript
55
- import { Injectable, Inject, WireScope, OnEvent, OnCommand, OnQuery } from '@wirestate/core';
40
+ ```ts
41
+ import { Injectable, Inject, WireScope } from '@wirestate/core';
56
42
  import { makeObservable, Observable, Action } from '@wirestate/react-mobx';
57
43
 
58
44
  @Injectable()
59
45
  export class CounterService {
60
46
  @Observable()
61
- public count: number = 0;
47
+ public count = 0;
62
48
 
63
- public constructor(
64
- @Inject(WireScope)
65
- private scope: WireScope
66
- ) {
49
+ public constructor(@Inject(WireScope) private scope: WireScope) {
67
50
  makeObservable(this);
68
51
  }
69
52
 
70
53
  @Action()
71
- public increment(amount: number = 1): void {
72
- this.count += amount;
73
- }
74
-
75
- @Action()
76
- public reset(): void {
77
- this.count = 0;
78
- }
79
-
80
- @OnCommand('INCREMENT')
81
- public onIncrementCommand(amount: number = 1): void {
82
- this.increment(amount);
83
- }
84
-
85
- @OnQuery('GET_TOTAL')
86
- public onGetTotal(): number {
87
- return this.count;
88
- }
89
-
90
- @OnEvent('RESET')
91
- public onResetEvent(): void {
92
- this.reset();
93
- }
94
- }
95
- ```
96
-
97
- ### 2. Configure the Provider
98
-
99
- Bind services at any level of the component tree.
100
- Lifetimes are managed automatically.
101
-
102
- ```tsx
103
- import { IocProvider, createInjectablesProvider } from '@wirestate/react';
104
- import { CounterService } from './CounterService';
105
-
106
- const MainProvider = createInjectablesProvider([CounterService]);
107
-
108
- export function Application() {
109
- return (
110
- <IocProvider>
111
- <MainProvider>
112
- <CounterView />
113
- </MainProvider>
114
- </IocProvider>
115
- );
116
- }
117
- ```
118
-
119
- ### 3. Consume in Components
120
-
121
- Directly use services and rely on mobx reactivity.
122
- Or use specialized hooks for communication without direct references.
123
-
124
- ```tsx
125
- import { useInjection, useCommandCaller, useEventEmitter } from '@wirestate/react';
126
- import { observer } from '@wirestate/react-mobx';
127
- import { CounterService } from './CounterService';
128
-
129
- export const CounterView = observer(() => {
130
- const service = useInjection(CounterService);
131
- const call = useCommandCaller();
132
- const emit = useEventEmitter();
133
-
134
- return (
135
- <div>
136
- <p>Count: {service.count}</p>
137
- <button onClick={() => service.increment(5)}>Add 1 (Method)</button>
138
- <button onClick={() => call('INCREMENT', 5)}>Add 5 (Command)</button>
139
- <button onClick={() => service.reset()}>Reset (Method)</button>
140
- <button onClick={() => emit('RESET')}>Reset (Event)</button>
141
- </div>
142
- );
143
- });
144
- ```
145
-
146
- ## Quick Start with signals
147
-
148
- ### 1. Define a Service
149
-
150
- Services use `signal` and `computed` for state management.
151
-
152
- ```typescript
153
- import { Injectable, Inject, WireScope, OnEvent, OnCommand, OnQuery } from '@wirestate/core';
154
- import { signal, computed, Signal, ReadonlySignal } from '@wirestate/react-signals';
155
-
156
- @Injectable()
157
- export class CounterService {
158
- public readonly count: Signal<number> = signal(0);
159
- public readonly isEven: ReadonlySignal<boolean> = computed(() => this.count.value % 2 === 0);
160
-
161
- public constructor(
162
- @Inject(WireScope)
163
- private scope: WireScope
164
- ) {}
165
-
166
- public increment(amount: number = 1): void {
167
- this.count.value += amount;
168
- }
169
-
170
- public reset(): void {
171
- this.count.value = 0;
172
- }
173
-
174
- @OnCommand('INCREMENT')
175
- public onIncrementCommand(amount: number = 1): void {
176
- this.increment(amount);
177
- }
178
-
179
- @OnQuery('GET_TOTAL')
180
- public onGetTotal(): number {
181
- return this.count.value;
54
+ public increment(): void {
55
+ this.count++;
182
56
  }
183
-
184
- @OnEvent('RESET')
185
- public onResetEvent(): void {
186
- this.reset();
187
- }
188
- }
189
- ```
190
-
191
- ### 2. Configure the Provider
192
-
193
- The provider configuration remains the same regardless of the reactivity implementation.
194
-
195
- ```tsx
196
- import { IocProvider, createInjectablesProvider } from '@wirestate/react';
197
- import { CounterService } from './CounterService';
198
-
199
- const MainProvider = createInjectablesProvider([CounterService]);
200
-
201
- export function Application() {
202
- return (
203
- <IocProvider>
204
- <MainProvider>
205
- <CounterView />
206
- </MainProvider>
207
- </IocProvider>
208
- );
209
- }
210
- ```
211
-
212
- ### 3. Consume in Components
213
-
214
- Access signals directly in components. Reactivity is handled by the signals transform or manual subscription.
215
-
216
- ```tsx
217
- import { useInjection, useCommandCaller, useEventEmitter } from '@wirestate/react';
218
- import { CounterService } from './CounterService';
219
-
220
- export function CounterView() {
221
- const service = useInjection(CounterService);
222
- const call = useCommandCaller();
223
- const emit = useEventEmitter();
224
-
225
- return (
226
- <div>
227
- <p>Count: {service.count}</p>
228
- <p>Even: {service.isEven.value ? 'Yes' : 'No'}</p>
229
- <button onClick={() => service.increment(5)}>Add 1 (Method)</button>
230
- <button onClick={() => call('INCREMENT', 5)}>Add 5 (Command)</button>
231
- <button onClick={() => service.reset()}>Reset (Method)</button>
232
- <button onClick={() => emit('RESET')}>Reset (Event)</button>
233
- </div>
234
- );
235
- }
236
- ```
237
-
238
- ## Advanced Usage
239
-
240
- ### Seeding Shared Initial State
241
-
242
- `wirestate` supports providing initial data (seeds) to services during activation.
243
-
244
- ```tsx
245
- const MainProvider = createInjectablesProvider([CounterService]);
246
-
247
- <IocProvider>
248
- <MainProvider seed={{ initialCount: 100 }}>
249
- <CounterView />
250
- </MainProvider>
251
- </IocProvider>
252
- ```
253
-
254
- In the service:
255
-
256
- ```typescript
257
- import { Injectable, Inject, SEED } from 'wirestate';
258
-
259
- @Injectable()
260
- export class CounterService {
261
- // ...
262
- public constructor(
263
- @Inject(SEED)
264
- initialState: { initialCount: number }
265
- ) {
266
- this.count = seed.initialCount;
267
- }
268
- }
269
- ```
270
-
271
- ### Seeding Bound Initial State
272
-
273
- `wirestate` supports providing initial data (seeds) to services during activation.
274
-
275
- ```tsx
276
- const MainProvider = createInjectablesProvider([CounterService]);
277
-
278
- <IocProvider>
279
- <MainProvider seeds={[[CounterService, { count: 10 }]]}>
280
- <CounterView />
281
- </MainProvider>
282
- </IocProvider>
283
- ```
284
-
285
- In the service:
286
-
287
- ```typescript
288
- import { Injectable, Inject, WireScope } from 'wirestate';
289
-
290
- @Injectable()
291
- export class CounterService {
292
- // ...
293
- public constructor(@Inject(WireScope) scope: WireScope) {
294
- this.count = scope.getSeed(CounterService).count;
295
- }
296
- }
297
- ```
298
-
299
- ### Service Lifecycle
300
-
301
- Use decorators to handle initialization and cleanup.
302
-
303
- ```typescript
304
- import { OnActivated, OnDeactivation } from 'wirestate';
305
-
306
- @OnActivated()
307
- public onActivated(): void {
308
- // Start polling, fetch initial data, etc.
309
- }
310
-
311
- @OnDeactivation()
312
- public onDeactivation(): void {
313
- // Cleanup subscriptions
314
57
  }
315
58
  ```
316
59
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirestate/react-mobx",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "Mobx alias and adapters for wirestate",
5
5
  "sideEffects": false,
6
6
  "author": "Syrotenko Igor",