effector-storage 4.4.0 → 5.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 +46 -53
- package/async-storage/index.cjs +2 -0
- package/async-storage/index.cjs.d.ts +21 -0
- package/async-storage/index.cjs.map +1 -0
- package/async-storage/index.d.ts +21 -0
- package/async-storage/index.js +2 -0
- package/async-storage/index.js.flow +19 -0
- package/async-storage/index.js.map +1 -0
- package/{fp → async-storage}/package.json +0 -0
- package/index.cjs +1 -1
- package/index.cjs.map +1 -1
- package/index.js +1 -1
- package/index.js.flow +1 -1
- package/index.js.map +1 -1
- package/local/index.cjs +1 -1
- package/local/index.cjs.map +1 -1
- package/local/index.js +1 -1
- package/local/index.js.flow +1 -1
- package/local/index.js.map +1 -1
- package/memory/index.cjs +1 -1
- package/memory/index.cjs.map +1 -1
- package/memory/index.js +1 -1
- package/memory/index.js.flow +1 -1
- package/memory/index.js.map +1 -1
- package/nil/index.cjs.map +1 -1
- package/nil/index.js.flow +1 -1
- package/nil/index.js.map +1 -1
- package/package.json +20 -26
- package/query/index.cjs +1 -1
- package/query/index.cjs.map +1 -1
- package/query/index.js +1 -1
- package/query/index.js.flow +1 -1
- package/query/index.js.map +1 -1
- package/rn/async/index.cjs +2 -0
- package/rn/async/index.cjs.d.ts +89 -0
- package/rn/async/index.cjs.map +1 -0
- package/rn/async/index.d.ts +89 -0
- package/rn/async/index.js +2 -0
- package/rn/async/index.js.flow +98 -0
- package/rn/async/index.js.map +1 -0
- package/{local/fp → rn/async}/package.json +0 -0
- package/rn/encrypted/index.cjs +2 -0
- package/rn/encrypted/index.cjs.d.ts +89 -0
- package/rn/encrypted/index.cjs.map +1 -0
- package/rn/encrypted/index.d.ts +89 -0
- package/rn/encrypted/index.js +2 -0
- package/rn/encrypted/index.js.flow +98 -0
- package/rn/encrypted/index.js.map +1 -0
- package/{memory/fp → rn/encrypted}/package.json +0 -0
- package/session/index.cjs +1 -1
- package/session/index.cjs.map +1 -1
- package/session/index.js +1 -1
- package/session/index.js.flow +1 -1
- package/session/index.js.map +1 -1
- package/storage/index.cjs.map +1 -1
- package/storage/index.js.flow +1 -1
- package/storage/index.js.map +1 -1
- package/fp/index.cjs +0 -2
- package/fp/index.cjs.d.ts +0 -55
- package/fp/index.cjs.map +0 -1
- package/fp/index.d.ts +0 -55
- package/fp/index.js +0 -2
- package/fp/index.js.flow +0 -76
- package/fp/index.js.map +0 -1
- package/local/fp/index.cjs +0 -2
- package/local/fp/index.cjs.d.ts +0 -46
- package/local/fp/index.cjs.map +0 -1
- package/local/fp/index.d.ts +0 -46
- package/local/fp/index.js +0 -2
- package/local/fp/index.js.flow +0 -63
- package/local/fp/index.js.map +0 -1
- package/memory/fp/index.cjs +0 -2
- package/memory/fp/index.cjs.d.ts +0 -43
- package/memory/fp/index.cjs.map +0 -1
- package/memory/fp/index.d.ts +0 -43
- package/memory/fp/index.js +0 -2
- package/memory/fp/index.js.flow +0 -64
- package/memory/fp/index.js.map +0 -1
- package/query/fp/index.cjs +0 -2
- package/query/fp/index.cjs.d.ts +0 -57
- package/query/fp/index.cjs.map +0 -1
- package/query/fp/index.d.ts +0 -57
- package/query/fp/index.js +0 -2
- package/query/fp/index.js.flow +0 -67
- package/query/fp/index.js.map +0 -1
- package/query/fp/package.json +0 -7
- package/session/fp/index.cjs +0 -2
- package/session/fp/index.cjs.d.ts +0 -46
- package/session/fp/index.cjs.map +0 -1
- package/session/fp/index.d.ts +0 -46
- package/session/fp/index.js +0 -2
- package/session/fp/index.js.flow +0 -63
- package/session/fp/index.js.map +0 -1
- package/session/fp/package.json +0 -7
package/README.md
CHANGED
|
@@ -17,6 +17,8 @@ Small module for [Effector](https://github.com/effector/effector) ☄️ to sync
|
|
|
17
17
|
- [with `localStorage`](#with-localstorage)
|
|
18
18
|
- [with `sessionStorage`](#with-sessionstorage)
|
|
19
19
|
- [with query string](#with-query-string)
|
|
20
|
+
- [with React Native AsyncStorage](#with-react-native-asyncstorage)
|
|
21
|
+
- [with React Native EncryptedStorage](#with-react-native-encryptedstorage)
|
|
20
22
|
- [Usage with domains](#usage-with-domains)
|
|
21
23
|
- [Functional helpers](#functional-helpers)
|
|
22
24
|
- [Formulae](#formulae)
|
|
@@ -43,13 +45,16 @@ Small module for [Effector](https://github.com/effector/effector) ☄️ to sync
|
|
|
43
45
|
|
|
44
46
|
## Install
|
|
45
47
|
|
|
48
|
+
Depending on your package manager
|
|
49
|
+
|
|
46
50
|
```bash
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
# using `pnpm` ↓
|
|
52
|
+
$ pnpm add effector-storage
|
|
49
53
|
|
|
50
|
-
|
|
54
|
+
# using `yarn` ↓
|
|
55
|
+
$ yarn add effector-storage
|
|
51
56
|
|
|
52
|
-
|
|
57
|
+
# using `npm` ↓
|
|
53
58
|
$ npm install --save effector-storage
|
|
54
59
|
```
|
|
55
60
|
|
|
@@ -101,50 +106,55 @@ If two (or more) stores are persisted in query string with the same key — they
|
|
|
101
106
|
⚠️ **Note**<br>
|
|
102
107
|
Use this only with plain string stores (`Store<string | null>`) to avoid strange unexpected behavior.
|
|
103
108
|
|
|
104
|
-
|
|
109
|
+
### with React Native AsyncStorage
|
|
105
110
|
|
|
106
|
-
|
|
111
|
+
Docs: [effector-storage/rn/async](https://github.com/yumauri/effector-storage/tree/master/src/rn/async/README.md)
|
|
107
112
|
|
|
108
113
|
```javascript
|
|
109
|
-
import {
|
|
110
|
-
import { persist } from 'effector-storage/local'
|
|
114
|
+
import { persist } from 'effector-storage/rn/async'
|
|
111
115
|
|
|
112
|
-
|
|
116
|
+
// persist store `$counter` with key 'counter'
|
|
117
|
+
persist({ store: $counter, key: 'counter' })
|
|
113
118
|
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
// if your storage has a name, you can omit `key` field
|
|
120
|
+
persist({ store: $counter })
|
|
121
|
+
```
|
|
117
122
|
|
|
118
|
-
|
|
123
|
+
⚠️ Note, that [AsyncStorage] is asynchronous, hence the name.
|
|
124
|
+
|
|
125
|
+
### with React Native EncryptedStorage
|
|
126
|
+
|
|
127
|
+
Docs: [effector-storage/rn/encrypted](https://github.com/yumauri/effector-storage/tree/master/src/rn/encrypted/README.md)
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
import { persist } from 'effector-storage/rn/encrypted'
|
|
131
|
+
|
|
132
|
+
// persist store `$counter` with key 'counter'
|
|
133
|
+
persist({ store: $counter, key: 'counter' })
|
|
134
|
+
|
|
135
|
+
// if your storage has a name, you can omit `key` field
|
|
136
|
+
persist({ store: $counter })
|
|
119
137
|
```
|
|
120
138
|
|
|
121
|
-
|
|
139
|
+
⚠️ Note, that [EncryptedStorage] is asynchronous (it is based on [AsyncStorage] actually).
|
|
122
140
|
|
|
123
|
-
|
|
141
|
+
## Usage with domains
|
|
124
142
|
|
|
125
|
-
|
|
143
|
+
You can use `persist` inside Domain's `onCreateStore` hook:
|
|
126
144
|
|
|
127
145
|
```javascript
|
|
128
146
|
import { createDomain } from 'effector'
|
|
129
|
-
import { persist } from 'effector-storage/local
|
|
147
|
+
import { persist } from 'effector-storage/local'
|
|
130
148
|
|
|
131
149
|
const app = createDomain('app')
|
|
132
150
|
|
|
133
151
|
// this hook will persist every store, created in domain,
|
|
134
152
|
// in `localStorage`, using stores' names as keys
|
|
135
|
-
app.onCreateStore(persist())
|
|
153
|
+
app.onCreateStore((store) => persist({ store }))
|
|
136
154
|
|
|
137
155
|
const $store = app.createStore(0, { name: 'store' })
|
|
138
|
-
|
|
139
|
-
// or persist single store in `localStorage` via .thru
|
|
140
|
-
const $counter = createStore(0)
|
|
141
|
-
.on(increment, (state) => state + 1)
|
|
142
|
-
.on(decrement, (state) => state - 1)
|
|
143
|
-
.thru(persist({ key: 'counter' }))
|
|
144
156
|
```
|
|
145
157
|
|
|
146
|
-
</s>
|
|
147
|
-
|
|
148
158
|
## Formulae
|
|
149
159
|
|
|
150
160
|
```javascript
|
|
@@ -154,15 +164,6 @@ import { persist } from 'effector-storage/<adapter>'
|
|
|
154
164
|
- `persist({ store, ...options }): Subscription`
|
|
155
165
|
- `persist({ source, target, ...options }): Subscription`
|
|
156
166
|
|
|
157
|
-
⚠️ Due to deprecation of `.thru` method in [effector version 22](https://github.com/effector/effector/releases/tag/effector%4022.0.0), functional helpers become obsolete, so, they are deprecated as well.<s>
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
import { persist } from 'effector-storage/<adapter>/fp'
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
- `persist({ ...options }?): (store: Store) => Store`
|
|
164
|
-
</s>
|
|
165
|
-
|
|
166
167
|
### Units
|
|
167
168
|
|
|
168
169
|
In order to synchronize _something_, you need to specify effector units. Depending on a requirements, you may want to use `store` parameter, or `source` and `target` parameters:
|
|
@@ -176,25 +177,25 @@ In order to synchronize _something_, you need to specify effector units. Dependi
|
|
|
176
177
|
- `key`? ([_string_]): Key for local/session storage, to store value in. If omitted — `store` name is used. **Note!** If `key` is not specified, `store` _must_ have a `name`! You can use `'effector/babel-plugin'` to have those names automatically.
|
|
177
178
|
- `keyPrefix`? ([_string_]): Prefix, used in adapter, to be concatenated to `key`. By default = `''`.
|
|
178
179
|
- `clock`? ([_Event_] | [_Effect_] | [_Store_]): Unit, if passed – then value from `store`/`source` will be stored in the storage only upon its trigger.
|
|
179
|
-
- `pickup`? ([_Event_] | [_Effect_] | [_Store_]): Unit, which you can specify to
|
|
180
|
+
- `pickup`? ([_Event_] | [_Effect_] | [_Store_]): Unit, which you can specify to update `store` value from storage. **Note!** When you add `pickup`, `persist` _will not_ get initial value from storage automatically!
|
|
180
181
|
- `done`? ([_Event_] | [_Effect_] | [_Store_]): Unit, which will be triggered on each successful read or write from/to storage.<br>
|
|
181
182
|
Payload structure:
|
|
182
183
|
- `key` ([_string_]): Same `key` as above.
|
|
183
184
|
- `keyPrefix` ([_string_]): Prefix, used in adapter, to be concatenated to `key`. By default = `''`.
|
|
184
|
-
- `operation` (_`'set'`_ | _`'get'`_):
|
|
185
|
+
- `operation` (_`'set'`_ | _`'get'`_): Type of operation, read (get) or write (set).
|
|
185
186
|
- `value` (_State_): Value set to `store` or got from `store`.
|
|
186
187
|
- `fail`? ([_Event_] | [_Effect_] | [_Store_]): Unit, which will be triggered in case of any error (serialization/deserialization error, storage is full and so on). **Note!** If `fail` unit is not specified, any errors will be printed using `console.error(Error)`.<br>
|
|
187
188
|
Payload structure:
|
|
188
189
|
- `key` ([_string_]): Same `key` as above.
|
|
189
190
|
- `keyPrefix` ([_string_]): Prefix, used in adapter, to be concatenated to `key`. By default = `''`.
|
|
190
|
-
- `operation` (_`'set'`_ | _`'get'`_):
|
|
191
|
+
- `operation` (_`'set'`_ | _`'get'`_): Type of operation, read (get) or write (set).
|
|
191
192
|
- `error` ([_Error_]): Error instance
|
|
192
193
|
- `value`? (_any_): In case of _'set'_ operation — value from `store`. In case of _'get'_ operation could contain raw value from storage or could be empty.
|
|
193
194
|
- `finally`? ([_Event_] | [_Effect_] | [_Store_]): Unit, which will be triggered either in case of success or error.<br>
|
|
194
195
|
Payload structure:
|
|
195
196
|
- `key` ([_string_]): Same `key` as above.
|
|
196
197
|
- `keyPrefix` ([_string_]): Prefix, used in adapter, to be concatenated to `key`. By default = `''`.
|
|
197
|
-
- `operation` (_`'set'`_ | _`'get'`_):
|
|
198
|
+
- `operation` (_`'set'`_ | _`'get'`_): Type of operation, read (get) or write (set).
|
|
198
199
|
- `status` (_`'done'`_ | _`'fail'`_): Operation status.
|
|
199
200
|
- `error`? ([_Error_]): Error instance, in case of error.
|
|
200
201
|
- `value`? (_any_): Value, in case it is exists (look above).
|
|
@@ -203,10 +204,6 @@ In order to synchronize _something_, you need to specify effector units. Dependi
|
|
|
203
204
|
|
|
204
205
|
- ([_Subscription_]): You can use this subscription to remove store association with storage, if you don't need them to be synced anymore. It is a function.
|
|
205
206
|
|
|
206
|
-
- <s>`(store) => Store` ([_Function_]): Function, which accepts store to synchronize with storage, and returns:
|
|
207
|
-
- ([_Store_]): Same given store.<br>
|
|
208
|
-
_You cannot unsubscribe store from storage when using functional form of `persist`._</s>
|
|
209
|
-
|
|
210
207
|
## `createPersist` factory
|
|
211
208
|
|
|
212
209
|
In rare cases you might want to use `createPersist` factory. It allows you to specify some adapter options, like `keyPrefix`.
|
|
@@ -254,12 +251,6 @@ Core function `persist` accepts all **common** options, as `persist` functions f
|
|
|
254
251
|
|
|
255
252
|
- `adapter` (_StorageAdapter_): Storage adapter to use.
|
|
256
253
|
|
|
257
|
-
There is also _fp_ form too:
|
|
258
|
-
|
|
259
|
-
```javascript
|
|
260
|
-
import { persist } from 'effector-storage/fp'
|
|
261
|
-
```
|
|
262
|
-
|
|
263
254
|
## Storage adapters
|
|
264
255
|
|
|
265
256
|
Adapter is a function, which is called by the core `persist` function, and has following interface:
|
|
@@ -358,13 +349,13 @@ persist({ store, adapter }) // <- use adapter
|
|
|
358
349
|
|
|
359
350
|
If your storage can be updated from _external source_, and doesn't have any events to react to, but you are able to know about it somehow.
|
|
360
351
|
|
|
361
|
-
You can use optional `pickup` parameter to specify unit to trigger
|
|
352
|
+
You can use optional `pickup` parameter to specify unit to trigger update (keep in mind, that when you add `pickup`, `persist` _will not_ get initial value from storage automatically):
|
|
362
353
|
|
|
363
354
|
```javascript
|
|
364
355
|
import { createEvent, createStore, forward } from 'effector'
|
|
365
356
|
import { persist } from 'effector-storage/session'
|
|
366
357
|
|
|
367
|
-
// event, which will be used to trigger
|
|
358
|
+
// event, which will be used to trigger update
|
|
368
359
|
const pickup = createEvent()
|
|
369
360
|
|
|
370
361
|
const store = createStore('', { name: 'store' })
|
|
@@ -373,7 +364,7 @@ persist({ store, pickup }) // <- set `pickup` parameter
|
|
|
373
364
|
// --8<--
|
|
374
365
|
|
|
375
366
|
// when you are sure, that storage was updated,
|
|
376
|
-
// and you need to
|
|
367
|
+
// and you need to update `store` from storage with new value
|
|
377
368
|
pickup()
|
|
378
369
|
```
|
|
379
370
|
|
|
@@ -498,8 +489,9 @@ Use this approach with caution, beware of infinite circular updates. To avoid th
|
|
|
498
489
|
- [x] [localStorage] support (docs: [effector-storage/local](https://github.com/yumauri/effector-storage/tree/master/src/local/README.md))
|
|
499
490
|
- [x] [sessionStorage] support (docs: [effector-storage/session](https://github.com/yumauri/effector-storage/tree/master/src/session/README.md))
|
|
500
491
|
- [x] [query string](https://developer.mozilla.org/en-US/docs/Web/API/Location/search) support (docs: [effector-storage/query](https://github.com/yumauri/effector-storage/tree/master/src/query/README.md))
|
|
492
|
+
- [x] [AsyncStorage] support (docs: [effector-storage/rn/async](https://github.com/yumauri/effector-storage/tree/master/src/rn/async/README.md))
|
|
493
|
+
- [x] [EncryptedStorage] support (docs: [effector-storage/rn/encrypted](https://github.com/yumauri/effector-storage/tree/master/src/rn/encrypted/README.md))
|
|
501
494
|
- [ ] [IndexedDB] support
|
|
502
|
-
- [ ] [AsyncStorage] support
|
|
503
495
|
- [ ] [Cookies] support
|
|
504
496
|
- [ ] you name it support
|
|
505
497
|
|
|
@@ -514,6 +506,7 @@ Use this approach with caution, beware of infinite circular updates. To avoid th
|
|
|
514
506
|
[`'storage'`]: https://developer.mozilla.org/en-US/docs/Web/API/StorageEvent
|
|
515
507
|
[indexeddb]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
|
|
516
508
|
[asyncstorage]: https://react-native-async-storage.github.io/async-storage/
|
|
509
|
+
[encryptedstorage]: https://github.com/emeraldsanto/react-native-encrypted-storage
|
|
517
510
|
[cookies]: https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
|
|
518
511
|
[_subscription_]: https://effector.dev/docs/glossary#subscription
|
|
519
512
|
[_effect_]: https://effector.dev/docs/api/effector/effect
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";exports.asyncStorage=function({storage:e,serialize:t=JSON.stringify,deserialize:a=JSON.parse}){var r=r=>({async get(){var t=await e.getItem(r);return null===t?void 0:a(t)},async set(a){await e.setItem(r,t(a))}});return r.keyArea=e,r};
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { StorageAdapter } from '..'
|
|
2
|
+
|
|
3
|
+
interface AsyncStorage {
|
|
4
|
+
getItem: (key: string) => Promise<string | null>
|
|
5
|
+
setItem: (key: string, value: string) => Promise<void>
|
|
6
|
+
}
|
|
7
|
+
interface AsyncStorageConfig {
|
|
8
|
+
storage: AsyncStorage
|
|
9
|
+
serialize?: (value: any) => string
|
|
10
|
+
deserialize?: (value: string) => any
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generic `AsyncStorage` adapter factory
|
|
14
|
+
*/
|
|
15
|
+
declare function asyncStorage({
|
|
16
|
+
storage,
|
|
17
|
+
serialize,
|
|
18
|
+
deserialize,
|
|
19
|
+
}: AsyncStorageConfig): StorageAdapter
|
|
20
|
+
|
|
21
|
+
export { AsyncStorage, AsyncStorageConfig, asyncStorage }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/async-storage/index.ts"],"sourcesContent":["import type { StorageAdapter } from '..'\n\nexport interface AsyncStorage {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<void>\n}\n\nexport interface AsyncStorageConfig {\n storage: AsyncStorage\n serialize?: (value: any) => string\n deserialize?: (value: string) => any\n}\n\n/**\n * Generic `AsyncStorage` adapter factory\n */\nexport function asyncStorage({\n storage,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n}: AsyncStorageConfig): StorageAdapter {\n const adapter: StorageAdapter = <State>(key: string) => ({\n async get() {\n const item = await storage.getItem(key)\n return item === null ? undefined : deserialize(item)\n },\n\n async set(value: State) {\n await storage.setItem(key, serialize(value))\n },\n })\n\n adapter.keyArea = storage\n return adapter\n}\n"],"names":["storage","serialize","JSON","stringify","deserialize","parse","adapter","key","async","item","getItem","undefined","value","setItem","keyArea"],"mappings":"kCAgBO,UAAsBA,QAC3BA,EAD2BC,UAE3BA,EAAYC,KAAKC,UAFUC,YAG3BA,EAAcF,KAAKG,QAEnB,IAAMC,EAAkCC,IAAiB,CACvDC,YACE,IAAMC,QAAaT,EAAQU,QAAQH,GACnC,OAAgB,OAATE,OAAgBE,EAAYP,EAAYK,EAHM,EAMvDD,UAAUI,SACFZ,EAAQa,QAAQN,EAAKN,EAAUW,GACtC,IAIH,OADAN,EAAQQ,QAAUd,EACXM,CACR"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { StorageAdapter } from '..'
|
|
2
|
+
|
|
3
|
+
interface AsyncStorage {
|
|
4
|
+
getItem: (key: string) => Promise<string | null>
|
|
5
|
+
setItem: (key: string, value: string) => Promise<void>
|
|
6
|
+
}
|
|
7
|
+
interface AsyncStorageConfig {
|
|
8
|
+
storage: AsyncStorage
|
|
9
|
+
serialize?: (value: any) => string
|
|
10
|
+
deserialize?: (value: string) => any
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generic `AsyncStorage` adapter factory
|
|
14
|
+
*/
|
|
15
|
+
declare function asyncStorage({
|
|
16
|
+
storage,
|
|
17
|
+
serialize,
|
|
18
|
+
deserialize,
|
|
19
|
+
}: AsyncStorageConfig): StorageAdapter
|
|
20
|
+
|
|
21
|
+
export { AsyncStorage, AsyncStorageConfig, asyncStorage }
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flowtype definitions for index
|
|
3
|
+
* Generated by Flowgen from a Typescript Definition
|
|
4
|
+
* Flowgen v1.20.1
|
|
5
|
+
* @flow
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { StorageAdapter } from '..'
|
|
9
|
+
declare interface AsyncStorage {
|
|
10
|
+
getItem: (key: string) => Promise<string | null>;
|
|
11
|
+
setItem: (key: string, value: string) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
declare interface AsyncStorageConfig {
|
|
14
|
+
storage: AsyncStorage;
|
|
15
|
+
serialize?: (value: any) => string;
|
|
16
|
+
deserialize?: (value: string) => any;
|
|
17
|
+
}
|
|
18
|
+
declare function asyncStorage(x: AsyncStorageConfig): StorageAdapter
|
|
19
|
+
declare export { AsyncStorage, AsyncStorageConfig, asyncStorage }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/async-storage/index.ts"],"sourcesContent":["import type { StorageAdapter } from '..'\n\nexport interface AsyncStorage {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<void>\n}\n\nexport interface AsyncStorageConfig {\n storage: AsyncStorage\n serialize?: (value: any) => string\n deserialize?: (value: string) => any\n}\n\n/**\n * Generic `AsyncStorage` adapter factory\n */\nexport function asyncStorage({\n storage,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n}: AsyncStorageConfig): StorageAdapter {\n const adapter: StorageAdapter = <State>(key: string) => ({\n async get() {\n const item = await storage.getItem(key)\n return item === null ? undefined : deserialize(item)\n },\n\n async set(value: State) {\n await storage.setItem(key, serialize(value))\n },\n })\n\n adapter.keyArea = storage\n return adapter\n}\n"],"names":["asyncStorage","storage","serialize","JSON","stringify","deserialize","parse","adapter","key","async","item","getItem","undefined","value","setItem","keyArea"],"mappings":"AAgBO,SAASA,GAAaC,QAC3BA,EAD2BC,UAE3BA,EAAYC,KAAKC,UAFUC,YAG3BA,EAAcF,KAAKG,QAEnB,IAAMC,EAAkCC,IAAiB,CACvDC,YACE,IAAMC,QAAaT,EAAQU,QAAQH,GACnC,OAAgB,OAATE,OAAgBE,EAAYP,EAAYK,EAHM,EAMvDD,UAAUI,SACFZ,EAAQa,QAAQN,EAAKN,EAAUW,GACtC,IAIH,OADAN,EAAQQ,QAAUd,EACXM,CACR"}
|
|
File without changes
|
package/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("effector"),r=new Map,t=e.createEvent();function o(o){return a=>function({adapter:o,
|
|
1
|
+
"use strict";var e=require("effector"),r=new Map,t=e.createEvent();function o(o){return a=>function({adapter:o,store:a,source:i=a,target:f=a,clock:s=i,done:n,fail:d=t,finally:u,pickup:c,key:l,keyPrefix:p=""}){if(!o)throw Error("Adapter is not defined");if(!i)throw Error("Store or source is not defined");if(!f)throw Error("Target is not defined");if(!l&&i.shortName===i.id)throw Error("Key or name is not defined");if(i===f&&!e.is.store(i))throw Error("Source must be different from target");var v=l||i.shortName,y=function(t,o){var a=r.get(t);void 0===a&&(a=new Map,r.set(t,a));var i=a.get(o);return void 0!==i||(i=e.createStore(null,{serialize:"ignore"}),a.set(o,i)),i}(o.keyArea||o,p+v),k=e.createNode(),m=()=>e.clearNode(k),w=e=>({status:r,params:t,result:o,error:a})=>"done"===r?{status:r,key:v,keyPrefix:p,operation:e,value:"get"===e?o:t}:{status:r,key:v,keyPrefix:p,operation:e,value:t,error:a};return e.withRegion(k,(()=>{var r=e.createEffect(),t=e.createEffect(),a=e.createEvent(),l=a.filterMap((({status:e,key:r,keyPrefix:t,operation:o,value:a})=>"done"===e?{key:r,keyPrefix:t,operation:o,value:a}:void 0)),k=a.filterMap((({status:e,key:r,keyPrefix:t,operation:o,error:a,value:i})=>"fail"===e?{key:r,keyPrefix:t,operation:o,error:a,value:i}:void 0)),m=o(p+v,r);r.use(m.get),t.use(m.set);var g=e.createEvent();e.sample({source:i,clock:s,target:g}),e.guard({source:e.sample(y,g,((e,r)=>[r,e])),filter:([e,r])=>e!==r,target:t.prepend((([e])=>e))}),e.forward({from:[r.doneData,t],to:y}),e.forward({from:[r.doneData,y],to:f}),e.forward({from:[r.finally.map(w("get")),t.finally.map(w("set"))],to:a}),e.forward({from:k,to:d}),n&&e.forward({from:l,to:n}),u&&e.forward({from:a,to:u}),c?e.forward({from:c,to:r.prepend((()=>{}))}):r()})),m.unsubscribe=m}({...o,...a})}t.watch((e=>console.error(e.error)));var a=o();exports.createPersist=o,exports.persist=a;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/area.ts","../src/persist.ts","../src/index.ts"],"sourcesContent":["import type { Store } from 'effector'\nimport { createStore } from 'effector'\n\n/**\n * Keys areas / namespaces cache\n */\nconst areas = new Map<any, Map<string, Store<any>>>()\n\n/**\n * Get store, responsible for the key in key area / namespace\n */\nexport function getAreaStorage<State>(keyArea: any, key: string): Store<State> {\n let area = areas.get(keyArea)\n if (area === undefined) {\n area = new Map()\n areas.set(keyArea, area)\n }\n\n let store = area.get(key)\n if (store !== undefined) {\n return store\n }\n\n store = createStore(null)\n area.set(key, store)\n\n return store\n}\n","import type { Subscription } from 'effector'\nimport type {\n ConfigPersist,\n ConfigSourceTarget,\n ConfigStore,\n Done,\n Fail,\n Finally,\n} from './types'\nimport {\n clearNode,\n createEffect,\n createEvent,\n createNode,\n forward,\n guard,\n is,\n sample,\n withRegion,\n} from 'effector'\nimport { getAreaStorage } from './area'\n\n/**\n * Default sink for unhandled errors\n */\nconst sink = createEvent<Fail<any>>()\nsink.watch((payload) => console.error(payload.error))\n\n/**\n * Main `persist` function\n */\nexport function persist<State, Err = Error>({\n adapter,\n
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/area.ts","../src/persist.ts","../src/index.ts"],"sourcesContent":["import type { Store } from 'effector'\nimport { createStore } from 'effector'\n\n/**\n * Keys areas / namespaces cache\n */\nconst areas = new Map<any, Map<string, Store<any>>>()\n\n/**\n * Get store, responsible for the key in key area / namespace\n */\nexport function getAreaStorage<State>(keyArea: any, key: string): Store<State> {\n let area = areas.get(keyArea)\n if (area === undefined) {\n area = new Map()\n areas.set(keyArea, area)\n }\n\n let store = area.get(key)\n if (store !== undefined) {\n return store\n }\n\n // @ts-expect-error due to old typings in import\n store = createStore(null, { serialize: 'ignore' })\n area.set(key, store)\n\n return store\n}\n","import type { Subscription } from 'effector'\nimport type {\n ConfigPersist,\n ConfigSourceTarget,\n ConfigStore,\n Done,\n Fail,\n Finally,\n} from './types'\nimport {\n clearNode,\n createEffect,\n createEvent,\n createNode,\n forward,\n guard,\n is,\n sample,\n withRegion,\n} from 'effector'\nimport { getAreaStorage } from './area'\n\n/**\n * Default sink for unhandled errors\n */\nconst sink = createEvent<Fail<any>>()\nsink.watch((payload) => console.error(payload.error))\n\n/**\n * Main `persist` function\n */\nexport function persist<State, Err = Error>({\n adapter,\n store,\n source = store,\n target = store,\n clock = source,\n done,\n fail = sink,\n finally: anyway,\n pickup,\n key: keyName,\n keyPrefix = '',\n}: Partial<\n ConfigPersist & ConfigStore<State, Err> & ConfigSourceTarget<State, Err>\n>): Subscription {\n if (!adapter) {\n throw Error('Adapter is not defined')\n }\n if (!source) {\n throw Error('Store or source is not defined')\n }\n if (!target) {\n throw Error('Target is not defined')\n }\n if (!keyName && source.shortName === (source as any).id) {\n throw Error('Key or name is not defined')\n }\n if (source === target && !is.store(source)) {\n throw Error('Source must be different from target')\n }\n\n const key = keyName || source.shortName\n const storage = getAreaStorage<State>(\n adapter.keyArea || adapter,\n keyPrefix + key\n )\n const region = createNode()\n const desist = () => clearNode(region)\n\n const op =\n (operation: 'get' | 'set') =>\n ({ status, params, result, error }: any): any =>\n status === 'done'\n ? {\n status,\n key,\n keyPrefix,\n operation,\n value: operation === 'get' ? result : params,\n }\n : {\n status,\n key,\n keyPrefix,\n operation,\n value: params,\n error,\n }\n\n // create all auxiliary units and nodes within the region,\n // to be able to remove them all at once on unsubscription\n withRegion(region, () => {\n const getFx = createEffect<void, State, Err>()\n const setFx = createEffect<State, void, Err>()\n\n const localAnyway = createEvent<Finally<State, Err>>()\n const localDone = localAnyway.filterMap<Done<State>>(\n ({ status, key, keyPrefix, operation, value }) =>\n status === 'done' ? { key, keyPrefix, operation, value } : undefined\n )\n const localFail = localAnyway.filterMap<Fail<Err>>(\n ({ status, key, keyPrefix, operation, error, value }: any) =>\n status === 'fail'\n ? { key, keyPrefix, operation, error, value }\n : undefined\n )\n\n const value = adapter<State>(keyPrefix + key, getFx)\n getFx.use(value.get)\n setFx.use(value.set)\n\n const trigger = createEvent<State>()\n sample({\n source,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n clock: clock!, // `clock` is always defined, as long as `source` is defined\n target: trigger,\n })\n\n guard({\n source: sample<State, State, [State, State]>(\n storage,\n trigger,\n (current, proposed) => [proposed, current]\n ),\n filter: ([proposed, current]) => proposed !== current,\n target: setFx.prepend<[State, State]>(([proposed]) => proposed),\n })\n forward({ from: [getFx.doneData, setFx], to: storage })\n forward({ from: [getFx.doneData, storage], to: target })\n forward({\n from: [getFx.finally.map(op('get')), setFx.finally.map(op('set'))],\n to: localAnyway,\n })\n\n forward({ from: localFail, to: fail })\n if (done) forward({ from: localDone, to: done })\n if (anyway) forward({ from: localAnyway, to: anyway })\n\n if (pickup) {\n // pick up value from storage ONLY on `pickup` update\n forward({ from: pickup, to: getFx.prepend(() => undefined) })\n } else {\n // kick getter to pick up initial value from storage\n getFx()\n }\n })\n\n return (desist.unsubscribe = desist)\n}\n","import type { ConfigPersist, Persist } from './types'\nimport { persist as base } from './persist'\n\nexport type {\n ConfigPersist,\n ConfigSourceTarget,\n ConfigStore,\n Done,\n Fail,\n Finally,\n Persist,\n StorageAdapter,\n} from './types'\n\n/**\n * Creates custom `persist`\n */\nexport function createPersist(defaults?: ConfigPersist): Persist {\n return (config) => base({ ...defaults, ...config })\n}\n\n/**\n * Default `persist`\n */\nexport const persist = createPersist()\n"],"names":["areas","Map","sink","createEvent","createPersist","defaults","config","adapter","store","source","target","clock","done","fail","finally","anyway","pickup","key","keyName","keyPrefix","Error","shortName","id","is","storage","keyArea","area","get","undefined","set","createStore","serialize","getAreaStorage","region","createNode","desist","clearNode","op","operation","status","params","result","error","value","withRegion","getFx","createEffect","setFx","localAnyway","localDone","filterMap","localFail","use","trigger","sample","guard","current","proposed","filter","prepend","forward","from","doneData","to","map","unsubscribe","base","watch","payload","console","persist"],"mappings":"uCAMMA,EAAQ,IAAIC,ICmBZC,EAAOC,EAAWA,cCRjB,SAASC,EAAcC,GAC5B,OAAQC,GDaH,UAAqCC,QAC1CA,EAD0CC,MAE1CA,EAF0CC,OAG1CA,EAASD,EAHiCE,OAI1CA,EAASF,EAJiCG,MAK1CA,EAAQF,EALkCG,KAM1CA,EAN0CC,KAO1CA,EAAOX,EACPY,QAASC,EARiCC,OAS1CA,EACAC,IAAKC,EAVqCC,UAW1CA,EAAY,KAIZ,IAAKZ,EACH,MAAMa,MAAM,0BAEd,IAAKX,EACH,MAAMW,MAAM,kCAEd,IAAKV,EACH,MAAMU,MAAM,yBAEd,IAAKF,GAAWT,EAAOY,YAAeZ,EAAea,GACnD,MAAMF,MAAM,8BAEd,GAAIX,IAAWC,IAAWa,EAAEA,GAACf,MAAMC,GACjC,MAAMW,MAAM,wCAGd,IAAMH,EAAMC,GAAWT,EAAOY,UACxBG,EDpDD,SAA+BC,EAAcR,GAClD,IAAIS,EAAO1B,EAAM2B,IAAIF,QACRG,IAATF,IACFA,EAAO,IAAIzB,IACXD,EAAM6B,IAAIJ,EAASC,IAGrB,IAAIlB,EAAQkB,EAAKC,IAAIV,GACrB,YAAcW,IAAVpB,IAKJA,EAAQsB,EAAWA,YAAC,KAAM,CAAEC,UAAW,WACvCL,EAAKG,IAAIZ,EAAKT,IALLA,CAQV,CCmCiBwB,CACdzB,EAAQkB,SAAWlB,EACnBY,EAAYF,GAERgB,EAASC,EAAAA,aACTC,EAAS,IAAMC,YAAUH,GAEzBI,EACHC,GACD,EAAGC,SAAQC,SAAQC,SAAQC,WACd,SAAXH,EACI,CACEA,SACAtB,MACAE,YACAmB,YACAK,MAAqB,QAAdL,EAAsBG,EAASD,GAExC,CACED,SACAtB,MACAE,YACAmB,YACAK,MAAOH,EACPE,SA8DV,OAzDAE,EAAUA,WAACX,GAAQ,KACjB,IAAMY,EAAQC,EAAAA,eACRC,EAAQD,EAAAA,eAERE,EAAc7C,EAAAA,cACd8C,EAAYD,EAAYE,WAC5B,EAAGX,SAAQtB,MAAKE,YAAWmB,YAAWK,WACzB,SAAXJ,EAAoB,CAAEtB,MAAKE,YAAWmB,YAAWK,cAAUf,IAEzDuB,EAAYH,EAAYE,WAC5B,EAAGX,SAAQtB,MAAKE,YAAWmB,YAAWI,QAAOC,WAChC,SAAXJ,EACI,CAAEtB,MAAKE,YAAWmB,YAAWI,QAAOC,cACpCf,IAGFe,EAAQpC,EAAeY,EAAYF,EAAK4B,GAC9CA,EAAMO,IAAIT,EAAMhB,KAChBoB,EAAMK,IAAIT,EAAMd,KAEhB,IAAMwB,EAAUlD,EAAAA,cAChBmD,SAAO,CACL7C,SAEAE,MAAOA,EACPD,OAAQ2C,IAGVE,QAAM,CACJ9C,OAAQ6C,EAAAA,OACN9B,EACA6B,GACA,CAACG,EAASC,IAAa,CAACA,EAAUD,KAEpCE,OAAQ,EAAED,EAAUD,KAAaC,IAAaD,EAC9C9C,OAAQqC,EAAMY,SAAwB,EAAEF,KAAcA,MAExDG,UAAQ,CAAEC,KAAM,CAAChB,EAAMiB,SAAUf,GAAQgB,GAAIvC,IAC7CoC,UAAQ,CAAEC,KAAM,CAAChB,EAAMiB,SAAUtC,GAAUuC,GAAIrD,IAC/CkD,UAAQ,CACNC,KAAM,CAAChB,EAAM/B,QAAQkD,IAAI3B,EAAG,QAASU,EAAMjC,QAAQkD,IAAI3B,EAAG,SAC1D0B,GAAIf,IAGNY,UAAQ,CAAEC,KAAMV,EAAWY,GAAIlD,IAC3BD,GAAMgD,EAAAA,QAAQ,CAAEC,KAAMZ,EAAWc,GAAInD,IACrCG,GAAQ6C,EAAAA,QAAQ,CAAEC,KAAMb,EAAae,GAAIhD,IAEzCC,EAEF4C,UAAQ,CAAEC,KAAM7C,EAAQ+C,GAAIlB,EAAMc,SAAQ,KAAd,MAG5Bd,GACD,IAGKV,EAAO8B,YAAc9B,CAC9B,CCpIoB+B,CAAK,IAAK7D,KAAaC,GAC3C,CDODJ,EAAKiE,OAAOC,GAAYC,QAAQ3B,MAAM0B,EAAQ1B,SCFjC4B,IAAAA,EAAUlE"}
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createStore as e,createEvent as r,is as o,createNode as t,
|
|
1
|
+
import{createStore as e,createEvent as r,is as o,createNode as t,withRegion as a,createEffect as i,sample as n,guard as f,forward as s,clearNode as u}from"effector";var l=new Map,d=r();function p(p){return y=>function({adapter:p,store:y,source:k=y,target:c=y,clock:m=k,done:v,fail:g=d,finally:h,pickup:w,key:x,keyPrefix:P=""}){if(!p)throw Error("Adapter is not defined");if(!k)throw Error("Store or source is not defined");if(!c)throw Error("Target is not defined");if(!x&&k.shortName===k.id)throw Error("Key or name is not defined");if(k===c&&!o.store(k))throw Error("Source must be different from target");var E=x||k.shortName,M=function(r,o){var t=l.get(r);void 0===t&&(t=new Map,l.set(r,t));var a=t.get(o);return void 0!==a||(a=e(null,{serialize:"ignore"}),t.set(o,a)),a}(p.keyArea||p,P+E),b=t(),A=()=>u(b),D=e=>({status:r,params:o,result:t,error:a})=>"done"===r?{status:r,key:E,keyPrefix:P,operation:e,value:"get"===e?t:o}:{status:r,key:E,keyPrefix:P,operation:e,value:o,error:a};return a(b,(()=>{var e=i(),o=i(),t=r(),a=t.filterMap((({status:e,key:r,keyPrefix:o,operation:t,value:a})=>"done"===e?{key:r,keyPrefix:o,operation:t,value:a}:void 0)),u=t.filterMap((({status:e,key:r,keyPrefix:o,operation:t,error:a,value:i})=>"fail"===e?{key:r,keyPrefix:o,operation:t,error:a,value:i}:void 0)),l=p(P+E,e);e.use(l.get),o.use(l.set);var d=r();n({source:k,clock:m,target:d}),f({source:n(M,d,((e,r)=>[r,e])),filter:([e,r])=>e!==r,target:o.prepend((([e])=>e))}),s({from:[e.doneData,o],to:M}),s({from:[e.doneData,M],to:c}),s({from:[e.finally.map(D("get")),o.finally.map(D("set"))],to:t}),s({from:u,to:g}),v&&s({from:a,to:v}),h&&s({from:t,to:h}),w?s({from:w,to:e.prepend((()=>{}))}):e()})),A.unsubscribe=A}({...p,...y})}d.watch((e=>console.error(e.error)));var y=p();export{p as createPersist,y as persist};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/index.js.flow
CHANGED
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/area.ts","../src/persist.ts","../src/index.ts"],"sourcesContent":["import type { Store } from 'effector'\nimport { createStore } from 'effector'\n\n/**\n * Keys areas / namespaces cache\n */\nconst areas = new Map<any, Map<string, Store<any>>>()\n\n/**\n * Get store, responsible for the key in key area / namespace\n */\nexport function getAreaStorage<State>(keyArea: any, key: string): Store<State> {\n let area = areas.get(keyArea)\n if (area === undefined) {\n area = new Map()\n areas.set(keyArea, area)\n }\n\n let store = area.get(key)\n if (store !== undefined) {\n return store\n }\n\n store = createStore(null)\n area.set(key, store)\n\n return store\n}\n","import type { Subscription } from 'effector'\nimport type {\n ConfigPersist,\n ConfigSourceTarget,\n ConfigStore,\n Done,\n Fail,\n Finally,\n} from './types'\nimport {\n clearNode,\n createEffect,\n createEvent,\n createNode,\n forward,\n guard,\n is,\n sample,\n withRegion,\n} from 'effector'\nimport { getAreaStorage } from './area'\n\n/**\n * Default sink for unhandled errors\n */\nconst sink = createEvent<Fail<any>>()\nsink.watch((payload) => console.error(payload.error))\n\n/**\n * Main `persist` function\n */\nexport function persist<State, Err = Error>({\n adapter,\n
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/area.ts","../src/persist.ts","../src/index.ts"],"sourcesContent":["import type { Store } from 'effector'\nimport { createStore } from 'effector'\n\n/**\n * Keys areas / namespaces cache\n */\nconst areas = new Map<any, Map<string, Store<any>>>()\n\n/**\n * Get store, responsible for the key in key area / namespace\n */\nexport function getAreaStorage<State>(keyArea: any, key: string): Store<State> {\n let area = areas.get(keyArea)\n if (area === undefined) {\n area = new Map()\n areas.set(keyArea, area)\n }\n\n let store = area.get(key)\n if (store !== undefined) {\n return store\n }\n\n // @ts-expect-error due to old typings in import\n store = createStore(null, { serialize: 'ignore' })\n area.set(key, store)\n\n return store\n}\n","import type { Subscription } from 'effector'\nimport type {\n ConfigPersist,\n ConfigSourceTarget,\n ConfigStore,\n Done,\n Fail,\n Finally,\n} from './types'\nimport {\n clearNode,\n createEffect,\n createEvent,\n createNode,\n forward,\n guard,\n is,\n sample,\n withRegion,\n} from 'effector'\nimport { getAreaStorage } from './area'\n\n/**\n * Default sink for unhandled errors\n */\nconst sink = createEvent<Fail<any>>()\nsink.watch((payload) => console.error(payload.error))\n\n/**\n * Main `persist` function\n */\nexport function persist<State, Err = Error>({\n adapter,\n store,\n source = store,\n target = store,\n clock = source,\n done,\n fail = sink,\n finally: anyway,\n pickup,\n key: keyName,\n keyPrefix = '',\n}: Partial<\n ConfigPersist & ConfigStore<State, Err> & ConfigSourceTarget<State, Err>\n>): Subscription {\n if (!adapter) {\n throw Error('Adapter is not defined')\n }\n if (!source) {\n throw Error('Store or source is not defined')\n }\n if (!target) {\n throw Error('Target is not defined')\n }\n if (!keyName && source.shortName === (source as any).id) {\n throw Error('Key or name is not defined')\n }\n if (source === target && !is.store(source)) {\n throw Error('Source must be different from target')\n }\n\n const key = keyName || source.shortName\n const storage = getAreaStorage<State>(\n adapter.keyArea || adapter,\n keyPrefix + key\n )\n const region = createNode()\n const desist = () => clearNode(region)\n\n const op =\n (operation: 'get' | 'set') =>\n ({ status, params, result, error }: any): any =>\n status === 'done'\n ? {\n status,\n key,\n keyPrefix,\n operation,\n value: operation === 'get' ? result : params,\n }\n : {\n status,\n key,\n keyPrefix,\n operation,\n value: params,\n error,\n }\n\n // create all auxiliary units and nodes within the region,\n // to be able to remove them all at once on unsubscription\n withRegion(region, () => {\n const getFx = createEffect<void, State, Err>()\n const setFx = createEffect<State, void, Err>()\n\n const localAnyway = createEvent<Finally<State, Err>>()\n const localDone = localAnyway.filterMap<Done<State>>(\n ({ status, key, keyPrefix, operation, value }) =>\n status === 'done' ? { key, keyPrefix, operation, value } : undefined\n )\n const localFail = localAnyway.filterMap<Fail<Err>>(\n ({ status, key, keyPrefix, operation, error, value }: any) =>\n status === 'fail'\n ? { key, keyPrefix, operation, error, value }\n : undefined\n )\n\n const value = adapter<State>(keyPrefix + key, getFx)\n getFx.use(value.get)\n setFx.use(value.set)\n\n const trigger = createEvent<State>()\n sample({\n source,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n clock: clock!, // `clock` is always defined, as long as `source` is defined\n target: trigger,\n })\n\n guard({\n source: sample<State, State, [State, State]>(\n storage,\n trigger,\n (current, proposed) => [proposed, current]\n ),\n filter: ([proposed, current]) => proposed !== current,\n target: setFx.prepend<[State, State]>(([proposed]) => proposed),\n })\n forward({ from: [getFx.doneData, setFx], to: storage })\n forward({ from: [getFx.doneData, storage], to: target })\n forward({\n from: [getFx.finally.map(op('get')), setFx.finally.map(op('set'))],\n to: localAnyway,\n })\n\n forward({ from: localFail, to: fail })\n if (done) forward({ from: localDone, to: done })\n if (anyway) forward({ from: localAnyway, to: anyway })\n\n if (pickup) {\n // pick up value from storage ONLY on `pickup` update\n forward({ from: pickup, to: getFx.prepend(() => undefined) })\n } else {\n // kick getter to pick up initial value from storage\n getFx()\n }\n })\n\n return (desist.unsubscribe = desist)\n}\n","import type { ConfigPersist, Persist } from './types'\nimport { persist as base } from './persist'\n\nexport type {\n ConfigPersist,\n ConfigSourceTarget,\n ConfigStore,\n Done,\n Fail,\n Finally,\n Persist,\n StorageAdapter,\n} from './types'\n\n/**\n * Creates custom `persist`\n */\nexport function createPersist(defaults?: ConfigPersist): Persist {\n return (config) => base({ ...defaults, ...config })\n}\n\n/**\n * Default `persist`\n */\nexport const persist = createPersist()\n"],"names":["areas","Map","sink","createEvent","createPersist","defaults","config","adapter","store","source","target","clock","done","fail","finally","anyway","pickup","key","keyName","keyPrefix","Error","shortName","id","is","storage","keyArea","area","get","undefined","set","createStore","serialize","getAreaStorage","region","createNode","desist","clearNode","op","operation","status","params","result","error","value","withRegion","getFx","createEffect","setFx","localAnyway","localDone","filterMap","localFail","use","trigger","sample","guard","current","proposed","filter","prepend","forward","from","doneData","to","map","unsubscribe","base","watch","payload","console","persist"],"mappings":"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"}
|
package/local/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
1
|
+
"use strict";var e=require("../index.cjs"),r=require("../nil/index.cjs"),t=require("../storage/index.cjs");function s(){try{return"undefined"!=typeof localStorage}catch(e){return!1}}function i(i){return n=>e.persist({adapter:s()?t.storage({storage:localStorage,sync:!0,...i,...n}):r.nil("local"),...i,...n})}var n=i();exports.createPersist=i,exports.persist=n;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/local/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/local/index.ts"],"sourcesContent":["import type { Subscription } from 'effector'\nimport type {\n ConfigPersist as BaseConfigPersist,\n ConfigCommon,\n ConfigJustStore,\n ConfigJustSourceTarget,\n} from '../types'\nimport { persist as base } from '../persist'\nimport { nil } from '../nil'\nimport { storage } from '../storage'\n\nexport type { Done, Fail, Finally, StorageAdapter } from '../types'\n\nexport interface ConfigPersist extends BaseConfigPersist {\n sync?: boolean\n}\n\nexport interface AdapterConfig {\n sync?: boolean\n serialize?: (value: any) => string\n deserialize?: (value: string) => any\n}\n\nexport interface ConfigStore<State, Err = Error>\n extends AdapterConfig,\n ConfigCommon<State, Err>,\n ConfigJustStore<State> {}\n\nexport interface ConfigSourceTarget<State, Err = Error>\n extends AdapterConfig,\n ConfigCommon<State, Err>,\n ConfigJustSourceTarget<State> {}\n\nexport interface Persist {\n <State, Err = Error>(config: ConfigSourceTarget<State, Err>): Subscription\n <State, Err = Error>(config: ConfigStore<State, Err>): Subscription\n}\n\n/**\n * Function, checking if `localStorage` exists and accessible\n */\nfunction supports() {\n try {\n return typeof localStorage !== 'undefined'\n } catch (error) {\n return false // should somehow return error instance?\n }\n}\n\n/**\n * Creates custom partially applied `persist`\n * with predefined `localStorage` adapter\n */\nexport function createPersist(defaults?: ConfigPersist): Persist {\n return (config) =>\n base({\n adapter: supports()\n ? storage({\n storage: localStorage,\n sync: true,\n ...defaults,\n ...config,\n })\n : nil('local'),\n ...defaults,\n ...config,\n })\n}\n\n/**\n * Default partially applied `persist`\n */\nexport const persist = createPersist()\n"],"names":["supports","localStorage","error","createPersist","defaults","config","base","adapter","storage","sync","nil","persist"],"mappings":"2GAyCA,SAASA,IACP,IACE,MAA+B,oBAAjBC,YAGf,CAFC,MAAOC,GACP,OAAO,CACR,CACF,CAMM,SAASC,EAAcC,GAC5B,OAAQC,GACNC,EAAAA,QAAK,CACHC,QAASP,IACLQ,UAAQ,CACNA,QAASP,aACTQ,MAAM,KACHL,KACAC,IAELK,EAAGA,IAAC,YACLN,KACAC,GAER,CAKYM,IAAAA,EAAUR"}
|
package/local/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{persist as r}from"../index.js";import{nil as t}from"../nil/index.js";import{storage as o}from"../storage/index.js";function e(){try{return"undefined"!=typeof localStorage}catch(r){return!1}}function n(n){return a=>r({adapter:e()?o({storage:localStorage,sync:!0,...n,...a}):t("local"),...n,...a})}var a=n();export{n as createPersist,a as persist};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/local/index.js.flow
CHANGED
package/local/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/local/index.ts"],"sourcesContent":["import type { Subscription } from 'effector'\nimport type {\n ConfigPersist as BaseConfigPersist,\n ConfigCommon,\n ConfigJustStore,\n ConfigJustSourceTarget,\n} from '../types'\nimport { persist as base } from '../persist'\nimport { nil } from '../nil'\nimport { storage } from '../storage'\n\nexport type { Done, Fail, Finally, StorageAdapter } from '../types'\n\nexport interface ConfigPersist extends BaseConfigPersist {\n sync?: boolean\n}\n\nexport interface AdapterConfig {\n sync?: boolean\n serialize?: (value: any) => string\n deserialize?: (value: string) => any\n}\n\nexport interface ConfigStore<State, Err = Error>\n extends AdapterConfig,\n ConfigCommon<State, Err>,\n ConfigJustStore<State> {}\n\nexport interface ConfigSourceTarget<State, Err = Error>\n extends AdapterConfig,\n ConfigCommon<State, Err>,\n ConfigJustSourceTarget<State> {}\n\nexport interface Persist {\n <State, Err = Error>(config: ConfigSourceTarget<State, Err>): Subscription\n <State, Err = Error>(config: ConfigStore<State, Err>): Subscription\n}\n\n/**\n * Function, checking if `localStorage` exists and accessible\n */\nfunction supports() {\n try {\n return typeof localStorage !== 'undefined'\n } catch (error) {\n return false // should somehow return error instance?\n }\n}\n\n/**\n * Creates custom partially applied `persist`\n * with predefined `localStorage` adapter\n */\nexport function createPersist(defaults?: ConfigPersist): Persist {\n return (config) =>\n base({\n adapter: supports()\n ? storage({\n storage: localStorage,\n sync: true,\n ...defaults,\n ...config,\n })\n : nil('local'),\n ...defaults,\n ...config,\n })\n}\n\n/**\n * Default partially applied `persist`\n */\nexport const persist = createPersist()\n"],"names":["supports","localStorage","error","createPersist","defaults","config","base","adapter","storage","sync","nil","persist"],"mappings":"0HAyCA,SAASA,IACP,IACE,MAA+B,oBAAjBC,YAGf,CAFC,MAAOC,GACP,OAAO,CACR,CACF,CAMM,SAASC,EAAcC,GAC5B,OAAQC,GACNC,EAAK,CACHC,QAASP,IACLQ,EAAQ,CACNA,QAASP,aACTQ,MAAM,KACHL,KACAC,IAELK,EAAI,YACLN,KACAC,GAER,CAKYM,IAAAA,EAAUR"}
|
package/memory/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("
|
|
1
|
+
"use strict";var e=require("../index.cjs"),t=new Map,r=e=>({get:()=>t.get(e),set:r=>t.set(e,r)});function s(t){return s=>e.persist({adapter:r,...t,...s})}var i=s();exports.createPersist=s,exports.persist=i;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|