@po-ui/ng-storage 5.22.3 → 6.2.0

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 (39) hide show
  1. package/README.md +16 -16
  2. package/{esm2015/lib/drivers/lokijs/po-loki-driver.js → esm2020/lib/drivers/lokijs/po-loki-driver.mjs} +209 -209
  3. package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +3 -3
  4. package/esm2020/lib/po-storage.module.mjs +33 -0
  5. package/esm2020/lib/services/po-storage-config.interface.mjs +11 -0
  6. package/esm2020/lib/services/po-storage.service.mjs +520 -0
  7. package/esm2020/po-ui-ng-storage.mjs +5 -0
  8. package/{esm2015/public-api.js → esm2020/public-api.mjs} +2 -2
  9. package/fesm2015/{po-ui-ng-storage.js → po-ui-ng-storage.mjs} +786 -774
  10. package/fesm2015/po-ui-ng-storage.mjs.map +1 -0
  11. package/fesm2020/po-ui-ng-storage.mjs +764 -0
  12. package/fesm2020/po-ui-ng-storage.mjs.map +1 -0
  13. package/lib/drivers/lokijs/po-loki-driver.d.ts +30 -30
  14. package/lib/index.d.ts +3 -3
  15. package/lib/po-storage.module.d.ts +14 -10
  16. package/lib/services/po-storage-config.interface.d.ts +27 -27
  17. package/lib/services/po-storage.service.d.ts +381 -378
  18. package/package.json +28 -13
  19. package/po-ui-ng-storage-6.2.0.tgz +0 -0
  20. package/po-ui-ng-storage.d.ts +5 -5
  21. package/public-api.d.ts +1 -1
  22. package/schematics/README.md +91 -91
  23. package/schematics/collection.json +10 -10
  24. package/schematics/ng-add/index.d.ts +7 -7
  25. package/schematics/ng-add/index.js +28 -28
  26. package/schematics/ng-add/index.js.map +1 -1
  27. package/schematics/ng-add/index.spec.d.ts +1 -1
  28. package/schematics/ng-add/index.spec.js +50 -50
  29. package/schematics/ng-add/index.spec.js.map +1 -1
  30. package/schematics/ng-add/schema.json +6 -6
  31. package/bundles/po-ui-ng-storage.umd.js +0 -1279
  32. package/bundles/po-ui-ng-storage.umd.js.map +0 -1
  33. package/esm2015/lib/po-storage.module.js +0 -29
  34. package/esm2015/lib/services/po-storage-config.interface.js +0 -11
  35. package/esm2015/lib/services/po-storage.service.js +0 -546
  36. package/esm2015/po-ui-ng-storage.js +0 -6
  37. package/fesm2015/po-ui-ng-storage.js.map +0 -1
  38. package/po-ui-ng-storage-5.22.3.tgz +0 -0
  39. package/po-ui-ng-storage.metadata.json +0 -1
@@ -1,787 +1,799 @@
1
1
  import { __awaiter } from 'tslib';
2
+ import * as i0 from '@angular/core';
2
3
  import { InjectionToken, Injectable, Inject, NgModule } from '@angular/core';
3
4
  import * as LocalForage from 'localforage';
4
5
  import IdleQueue from 'custom-idle-queue';
5
6
  import Loki from 'lokijs';
6
7
  import LokiIndexedAdapter from 'lokijs/src/loki-indexed-adapter';
7
8
 
8
- const keyField = 'key';
9
- class PoLokiDriver {
10
- constructor() {
11
- const self = this;
12
- this.driver = {
13
- _driver: 'lokijs',
14
- _initStorage: function (options) {
15
- return self.initStorage(options);
16
- },
17
- clear: function () {
18
- return self.clear(this);
19
- },
20
- getItem: function (key) {
21
- return self.getItem(this, key);
22
- },
23
- iterate: function (iteratorCallback) {
24
- return self.iterate(this, iteratorCallback);
25
- },
26
- key: function (n) {
27
- return self.key(this, n);
28
- },
29
- keys: function () {
30
- return self.keys(this);
31
- },
32
- length: function () {
33
- return self.length(this);
34
- },
35
- removeItem: function (key) {
36
- return self.removeItem(this, key);
37
- },
38
- setItem: function (key, value) {
39
- return self.setItem(this, key, value);
40
- }
41
- };
42
- }
43
- // Funções de iteração
44
- clear(localforage) {
45
- return new Promise(resolve => {
46
- localforage.ready().then(() => {
47
- if (this.hasCollectionAndDataInCollection()) {
48
- this.clearCollection();
49
- }
50
- resolve(null);
51
- });
52
- });
53
- }
54
- getItem(localforage, key) {
55
- return new Promise(resolve => {
56
- localforage.ready().then(() => {
57
- if (this.hasCollectionAndDataInCollection()) {
58
- const item = this.getItemInCollectionBy(keyField, key);
59
- if (item) {
60
- resolve(item.value);
61
- }
62
- }
63
- resolve(null);
64
- });
65
- });
66
- }
67
- initStorage(options) {
68
- return new Promise(resolve => {
69
- try {
70
- this.configureLokiStorage(options, this.databaseInitialize.bind(this, options, resolve));
71
- }
72
- catch (_a) {
73
- throw new Error(`Cannot configure Loki Storage`);
74
- }
75
- });
76
- }
77
- iterate(localforage, iteratorCallback) {
78
- return new Promise(resolve => {
79
- localforage.ready().then(() => {
80
- if (this.hasCollectionAndDataInCollection()) {
81
- this.iterateWithDataItem(iteratorCallback);
82
- }
83
- resolve(null);
84
- });
85
- });
86
- }
87
- key(localforage, n) {
88
- return new Promise(resolve => {
89
- localforage.ready().then(() => {
90
- if (this.hasCollection()) {
91
- const map = this.getLokiMap();
92
- resolve(map[n]);
93
- }
94
- resolve(null);
95
- });
96
- });
97
- }
98
- keys(localforage) {
99
- return new Promise(resolve => {
100
- localforage.ready().then(() => {
101
- if (this.hasCollection()) {
102
- const keys = [];
103
- const map = this.getLokiMap();
104
- for (const key of Object.keys(map)) {
105
- keys.push(map[key]);
106
- }
107
- resolve(keys);
108
- }
109
- resolve(null);
110
- });
111
- });
112
- }
113
- length(localforage) {
114
- return new Promise(resolve => {
115
- localforage.ready().then(() => {
116
- if (this.hasCollection()) {
117
- resolve(this.getNumberItensInCollection());
118
- }
119
- resolve(0);
120
- });
121
- });
122
- }
123
- removeItem(localforage, key) {
124
- return new Promise(resolve => {
125
- localforage.ready().then(() => {
126
- if (this.hasCollection()) {
127
- this.findAndRemoveItem(key);
128
- }
129
- resolve(null);
130
- });
131
- });
132
- }
133
- setItem(localforage, key, value) {
134
- return new Promise(resolve => {
135
- localforage.ready().then(() => {
136
- if (this.hasCollection()) {
137
- let item;
138
- if (this.hasDataInCollection()) {
139
- item = this.getItemInCollectionBy(keyField, key);
140
- }
141
- this.insertOrUpdate(item, value, key);
142
- }
143
- resolve(value);
144
- });
145
- });
146
- }
147
- // Funções de acesso ao storage
148
- // eslint-disable-next-line @typescript-eslint/member-ordering
149
- getDriver() {
150
- return this.driver;
151
- }
152
- addCollection(options) {
153
- return this.db.addCollection(options.storeName, { unique: [keyField] });
154
- }
155
- clearCollection() {
156
- this.collection.clear({ removeIndices: false });
157
- }
158
- configureLokiStorage(options, databaseInitialize) {
159
- const idbAdapter = new LokiIndexedAdapter();
160
- this.db = new Loki(options.name, {
161
- adapter: idbAdapter,
162
- autoload: true,
163
- autoloadCallback: databaseInitialize,
164
- autosave: true,
165
- autosaveInterval: 4000
166
- });
167
- }
168
- findAndRemoveItem(key) {
169
- this.collection.findAndRemove({ [keyField]: key });
170
- }
171
- getCollection(options) {
172
- return this.db.getCollection(options.storeName);
173
- }
174
- databaseInitialize(options, resolve) {
175
- this.collection = this.getCollection(options);
176
- if (!this.hasCollection()) {
177
- this.collection = this.addCollection(options);
178
- }
179
- resolve();
180
- }
181
- getItemInCollectionBy(fieldKey, key) {
182
- return this.collection.by(fieldKey, key);
183
- }
184
- getLokiMap() {
185
- return this.collection.constraints.unique[keyField].lokiMap;
186
- }
187
- hasCollection() {
188
- return this.collection;
189
- }
190
- hasDataInCollection() {
191
- return this.collection.data && this.collection.data.length;
192
- }
193
- hasCollectionAndDataInCollection() {
194
- return this.hasCollection() && this.hasDataInCollection();
195
- }
196
- insertOrUpdate(item, value, key) {
197
- if (item) {
198
- item.value = value;
199
- this.collection.update(item);
200
- }
201
- else {
202
- this.collection.insert({ [keyField]: key, value: value });
203
- }
204
- }
205
- iterateWithDataItem(iteratorcallback) {
206
- this.collection.data.forEach(element => {
207
- iteratorcallback(element.value, element[keyField], element.$loki);
208
- });
209
- }
210
- getNumberItensInCollection() {
211
- return this.collection.count();
212
- }
9
+ const keyField = 'key';
10
+ class PoLokiDriver {
11
+ constructor() {
12
+ const self = this;
13
+ this.driver = {
14
+ _driver: 'lokijs',
15
+ _initStorage: function (options) {
16
+ return self.initStorage(options);
17
+ },
18
+ clear: function () {
19
+ return self.clear(this);
20
+ },
21
+ getItem: function (key) {
22
+ return self.getItem(this, key);
23
+ },
24
+ iterate: function (iteratorCallback) {
25
+ return self.iterate(this, iteratorCallback);
26
+ },
27
+ key: function (n) {
28
+ return self.key(this, n);
29
+ },
30
+ keys: function () {
31
+ return self.keys(this);
32
+ },
33
+ length: function () {
34
+ return self.length(this);
35
+ },
36
+ removeItem: function (key) {
37
+ return self.removeItem(this, key);
38
+ },
39
+ setItem: function (key, value) {
40
+ return self.setItem(this, key, value);
41
+ }
42
+ };
43
+ }
44
+ // Funções de iteração
45
+ clear(localforage) {
46
+ return new Promise(resolve => {
47
+ localforage.ready().then(() => {
48
+ if (this.hasCollectionAndDataInCollection()) {
49
+ this.clearCollection();
50
+ }
51
+ resolve(null);
52
+ });
53
+ });
54
+ }
55
+ getItem(localforage, key) {
56
+ return new Promise(resolve => {
57
+ localforage.ready().then(() => {
58
+ if (this.hasCollectionAndDataInCollection()) {
59
+ const item = this.getItemInCollectionBy(keyField, key);
60
+ if (item) {
61
+ resolve(item.value);
62
+ }
63
+ }
64
+ resolve(null);
65
+ });
66
+ });
67
+ }
68
+ initStorage(options) {
69
+ return new Promise(resolve => {
70
+ try {
71
+ this.configureLokiStorage(options, this.databaseInitialize.bind(this, options, resolve));
72
+ }
73
+ catch (_a) {
74
+ throw new Error(`Cannot configure Loki Storage`);
75
+ }
76
+ });
77
+ }
78
+ iterate(localforage, iteratorCallback) {
79
+ return new Promise(resolve => {
80
+ localforage.ready().then(() => {
81
+ if (this.hasCollectionAndDataInCollection()) {
82
+ this.iterateWithDataItem(iteratorCallback);
83
+ }
84
+ resolve(null);
85
+ });
86
+ });
87
+ }
88
+ key(localforage, n) {
89
+ return new Promise(resolve => {
90
+ localforage.ready().then(() => {
91
+ if (this.hasCollection()) {
92
+ const map = this.getLokiMap();
93
+ resolve(map[n]);
94
+ }
95
+ resolve(null);
96
+ });
97
+ });
98
+ }
99
+ keys(localforage) {
100
+ return new Promise(resolve => {
101
+ localforage.ready().then(() => {
102
+ if (this.hasCollection()) {
103
+ const keys = [];
104
+ const map = this.getLokiMap();
105
+ for (const key of Object.keys(map)) {
106
+ keys.push(map[key]);
107
+ }
108
+ resolve(keys);
109
+ }
110
+ resolve(null);
111
+ });
112
+ });
113
+ }
114
+ length(localforage) {
115
+ return new Promise(resolve => {
116
+ localforage.ready().then(() => {
117
+ if (this.hasCollection()) {
118
+ resolve(this.getNumberItensInCollection());
119
+ }
120
+ resolve(0);
121
+ });
122
+ });
123
+ }
124
+ removeItem(localforage, key) {
125
+ return new Promise(resolve => {
126
+ localforage.ready().then(() => {
127
+ if (this.hasCollection()) {
128
+ this.findAndRemoveItem(key);
129
+ }
130
+ resolve(null);
131
+ });
132
+ });
133
+ }
134
+ setItem(localforage, key, value) {
135
+ return new Promise(resolve => {
136
+ localforage.ready().then(() => {
137
+ if (this.hasCollection()) {
138
+ let item;
139
+ if (this.hasDataInCollection()) {
140
+ item = this.getItemInCollectionBy(keyField, key);
141
+ }
142
+ this.insertOrUpdate(item, value, key);
143
+ }
144
+ resolve(value);
145
+ });
146
+ });
147
+ }
148
+ // Funções de acesso ao storage
149
+ // eslint-disable-next-line @typescript-eslint/member-ordering
150
+ getDriver() {
151
+ return this.driver;
152
+ }
153
+ addCollection(options) {
154
+ return this.db.addCollection(options.storeName, { unique: [keyField] });
155
+ }
156
+ clearCollection() {
157
+ this.collection.clear({ removeIndices: false });
158
+ }
159
+ configureLokiStorage(options, databaseInitialize) {
160
+ const idbAdapter = new LokiIndexedAdapter();
161
+ this.db = new Loki(options.name, {
162
+ adapter: idbAdapter,
163
+ autoload: true,
164
+ autoloadCallback: databaseInitialize,
165
+ autosave: true,
166
+ autosaveInterval: 4000
167
+ });
168
+ }
169
+ findAndRemoveItem(key) {
170
+ this.collection.findAndRemove({ [keyField]: key });
171
+ }
172
+ getCollection(options) {
173
+ return this.db.getCollection(options.storeName);
174
+ }
175
+ databaseInitialize(options, resolve) {
176
+ this.collection = this.getCollection(options);
177
+ if (!this.hasCollection()) {
178
+ this.collection = this.addCollection(options);
179
+ }
180
+ resolve();
181
+ }
182
+ getItemInCollectionBy(fieldKey, key) {
183
+ return this.collection.by(fieldKey, key);
184
+ }
185
+ getLokiMap() {
186
+ return this.collection.constraints.unique[keyField].lokiMap;
187
+ }
188
+ hasCollection() {
189
+ return this.collection;
190
+ }
191
+ hasDataInCollection() {
192
+ return this.collection.data && this.collection.data.length;
193
+ }
194
+ hasCollectionAndDataInCollection() {
195
+ return this.hasCollection() && this.hasDataInCollection();
196
+ }
197
+ insertOrUpdate(item, value, key) {
198
+ if (item) {
199
+ item.value = value;
200
+ this.collection.update(item);
201
+ }
202
+ else {
203
+ this.collection.insert({ [keyField]: key, value: value });
204
+ }
205
+ }
206
+ iterateWithDataItem(iteratorcallback) {
207
+ this.collection.data.forEach(element => {
208
+ iteratorcallback(element.value, element[keyField], element.$loki);
209
+ });
210
+ }
211
+ getNumberItensInCollection() {
212
+ return this.collection.count();
213
+ }
213
214
  }
214
215
 
215
- const PO_STORAGE_CONFIG_TOKEN = new InjectionToken('PO_STORAGE_CONFIG_TOKEN');
216
- /**
217
- * @description
218
- *
219
- * O PO Storage é uma biblioteca que fornece um serviço para armazenamento de dados no dispositivo local, sendo semelhante
220
- * ao funcionamento do [IonicStorage](https://ionicframework.com/docs/storage/).
221
- * É possível utilizar os drivers [Websql](https://dev.w3.org/html5/webdatabase/), [Indexeddb](https://www.w3.org/TR/IndexedDB/),
222
- * [LocalStorage](https://html.spec.whatwg.org/multipage/webstorage.html) e também [LokiJS](https://github.com/techfort/LokiJS/wiki).
223
- *
224
- * Para um melhor ganho de performance ao buscar e salvar dados, recomendamos a utilização do `LokiJS`, um *database*
225
- * orientado a documento semelhante ao MongoDB, que além de permitir a persistência dos dados no dispositivo possibilita
226
- * também o armazenamento dos dados em memória. Outra vantagem, é o aumento do limite de armazenamento para
227
- * aproximadamente `300mb`.
228
- *
229
- * A estrutura utilizada para armazenar os dados é a de chave/valor, onde uma chave funciona como um identificador exclusivo.
230
- *
231
- * #### Instalando o PO Storage
232
- *
233
- * Para instalar o `po-storage` em sua aplicação execute o seguinte comando:
234
- *
235
- * ```shell
236
- * ng add @po-ui/ng-storage
237
- * ```
238
- * Será instalado o pacote `@po-ui/ng-storage` e também já importará `PoStorageModule` no módulo principal da sua aplicação, conforme abaixo:
239
- *
240
- * ```typescript
241
- * import { PoStorageModule } from '@po-ui/ng-storage';
242
- *
243
- * @NgModule({
244
- * declarations: [...],
245
- * imports: [
246
- * // Importação do módulo PoStorageModule
247
- * PoStorageModule.forRoot(),
248
- * ],
249
- * bootstrap: [IonicApp],
250
- * providers: [...]
251
- * })
252
- * export class AppModule {}
253
- * ```
254
- *
255
- * Com a declaração do módulo, é criada uma base de dados no armazenamento local e o serviço `PoStorageService` estará
256
- * pronto para ser utilizada na sua aplicação.
257
- *
258
- * #### Configurando as opções de armazenamento
259
- *
260
- * Na importação do módulo, o método `PoStorageModule.forRoot()` pode receber como parâmetro um objeto do tipo
261
- * [`PoStorageConfig`](documentation/po-storage#po-storage-config),
262
- * que serve para configurar as opções personalizadas do armazenamento, como por exemplo: o tipo de armazenamento
263
- * preferêncial.
264
- *
265
- * Caso não seja passada nenhuma configuração a ordem padrão será: ['websql', 'indexeddb', 'localstorage', 'lokijs'].
266
- *
267
- * Abaixo segue um exemplo de configuração onde o storage preferencial passa a ser o `lokijs`:
268
- *
269
- * ```typescript
270
- * import { PoStorageModule } from '@po-ui/ng-storage';
271
- *
272
- * @NgModule({
273
- * declarations: [...],
274
- * imports: [
275
- * // Importação do módulo PoStorageModule com a configuração personalizada
276
- * PoStorageModule.forRoot({
277
- * name: 'mystorage',
278
- * storeName: '_mystore',
279
- * driverOrder: ['lokijs', 'websql', 'indexeddb', 'localstorage']
280
- * }),
281
- * ],
282
- * bootstrap: [IonicApp],
283
- * providers: [...]
284
- * })
285
- * export class AppModule {}
286
- * ```
287
- */
288
- class PoStorageService {
289
- constructor(config) {
290
- this.driver = null;
291
- this.idleQueue = new IdleQueue();
292
- this.lokijsDriver = new PoLokiDriver();
293
- this.setStoragePromise(config);
294
- }
295
- /**
296
- * Retorna a configuração padrão para o armazenamento. Caso nenhuma configuração seja inserida,
297
- * essa configuração será utilizada.
298
- *
299
- * @returns {PoStorageConfig} Objeto com a configuração padrão do armazenamento.
300
- */
301
- static getDefaultConfig() {
302
- return {
303
- name: '_postorage',
304
- storeName: '_pokv',
305
- driverOrder: ['websql', 'indexeddb', 'localstorage', 'lokijs']
306
- };
307
- }
308
- /**
309
- * Cria uma instância do `PoStorageService` com a configuração de armazenamento passada como parâmetro.
310
- *
311
- * @param {PoStorageConfig} storageConfig Configuração para o armazenamento.
312
- * @returns {PoStorageService} Instância do `PoStorageService`.
313
- */
314
- static providePoStorage(storageConfig) {
315
- return new PoStorageService(PoStorageService.getConfig(storageConfig));
316
- }
317
- static getConfig(storageConfig) {
318
- return storageConfig || PoStorageService.getDefaultConfig();
319
- }
320
- /**
321
- * Busca uma lista armazenada pela chave e concatena com a lista passada por parâmetro.
322
- *
323
- * Por exemplo:
324
- *
325
- * ``` typescript
326
- * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
327
- *
328
- * this.poStorageService.set('clientKey', clients).then(() => {});
329
- *
330
- * ...
331
- *
332
- * const newClients = [ { name: 'Lisa', age: 36 }, { name: 'Bruce', age: 18 } ];
333
- *
334
- * this.poStorageService.appendArrayToArray('clientKey', newClients).then(() => {
335
- * // A lista agora será:
336
- * // [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }, { name: 'Lisa', age: 36 }, { name: 'Bruce', age: 18 }];
337
- * });
338
- * ```
339
- *
340
- * @param {string} key Chave da lista armazenada.
341
- * @param {Array} value Lista que será concatenada.
342
- *
343
- * @returns {Promise<any>} Promessa que é resolvida após as duas listas serem concatenadas e armazenadas localmente.
344
- */
345
- appendArrayToArray(key, value) {
346
- return __awaiter(this, void 0, void 0, function* () {
347
- const data = yield this.getArrayOfStorage(key);
348
- const newData = [...data, ...value];
349
- return this.set(key, newData);
350
- });
351
- }
352
- /**
353
- * Acrescenta um item em uma lista armazenada pela chave.
354
- *
355
- * @param {string} key Chave da lista armazenada.
356
- * @param {Array} value Item que será acrescentado na lista.
357
- *
358
- * @returns {Promise<any>} Promessa que é resolvida após o item ser acrescentado na lista armazenada.
359
- */
360
- appendItemToArray(key, value) {
361
- return __awaiter(this, void 0, void 0, function* () {
362
- const data = yield this.getArrayOfStorage(key);
363
- data.push(value);
364
- return this.set(key, data);
365
- });
366
- }
367
- /**
368
- * Remove todos os itens da base de dados local configurada na declaração do módulo `PoStorageModule`.
369
- *
370
- * > Utilize este método com cautela, para evitar a perda indesejada de dados.
371
- *
372
- * @returns {Promise<void>} Promessa que é resolvida após todos os itens da base de dados local serem removidos.
373
- */
374
- clear() {
375
- return this.storagePromise.then(store => store.clear());
376
- }
377
- /**
378
- * Verifica se existe um valor dentro de uma determinada chave.
379
- *
380
- * @param {string} key Chave que será verificada.
381
- *
382
- * @returns {Promise<boolean>} Promessa que é resolvida quando a verificação da existência do valor na chave é concluída.
383
- */
384
- exists(key) {
385
- return this.get(key).then(data => Promise.resolve(data !== null));
386
- }
387
- /**
388
- * Itera sobre todas as chaves armazenadas.
389
- *
390
- * @param {any} iteratorCallback Função de `callback` que é chamada a cada iteração, com os seguintes parâmetros:
391
- * valor, chave e número da iteração.
392
- *
393
- * Exemplo de utilização:
394
- *
395
- * ``` typescript
396
- * this.poStorageService.forEach((value: any, key: string, iterationNumber: number) => {
397
- * // Iteração sobre cada chave armazenada.
398
- * });
399
- * ```
400
- *
401
- * @returns {Promise<void>} Promessa que é resolvida após a iteração sobre todas as chaves armazenadas.
402
- */
403
- forEach(iteratorCallback) {
404
- return this.storagePromise.then(store => store.iterate(iteratorCallback));
405
- }
406
- /**
407
- * Retorna o valor armazenado em uma determinada chave.
408
- *
409
- * @param {string} key Chave que identifica o item.
410
- * @param {boolean} lock Define se irá travar a leitura e a escrita da base de dados para não ser acessada de forma paralela.
411
- * Caso outra leitura/escrita já tenha sido iniciada, este método irá esperar o outro terminar para então começar.
412
- *
413
- * Padrão: `false`.
414
- *
415
- * > Esta definição só será válida se o outro acesso paralelo a este método também estiver com o parâmetro *lock* ativado.
416
- * @returns {Promise<any>} Promessa que é resolvida após o item ser buscado.
417
- */
418
- get(key, lock = false) {
419
- return __awaiter(this, void 0, void 0, function* () {
420
- if (lock) {
421
- yield this.requestIdlePromise();
422
- return yield this.idleQueue.wrapCall(() => __awaiter(this, void 0, void 0, function* () {
423
- yield this.getImmutableItem(key);
424
- }));
425
- }
426
- return yield this.getImmutableItem(key);
427
- });
428
- }
429
- /**
430
- * Retorna o nome do *driver* que está sendo usado para armazenar os dados, por exemplo: localStorage.
431
- *
432
- * @returns {string | null} Nome do *driver*.
433
- */
434
- getDriver() {
435
- return this.driver;
436
- }
437
- /**
438
- * Retorna o primeiro item de uma lista para uma determinada chave.
439
- *
440
- * @param {string} key Chave da lista.
441
- * @returns {Promise<any>} Promessa que é resolvida após o primeiro item ser encontrado.
442
- */
443
- getFirstItem(key) {
444
- return this.get(key).then((data) => Promise.resolve(data ? data[0] : null));
445
- }
446
- /**
447
- * Remove o primeiro item de uma lista a partir da chave.
448
- *
449
- * @param {string} key Chave da lista que será removido o primeiro item.
450
- * @returns {Promise<any>} Promessa que é resolvida após o primeiro item da lista ser removido.
451
- */
452
- getItemAndRemove(key) {
453
- return this.get(key).then((data) => {
454
- if (data === null) {
455
- return null;
456
- }
457
- const item = data.shift();
458
- return this.set(key, data).then(() => Promise.resolve(item));
459
- });
460
- }
461
- /**
462
- * Busca o primeiro objeto encontrado dentro de uma lista pelo do valor de um campo.
463
- *
464
- * Por exemplo:
465
- *
466
- * ``` typescript
467
- * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
468
- *
469
- * this.poStorageService.set('clientKey', clients).then(() => {});
470
- *
471
- * ...
472
- *
473
- * this.poStorageService.getItemByField('clientKey', 'name', 'Marie').then(client => {
474
- * // Resultado do console.log: { name: 'Marie', age: 23 }
475
- * console.log(client);
476
- * });
477
- * ```
478
- *
479
- * @param {string} key Chave da lista.
480
- * @param {string} fieldName O campo a ser filtrado.
481
- * @param {any} fieldValue O valor do campo.
482
- * @returns {Promise<any>} Promessa que é resolvida com o item que foi encontrado.
483
- */
484
- getItemByField(key, fieldName, fieldValue) {
485
- return this.get(key).then((storageRecords) => {
486
- let storageRecordsFiltered = storageRecords.find(storageRecord => storageRecord[fieldName] === fieldValue);
487
- storageRecordsFiltered = storageRecordsFiltered || null;
488
- return Promise.resolve(storageRecordsFiltered);
489
- });
490
- }
491
- /**
492
- * Lista com todas as chaves armazenadas.
493
- *
494
- * @returns {Promise<Array<string>>} Promessa que é resolvida com todas as chaves armazenadas.
495
- */
496
- keys() {
497
- return this.storagePromise.then(store => store.keys());
498
- }
499
- /**
500
- * Quantidade de chaves armazenadas.
501
- *
502
- * @returns {Promise<number>} Promessa que é resolvida com o número de chaves armazenadas.
503
- */
504
- length() {
505
- return this.storagePromise.then(store => store.length());
506
- }
507
- /**
508
- * Utilizado para gerenciar o bloqueio e desbloqueio de recursos no `PoStorageService`.
509
- * Aguardando a liberação da utilização dos recursos que participam deste comportamento e posteriormente envolve o recurso
510
- * passado como parâmetro em um comportamento de bloqueio e desbloqueio.
511
- *
512
- * Este método se comporta igual a utilização em conjunta dos métodos: `PoStorageService.requestIdlePromise()`,
513
- * `PoStorageService.lock()` e `PoStorageService.unlook()`.
514
- *
515
- * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
516
- *
517
- * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.
518
- */
519
- limitedCallWrap(limitedResource) {
520
- return __awaiter(this, void 0, void 0, function* () {
521
- yield this.requestIdlePromise();
522
- return this.idleQueue.wrapCall(limitedResource);
523
- });
524
- }
525
- /**
526
- * Incrementa um valor na fila de bloqueio do `PoStorageService`. Utilizado juntamente com o método `unlock` para poder
527
- * controlar a execução de uma determinada tarefa com o `PoStorage.requestIdlePromise()`.
528
- *
529
- * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
530
- */
531
- lock() {
532
- this.idleQueue.lock();
533
- }
534
- /**
535
- * Determina se o processo de inicialização do *driver* assíncrono foi concluído.
536
- *
537
- * @returns {Promise<LocalForage>} Promessa que é resolvida quando o processo de inicialização do *driver* assíncrono
538
- * for concluído.
539
- */
540
- ready() {
541
- return this.storagePromise;
542
- }
543
- /**
544
- * Remove um valor associado a uma chave.
545
- *
546
- * @param {key} key Chave do valor que será removido.
547
- * @returns {Promise<any>} Promessa que é resolvida após o valor ser removido.
548
- */
549
- remove(key) {
550
- return this.storagePromise.then(store => store.removeItem(key));
551
- }
552
- /**
553
- * Remove uma propriedade de um objeto armazenado.
554
- *
555
- * @param {string} key Chave do objeto armazenado.
556
- * @param {string} property Propriedade que será removida.
557
- *
558
- * @returns {Promise<any>} Promessa que é resolvida após a propriedade ser removida.
559
- */
560
- removeIndexFromObject(key, property) {
561
- return __awaiter(this, void 0, void 0, function* () {
562
- const data = yield this.getObjectOfStorage(key);
563
- delete data[property];
564
- return this.set(key, data);
565
- });
566
- }
567
- /**
568
- * Remove um objeto de uma lista armazenada pelo valor de uma propriedade.
569
- *
570
- * Por exemplo:
571
- *
572
- * ``` typescript
573
- * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
574
- *
575
- * this.poStorageService.set('clientKey', clients).then(() => {});
576
- *
577
- * ...
578
- *
579
- * this.poStorageService.removeItemFromArray('clientKey', 'name', 'Marie').then(() => {
580
- * // O objeto { name: 'Marie', age: 23 } foi removido da lista que está na chave 'clientKey'
581
- * });
582
- * ```
583
- *
584
- * @param {string} key Chave da lista que contém o item que será removido.
585
- * @param {string} field O campo a ser filtrado no item.
586
- * @param {string} value O valor do filtro.
587
- * @returns {Promise<any>} Promessa que é resolvida quando o objeto for removido da lista.
588
- */
589
- removeItemFromArray(key, field, value) {
590
- return __awaiter(this, void 0, void 0, function* () {
591
- let data = yield this.getArrayOfStorage(key);
592
- data = data.filter(item => item[field] !== value);
593
- return this.set(key, data);
594
- });
595
- }
596
- /**
597
- * <a id="request-idle-promise"></a>
598
- * Método que verifica se o acesso a base de dados configurada está liberado.
599
- *
600
- * Utilizado em conjunto com os métodos `lock()` e `unlock()` entre tarefas que não podem ser executadas de forma
601
- * paralela, para não causar inconsistências nos dados.
602
- *
603
- * Exemplo de utilização:
604
- *
605
- * ```
606
- * // Aguarda a liberação para continuar
607
- * await this.poStorage.requestIdlePromise();
608
- *
609
- * this.poStorage.lock();
610
- *
611
- * // Executa uma tarefa que irá ler e/ou escrever na base de dados configurada.
612
- *
613
- * this.poStorage.unlock();
614
- * ```
615
- *
616
- * > É importante sempre utilizá-lo antes de executar os métodos `lock()` e `unlock()` para garantir que a tarefa só
617
- * será executada caso o acesso esteja livre.
618
- *
619
- * @returns {Promise<any>} Promessa que é resolvida quando o acesso a base de dados configurada estiver liberado.
620
- */
621
- requestIdlePromise() {
622
- return this.idleQueue.requestIdlePromise();
623
- }
624
- /**
625
- * Grava um valor em uma determinada chave.
626
- *
627
- * @param {string} key Chave para o valor que será gravado.
628
- * @param {any} value Valor que será gravado.
629
- * @param {boolean} lock Define se irá travar a leitura e a escrita da base de dados para não ser acessada de forma paralela.
630
- * Caso outra leitura/escrita já tenha sido iniciada, este método irá esperar o outro terminar para então começar.
631
- *
632
- * Padrão: `false`.
633
- *
634
- * > Esta definição só será válida se o outro acesso paralelo a este método também estiver com o parâmetro *lock* ativado.
635
- * @returns {Promise<any>} Promessa que é resolvida após o valor ter sido gravado.
636
- */
637
- set(key, value, lock = false) {
638
- return __awaiter(this, void 0, void 0, function* () {
639
- const store = yield this.storagePromise;
640
- const newValue = typeof value === 'object' ? JSON.parse(JSON.stringify(value)) : value;
641
- if (lock) {
642
- yield this.requestIdlePromise();
643
- return this.idleQueue.wrapCall(() => store.setItem(key, newValue));
644
- }
645
- return store.setItem(key, newValue);
646
- });
647
- }
648
- /**
649
- * Atribui um valor a uma propriedade de um objeto armazenado pela chave.
650
- *
651
- * Por exemplo:
652
- *
653
- * ``` typescript
654
- * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
655
- *
656
- * this.poStorageService.set('clientKey', clients).then(() => {});
657
- *
658
- * ...
659
- *
660
- * this.poStorageService.setIndexToObject('clientKey', 'name', 'Clare').then(() => {
661
- * // O objeto { name: 'Marie', age: 23 } passa a ser { name: 'Clare', age: 23 }
662
- * });
663
- * ```
664
- *
665
- * @param {string} key Chave do objeto.
666
- * @param {string} property Nome da propriedade do objeto.
667
- * @param {any} value Valor que será gravado na propriedade do objeto.
668
- */
669
- setIndexToObject(key, property, value) {
670
- return __awaiter(this, void 0, void 0, function* () {
671
- const data = yield this.getObjectOfStorage(key);
672
- data[property] = value;
673
- return this.set(key, data);
674
- });
675
- }
676
- /**
677
- * Decrementa um valor na fila de bloqueio. Utilizado juntamente com o método `lock` para poder
678
- * controlar a execução de uma determinada tarefa com o `PoStorage.requestIdlePromise()`.
679
- *
680
- * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
681
- */
682
- unlock() {
683
- this.idleQueue.unlock();
684
- }
685
- getArrayOfStorage(key) {
686
- return __awaiter(this, void 0, void 0, function* () {
687
- const data = yield this.get(key);
688
- return data || [];
689
- });
690
- }
691
- getImmutableItem(key) {
692
- return __awaiter(this, void 0, void 0, function* () {
693
- const store = yield this.storagePromise;
694
- const items = yield store.getItem(key);
695
- return items ? JSON.parse(JSON.stringify(items)) : null;
696
- });
697
- }
698
- defineLocalForageDriver(localForageInstance, driverOrder) {
699
- return __awaiter(this, void 0, void 0, function* () {
700
- yield localForageInstance.defineDriver(this.lokijsDriver.getDriver());
701
- yield this.setDriver(localForageInstance, driverOrder);
702
- return localForageInstance;
703
- });
704
- }
705
- getDriverOrder(driverOrder) {
706
- return driverOrder.map(driver => {
707
- switch (driver) {
708
- case 'indexeddb':
709
- return LocalForage.INDEXEDDB;
710
- case 'websql':
711
- return LocalForage.WEBSQL;
712
- case 'localstorage':
713
- return LocalForage.LOCALSTORAGE;
714
- default:
715
- return driver;
716
- }
717
- });
718
- }
719
- getObjectOfStorage(key) {
720
- return __awaiter(this, void 0, void 0, function* () {
721
- const data = yield this.get(key);
722
- return data || {};
723
- });
724
- }
725
- setDriver(localForageInstance, driverOrder) {
726
- return __awaiter(this, void 0, void 0, function* () {
727
- yield localForageInstance.setDriver(this.getDriverOrder(driverOrder));
728
- this.driver = localForageInstance.driver();
729
- });
730
- }
731
- setStoragePromise(config) {
732
- this.storagePromise = this.getStorageInstance(config);
733
- }
734
- getStorageInstance(config) {
735
- return __awaiter(this, void 0, void 0, function* () {
736
- const defaultConfig = PoStorageService.getDefaultConfig();
737
- const actualConfig = Object.assign(defaultConfig, config || {});
738
- const localForageInstance = LocalForage.createInstance(actualConfig);
739
- try {
740
- return yield this.defineLocalForageDriver(localForageInstance, actualConfig.driverOrder);
741
- }
742
- catch (_a) {
743
- throw new Error(`Cannot use this drivers: ${actualConfig.driverOrder.join(', ')}.`);
744
- }
745
- });
746
- }
747
- }
748
- PoStorageService.decorators = [
749
- { type: Injectable }
750
- ];
751
- PoStorageService.ctorParameters = () => [
752
- { type: undefined, decorators: [{ type: Inject, args: [PO_STORAGE_CONFIG_TOKEN,] }] }
753
- ];
216
+ const PO_STORAGE_CONFIG_TOKEN = new InjectionToken('PO_STORAGE_CONFIG_TOKEN');
217
+ /**
218
+ * @description
219
+ *
220
+ * O PO Storage é uma biblioteca que fornece um serviço para armazenamento de dados no dispositivo local, sendo semelhante
221
+ * ao funcionamento do [IonicStorage](https://ionicframework.com/docs/storage/).
222
+ * É possível utilizar os drivers [Websql](https://dev.w3.org/html5/webdatabase/), [Indexeddb](https://www.w3.org/TR/IndexedDB/),
223
+ * [LocalStorage](https://html.spec.whatwg.org/multipage/webstorage.html) e também [LokiJS](https://github.com/techfort/LokiJS/wiki).
224
+ *
225
+ * Para um melhor ganho de performance ao buscar e salvar dados, recomendamos a utilização do `LokiJS`, um *database*
226
+ * orientado a documento semelhante ao MongoDB, que além de permitir a persistência dos dados no dispositivo possibilita
227
+ * também o armazenamento dos dados em memória. Outra vantagem, é o aumento do limite de armazenamento para
228
+ * aproximadamente `300mb`.
229
+ *
230
+ * A estrutura utilizada para armazenar os dados é a de chave/valor, onde uma chave funciona como um identificador exclusivo.
231
+ *
232
+ * #### Instalando o PO Storage
233
+ *
234
+ * Para instalar o `po-storage` em sua aplicação execute o seguinte comando:
235
+ *
236
+ * ```shell
237
+ * ng add @po-ui/ng-storage
238
+ * ```
239
+ * Será instalado o pacote `@po-ui/ng-storage` e também já importará `PoStorageModule` no módulo principal da sua aplicação, conforme abaixo:
240
+ *
241
+ * ```typescript
242
+ * import { PoStorageModule } from '@po-ui/ng-storage';
243
+ *
244
+ * @NgModule({
245
+ * declarations: [...],
246
+ * imports: [
247
+ * // Importação do módulo PoStorageModule
248
+ * PoStorageModule.forRoot(),
249
+ * ],
250
+ * bootstrap: [IonicApp],
251
+ * providers: [...]
252
+ * })
253
+ * export class AppModule {}
254
+ * ```
255
+ *
256
+ * Com a declaração do módulo, é criada uma base de dados no armazenamento local e o serviço `PoStorageService` estará
257
+ * pronto para ser utilizada na sua aplicação.
258
+ *
259
+ * #### Configurando as opções de armazenamento
260
+ *
261
+ * Na importação do módulo, o método `PoStorageModule.forRoot()` pode receber como parâmetro um objeto do tipo
262
+ * [`PoStorageConfig`](documentation/po-storage#po-storage-config),
263
+ * que serve para configurar as opções personalizadas do armazenamento, como por exemplo: o tipo de armazenamento
264
+ * preferêncial.
265
+ *
266
+ * Caso não seja passada nenhuma configuração a ordem padrão será: ['websql', 'indexeddb', 'localstorage', 'lokijs'].
267
+ *
268
+ * Abaixo segue um exemplo de configuração onde o storage preferencial passa a ser o `lokijs`:
269
+ *
270
+ * ```typescript
271
+ * import { PoStorageModule } from '@po-ui/ng-storage';
272
+ *
273
+ * @NgModule({
274
+ * declarations: [...],
275
+ * imports: [
276
+ * // Importação do módulo PoStorageModule com a configuração personalizada
277
+ * PoStorageModule.forRoot({
278
+ * name: 'mystorage',
279
+ * storeName: '_mystore',
280
+ * driverOrder: ['lokijs', 'websql', 'indexeddb', 'localstorage']
281
+ * }),
282
+ * ],
283
+ * bootstrap: [IonicApp],
284
+ * providers: [...]
285
+ * })
286
+ * export class AppModule {}
287
+ * ```
288
+ */
289
+ class PoStorageService {
290
+ constructor(config) {
291
+ this.driver = null;
292
+ this.idleQueue = new IdleQueue();
293
+ this.lokijsDriver = new PoLokiDriver();
294
+ this.setStoragePromise(config);
295
+ }
296
+ /**
297
+ * Retorna a configuração padrão para o armazenamento. Caso nenhuma configuração seja inserida,
298
+ * essa configuração será utilizada.
299
+ *
300
+ * @returns {PoStorageConfig} Objeto com a configuração padrão do armazenamento.
301
+ */
302
+ static getDefaultConfig() {
303
+ return {
304
+ name: '_postorage',
305
+ storeName: '_pokv',
306
+ driverOrder: ['websql', 'indexeddb', 'localstorage', 'lokijs']
307
+ };
308
+ }
309
+ /**
310
+ * Cria uma instância do `PoStorageService` com a configuração de armazenamento passada como parâmetro.
311
+ *
312
+ * @param {PoStorageConfig} storageConfig Configuração para o armazenamento.
313
+ * @returns {PoStorageService} Instância do `PoStorageService`.
314
+ */
315
+ static providePoStorage(storageConfig) {
316
+ return new PoStorageService(PoStorageService.getConfig(storageConfig));
317
+ }
318
+ static getConfig(storageConfig) {
319
+ return storageConfig || PoStorageService.getDefaultConfig();
320
+ }
321
+ /**
322
+ * Busca uma lista armazenada pela chave e concatena com a lista passada por parâmetro.
323
+ *
324
+ * Por exemplo:
325
+ *
326
+ * ``` typescript
327
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
328
+ *
329
+ * this.poStorageService.set('clientKey', clients).then(() => {});
330
+ *
331
+ * ...
332
+ *
333
+ * const newClients = [ { name: 'Lisa', age: 36 }, { name: 'Bruce', age: 18 } ];
334
+ *
335
+ * this.poStorageService.appendArrayToArray('clientKey', newClients).then(() => {
336
+ * // A lista agora será:
337
+ * // [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }, { name: 'Lisa', age: 36 }, { name: 'Bruce', age: 18 }];
338
+ * });
339
+ * ```
340
+ *
341
+ * @param {string} key Chave da lista armazenada.
342
+ * @param {Array} value Lista que será concatenada.
343
+ *
344
+ * @returns {Promise<any>} Promessa que é resolvida após as duas listas serem concatenadas e armazenadas localmente.
345
+ */
346
+ appendArrayToArray(key, value) {
347
+ return __awaiter(this, void 0, void 0, function* () {
348
+ const data = yield this.getArrayOfStorage(key);
349
+ const newData = [...data, ...value];
350
+ return this.set(key, newData);
351
+ });
352
+ }
353
+ /**
354
+ * Acrescenta um item em uma lista armazenada pela chave.
355
+ *
356
+ * @param {string} key Chave da lista armazenada.
357
+ * @param {Array} value Item que será acrescentado na lista.
358
+ *
359
+ * @returns {Promise<any>} Promessa que é resolvida após o item ser acrescentado na lista armazenada.
360
+ */
361
+ appendItemToArray(key, value) {
362
+ return __awaiter(this, void 0, void 0, function* () {
363
+ const data = yield this.getArrayOfStorage(key);
364
+ data.push(value);
365
+ return this.set(key, data);
366
+ });
367
+ }
368
+ /**
369
+ * Remove todos os itens da base de dados local configurada na declaração do módulo `PoStorageModule`.
370
+ *
371
+ * > Utilize este método com cautela, para evitar a perda indesejada de dados.
372
+ *
373
+ * @returns {Promise<void>} Promessa que é resolvida após todos os itens da base de dados local serem removidos.
374
+ */
375
+ clear() {
376
+ return this.storagePromise.then(store => store.clear());
377
+ }
378
+ /**
379
+ * Verifica se existe um valor dentro de uma determinada chave.
380
+ *
381
+ * @param {string} key Chave que será verificada.
382
+ *
383
+ * @returns {Promise<boolean>} Promessa que é resolvida quando a verificação da existência do valor na chave é concluída.
384
+ */
385
+ exists(key) {
386
+ return this.get(key).then(data => Promise.resolve(data !== null));
387
+ }
388
+ /**
389
+ * Itera sobre todas as chaves armazenadas.
390
+ *
391
+ * @param {any} iteratorCallback Função de `callback` que é chamada a cada iteração, com os seguintes parâmetros:
392
+ * valor, chave e número da iteração.
393
+ *
394
+ * Exemplo de utilização:
395
+ *
396
+ * ``` typescript
397
+ * this.poStorageService.forEach((value: any, key: string, iterationNumber: number) => {
398
+ * // Iteração sobre cada chave armazenada.
399
+ * });
400
+ * ```
401
+ *
402
+ * @returns {Promise<void>} Promessa que é resolvida após a iteração sobre todas as chaves armazenadas.
403
+ */
404
+ forEach(iteratorCallback) {
405
+ return this.storagePromise.then(store => store.iterate(iteratorCallback));
406
+ }
407
+ /**
408
+ * Retorna o valor armazenado em uma determinada chave.
409
+ *
410
+ * @param {string} key Chave que identifica o item.
411
+ * @param {boolean} lock Define se irá travar a leitura e a escrita da base de dados para não ser acessada de forma paralela.
412
+ * Caso outra leitura/escrita já tenha sido iniciada, este método irá esperar o outro terminar para então começar.
413
+ *
414
+ * Padrão: `false`.
415
+ *
416
+ * > Esta definição só será válida se o outro acesso paralelo a este método também estiver com o parâmetro *lock* ativado.
417
+ * @returns {Promise<any>} Promessa que é resolvida após o item ser buscado.
418
+ */
419
+ get(key, lock = false) {
420
+ return __awaiter(this, void 0, void 0, function* () {
421
+ if (lock) {
422
+ yield this.requestIdlePromise();
423
+ return yield this.idleQueue.wrapCall(() => __awaiter(this, void 0, void 0, function* () {
424
+ yield this.getImmutableItem(key);
425
+ }));
426
+ }
427
+ return yield this.getImmutableItem(key);
428
+ });
429
+ }
430
+ /**
431
+ * Retorna o nome do *driver* que está sendo usado para armazenar os dados, por exemplo: localStorage.
432
+ *
433
+ * @returns {string | null} Nome do *driver*.
434
+ */
435
+ getDriver() {
436
+ return this.driver;
437
+ }
438
+ /**
439
+ * Retorna o primeiro item de uma lista para uma determinada chave.
440
+ *
441
+ * @param {string} key Chave da lista.
442
+ * @returns {Promise<any>} Promessa que é resolvida após o primeiro item ser encontrado.
443
+ */
444
+ getFirstItem(key) {
445
+ return this.get(key).then((data) => Promise.resolve(data ? data[0] : null));
446
+ }
447
+ /**
448
+ * Remove o primeiro item de uma lista a partir da chave.
449
+ *
450
+ * @param {string} key Chave da lista que será removido o primeiro item.
451
+ * @returns {Promise<any>} Promessa que é resolvida após o primeiro item da lista ser removido.
452
+ */
453
+ getItemAndRemove(key) {
454
+ return this.get(key).then((data) => {
455
+ if (data === null) {
456
+ return null;
457
+ }
458
+ const item = data.shift();
459
+ return this.set(key, data).then(() => Promise.resolve(item));
460
+ });
461
+ }
462
+ /**
463
+ * Busca o primeiro objeto encontrado dentro de uma lista pelo do valor de um campo.
464
+ *
465
+ * Por exemplo:
466
+ *
467
+ * ``` typescript
468
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
469
+ *
470
+ * this.poStorageService.set('clientKey', clients).then(() => {});
471
+ *
472
+ * ...
473
+ *
474
+ * this.poStorageService.getItemByField('clientKey', 'name', 'Marie').then(client => {
475
+ * // Resultado do console.log: { name: 'Marie', age: 23 }
476
+ * console.log(client);
477
+ * });
478
+ * ```
479
+ *
480
+ * @param {string} key Chave da lista.
481
+ * @param {string} fieldName O campo a ser filtrado.
482
+ * @param {any} fieldValue O valor do campo.
483
+ * @returns {Promise<any>} Promessa que é resolvida com o item que foi encontrado.
484
+ */
485
+ getItemByField(key, fieldName, fieldValue) {
486
+ return this.get(key).then((storageRecords) => {
487
+ let storageRecordsFiltered = storageRecords.find(storageRecord => storageRecord[fieldName] === fieldValue);
488
+ storageRecordsFiltered = storageRecordsFiltered || null;
489
+ return Promise.resolve(storageRecordsFiltered);
490
+ });
491
+ }
492
+ /**
493
+ * Lista com todas as chaves armazenadas.
494
+ *
495
+ * @returns {Promise<Array<string>>} Promessa que é resolvida com todas as chaves armazenadas.
496
+ */
497
+ keys() {
498
+ return this.storagePromise.then(store => store.keys());
499
+ }
500
+ /**
501
+ * Quantidade de chaves armazenadas.
502
+ *
503
+ * @returns {Promise<number>} Promessa que é resolvida com o número de chaves armazenadas.
504
+ */
505
+ length() {
506
+ return this.storagePromise.then(store => store.length());
507
+ }
508
+ /**
509
+ * Utilizado para gerenciar o bloqueio e desbloqueio de recursos no `PoStorageService`.
510
+ * Aguardando a liberação da utilização dos recursos que participam deste comportamento e posteriormente envolve o recurso
511
+ * passado como parâmetro em um comportamento de bloqueio e desbloqueio.
512
+ *
513
+ * Este método se comporta igual a utilização em conjunta dos métodos: `PoStorageService.requestIdlePromise()`,
514
+ * `PoStorageService.lock()` e `PoStorageService.unlook()`.
515
+ *
516
+ * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
517
+ *
518
+ * @param {Function} limitedResource Função que será envolvida no comportamento de bloqueio e desbloqueio.
519
+ */
520
+ limitedCallWrap(limitedResource) {
521
+ return __awaiter(this, void 0, void 0, function* () {
522
+ yield this.requestIdlePromise();
523
+ return this.idleQueue.wrapCall(limitedResource);
524
+ });
525
+ }
526
+ /**
527
+ * Incrementa um valor na fila de bloqueio do `PoStorageService`. Utilizado juntamente com o método `unlock` para poder
528
+ * controlar a execução de uma determinada tarefa com o `PoStorage.requestIdlePromise()`.
529
+ *
530
+ * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
531
+ */
532
+ lock() {
533
+ this.idleQueue.lock();
534
+ }
535
+ /**
536
+ * Determina se o processo de inicialização do *driver* assíncrono foi concluído.
537
+ *
538
+ * @returns {Promise<LocalForage>} Promessa que é resolvida quando o processo de inicialização do *driver* assíncrono
539
+ * for concluído.
540
+ */
541
+ ready() {
542
+ return this.storagePromise;
543
+ }
544
+ /**
545
+ * Remove um valor associado a uma chave.
546
+ *
547
+ * @param {key} key Chave do valor que será removido.
548
+ * @returns {Promise<any>} Promessa que é resolvida após o valor ser removido.
549
+ */
550
+ remove(key) {
551
+ return this.storagePromise.then(store => store.removeItem(key));
552
+ }
553
+ /**
554
+ * Remove uma propriedade de um objeto armazenado.
555
+ *
556
+ * @param {string} key Chave do objeto armazenado.
557
+ * @param {string} property Propriedade que será removida.
558
+ *
559
+ * @returns {Promise<any>} Promessa que é resolvida após a propriedade ser removida.
560
+ */
561
+ removeIndexFromObject(key, property) {
562
+ return __awaiter(this, void 0, void 0, function* () {
563
+ const data = yield this.getObjectOfStorage(key);
564
+ delete data[property];
565
+ return this.set(key, data);
566
+ });
567
+ }
568
+ /**
569
+ * Remove um objeto de uma lista armazenada pelo valor de uma propriedade.
570
+ *
571
+ * Por exemplo:
572
+ *
573
+ * ``` typescript
574
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
575
+ *
576
+ * this.poStorageService.set('clientKey', clients).then(() => {});
577
+ *
578
+ * ...
579
+ *
580
+ * this.poStorageService.removeItemFromArray('clientKey', 'name', 'Marie').then(() => {
581
+ * // O objeto { name: 'Marie', age: 23 } foi removido da lista que está na chave 'clientKey'
582
+ * });
583
+ * ```
584
+ *
585
+ * @param {string} key Chave da lista que contém o item que será removido.
586
+ * @param {string} field O campo a ser filtrado no item.
587
+ * @param {string} value O valor do filtro.
588
+ * @returns {Promise<any>} Promessa que é resolvida quando o objeto for removido da lista.
589
+ */
590
+ removeItemFromArray(key, field, value) {
591
+ return __awaiter(this, void 0, void 0, function* () {
592
+ let data = yield this.getArrayOfStorage(key);
593
+ data = data.filter(item => item[field] !== value);
594
+ return this.set(key, data);
595
+ });
596
+ }
597
+ /**
598
+ * <a id="request-idle-promise"></a>
599
+ * Método que verifica se o acesso a base de dados configurada está liberado.
600
+ *
601
+ * Utilizado em conjunto com os métodos `lock()` e `unlock()` entre tarefas que não podem ser executadas de forma
602
+ * paralela, para não causar inconsistências nos dados.
603
+ *
604
+ * Exemplo de utilização:
605
+ *
606
+ * ```
607
+ * // Aguarda a liberação para continuar
608
+ * await this.poStorage.requestIdlePromise();
609
+ *
610
+ * this.poStorage.lock();
611
+ *
612
+ * // Executa uma tarefa que irá ler e/ou escrever na base de dados configurada.
613
+ *
614
+ * this.poStorage.unlock();
615
+ * ```
616
+ *
617
+ * > É importante sempre utilizá-lo antes de executar os métodos `lock()` e `unlock()` para garantir que a tarefa só
618
+ * será executada caso o acesso esteja livre.
619
+ *
620
+ * @returns {Promise<any>} Promessa que é resolvida quando o acesso a base de dados configurada estiver liberado.
621
+ */
622
+ requestIdlePromise() {
623
+ return this.idleQueue.requestIdlePromise();
624
+ }
625
+ /**
626
+ * Grava um valor em uma determinada chave.
627
+ *
628
+ * @param {string} key Chave para o valor que será gravado.
629
+ * @param {any} value Valor que será gravado.
630
+ * @param {boolean} lock Define se irá travar a leitura e a escrita da base de dados para não ser acessada de forma paralela.
631
+ * Caso outra leitura/escrita já tenha sido iniciada, este método irá esperar o outro terminar para então começar.
632
+ *
633
+ * Padrão: `false`.
634
+ *
635
+ * > Esta definição só será válida se o outro acesso paralelo a este método também estiver com o parâmetro *lock* ativado.
636
+ * @returns {Promise<any>} Promessa que é resolvida após o valor ter sido gravado.
637
+ */
638
+ set(key, value, lock = false) {
639
+ return __awaiter(this, void 0, void 0, function* () {
640
+ const store = yield this.storagePromise;
641
+ const newValue = typeof value === 'object' ? JSON.parse(JSON.stringify(value)) : value;
642
+ if (lock) {
643
+ yield this.requestIdlePromise();
644
+ return this.idleQueue.wrapCall(() => store.setItem(key, newValue));
645
+ }
646
+ return store.setItem(key, newValue);
647
+ });
648
+ }
649
+ /**
650
+ * Atribui um valor a uma propriedade de um objeto armazenado pela chave.
651
+ *
652
+ * Por exemplo:
653
+ *
654
+ * ``` typescript
655
+ * const clients = [ { name: 'Marie', age: 23 }, { name: 'Pether', age: 39 }];
656
+ *
657
+ * this.poStorageService.set('clientKey', clients).then(() => {});
658
+ *
659
+ * ...
660
+ *
661
+ * this.poStorageService.setIndexToObject('clientKey', 'name', 'Clare').then(() => {
662
+ * // O objeto { name: 'Marie', age: 23 } passa a ser { name: 'Clare', age: 23 }
663
+ * });
664
+ * ```
665
+ *
666
+ * @param {string} key Chave do objeto.
667
+ * @param {string} property Nome da propriedade do objeto.
668
+ * @param {any} value Valor que será gravado na propriedade do objeto.
669
+ */
670
+ setIndexToObject(key, property, value) {
671
+ return __awaiter(this, void 0, void 0, function* () {
672
+ const data = yield this.getObjectOfStorage(key);
673
+ data[property] = value;
674
+ return this.set(key, data);
675
+ });
676
+ }
677
+ /**
678
+ * Decrementa um valor na fila de bloqueio. Utilizado juntamente com o método `lock` para poder
679
+ * controlar a execução de uma determinada tarefa com o `PoStorage.requestIdlePromise()`.
680
+ *
681
+ * Veja mais no método: [`PoStorage.requestIdlePromise()`](documentation/po-storage#request-idle-promise).
682
+ */
683
+ unlock() {
684
+ this.idleQueue.unlock();
685
+ }
686
+ getArrayOfStorage(key) {
687
+ return __awaiter(this, void 0, void 0, function* () {
688
+ const data = yield this.get(key);
689
+ return data || [];
690
+ });
691
+ }
692
+ getImmutableItem(key) {
693
+ return __awaiter(this, void 0, void 0, function* () {
694
+ const store = yield this.storagePromise;
695
+ const items = yield store.getItem(key);
696
+ return items ? JSON.parse(JSON.stringify(items)) : null;
697
+ });
698
+ }
699
+ defineLocalForageDriver(localForageInstance, driverOrder) {
700
+ return __awaiter(this, void 0, void 0, function* () {
701
+ yield localForageInstance.defineDriver(this.lokijsDriver.getDriver());
702
+ yield this.setDriver(localForageInstance, driverOrder);
703
+ return localForageInstance;
704
+ });
705
+ }
706
+ getDriverOrder(driverOrder) {
707
+ return driverOrder.map(driver => {
708
+ switch (driver) {
709
+ case 'indexeddb':
710
+ return LocalForage.INDEXEDDB;
711
+ case 'websql':
712
+ return LocalForage.WEBSQL;
713
+ case 'localstorage':
714
+ return LocalForage.LOCALSTORAGE;
715
+ default:
716
+ return driver;
717
+ }
718
+ });
719
+ }
720
+ getObjectOfStorage(key) {
721
+ return __awaiter(this, void 0, void 0, function* () {
722
+ const data = yield this.get(key);
723
+ return data || {};
724
+ });
725
+ }
726
+ setDriver(localForageInstance, driverOrder) {
727
+ return __awaiter(this, void 0, void 0, function* () {
728
+ yield localForageInstance.setDriver(this.getDriverOrder(driverOrder));
729
+ this.driver = localForageInstance.driver();
730
+ });
731
+ }
732
+ setStoragePromise(config) {
733
+ this.storagePromise = this.getStorageInstance(config);
734
+ }
735
+ getStorageInstance(config) {
736
+ return __awaiter(this, void 0, void 0, function* () {
737
+ const defaultConfig = PoStorageService.getDefaultConfig();
738
+ const actualConfig = Object.assign(defaultConfig, config || {});
739
+ const localForageInstance = LocalForage.createInstance(actualConfig);
740
+ try {
741
+ return yield this.defineLocalForageDriver(localForageInstance, actualConfig.driverOrder);
742
+ }
743
+ catch (_a) {
744
+ throw new Error(`Cannot use this drivers: ${actualConfig.driverOrder.join(', ')}.`);
745
+ }
746
+ });
747
+ }
748
+ }
749
+ PoStorageService.ɵfac = function PoStorageService_Factory(t) { return new (t || PoStorageService)(i0.ɵɵinject(PO_STORAGE_CONFIG_TOKEN)); };
750
+ PoStorageService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoStorageService, factory: PoStorageService.ɵfac });
751
+ (function () {
752
+ (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoStorageService, [{
753
+ type: Injectable
754
+ }], function () {
755
+ return [{ type: undefined, decorators: [{
756
+ type: Inject,
757
+ args: [PO_STORAGE_CONFIG_TOKEN]
758
+ }] }];
759
+ }, null);
760
+ })();
754
761
 
755
- /**
756
- * @description
757
- *
758
- * Módulo do componente PoStorage responsável por manipular o storage do browser.
759
- */
760
- class PoStorageModule {
761
- static forRoot(storageConfig) {
762
- return {
763
- ngModule: PoStorageModule,
764
- providers: [
765
- {
766
- provide: PO_STORAGE_CONFIG_TOKEN,
767
- useValue: storageConfig || PoStorageService.getDefaultConfig()
768
- },
769
- {
770
- provide: PoStorageService,
771
- useFactory: PoStorageService.providePoStorage,
772
- deps: [PO_STORAGE_CONFIG_TOKEN]
773
- }
774
- ]
775
- };
776
- }
777
- }
778
- PoStorageModule.decorators = [
779
- { type: NgModule }
780
- ];
762
+ /**
763
+ * @description
764
+ *
765
+ * Módulo do componente PoStorage responsável por manipular o storage do browser.
766
+ */
767
+ class PoStorageModule {
768
+ static forRoot(storageConfig) {
769
+ return {
770
+ ngModule: PoStorageModule,
771
+ providers: [
772
+ {
773
+ provide: PO_STORAGE_CONFIG_TOKEN,
774
+ useValue: storageConfig || PoStorageService.getDefaultConfig()
775
+ },
776
+ {
777
+ provide: PoStorageService,
778
+ useFactory: PoStorageService.providePoStorage,
779
+ deps: [PO_STORAGE_CONFIG_TOKEN]
780
+ }
781
+ ]
782
+ };
783
+ }
784
+ }
785
+ PoStorageModule.ɵfac = function PoStorageModule_Factory(t) { return new (t || PoStorageModule)(); };
786
+ PoStorageModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: PoStorageModule });
787
+ PoStorageModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({});
788
+ (function () {
789
+ (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoStorageModule, [{
790
+ type: NgModule
791
+ }], null, null);
792
+ })();
781
793
 
782
- /**
783
- * Generated bundle index. Do not edit.
794
+ /**
795
+ * Generated bundle index. Do not edit.
784
796
  */
785
797
 
786
- export { PoStorageModule, PoStorageService, PO_STORAGE_CONFIG_TOKEN as ɵa };
787
- //# sourceMappingURL=po-ui-ng-storage.js.map
798
+ export { PoStorageModule, PoStorageService };
799
+ //# sourceMappingURL=po-ui-ng-storage.mjs.map