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.
Files changed (94) hide show
  1. package/README.md +46 -53
  2. package/async-storage/index.cjs +2 -0
  3. package/async-storage/index.cjs.d.ts +21 -0
  4. package/async-storage/index.cjs.map +1 -0
  5. package/async-storage/index.d.ts +21 -0
  6. package/async-storage/index.js +2 -0
  7. package/async-storage/index.js.flow +19 -0
  8. package/async-storage/index.js.map +1 -0
  9. package/{fp → async-storage}/package.json +0 -0
  10. package/index.cjs +1 -1
  11. package/index.cjs.map +1 -1
  12. package/index.js +1 -1
  13. package/index.js.flow +1 -1
  14. package/index.js.map +1 -1
  15. package/local/index.cjs +1 -1
  16. package/local/index.cjs.map +1 -1
  17. package/local/index.js +1 -1
  18. package/local/index.js.flow +1 -1
  19. package/local/index.js.map +1 -1
  20. package/memory/index.cjs +1 -1
  21. package/memory/index.cjs.map +1 -1
  22. package/memory/index.js +1 -1
  23. package/memory/index.js.flow +1 -1
  24. package/memory/index.js.map +1 -1
  25. package/nil/index.cjs.map +1 -1
  26. package/nil/index.js.flow +1 -1
  27. package/nil/index.js.map +1 -1
  28. package/package.json +20 -26
  29. package/query/index.cjs +1 -1
  30. package/query/index.cjs.map +1 -1
  31. package/query/index.js +1 -1
  32. package/query/index.js.flow +1 -1
  33. package/query/index.js.map +1 -1
  34. package/rn/async/index.cjs +2 -0
  35. package/rn/async/index.cjs.d.ts +89 -0
  36. package/rn/async/index.cjs.map +1 -0
  37. package/rn/async/index.d.ts +89 -0
  38. package/rn/async/index.js +2 -0
  39. package/rn/async/index.js.flow +98 -0
  40. package/rn/async/index.js.map +1 -0
  41. package/{local/fp → rn/async}/package.json +0 -0
  42. package/rn/encrypted/index.cjs +2 -0
  43. package/rn/encrypted/index.cjs.d.ts +89 -0
  44. package/rn/encrypted/index.cjs.map +1 -0
  45. package/rn/encrypted/index.d.ts +89 -0
  46. package/rn/encrypted/index.js +2 -0
  47. package/rn/encrypted/index.js.flow +98 -0
  48. package/rn/encrypted/index.js.map +1 -0
  49. package/{memory/fp → rn/encrypted}/package.json +0 -0
  50. package/session/index.cjs +1 -1
  51. package/session/index.cjs.map +1 -1
  52. package/session/index.js +1 -1
  53. package/session/index.js.flow +1 -1
  54. package/session/index.js.map +1 -1
  55. package/storage/index.cjs.map +1 -1
  56. package/storage/index.js.flow +1 -1
  57. package/storage/index.js.map +1 -1
  58. package/fp/index.cjs +0 -2
  59. package/fp/index.cjs.d.ts +0 -55
  60. package/fp/index.cjs.map +0 -1
  61. package/fp/index.d.ts +0 -55
  62. package/fp/index.js +0 -2
  63. package/fp/index.js.flow +0 -76
  64. package/fp/index.js.map +0 -1
  65. package/local/fp/index.cjs +0 -2
  66. package/local/fp/index.cjs.d.ts +0 -46
  67. package/local/fp/index.cjs.map +0 -1
  68. package/local/fp/index.d.ts +0 -46
  69. package/local/fp/index.js +0 -2
  70. package/local/fp/index.js.flow +0 -63
  71. package/local/fp/index.js.map +0 -1
  72. package/memory/fp/index.cjs +0 -2
  73. package/memory/fp/index.cjs.d.ts +0 -43
  74. package/memory/fp/index.cjs.map +0 -1
  75. package/memory/fp/index.d.ts +0 -43
  76. package/memory/fp/index.js +0 -2
  77. package/memory/fp/index.js.flow +0 -64
  78. package/memory/fp/index.js.map +0 -1
  79. package/query/fp/index.cjs +0 -2
  80. package/query/fp/index.cjs.d.ts +0 -57
  81. package/query/fp/index.cjs.map +0 -1
  82. package/query/fp/index.d.ts +0 -57
  83. package/query/fp/index.js +0 -2
  84. package/query/fp/index.js.flow +0 -67
  85. package/query/fp/index.js.map +0 -1
  86. package/query/fp/package.json +0 -7
  87. package/session/fp/index.cjs +0 -2
  88. package/session/fp/index.cjs.d.ts +0 -46
  89. package/session/fp/index.cjs.map +0 -1
  90. package/session/fp/index.d.ts +0 -46
  91. package/session/fp/index.js +0 -2
  92. package/session/fp/index.js.flow +0 -63
  93. package/session/fp/index.js.map +0 -1
  94. 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
- $ yarn add effector-storage
48
- ```
51
+ # using `pnpm`
52
+ $ pnpm add effector-storage
49
53
 
50
- Or using `npm`
54
+ # using `yarn`
55
+ $ yarn add effector-storage
51
56
 
52
- ```bash
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
- ## Usage with domains
109
+ ### with React Native AsyncStorage
105
110
 
106
- You can use `persist` inside Domain's `onCreateStore` hook:
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 { createDomain } from 'effector'
110
- import { persist } from 'effector-storage/local'
114
+ import { persist } from 'effector-storage/rn/async'
111
115
 
112
- const app = createDomain('app')
116
+ // persist store `$counter` with key 'counter'
117
+ persist({ store: $counter, key: 'counter' })
113
118
 
114
- // this hook will persist every store, created in domain,
115
- // in `localStorage`, using stores' names as keys
116
- app.onCreateStore((store) => persist({ store }))
119
+ // if your storage has a name, you can omit `key` field
120
+ persist({ store: $counter })
121
+ ```
117
122
 
118
- const $store = app.createStore(0, { name: 'store' })
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
- ## Functional helpers
139
+ ⚠️ Note, that [EncryptedStorage] is asynchronous (it is based on [AsyncStorage] actually).
122
140
 
123
- ⚠️ 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>
141
+ ## Usage with domains
124
142
 
125
- There are special `persist` forms to use with functional programming style. You can use them, if you like, with Domain hook or `.thru()` store method:
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/fp'
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 force update `store` value from storage.
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'`_): Did error occurs during setting value to storage or getting value from storage.
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'`_): Did error occurs during setting value to storage or getting value from storage.
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'`_): Operation stage.
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 force update:
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 force update
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 force update `store` from storage with new value
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,2 @@
1
+ function e({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}export{e as asyncStorage};
2
+ //# sourceMappingURL=index.js.map
@@ -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,clock:a,store:i,source:f=i,target:s=i,done:n,fail:d=t,finally:u,pickup:p,key:c,keyPrefix:l=""}){if(!o)throw Error("Adapter is not defined");if(!f)throw Error("Store or source is not defined");if(!s)throw Error("Target is not defined");if(!c&&f.shortName===f.id)throw Error("Key or name is not defined");if(f===s&&!e.is.store(f))throw Error("Source must be different from target");var y=c||f.shortName,v=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),a.set(o,i)),i}(o.keyArea||o,l+y),k=e.createNode(),m=()=>e.clearNode(k),w=e=>({status:r,params:t,result:o,error:a})=>"done"===r?{status:r,key:y,keyPrefix:l,operation:e,value:o}:{status:r,key:y,keyPrefix:l,operation:e,value:t,error:a};return e.withRegion(k,(()=>{var r=e.createEffect(),t=e.createEffect(),i=e.createEvent(),c=i.filterMap((({status:e,key:r,keyPrefix:t,operation:o,value:a})=>"done"===e?{key:r,keyPrefix:t,operation:o,value:a}:void 0)),k=i.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(l+y,r);r.use(m.get),t.use(m.set),e.guard({source:e.sample(v,e.sample(f,a),((e,r)=>[r,e])),filter:([e,r])=>e!==r,target:t.prepend((([e])=>e))}),e.forward({from:[r.doneData,t],to:v}),e.forward({from:[r.doneData,v],to:s}),e.forward({from:[r.finally.map(w("get")),t.finally.map(w("set"))],to:i}),e.forward({from:k,to:d}),n&&e.forward({from:c,to:n}),u&&e.forward({from:i,to:u}),p&&e.forward({from:p,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;
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 clock,\n store,\n source = store,\n target = store,\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 ? { status, key, keyPrefix, operation, value: result }\n : { status, key, keyPrefix, operation, value: params, error }\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 guard({\n source: sample<State, State, [State, State]>(\n storage,\n (sample as any)(source, clock),\n (current: any, 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 done && forward({ from: localDone, to: done })\n anyway && forward({ from: localAnyway, to: anyway })\n\n pickup && forward({ from: pickup, to: getFx.prepend(() => undefined) })\n\n // kick getter to pick up initial value from storage\n getFx()\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","clock","store","source","target","done","fail","finally","anyway","pickup","key","keyName","keyPrefix","Error","shortName","id","is","storage","keyArea","area","get","undefined","set","createStore","getAreaStorage","region","createNode","desist","clearNode","op","operation","status","params","result","error","value","withRegion","getFx","createEffect","setFx","localAnyway","localDone","filterMap","localFail","use","guard","sample","current","proposed","filter","prepend","forward","from","doneData","to","map","unsubscribe","base","watch","payload","console","persist"],"mappings":"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"}
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":"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"}
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{createStore as e,createEvent as r,is as o,createNode as t,clearNode as a,withRegion as i,createEffect as f,guard as n,sample as s,forward as u}from"effector";var d=new Map,p=r();function l(l){return y=>function({adapter:l,clock:y,store:k,source:m=k,target:v=k,done:c,fail:g=p,finally:h,pickup:w,key:x,keyPrefix:P=""}){if(!l)throw Error("Adapter is not defined");if(!m)throw Error("Store or source is not defined");if(!v)throw Error("Target is not defined");if(!x&&m.shortName===m.id)throw Error("Key or name is not defined");if(m===v&&!o.store(m))throw Error("Source must be different from target");var E=x||m.shortName,M=function(r,o){var t=d.get(r);void 0===t&&(t=new Map,d.set(r,t));var a=t.get(o);return void 0!==a||(a=e(null),t.set(o,a)),a}(l.keyArea||l,P+E),b=t(),A=()=>a(b),D=e=>({status:r,params:o,result:t,error:a})=>"done"===r?{status:r,key:E,keyPrefix:P,operation:e,value:t}:{status:r,key:E,keyPrefix:P,operation:e,value:o,error:a};return i(b,(()=>{var e=f(),o=f(),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)),i=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)),d=l(P+E,e);e.use(d.get),o.use(d.set),n({source:s(M,s(m,y),((e,r)=>[r,e])),filter:([e,r])=>e!==r,target:o.prepend((([e])=>e))}),u({from:[e.doneData,o],to:M}),u({from:[e.doneData,M],to:v}),u({from:[e.finally.map(D("get")),o.finally.map(D("set"))],to:t}),u({from:i,to:g}),c&&u({from:a,to:c}),h&&u({from:t,to:h}),w&&u({from:w,to:e.prepend((()=>{}))}),e()})),A.unsubscribe=A}({...l,...y})}p.watch((e=>console.error(e.error)));var y=l();export{l as createPersist,y as persist};
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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Flowtype definitions for index
3
3
  * Generated by Flowgen from a Typescript Definition
4
- * Flowgen v1.14.1
4
+ * Flowgen v1.20.1
5
5
  * @flow
6
6
  */
7
7
 
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 clock,\n store,\n source = store,\n target = store,\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 ? { status, key, keyPrefix, operation, value: result }\n : { status, key, keyPrefix, operation, value: params, error }\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 guard({\n source: sample<State, State, [State, State]>(\n storage,\n (sample as any)(source, clock),\n (current: any, 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 done && forward({ from: localDone, to: done })\n anyway && forward({ from: localAnyway, to: anyway })\n\n pickup && forward({ from: pickup, to: getFx.prepend(() => undefined) })\n\n // kick getter to pick up initial value from storage\n getFx()\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","clock","store","source","target","done","fail","finally","anyway","pickup","key","keyName","keyPrefix","Error","shortName","id","is","storage","keyArea","area","get","undefined","set","createStore","getAreaStorage","region","createNode","desist","clearNode","op","operation","status","params","result","error","value","withRegion","getFx","createEffect","setFx","localAnyway","localDone","filterMap","localFail","use","guard","sample","current","proposed","filter","prepend","forward","from","doneData","to","map","unsubscribe","base","watch","payload","console","persist"],"mappings":"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"}
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("effector"),r=require("../nil/index.cjs"),t=require("../storage/index.cjs"),o=new Map,a=e.createEvent();function i(){try{return"undefined"!=typeof localStorage}catch(e){return!1}}function n(n){return f=>function({adapter:r,clock:t,store:i,source:n=i,target:f=i,done:s,fail:d=a,finally:u,pickup:c,key:l,keyPrefix:p=""}){if(!r)throw Error("Adapter is not defined");if(!n)throw Error("Store or source is not defined");if(!f)throw Error("Target is not defined");if(!l&&n.shortName===n.id)throw Error("Key or name is not defined");if(n===f&&!e.is.store(n))throw Error("Source must be different from target");var y=l||n.shortName,v=function(r,t){var a=o.get(r);void 0===a&&(a=new Map,o.set(r,a));var i=a.get(t);return void 0!==i||(i=e.createStore(null),a.set(t,i)),i}(r.keyArea||r,p+y),k=e.createNode(),m=()=>e.clearNode(k),w=e=>({status:r,params:t,result:o,error:a})=>"done"===r?{status:r,key:y,keyPrefix:p,operation:e,value:o}:{status:r,key:y,keyPrefix:p,operation:e,value:t,error:a};return e.withRegion(k,(()=>{var o=e.createEffect(),a=e.createEffect(),i=e.createEvent(),l=i.filterMap((({status:e,key:r,keyPrefix:t,operation:o,value:a})=>"done"===e?{key:r,keyPrefix:t,operation:o,value:a}:void 0)),k=i.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=r(p+y,o);o.use(m.get),a.use(m.set),e.guard({source:e.sample(v,e.sample(n,t),((e,r)=>[r,e])),filter:([e,r])=>e!==r,target:a.prepend((([e])=>e))}),e.forward({from:[o.doneData,a],to:v}),e.forward({from:[o.doneData,v],to:f}),e.forward({from:[o.finally.map(w("get")),a.finally.map(w("set"))],to:i}),e.forward({from:k,to:d}),s&&e.forward({from:l,to:s}),u&&e.forward({from:i,to:u}),c&&e.forward({from:c,to:o.prepend((()=>{}))}),o()})),m.unsubscribe=m}({adapter:i()?t.storage({storage:localStorage,sync:!0,...n,...f}):r.nil("local"),...n,...f})}a.watch((e=>console.error(e.error)));var f=n();exports.createPersist=n,exports.persist=f;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/area.ts","../../src/persist.ts","../../src/local/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 clock,\n store,\n source = store,\n target = store,\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 ? { status, key, keyPrefix, operation, value: result }\n : { status, key, keyPrefix, operation, value: params, error }\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 guard({\n source: sample<State, State, [State, State]>(\n storage,\n (sample as any)(source, clock),\n (current: any, 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 done && forward({ from: localDone, to: done })\n anyway && forward({ from: localAnyway, to: anyway })\n\n pickup && forward({ from: pickup, to: getFx.prepend(() => undefined) })\n\n // kick getter to pick up initial value from storage\n getFx()\n })\n\n return (desist.unsubscribe = desist)\n}\n","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":["areas","Map","sink","createEvent","supports","localStorage","error","createPersist","defaults","config","adapter","clock","store","source","target","done","fail","finally","anyway","pickup","key","keyName","keyPrefix","Error","shortName","id","is","storage","keyArea","area","get","undefined","set","createStore","getAreaStorage","region","createNode","desist","clearNode","op","operation","status","params","result","value","withRegion","getFx","createEffect","setFx","localAnyway","localDone","filterMap","localFail","use","guard","sample","current","proposed","filter","prepend","forward","from","doneData","to","map","unsubscribe","base","sync","nil","watch","payload","console","persist"],"mappings":"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"}
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{createStore as r,createEvent as e,is as o,createNode as t,clearNode as a,withRegion as i,createEffect as n,guard as f,sample as s,forward as u}from"effector";import{nil as l}from"../nil/index.js";import{storage as d}from"../storage/index.js";var p=new Map,y=e();function c(){try{return"undefined"!=typeof localStorage}catch(r){return!1}}function m(m){return k=>function({adapter:l,clock:d,store:c,source:m=c,target:k=c,done:v,fail:g=y,finally:x,pickup:h,key:w,keyPrefix:P=""}){if(!l)throw Error("Adapter is not defined");if(!m)throw Error("Store or source is not defined");if(!k)throw Error("Target is not defined");if(!w&&m.shortName===m.id)throw Error("Key or name is not defined");if(m===k&&!o.store(m))throw Error("Source must be different from target");var E=w||m.shortName,M=function(e,o){var t=p.get(e);void 0===t&&(t=new Map,p.set(e,t));var a=t.get(o);return void 0!==a||(a=r(null),t.set(o,a)),a}(l.keyArea||l,P+E),S=t(),b=()=>a(S),j=r=>({status:e,params:o,result:t,error:a})=>"done"===e?{status:e,key:E,keyPrefix:P,operation:r,value:t}:{status:e,key:E,keyPrefix:P,operation:r,value:o,error:a};return i(S,(()=>{var r=n(),o=n(),t=e(),a=t.filterMap((({status:r,key:e,keyPrefix:o,operation:t,value:a})=>"done"===r?{key:e,keyPrefix:o,operation:t,value:a}:void 0)),i=t.filterMap((({status:r,key:e,keyPrefix:o,operation:t,error:a,value:i})=>"fail"===r?{key:e,keyPrefix:o,operation:t,error:a,value:i}:void 0)),p=l(P+E,r);r.use(p.get),o.use(p.set),f({source:s(M,s(m,d),((r,e)=>[e,r])),filter:([r,e])=>r!==e,target:o.prepend((([r])=>r))}),u({from:[r.doneData,o],to:M}),u({from:[r.doneData,M],to:k}),u({from:[r.finally.map(j("get")),o.finally.map(j("set"))],to:t}),u({from:i,to:g}),v&&u({from:a,to:v}),x&&u({from:t,to:x}),h&&u({from:h,to:r.prepend((()=>{}))}),r()})),b.unsubscribe=b}({adapter:c()?d({storage:localStorage,sync:!0,...m,...k}):l("local"),...m,...k})}y.watch((r=>console.error(r.error)));var k=m();export{m as createPersist,k as persist};
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
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Flowtype definitions for index
3
3
  * Generated by Flowgen from a Typescript Definition
4
- * Flowgen v1.14.1
4
+ * Flowgen v1.20.1
5
5
  * @flow
6
6
  */
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/area.ts","../../src/persist.ts","../../src/local/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 clock,\n store,\n source = store,\n target = store,\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 ? { status, key, keyPrefix, operation, value: result }\n : { status, key, keyPrefix, operation, value: params, error }\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 guard({\n source: sample<State, State, [State, State]>(\n storage,\n (sample as any)(source, clock),\n (current: any, 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 done && forward({ from: localDone, to: done })\n anyway && forward({ from: localAnyway, to: anyway })\n\n pickup && forward({ from: pickup, to: getFx.prepend(() => undefined) })\n\n // kick getter to pick up initial value from storage\n getFx()\n })\n\n return (desist.unsubscribe = desist)\n}\n","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":["areas","Map","sink","createEvent","supports","localStorage","error","createPersist","defaults","config","adapter","clock","store","source","target","done","fail","finally","anyway","pickup","key","keyName","keyPrefix","Error","shortName","id","is","storage","keyArea","area","get","undefined","set","createStore","getAreaStorage","region","createNode","desist","clearNode","op","operation","status","params","result","value","withRegion","getFx","createEffect","setFx","localAnyway","localDone","filterMap","localFail","use","guard","sample","current","proposed","filter","prepend","forward","from","doneData","to","map","unsubscribe","base","sync","nil","watch","payload","console","persist"],"mappings":"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"}
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("effector"),r=new Map,t=e.createEvent();t.watch((e=>console.error(e.error)));var o=new Map,a=e=>({get:()=>o.get(e),set:r=>o.set(e,r)});function i(o){return i=>function({adapter:o,clock:a,store:i,source:f=i,target:s=i,done:n,fail:d=t,finally:u,pickup:p,key:c,keyPrefix:l=""}){if(!o)throw Error("Adapter is not defined");if(!f)throw Error("Store or source is not defined");if(!s)throw Error("Target is not defined");if(!c&&f.shortName===f.id)throw Error("Key or name is not defined");if(f===s&&!e.is.store(f))throw Error("Source must be different from target");var v=c||f.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),a.set(o,i)),i}(o.keyArea||o,l+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:l,operation:e,value:o}:{status:r,key:v,keyPrefix:l,operation:e,value:t,error:a};return e.withRegion(k,(()=>{var r=e.createEffect(),t=e.createEffect(),i=e.createEvent(),c=i.filterMap((({status:e,key:r,keyPrefix:t,operation:o,value:a})=>"done"===e?{key:r,keyPrefix:t,operation:o,value:a}:void 0)),k=i.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(l+v,r);r.use(m.get),t.use(m.set),e.guard({source:e.sample(y,e.sample(f,a),((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:s}),e.forward({from:[r.finally.map(w("get")),t.finally.map(w("set"))],to:i}),e.forward({from:k,to:d}),n&&e.forward({from:c,to:n}),u&&e.forward({from:i,to:u}),p&&e.forward({from:p,to:r.prepend((()=>{}))}),r()})),m.unsubscribe=m}({adapter:a,...o,...i})}var f=i();exports.createPersist=i,exports.persist=f;
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