@po-ui/ng-sync 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.
- package/README.md +22 -22
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +15 -15
- package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +6 -6
- package/{esm2015/lib/models/po-data-message.model.js → esm2020/lib/models/po-data-message.model.mjs} +57 -57
- package/esm2020/lib/models/po-data-transform.model.mjs +22 -0
- package/esm2020/lib/models/po-entity/po-entity.model.mjs +214 -0
- package/{esm2015/lib/models/po-event-sourcing-error-response.model.js → esm2020/lib/models/po-event-sourcing-error-response.model.mjs} +17 -17
- package/{esm2015/lib/models/po-network-status.model.js → esm2020/lib/models/po-network-status.model.mjs} +44 -44
- package/{esm2015/lib/models/po-network-type.enum.js → esm2020/lib/models/po-network-type.enum.mjs} +30 -30
- package/esm2020/lib/models/po-query-builder/po-query-builder.model.mjs +238 -0
- package/{esm2015/lib/models/po-request-type.enum.js → esm2020/lib/models/po-request-type.enum.mjs} +16 -16
- package/esm2020/lib/po-sync.module.mjs +45 -0
- package/{esm2015/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.js → esm2020/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.mjs} +17 -17
- package/{esm2015/lib/services/po-event-sourcing/index.js → esm2020/lib/services/po-event-sourcing/index.mjs} +4 -4
- package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.mjs +2 -0
- package/esm2020/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.mjs +2 -0
- package/esm2020/lib/services/po-event-sourcing/po-event-sourcing.service.mjs +372 -0
- package/{esm2015/lib/services/po-http-client/interfaces/po-http-header-option.interface.js → esm2020/lib/services/po-http-client/interfaces/po-http-header-option.interface.mjs} +11 -11
- package/esm2020/lib/services/po-http-client/interfaces/po-http-request-data.interface.mjs +2 -0
- package/esm2020/lib/services/po-http-client/interfaces/po-response-api.interface.mjs +2 -0
- package/esm2020/lib/services/po-http-client/po-http-client.service.mjs +148 -0
- package/{esm2015/lib/services/po-http-client/po-http-request-type.enum.js → esm2020/lib/services/po-http-client/po-http-request-type.enum.mjs} +25 -25
- package/esm2020/lib/services/po-network/po-network.service.mjs +58 -0
- package/{esm2015/lib/services/po-schema/index.js → esm2020/lib/services/po-schema/index.mjs} +4 -4
- package/esm2020/lib/services/po-schema/po-schema-definition/po-schema-definition.service.mjs +77 -0
- package/{esm2015/lib/services/po-schema/po-schema-util/po-schema-util.model.js → esm2020/lib/services/po-schema/po-schema-util/po-schema-util.model.mjs} +124 -124
- package/esm2020/lib/services/po-schema/po-schema.service.mjs +174 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-config.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-field-options.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-response.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/interfaces/po-sync-schema.interface.mjs +2 -0
- package/esm2020/lib/services/po-sync/po-sync.service.mjs +325 -0
- package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +63 -63
- package/esm2020/po-ui-ng-sync.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +2 -2
- package/fesm2015/{po-ui-ng-sync.js → po-ui-ng-sync.mjs} +2074 -2058
- package/fesm2015/po-ui-ng-sync.mjs.map +1 -0
- package/fesm2020/po-ui-ng-sync.mjs +2018 -0
- package/fesm2020/po-ui-ng-sync.mjs.map +1 -0
- package/lib/index.d.ts +14 -14
- package/lib/models/index.d.ts +5 -5
- package/lib/models/po-data-message.model.d.ts +46 -46
- package/lib/models/po-data-transform.model.d.ts +52 -52
- package/lib/models/po-entity/po-entity.model.d.ts +122 -122
- package/lib/models/po-event-sourcing-error-response.model.d.ts +20 -20
- package/lib/models/po-network-status.model.d.ts +25 -25
- package/lib/models/po-network-type.enum.d.ts +28 -28
- package/lib/models/po-query-builder/po-query-builder.model.d.ts +126 -126
- package/lib/models/po-request-type.enum.d.ts +14 -14
- package/lib/po-sync.module.d.ts +12 -7
- package/lib/services/po-event-sourcing/enums/po-event-sourcing-operation.enum.d.ts +11 -11
- package/lib/services/po-event-sourcing/index.d.ts +3 -3
- package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.d.ts +26 -26
- package/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.d.ts +16 -16
- package/lib/services/po-event-sourcing/po-event-sourcing.service.d.ts +74 -71
- package/lib/services/po-http-client/interfaces/po-http-header-option.interface.d.ts +15 -15
- package/lib/services/po-http-client/interfaces/po-http-request-data.interface.d.ts +24 -24
- package/lib/services/po-http-client/interfaces/po-response-api.interface.d.ts +14 -14
- package/lib/services/po-http-client/po-http-client.service.d.ts +78 -75
- package/lib/services/po-http-client/po-http-request-type.enum.d.ts +23 -23
- package/lib/services/po-network/po-network.service.d.ts +36 -33
- package/lib/services/po-schema/index.d.ts +3 -3
- package/lib/services/po-schema/po-schema-definition/po-schema-definition.service.d.ts +51 -48
- package/lib/services/po-schema/po-schema-util/po-schema-util.model.d.ts +79 -79
- package/lib/services/po-schema/po-schema.service.d.ts +98 -95
- package/lib/services/po-sync/interfaces/po-sync-config.interface.d.ts +24 -24
- package/lib/services/po-sync/interfaces/po-sync-field-options.interface.d.ts +15 -15
- package/lib/services/po-sync/interfaces/po-sync-response.interface.d.ts +20 -20
- package/lib/services/po-sync/interfaces/po-sync-schema.interface.d.ts +37 -37
- package/lib/services/po-sync/po-sync.service.d.ts +162 -159
- package/lib/utils/utils.d.ts +36 -36
- package/package.json +30 -15
- package/po-ui-ng-sync-6.2.0.tgz +0 -0
- package/po-ui-ng-sync.d.ts +5 -8
- package/public-api.d.ts +1 -1
- package/schematics/README.md +169 -169
- package/schematics/collection.json +15 -15
- package/schematics/migrations.json +30 -25
- package/schematics/ng-add/index.d.ts +7 -7
- package/schematics/ng-add/index.js +33 -33
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/index.spec.d.ts +1 -1
- package/schematics/ng-add/index.spec.js +62 -62
- package/schematics/ng-add/index.spec.js.map +1 -1
- package/schematics/ng-add/schema.json +7 -7
- package/schematics/ng-generate/schema/files/__path__/__name@dasherize__/__name@dasherize__.constants.ts.template +13 -13
- package/schematics/ng-generate/schema/index.d.ts +4 -4
- package/schematics/ng-generate/schema/index.js +12 -12
- package/schematics/ng-generate/schema/index.js.map +1 -1
- package/schematics/ng-generate/schema/index.spec.d.ts +1 -1
- package/schematics/ng-generate/schema/index.spec.js +44 -44
- package/schematics/ng-generate/schema/index.spec.js.map +1 -1
- package/schematics/ng-generate/schema/schema.d.ts +3 -3
- package/schematics/ng-generate/schema/schema.js +2 -2
- package/schematics/ng-generate/schema/schema.json +31 -31
- package/schematics/ng-update/v2/changes.d.ts +8 -8
- package/schematics/ng-update/v2/changes.js +20 -20
- package/schematics/ng-update/v2/index.d.ts +5 -5
- package/schematics/ng-update/v2/index.js +101 -101
- package/schematics/ng-update/v2/index.js.map +1 -1
- package/schematics/ng-update/v3/changes.d.ts +2 -2
- package/schematics/ng-update/v3/changes.js +14 -14
- package/schematics/ng-update/v3/index.d.ts +1 -1
- package/schematics/ng-update/v3/index.js +16 -16
- package/schematics/ng-update/v3/index.js.map +1 -1
- package/schematics/ng-update/v4/changes.d.ts +2 -2
- package/schematics/ng-update/v4/changes.js +14 -14
- package/schematics/ng-update/v4/index.d.ts +1 -1
- package/schematics/ng-update/v4/index.js +15 -15
- package/schematics/ng-update/v4/index.js.map +1 -1
- package/schematics/ng-update/v5/changes.d.ts +2 -2
- package/schematics/ng-update/v5/changes.js +13 -13
- package/schematics/ng-update/v5/index.d.ts +1 -1
- package/schematics/ng-update/v5/index.js +15 -15
- package/schematics/ng-update/v5/index.js.map +1 -1
- package/schematics/ng-update/v6/changes.d.ts +2 -0
- package/schematics/ng-update/v6/changes.js +14 -0
- package/schematics/ng-update/v6/changes.js.map +1 -0
- package/schematics/ng-update/v6/index.d.ts +1 -0
- package/schematics/ng-update/v6/index.js +16 -0
- package/schematics/ng-update/v6/index.js.map +1 -0
- package/bundles/po-ui-ng-sync.umd.js +0 -3002
- package/bundles/po-ui-ng-sync.umd.js.map +0 -1
- package/esm2015/lib/models/po-data-transform.model.js +0 -22
- package/esm2015/lib/models/po-entity/po-entity.model.js +0 -229
- package/esm2015/lib/models/po-query-builder/po-query-builder.model.js +0 -241
- package/esm2015/lib/po-sync.module.js +0 -31
- package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-item.interface.js +0 -2
- package/esm2015/lib/services/po-event-sourcing/interfaces/po-event-sourcing-summary-item.interface.js +0 -2
- package/esm2015/lib/services/po-event-sourcing/po-event-sourcing.service.js +0 -411
- package/esm2015/lib/services/po-http-client/interfaces/po-http-request-data.interface.js +0 -2
- package/esm2015/lib/services/po-http-client/interfaces/po-response-api.interface.js +0 -2
- package/esm2015/lib/services/po-http-client/po-http-client.service.js +0 -147
- package/esm2015/lib/services/po-network/po-network.service.js +0 -58
- package/esm2015/lib/services/po-schema/po-schema-definition/po-schema-definition.service.js +0 -80
- package/esm2015/lib/services/po-schema/po-schema.service.js +0 -198
- package/esm2015/lib/services/po-sync/interfaces/po-sync-config.interface.js +0 -2
- package/esm2015/lib/services/po-sync/interfaces/po-sync-field-options.interface.js +0 -2
- package/esm2015/lib/services/po-sync/interfaces/po-sync-response.interface.js +0 -2
- package/esm2015/lib/services/po-sync/interfaces/po-sync-schema.interface.js +0 -2
- package/esm2015/lib/services/po-sync/po-sync.service.js +0 -336
- package/esm2015/po-ui-ng-sync.js +0 -9
- package/fesm2015/po-ui-ng-sync.js.map +0 -1
- package/po-ui-ng-sync-5.22.3.tgz +0 -0
- package/po-ui-ng-sync.metadata.json +0 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { forkJoin, Observable, of, Subject, timer } from 'rxjs';
|
|
3
|
+
import { expand, map, mergeMap, reduce } from 'rxjs/operators';
|
|
4
|
+
import { validateParameter, validateArray } from '../../utils/utils';
|
|
5
|
+
import { PoDataMessage, PoEntity } from '../../models';
|
|
6
|
+
import { PoRequestType } from '../../models/po-request-type.enum';
|
|
7
|
+
import { PoSchemaUtil } from './../po-schema/po-schema-util/po-schema-util.model';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../po-event-sourcing/po-event-sourcing.service";
|
|
10
|
+
import * as i2 from "../po-http-client/po-http-client.service";
|
|
11
|
+
import * as i3 from "../po-network/po-network.service";
|
|
12
|
+
import * as i4 from "./../po-schema/po-schema-definition/po-schema-definition.service";
|
|
13
|
+
import * as i5 from "./../po-schema/po-schema.service";
|
|
14
|
+
/**
|
|
15
|
+
* @description
|
|
16
|
+
*
|
|
17
|
+
* O `PoSyncService` é utilizado para configurar toda a base de dados que receberá as informações que serão
|
|
18
|
+
* armazenadas *offline* vindas do servidor. Nele ocorre toda a preparação dos modelos de dados retornados por
|
|
19
|
+
* cada consulta.
|
|
20
|
+
*/
|
|
21
|
+
export class PoSyncService {
|
|
22
|
+
constructor(poEventSourcingService, poHttpClient, poNetworkService, poSchemaDefinitionService, poSchemaService) {
|
|
23
|
+
this.poEventSourcingService = poEventSourcingService;
|
|
24
|
+
this.poHttpClient = poHttpClient;
|
|
25
|
+
this.poNetworkService = poNetworkService;
|
|
26
|
+
this.poSchemaDefinitionService = poSchemaDefinitionService;
|
|
27
|
+
this.poSchemaService = poSchemaService;
|
|
28
|
+
this.models = [];
|
|
29
|
+
this.finishSyncSubject = new Subject();
|
|
30
|
+
this.isSyncEnabled = true;
|
|
31
|
+
this.syncing = false;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Destrói todas as chaves do *storage* referentes ao `po-sync`, ou seja,
|
|
35
|
+
* as definições dos *schemas*, os registros de cada *schema* e a fila
|
|
36
|
+
* de eventos que estão para ser enviados ao servidor *(EventSourcing)*.
|
|
37
|
+
*
|
|
38
|
+
* > Para que não venham ocorrer erros em ações que dependam das definições dos *schemas*,
|
|
39
|
+
* recomenda-se utilizar o método `prepare()` em seguida.
|
|
40
|
+
*
|
|
41
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Alterando as definições dos schemas](/guides/sync-fundamentals).
|
|
42
|
+
*
|
|
43
|
+
* @returns {Promise<any>} Promessa que é resolvida quando as chaves referentes ao `po-sync` forem destruídas.
|
|
44
|
+
*/
|
|
45
|
+
async destroy() {
|
|
46
|
+
const destroyFunction = async () => {
|
|
47
|
+
await this.poSchemaService.destroySchemasRecords();
|
|
48
|
+
await this.poSchemaDefinitionService.destroy();
|
|
49
|
+
await this.poEventSourcingService.destroyEventSourcingQueue();
|
|
50
|
+
};
|
|
51
|
+
return this.poSchemaService.limitedCallWrap(destroyFunction);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Desabilita todos os tipos de sincronização de dados (periódica, reativa e manual).
|
|
55
|
+
*
|
|
56
|
+
* > Para habilitar novamente a sincronização utilize o método [`PoSyncService.enableSync()`](documentation/po-sync#enable-sync).
|
|
57
|
+
*/
|
|
58
|
+
disableSync() {
|
|
59
|
+
this.isSyncEnabled = false;
|
|
60
|
+
if (this.timer && this.subscription) {
|
|
61
|
+
this.subscription.unsubscribe();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* <a id="enable-sync"></a>
|
|
66
|
+
* Habilita todos os tipos de sincronização de dados (periódica, reativa e manual).
|
|
67
|
+
*
|
|
68
|
+
* Por padrão, sempre que se inicializa uma aplicação com PO Sync as sincronizações já estão habilitadas.
|
|
69
|
+
*/
|
|
70
|
+
enableSync() {
|
|
71
|
+
this.isSyncEnabled = true;
|
|
72
|
+
this.createSubscribe();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Método que disponibiliza a partir de sua inscrição o evento de retorno das operações da fila de eventos que
|
|
76
|
+
* foram enviadas ao servidor. A cada operação enviada para o servidor, será disparado um evento para a inscrição
|
|
77
|
+
* deste método.
|
|
78
|
+
*
|
|
79
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
|
|
80
|
+
*
|
|
81
|
+
* @returns {Observable<PoSyncResponse>} Observable com um objeto do tipo `PoSyncResponse`.
|
|
82
|
+
*/
|
|
83
|
+
getResponses() {
|
|
84
|
+
return this.poEventSourcingService.responsesSubject();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Retorna uma instância de `PoEntity` para um determinado *schema*.
|
|
88
|
+
*
|
|
89
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Manipulando os registros de um schema](/guides/sync-fundamentals).
|
|
90
|
+
*
|
|
91
|
+
* @param {string} schemaName Nome do *schema*.
|
|
92
|
+
* @returns {PoEntity} Objeto para efetuar consultas e alterações nos dados.
|
|
93
|
+
*/
|
|
94
|
+
getModel(schemaName) {
|
|
95
|
+
const model = this.models[schemaName];
|
|
96
|
+
if (!model) {
|
|
97
|
+
throw new Error('Model not found: ' + schemaName);
|
|
98
|
+
}
|
|
99
|
+
return model;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Insere uma requisição HTTP na fila de eventos do `po-sync`.
|
|
103
|
+
*
|
|
104
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Inserindo requisições HTTP na fila de eventos](/guides/sync-fundamentals).
|
|
105
|
+
*
|
|
106
|
+
* @param {PoHttpRequestData} poHttpRequestData Dados da requisição HTTP.
|
|
107
|
+
* @param {string} customRequestId Identificador customizado da requisição HTTP.
|
|
108
|
+
* @returns {Promise<number>} Promessa com o identificador da requisição HTTP criada.
|
|
109
|
+
*/
|
|
110
|
+
insertHttpCommand(requestData, customRequestId) {
|
|
111
|
+
validateParameter({ requestData });
|
|
112
|
+
return this.poEventSourcingService.httpCommand(requestData, customRequestId);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Efetua uma chamada na API do servidor para realizar a carga inicial dos dados. Deve ser chamado apenas uma vez
|
|
116
|
+
* na aplicação, após a preparação dos *schemas* realizada através do método `PoSyncService.prepare()`.
|
|
117
|
+
*
|
|
118
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Carga inicial dos dados](/guides/sync-fundamentals).
|
|
119
|
+
*
|
|
120
|
+
* @returns {Observable<Array<{ entity: string, data: Array<any> }>>} Observable que notificará quando a
|
|
121
|
+
* carga inicial for concluída.
|
|
122
|
+
*/
|
|
123
|
+
loadData() {
|
|
124
|
+
const loads = [];
|
|
125
|
+
this.schemas.forEach(el => loads.push(this.loadEntityData(el)));
|
|
126
|
+
return forkJoin(loads);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Responsável por notificar sempre que houver sincronismo.
|
|
130
|
+
*
|
|
131
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Notificação pós-sincronização](/guides/sync-fundamentals).
|
|
132
|
+
*
|
|
133
|
+
* @returns {Observable<any>} Observable que é disparado a cada sincronismo realizado.
|
|
134
|
+
*/
|
|
135
|
+
onSync() {
|
|
136
|
+
if (!this.eventSub) {
|
|
137
|
+
this.eventSub = Observable.create(e => {
|
|
138
|
+
this.emitter = e;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return this.eventSub;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Prepara a aplicação criando os schemas e aplica as configurações.
|
|
145
|
+
*
|
|
146
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Preparando a aplicação](/guides/sync-fundamentals).
|
|
147
|
+
*
|
|
148
|
+
* @param {Array<PoSyncSchema>} schemas Lista de *schemas* a serem preparados.
|
|
149
|
+
* @param {PoSyncConfig} config Configurações adicionais.
|
|
150
|
+
* @returns {Promise<any>} Promessa que é resolvida quando a aplicação estiver preparada para a utilização do `po-sync`.
|
|
151
|
+
*/
|
|
152
|
+
prepare(schemas, config) {
|
|
153
|
+
validateArray({ schemas });
|
|
154
|
+
const defaultSyncConfig = {
|
|
155
|
+
type: this.poNetworkService.getConnectionStatus().type,
|
|
156
|
+
period: 60,
|
|
157
|
+
dataTransform: new PoDataMessage()
|
|
158
|
+
};
|
|
159
|
+
this.schemas = schemas;
|
|
160
|
+
this.config = config || defaultSyncConfig;
|
|
161
|
+
this.config.dataTransform = this.config.dataTransform || new PoDataMessage();
|
|
162
|
+
this.poEventSourcingService.config = this.config;
|
|
163
|
+
this.startTimer(this.config.period);
|
|
164
|
+
this.reactiveSync();
|
|
165
|
+
this.poEventSourcingService.onSaveData().subscribe(() => this.sync());
|
|
166
|
+
return this.saveSchemas().then(() => {
|
|
167
|
+
this.schemas.forEach(schema => {
|
|
168
|
+
this.models[schema.name] = new PoEntity(this.poEventSourcingService, schema, this.poSchemaService);
|
|
169
|
+
});
|
|
170
|
+
return Promise.resolve();
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Remove um item da fila de eventos que espera a sincronização.
|
|
175
|
+
*
|
|
176
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
|
|
177
|
+
*
|
|
178
|
+
* @param {any} idEventSourcing Identificador do item da fila de eventos.
|
|
179
|
+
* @returns {Promise<any>} Promessa que é resolvida quando o item da fila de eventos é removido.
|
|
180
|
+
*/
|
|
181
|
+
removeItemOfSync(idEventSourcing) {
|
|
182
|
+
return this.poEventSourcingService.removeEventSourcingItem(idEventSourcing);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Reenvia os comandos pendentes na fila (inclusão, alteração e exclusão) e busca novos dados do servidor.
|
|
186
|
+
*
|
|
187
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Capturando respostas da sincronização](/guides/sync-fundamentals).
|
|
188
|
+
*
|
|
189
|
+
* @returns {Promise<any>} Promessa que resolve o sincronismo disparado.
|
|
190
|
+
*/
|
|
191
|
+
resumeSync() {
|
|
192
|
+
if (!this.canSync()) {
|
|
193
|
+
const finishSyncSubscription = this.finishSyncSubject.asObservable().subscribe(() => {
|
|
194
|
+
finishSyncSubscription.unsubscribe();
|
|
195
|
+
return this.sync();
|
|
196
|
+
});
|
|
197
|
+
return Promise.resolve();
|
|
198
|
+
}
|
|
199
|
+
return this.sync();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Dispara o sincronismo enviando os eventos pendentes (inclusão, alteração e exclusão) e buscando novos dados do servidor.
|
|
203
|
+
*
|
|
204
|
+
* O sincronismo somente será executado depois que o acesso a base de dados local do dispositivo for liberada.
|
|
205
|
+
*
|
|
206
|
+
* > Veja mais detalhes em [Fundamentos do PO Sync - Sincronização manual](/guides/sync-fundamentals).
|
|
207
|
+
*
|
|
208
|
+
* @returns {Promise<any>} Promessa que é resolvida quando o sincronismo for finalizado.
|
|
209
|
+
*/
|
|
210
|
+
async sync() {
|
|
211
|
+
if (this.canSync()) {
|
|
212
|
+
this.startSync();
|
|
213
|
+
try {
|
|
214
|
+
await this.poEventSourcingService.syncSend();
|
|
215
|
+
await this.poEventSourcingService.syncGet();
|
|
216
|
+
if (this.emitter) {
|
|
217
|
+
this.emitter.next();
|
|
218
|
+
}
|
|
219
|
+
this.finishSync();
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
this.syncError();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
canSync() {
|
|
227
|
+
if (this.syncing || !this.isSyncEnabled) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const currentConnection = this.poNetworkService.getConnectionStatus();
|
|
232
|
+
const isConfiguredConnection = this.config && currentConnection.type === this.config.type;
|
|
233
|
+
const isConfigIncludesType = this.config && this.config.type instanceof Array && this.config.type.includes(currentConnection.type);
|
|
234
|
+
return currentConnection.status && (!this.config || isConfiguredConnection || isConfigIncludesType);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
createSubscribe() {
|
|
238
|
+
if (this.timer) {
|
|
239
|
+
this.subscription = this.timer.subscribe(() => {
|
|
240
|
+
this.sync().then(() => {
|
|
241
|
+
this.subscription.unsubscribe();
|
|
242
|
+
this.subscription = null;
|
|
243
|
+
this.timer = null;
|
|
244
|
+
this.startTimer(this.config.period);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
finishSync() {
|
|
250
|
+
this.syncing = false;
|
|
251
|
+
this.finishSyncSubject.next(null);
|
|
252
|
+
}
|
|
253
|
+
getOnePage(schema, page = 1) {
|
|
254
|
+
const params = [];
|
|
255
|
+
params.push(`${this.config.dataTransform.getPageSizeParamName()}=${schema.pageSize}`);
|
|
256
|
+
params.push(`${this.config.dataTransform.getPageParamName()}=${page}`);
|
|
257
|
+
const url = `${PoSchemaUtil.getUrl(schema, PoRequestType.GET)}?${params.join('&')}`;
|
|
258
|
+
return this.poHttpClient.get(url).pipe(map(response => response.body), mergeMap(responseBody => {
|
|
259
|
+
const now = new Date().getTime();
|
|
260
|
+
responseBody[this.config.dataTransform.getItemsFieldName()].map(item => {
|
|
261
|
+
item.SyncInsertedDateTime = now;
|
|
262
|
+
item.SyncUpdatedDateTime = null;
|
|
263
|
+
item.SyncExclusionDateTime = null;
|
|
264
|
+
item.SyncDeleted = false;
|
|
265
|
+
item.SyncStatus = 2;
|
|
266
|
+
});
|
|
267
|
+
return this.poSchemaService
|
|
268
|
+
.updateAll(schema, responseBody[this.config.dataTransform.getItemsFieldName()])
|
|
269
|
+
.then(() => responseBody);
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
loadEntityData(schema) {
|
|
273
|
+
let page = 1;
|
|
274
|
+
return this.getOnePage(schema, page).pipe(expand(data => {
|
|
275
|
+
this.config.dataTransform.transform(data);
|
|
276
|
+
const hasNext = this.config.dataTransform.hasNext();
|
|
277
|
+
if (hasNext) {
|
|
278
|
+
return this.getOnePage(schema, ++page);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
return of();
|
|
282
|
+
}
|
|
283
|
+
}), reduce((acc, obj) => {
|
|
284
|
+
acc.data = acc.data.concat(obj[this.config.dataTransform.getItemsFieldName()]);
|
|
285
|
+
return acc;
|
|
286
|
+
}, {
|
|
287
|
+
entity: schema.name,
|
|
288
|
+
data: []
|
|
289
|
+
}));
|
|
290
|
+
}
|
|
291
|
+
reactiveSync() {
|
|
292
|
+
this.poNetworkService.onChange().subscribe(networkStatus => {
|
|
293
|
+
if (networkStatus.status) {
|
|
294
|
+
this.startTimer(this.config.period);
|
|
295
|
+
return this.sync();
|
|
296
|
+
}
|
|
297
|
+
if (this.subscription) {
|
|
298
|
+
this.subscription.unsubscribe();
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
async saveSchemas() {
|
|
303
|
+
const storageSchemas = await this.poSchemaDefinitionService.getAll();
|
|
304
|
+
this.schemas.forEach(schema => (schema.lastSync = PoSchemaUtil.getLastSync(storageSchemas, schema.name)));
|
|
305
|
+
return this.poSchemaDefinitionService.saveAll(this.schemas);
|
|
306
|
+
}
|
|
307
|
+
startSync() {
|
|
308
|
+
this.syncing = true;
|
|
309
|
+
}
|
|
310
|
+
startTimer(period) {
|
|
311
|
+
if (period && this.isSyncEnabled) {
|
|
312
|
+
this.timer = timer(period * 1000);
|
|
313
|
+
this.createSubscribe();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
syncError() {
|
|
317
|
+
this.finishSync();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
PoSyncService.ɵfac = function PoSyncService_Factory(t) { return new (t || PoSyncService)(i0.ɵɵinject(i1.PoEventSourcingService), i0.ɵɵinject(i2.PoHttpClientService), i0.ɵɵinject(i3.PoNetworkService), i0.ɵɵinject(i4.PoSchemaDefinitionService), i0.ɵɵinject(i5.PoSchemaService)); };
|
|
321
|
+
PoSyncService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoSyncService, factory: PoSyncService.ɵfac });
|
|
322
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoSyncService, [{
|
|
323
|
+
type: Injectable
|
|
324
|
+
}], function () { return [{ type: i1.PoEventSourcingService }, { type: i2.PoHttpClientService }, { type: i3.PoNetworkService }, { type: i4.PoSchemaDefinitionService }, { type: i5.PoSchemaService }]; }, null); })();
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tc3luYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3luYy9zcmMvbGliL3NlcnZpY2VzL3BvLXN5bmMvcG8tc3luYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFLdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7OztBQUtsRjs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sYUFBYTtJQWF4QixZQUNVLHNCQUE4QyxFQUM5QyxZQUFpQyxFQUNqQyxnQkFBa0MsRUFDbEMseUJBQW9ELEVBQ3BELGVBQWdDO1FBSmhDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFqQjFDLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBS3JCLHNCQUFpQixHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3ZELGtCQUFhLEdB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TSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQjtZQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNqQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLE1BQU0sY0FBYyxHQUF3QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQU07UUFDdkIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7MEVBNVZVLGFBQWE7bUVBQWIsYUFBYSxXQUFiLGFBQWE7dUZBQWIsYUFBYTtjQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGV4cGFuZCwgbWFwLCBtZXJnZU1hcCwgcmVkdWNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVQYXJhbWV0ZXIsIHZhbGlkYXRlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5cbmltcG9ydCB7IFBvRGF0YU1lc3NhZ2UsIFBvRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UgfSBmcm9tICcuLi9wby1ldmVudC1zb3VyY2luZy9wby1ldmVudC1zb3VyY2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFBvSHR0cENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9wby1odHRwLWNsaWVudC9wby1odHRwLWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFBvSHR0cFJlcXVlc3REYXRhIH0gZnJvbSAnLi4vcG8taHR0cC1jbGllbnQvaW50ZXJmYWNlcy9wby1odHRwLXJlcXVlc3QtZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9OZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3BvLW5ldHdvcmsvcG8tbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IFBvUmVxdWVzdFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvcG8tcmVxdWVzdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vcG8tc2NoZW1hL3BvLXNjaGVtYS1kZWZpbml0aW9uL3BvLXNjaGVtYS1kZWZpbml0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9TY2hlbWFVdGlsIH0gZnJvbSAnLi8uLi9wby1zY2hlbWEvcG8tc2NoZW1hLXV0aWwvcG8tc2NoZW1hLXV0aWwubW9kZWwnO1xuaW1wb3J0IHsgUG9TeW5jQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXN5bmMtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1N5bmNSZXNwb25zZSB9IGZyb20gJy4uL3BvLXN5bmMvaW50ZXJmYWNlcy9wby1zeW5jLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1N5bmNTY2hlbWEgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tc3luYy1zY2hlbWEuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBPIGBQb1N5bmNTZXJ2aWNlYCDDqSB1dGlsaXphZG8gcGFyYSBjb25maWd1cmFyIHRvZGEgYSBiYXNlIGRlIGRhZG9zIHF1ZSByZWNlYmVyw6EgYXMgaW5mb3JtYcOnw7VlcyBxdWUgc2Vyw6NvXG4gKiBhcm1hemVuYWRhcyAqb2ZmbGluZSogdmluZGFzIGRvIHNlcnZpZG9yLiBOZWxlIG9jb3JyZSB0b2RhIGEgcHJlcGFyYcOnw6NvIGRvcyBtb2RlbG9zIGRlIGRhZG9zIHJldG9ybmFkb3MgcG9yXG4gKiBjYWRhIGNvbnN1bHRhLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9TeW5jU2VydmljZSB7XG4gIG1vZGVsczogQXJyYXk8UG9FbnRpdHk+ID0gW107XG5cbiAgcHJpdmF0ZSBjb25maWc6IFBvU3luY0NvbmZpZztcbiAgcHJpdmF0ZSBlbWl0dGVyOiBhbnk7XG4gIHByaXZhdGUgZXZlbnRTdWI6IE9ic2VydmFibGU8YW55PjtcbiAgcHJpdmF0ZSBmaW5pc2hTeW5jU3ViamVjdDogU3ViamVjdDxudWxsPiA9IG5ldyBTdWJqZWN0PG51bGw+KCk7XG4gIHByaXZhdGUgaXNTeW5jRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgc2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPjtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBzeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdGltZXI6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBvRXZlbnRTb3VyY2luZ1NlcnZpY2U6IFBvRXZlbnRTb3VyY2luZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb0h0dHBDbGllbnQ6IFBvSHR0cENsaWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb05ldHdvcmtTZXJ2aWNlOiBQb05ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9TY2hlbWFEZWZpbml0aW9uU2VydmljZTogUG9TY2hlbWFEZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHBvU2NoZW1hU2VydmljZTogUG9TY2hlbWFTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogRGVzdHLDs2kgdG9kYXMgYXMgY2hhdmVzIGRvICpzdG9yYWdlKiByZWZlcmVudGVzIGFvIGBwby1zeW5jYCwgb3Ugc2VqYSxcbiAgICogYXMgZGVmaW5pw6fDtWVzIGRvcyAqc2NoZW1hcyosIG9zIHJlZ2lzdHJvcyBkZSBjYWRhICpzY2hlbWEqIGUgYSBmaWxhXG4gICAqIGRlIGV2ZW50b3MgcXVlIGVzdMOjbyBwYXJhIHNlciBlbnZpYWRvcyBhbyBzZXJ2aWRvciAqKEV2ZW50U291cmNpbmcpKi5cbiAgICpcbiAgICogPiBQYXJhIHF1ZSBuw6NvIHZlbmhhbSBvY29ycmVyIGVycm9zIGVtIGHDp8O1ZXMgcXVlIGRlcGVuZGFtIGRhcyBkZWZpbmnDp8O1ZXMgZG9zICpzY2hlbWFzKixcbiAgICogcmVjb21lbmRhLXNlIHV0aWxpemFyIG8gbcOpdG9kbyBgcHJlcGFyZSgpYCBlbSBzZWd1aWRhLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIEFsdGVyYW5kbyBhcyBkZWZpbmnDp8O1ZXMgZG9zIHNjaGVtYXNdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhcyBjaGF2ZXMgcmVmZXJlbnRlcyBhbyBgcG8tc3luY2AgZm9yZW0gZGVzdHJ1w61kYXMuXG4gICAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgZGVzdHJveUZ1bmN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5wb1NjaGVtYVNlcnZpY2UuZGVzdHJveVNjaGVtYXNSZWNvcmRzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBvU2NoZW1hRGVmaW5pdGlvblNlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLmRlc3Ryb3lFdmVudFNvdXJjaW5nUXVldWUoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFTZXJ2aWNlLmxpbWl0ZWRDYWxsV3JhcChkZXN0cm95RnVuY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2FiaWxpdGEgdG9kb3Mgb3MgdGlwb3MgZGUgc2luY3Jvbml6YcOnw6NvIGRlIGRhZG9zIChwZXJpw7NkaWNhLCByZWF0aXZhIGUgbWFudWFsKS5cbiAgICpcbiAgICogPiBQYXJhIGhhYmlsaXRhciBub3ZhbWVudGUgYSBzaW5jcm9uaXphw6fDo28gdXRpbGl6ZSBvIG3DqXRvZG8gW2BQb1N5bmNTZXJ2aWNlLmVuYWJsZVN5bmMoKWBdKGRvY3VtZW50YXRpb24vcG8tc3luYyNlbmFibGUtc3luYykuXG4gICAqL1xuICBkaXNhYmxlU3luYygpIHtcbiAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnRpbWVyICYmIHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA8YSBpZD1cImVuYWJsZS1zeW5jXCI+PC9hPlxuICAgKiBIYWJpbGl0YSB0b2RvcyBvcyB0aXBvcyBkZSBzaW5jcm9uaXphw6fDo28gZGUgZGFkb3MgKHBlcmnDs2RpY2EsIHJlYXRpdmEgZSBtYW51YWwpLlxuICAgKlxuICAgKiBQb3IgcGFkcsOjbywgc2VtcHJlIHF1ZSBzZSBpbmljaWFsaXphIHVtYSBhcGxpY2HDp8OjbyBjb20gUE8gU3luYyBhcyBzaW5jcm9uaXphw6fDtWVzIGrDoSBlc3TDo28gaGFiaWxpdGFkYXMuXG4gICAqL1xuICBlbmFibGVTeW5jKCkge1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5jcmVhdGVTdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHF1ZSBkaXNwb25pYmlsaXphIGEgcGFydGlyIGRlIHN1YSBpbnNjcmnDp8OjbyBvIGV2ZW50byBkZSByZXRvcm5vIGRhcyBvcGVyYcOnw7VlcyBkYSBmaWxhIGRlIGV2ZW50b3MgcXVlXG4gICAqIGZvcmFtIGVudmlhZGFzIGFvIHNlcnZpZG9yLiBBIGNhZGEgb3BlcmHDp8OjbyBlbnZpYWRhIHBhcmEgbyBzZXJ2aWRvciwgc2Vyw6EgZGlzcGFyYWRvIHVtIGV2ZW50byBwYXJhIGEgaW5zY3Jpw6fDo29cbiAgICogZGVzdGUgbcOpdG9kby5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXB0dXJhbmRvIHJlc3Bvc3RhcyBkYSBzaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxQb1N5bmNSZXNwb25zZT59IE9ic2VydmFibGUgY29tIHVtIG9iamV0byBkbyB0aXBvIGBQb1N5bmNSZXNwb25zZWAuXG4gICAqL1xuICBnZXRSZXNwb25zZXMoKTogT2JzZXJ2YWJsZTxQb1N5bmNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UucmVzcG9uc2VzU3ViamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdW1hIGluc3TDom5jaWEgZGUgYFBvRW50aXR5YCBwYXJhIHVtIGRldGVybWluYWRvICpzY2hlbWEqLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIE1hbmlwdWxhbmRvIG9zIHJlZ2lzdHJvcyBkZSB1bSBzY2hlbWFdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZW1hTmFtZSBOb21lIGRvICpzY2hlbWEqLlxuICAgKiBAcmV0dXJucyB7UG9FbnRpdHl9IE9iamV0byBwYXJhIGVmZXR1YXIgY29uc3VsdGFzIGUgYWx0ZXJhw6fDtWVzIG5vcyBkYWRvcy5cbiAgICovXG4gIGdldE1vZGVsKHNjaGVtYU5hbWU6IHN0cmluZyk6IFBvRW50aXR5IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzW3NjaGVtYU5hbWVdO1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgbm90IGZvdW5kOiAnICsgc2NoZW1hTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcmUgdW1hIHJlcXVpc2nDp8OjbyBIVFRQIG5hIGZpbGEgZGUgZXZlbnRvcyBkbyBgcG8tc3luY2AuXG4gICAqXG4gICAqID4gVmVqYSBtYWlzIGRldGFsaGVzIGVtIFtGdW5kYW1lbnRvcyBkbyBQTyBTeW5jIC0gSW5zZXJpbmRvIHJlcXVpc2nDp8O1ZXMgSFRUUCBuYSBmaWxhIGRlIGV2ZW50b3NdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvSHR0cFJlcXVlc3REYXRhfSBwb0h0dHBSZXF1ZXN0RGF0YSBEYWRvcyBkYSByZXF1aXNpw6fDo28gSFRUUC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbVJlcXVlc3RJZCBJZGVudGlmaWNhZG9yIGN1c3RvbWl6YWRvIGRhIHJlcXVpc2nDp8OjbyBIVFRQLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBQcm9tZXNzYSBjb20gbyBpZGVudGlmaWNhZG9yIGRhIHJlcXVpc2nDp8OjbyBIVFRQIGNyaWFkYS5cbiAgICovXG4gIGluc2VydEh0dHBDb21tYW5kKHJlcXVlc3REYXRhOiBQb0h0dHBSZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB2YWxpZGF0ZVBhcmFtZXRlcih7IHJlcXVlc3REYXRhIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5odHRwQ29tbWFuZChyZXF1ZXN0RGF0YSwgY3VzdG9tUmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZmV0dWEgdW1hIGNoYW1hZGEgbmEgQVBJIGRvIHNlcnZpZG9yIHBhcmEgcmVhbGl6YXIgYSBjYXJnYSBpbmljaWFsIGRvcyBkYWRvcy4gRGV2ZSBzZXIgY2hhbWFkbyBhcGVuYXMgdW1hIHZlelxuICAgKiBuYSBhcGxpY2HDp8OjbywgYXDDs3MgYSBwcmVwYXJhw6fDo28gZG9zICpzY2hlbWFzKiByZWFsaXphZGEgYXRyYXbDqXMgZG8gbcOpdG9kbyBgUG9TeW5jU2VydmljZS5wcmVwYXJlKClgLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIENhcmdhIGluaWNpYWwgZG9zIGRhZG9zXSgvZ3VpZGVzL3N5bmMtZnVuZGFtZW50YWxzKS5cbiAgICpcbiAgICogQHJldHVybnMge09ic2VydmFibGU8QXJyYXk8eyBlbnRpdHk6IHN0cmluZywgZGF0YTogQXJyYXk8YW55PiB9Pj59IE9ic2VydmFibGUgcXVlIG5vdGlmaWNhcsOhIHF1YW5kbyBhXG4gICAqIGNhcmdhIGluaWNpYWwgZm9yIGNvbmNsdcOtZGEuXG4gICAqL1xuICBsb2FkRGF0YSgpOiBPYnNlcnZhYmxlPEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4+IHtcbiAgICBjb25zdCBsb2FkczogQXJyYXk8T2JzZXJ2YWJsZTx7IGVudGl0eTogc3RyaW5nOyBkYXRhOiBBcnJheTxhbnk+IH0+PiA9IFtdO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKGVsID0+IGxvYWRzLnB1c2godGhpcy5sb2FkRW50aXR5RGF0YShlbCkpKTtcbiAgICByZXR1cm4gZm9ya0pvaW4obG9hZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbnPDoXZlbCBwb3Igbm90aWZpY2FyIHNlbXByZSBxdWUgaG91dmVyIHNpbmNyb25pc21vLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIE5vdGlmaWNhw6fDo28gcMOzcy1zaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxhbnk+fSBPYnNlcnZhYmxlIHF1ZSDDqSBkaXNwYXJhZG8gYSBjYWRhIHNpbmNyb25pc21vIHJlYWxpemFkby5cbiAgICovXG4gIG9uU3luYygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICghdGhpcy5ldmVudFN1Yikge1xuICAgICAgdGhpcy5ldmVudFN1YiA9IE9ic2VydmFibGUuY3JlYXRlKGUgPT4ge1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZW50U3ViO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmEgYSBhcGxpY2HDp8OjbyBjcmlhbmRvIG9zIHNjaGVtYXMgZSBhcGxpY2EgYXMgY29uZmlndXJhw6fDtWVzLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIFByZXBhcmFuZG8gYSBhcGxpY2HDp8Ojb10oL2d1aWRlcy9zeW5jLWZ1bmRhbWVudGFscykuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8UG9TeW5jU2NoZW1hPn0gc2NoZW1hcyBMaXN0YSBkZSAqc2NoZW1hcyogYSBzZXJlbSBwcmVwYXJhZG9zLlxuICAgKiBAcGFyYW0ge1BvU3luY0NvbmZpZ30gY29uZmlnIENvbmZpZ3VyYcOnw7VlcyBhZGljaW9uYWlzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBhIGFwbGljYcOnw6NvIGVzdGl2ZXIgcHJlcGFyYWRhIHBhcmEgYSB1dGlsaXphw6fDo28gZG8gYHBvLXN5bmNgLlxuICAgKi9cbiAgcHJlcGFyZShzY2hlbWFzOiBBcnJheTxQb1N5bmNTY2hlbWE+LCBjb25maWc/OiBQb1N5bmNDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICAgIHZhbGlkYXRlQXJyYXkoeyBzY2hlbWFzIH0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFN5bmNDb25maWc6IFBvU3luY0NvbmZpZyA9IHtcbiAgICAgIHR5cGU6IHRoaXMucG9OZXR3b3JrU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdHVzKCkudHlwZSxcbiAgICAgIHBlcmlvZDogNjAsXG4gICAgICBkYXRhVHJhbnNmb3JtOiBuZXcgUG9EYXRhTWVzc2FnZSgpXG4gICAgfTtcblxuICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWcgfHwgZGVmYXVsdFN5bmNDb25maWc7XG4gICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybSA9IHRoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0gfHwgbmV3IFBvRGF0YU1lc3NhZ2UoKTtcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2UuY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5zdGFydFRpbWVyKHRoaXMuY29uZmlnLnBlcmlvZCk7XG4gICAgdGhpcy5yZWFjdGl2ZVN5bmMoKTtcbiAgICB0aGlzLnBvRXZlbnRTb3VyY2luZ1NlcnZpY2Uub25TYXZlRGF0YSgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN5bmMoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5zYXZlU2NoZW1hcygpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zY2hlbWFzLmZvckVhY2goc2NoZW1hID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbHNbc2NoZW1hLm5hbWVdID0gbmV3IFBvRW50aXR5KHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZSwgc2NoZW1hLCB0aGlzLnBvU2NoZW1hU2VydmljZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdW0gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MgcXVlIGVzcGVyYSBhIHNpbmNyb25pemHDp8Ojby5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXB0dXJhbmRvIHJlc3Bvc3RhcyBkYSBzaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gaWRFdmVudFNvdXJjaW5nIElkZW50aWZpY2Fkb3IgZG8gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFByb21lc3NhIHF1ZSDDqSByZXNvbHZpZGEgcXVhbmRvIG8gaXRlbSBkYSBmaWxhIGRlIGV2ZW50b3Mgw6kgcmVtb3ZpZG8uXG4gICAqL1xuICByZW1vdmVJdGVtT2ZTeW5jKGlkRXZlbnRTb3VyY2luZzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnJlbW92ZUV2ZW50U291cmNpbmdJdGVtKGlkRXZlbnRTb3VyY2luZyk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbnZpYSBvcyBjb21hbmRvcyBwZW5kZW50ZXMgbmEgZmlsYSAoaW5jbHVzw6NvLCBhbHRlcmHDp8OjbyBlIGV4Y2x1c8OjbykgZSBidXNjYSBub3ZvcyBkYWRvcyBkbyBzZXJ2aWRvci5cbiAgICpcbiAgICogPiBWZWphIG1haXMgZGV0YWxoZXMgZW0gW0Z1bmRhbWVudG9zIGRvIFBPIFN5bmMgLSBDYXB0dXJhbmRvIHJlc3Bvc3RhcyBkYSBzaW5jcm9uaXphw6fDo29dKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgcmVzb2x2ZSBvIHNpbmNyb25pc21vIGRpc3BhcmFkby5cbiAgICovXG4gIHJlc3VtZVN5bmMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuY2FuU3luYygpKSB7XG4gICAgICBjb25zdCBmaW5pc2hTeW5jU3Vic2NyaXB0aW9uID0gdGhpcy5maW5pc2hTeW5jU3ViamVjdC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBmaW5pc2hTeW5jU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXJhIG8gc2luY3JvbmlzbW8gZW52aWFuZG8gb3MgZXZlbnRvcyBwZW5kZW50ZXMgKGluY2x1c8OjbywgYWx0ZXJhw6fDo28gZSBleGNsdXPDo28pIGUgYnVzY2FuZG8gbm92b3MgZGFkb3MgZG8gc2Vydmlkb3IuXG4gICAqXG4gICAqIE8gc2luY3JvbmlzbW8gc29tZW50ZSBzZXLDoSBleGVjdXRhZG8gZGVwb2lzIHF1ZSBvIGFjZXNzbyBhIGJhc2UgZGUgZGFkb3MgbG9jYWwgZG8gZGlzcG9zaXRpdm8gZm9yIGxpYmVyYWRhLlxuICAgKlxuICAgKiA+IFZlamEgbWFpcyBkZXRhbGhlcyBlbSBbRnVuZGFtZW50b3MgZG8gUE8gU3luYyAtIFNpbmNyb25pemHDp8OjbyBtYW51YWxdKC9ndWlkZXMvc3luYy1mdW5kYW1lbnRhbHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBQcm9tZXNzYSBxdWUgw6kgcmVzb2x2aWRhIHF1YW5kbyBvIHNpbmNyb25pc21vIGZvciBmaW5hbGl6YWRvLlxuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNhblN5bmMoKSkge1xuICAgICAgdGhpcy5zdGFydFN5bmMoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wb0V2ZW50U291cmNpbmdTZXJ2aWNlLnN5bmNTZW5kKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucG9FdmVudFNvdXJjaW5nU2VydmljZS5zeW5jR2V0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW1pdHRlcikge1xuICAgICAgICAgIHRoaXMuZW1pdHRlci5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbmlzaFN5bmMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc3luY0Vycm9yKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYW5TeW5jKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN5bmNpbmcgfHwgIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50Q29ubmVjdGlvbiA9IHRoaXMucG9OZXR3b3JrU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdHVzKCk7XG4gICAgICBjb25zdCBpc0NvbmZpZ3VyZWRDb25uZWN0aW9uID0gdGhpcy5jb25maWcgJiYgY3VycmVudENvbm5lY3Rpb24udHlwZSA9PT0gdGhpcy5jb25maWcudHlwZTtcbiAgICAgIGNvbnN0IGlzQ29uZmlnSW5jbHVkZXNUeXBlID1cbiAgICAgICAgdGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcudHlwZSBpbnN0YW5jZW9mIEFycmF5ICYmIHRoaXMuY29uZmlnLnR5cGUuaW5jbHVkZXMoY3VycmVudENvbm5lY3Rpb24udHlwZSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50Q29ubmVjdGlvbi5zdGF0dXMgJiYgKCF0aGlzLmNvbmZpZyB8fCBpc0NvbmZpZ3VyZWRDb25uZWN0aW9uIHx8IGlzQ29uZmlnSW5jbHVkZXNUeXBlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3RhcnRUaW1lcih0aGlzLmNvbmZpZy5wZXJpb2QpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmZpbmlzaFN5bmNTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGdldE9uZVBhZ2Uoc2NoZW1hOiBQb1N5bmNTY2hlbWEsIHBhZ2U6IG51bWJlciA9IDEpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIHBhcmFtcy5wdXNoKGAke3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0UGFnZVNpemVQYXJhbU5hbWUoKX09JHtzY2hlbWEucGFnZVNpemV9YCk7XG4gICAgcGFyYW1zLnB1c2goYCR7dGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS5nZXRQYWdlUGFyYW1OYW1lKCl9PSR7cGFnZX1gKTtcblxuICAgIGNvbnN0IHVybCA9IGAke1BvU2NoZW1hVXRpbC5nZXRVcmwoc2NoZW1hLCBQb1JlcXVlc3RUeXBlLkdFVCl9PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucG9IdHRwQ2xpZW50LmdldCh1cmwpLnBpcGUoXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYm9keSksXG4gICAgICBtZXJnZU1hcChyZXNwb25zZUJvZHkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGl0ZW0uU3luY0luc2VydGVkRGF0ZVRpbWUgPSBub3c7XG4gICAgICAgICAgaXRlbS5TeW5jVXBkYXRlZERhdGVUaW1lID0gbnVsbDtcbiAgICAgICAgICBpdGVtLlN5bmNFeGNsdXNpb25EYXRlVGltZSA9IG51bGw7XG4gICAgICAgICAgaXRlbS5TeW5jRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgIGl0ZW0uU3luY1N0YXR1cyA9IDI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wb1NjaGVtYVNlcnZpY2VcbiAgICAgICAgICAudXBkYXRlQWxsKHNjaGVtYSwgcmVzcG9uc2VCb2R5W3RoaXMuY29uZmlnLmRhdGFUcmFuc2Zvcm0uZ2V0SXRlbXNGaWVsZE5hbWUoKV0pXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzcG9uc2VCb2R5KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEVudGl0eURhdGEoc2NoZW1hOiBQb1N5bmNTY2hlbWEpOiBPYnNlcnZhYmxlPHsgZW50aXR5OiBzdHJpbmc7IGRhdGE6IEFycmF5PGFueT4gfT4ge1xuICAgIGxldCBwYWdlID0gMTtcbiAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgcGFnZSkucGlwZShcbiAgICAgIGV4cGFuZChkYXRhID0+IHtcbiAgICAgICAgdGhpcy5jb25maWcuZGF0YVRyYW5zZm9ybS50cmFuc2Zvcm0oZGF0YSk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSB0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmhhc05leHQoKTtcbiAgICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPbmVQYWdlKHNjaGVtYSwgKytwYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICByZWR1Y2UoXG4gICAgICAgIChhY2MsIG9iaikgPT4ge1xuICAgICAgICAgIGFjYy5kYXRhID0gYWNjLmRhdGEuY29uY2F0KG9ialt0aGlzLmNvbmZpZy5kYXRhVHJhbnNmb3JtLmdldEl0ZW1zRmllbGROYW1lKCldKTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZW50aXR5OiBzY2hlbWEubmFtZSxcbiAgICAgICAgICBkYXRhOiBbXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhY3RpdmVTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMucG9OZXR3b3JrU2VydmljZS5vbkNoYW5nZSgpLnN1YnNjcmliZShuZXR3b3JrU3RhdHVzID0+IHtcbiAgICAgIGlmIChuZXR3b3JrU3RhdHVzLnN0YXR1cykge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIodGhpcy5jb25maWcucGVyaW9kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVNjaGVtYXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdG9yYWdlU2NoZW1hczogQXJyYXk8UG9TeW5jU2NoZW1hPiA9IGF3YWl0IHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5nZXRBbGwoKTtcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4gKHNjaGVtYS5sYXN0U3luYyA9IFBvU2NoZW1hVXRpbC5nZXRMYXN0U3luYyhzdG9yYWdlU2NoZW1hcywgc2NoZW1hLm5hbWUpKSk7XG4gICAgcmV0dXJuIHRoaXMucG9TY2hlbWFEZWZpbml0aW9uU2VydmljZS5zYXZlQWxsKHRoaXMuc2NoZW1hcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0U3luYygpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNpbmcgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFRpbWVyKHBlcmlvZCk6IHZvaWQge1xuICAgIGlmIChwZXJpb2QgJiYgdGhpcy5pc1N5bmNFbmFibGVkKSB7XG4gICAgICB0aGlzLnRpbWVyID0gdGltZXIocGVyaW9kICogMTAwMCk7XG4gICAgICB0aGlzLmNyZWF0ZVN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0Vycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuZmluaXNoU3luYygpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retorna um *array* contendo os pares `[chave, valor]` do objeto.
|
|
3
|
-
*
|
|
4
|
-
* Semelhante ao método `Object.entries()` nativo do javascript.
|
|
5
|
-
*
|
|
6
|
-
* > Veja mais em: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
|
|
7
|
-
*
|
|
8
|
-
* @param object Objeto que será extraído os pares [chave, valor].
|
|
9
|
-
*/
|
|
10
|
-
export const getObjectEntries = (object) => {
|
|
11
|
-
const objectName = Object.keys(object)[0];
|
|
12
|
-
const objectValue = object[objectName];
|
|
13
|
-
return [objectName, objectValue];
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Recebe um objeto e valida se o seu valor é diferente de *undefined* ou *null*.
|
|
17
|
-
*
|
|
18
|
-
* @param {object} parameter Objeto contento o nome do parâmetro que está sendo validado
|
|
19
|
-
* e o seu valor.
|
|
20
|
-
*/
|
|
21
|
-
export const validateParameter = (parameter) => {
|
|
22
|
-
const [paramName, paramValue] = getObjectEntries(parameter);
|
|
23
|
-
if (paramValue === undefined || paramValue === null) {
|
|
24
|
-
throw new Error(`The ${paramName} parameter cannot be undefined or null`);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Recebe um objeto e valida se o seu valor é uma instância de *Array* e se não
|
|
29
|
-
* está vazio.
|
|
30
|
-
*
|
|
31
|
-
* @param value Objeto contento o nome da propriedade que está sendo validada e o seu valor.
|
|
32
|
-
*/
|
|
33
|
-
export const validateArray = (value) => {
|
|
34
|
-
validateParameter(value);
|
|
35
|
-
const [paramName, paramValue] = getObjectEntries(value);
|
|
36
|
-
if (!(paramValue instanceof Array)) {
|
|
37
|
-
throw new Error(`${paramName} is not an Array instance`);
|
|
38
|
-
}
|
|
39
|
-
if (!paramValue.length) {
|
|
40
|
-
throw new Error(`${paramName} cannot be empty array`);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Recebe um arquivo e converte para uma string base64
|
|
45
|
-
*
|
|
46
|
-
* @param Objeto do tipo file.
|
|
47
|
-
*/
|
|
48
|
-
export const toBase64 = (file) => new Promise((resolve, reject) => {
|
|
49
|
-
const reader = new FileReader();
|
|
50
|
-
reader.readAsDataURL(file);
|
|
51
|
-
reader.onload = () => resolve(reader.result);
|
|
52
|
-
/* istanbul ignore next */
|
|
53
|
-
reader.onerror = error => reject(error);
|
|
54
|
-
});
|
|
55
|
-
/**
|
|
56
|
-
* Recebe uma string base64 e converte para um arquivo
|
|
57
|
-
*
|
|
58
|
-
* @param string base64.
|
|
59
|
-
*/
|
|
60
|
-
export const toFile = (url, fileName, mimeType) => fetch(url)
|
|
61
|
-
.then(result => result.arrayBuffer())
|
|
62
|
-
.then(buffer => new File([buffer], fileName, { type: mimeType }));
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
/**
|
|
2
|
+
* Retorna um *array* contendo os pares `[chave, valor]` do objeto.
|
|
3
|
+
*
|
|
4
|
+
* Semelhante ao método `Object.entries()` nativo do javascript.
|
|
5
|
+
*
|
|
6
|
+
* > Veja mais em: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
|
|
7
|
+
*
|
|
8
|
+
* @param object Objeto que será extraído os pares [chave, valor].
|
|
9
|
+
*/
|
|
10
|
+
export const getObjectEntries = (object) => {
|
|
11
|
+
const objectName = Object.keys(object)[0];
|
|
12
|
+
const objectValue = object[objectName];
|
|
13
|
+
return [objectName, objectValue];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Recebe um objeto e valida se o seu valor é diferente de *undefined* ou *null*.
|
|
17
|
+
*
|
|
18
|
+
* @param {object} parameter Objeto contento o nome do parâmetro que está sendo validado
|
|
19
|
+
* e o seu valor.
|
|
20
|
+
*/
|
|
21
|
+
export const validateParameter = (parameter) => {
|
|
22
|
+
const [paramName, paramValue] = getObjectEntries(parameter);
|
|
23
|
+
if (paramValue === undefined || paramValue === null) {
|
|
24
|
+
throw new Error(`The ${paramName} parameter cannot be undefined or null`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Recebe um objeto e valida se o seu valor é uma instância de *Array* e se não
|
|
29
|
+
* está vazio.
|
|
30
|
+
*
|
|
31
|
+
* @param value Objeto contento o nome da propriedade que está sendo validada e o seu valor.
|
|
32
|
+
*/
|
|
33
|
+
export const validateArray = (value) => {
|
|
34
|
+
validateParameter(value);
|
|
35
|
+
const [paramName, paramValue] = getObjectEntries(value);
|
|
36
|
+
if (!(paramValue instanceof Array)) {
|
|
37
|
+
throw new Error(`${paramName} is not an Array instance`);
|
|
38
|
+
}
|
|
39
|
+
if (!paramValue.length) {
|
|
40
|
+
throw new Error(`${paramName} cannot be empty array`);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Recebe um arquivo e converte para uma string base64
|
|
45
|
+
*
|
|
46
|
+
* @param Objeto do tipo file.
|
|
47
|
+
*/
|
|
48
|
+
export const toBase64 = (file) => new Promise((resolve, reject) => {
|
|
49
|
+
const reader = new FileReader();
|
|
50
|
+
reader.readAsDataURL(file);
|
|
51
|
+
reader.onload = () => resolve(reader.result);
|
|
52
|
+
/* istanbul ignore next */
|
|
53
|
+
reader.onerror = error => reject(error);
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Recebe uma string base64 e converte para um arquivo
|
|
57
|
+
*
|
|
58
|
+
* @param string base64.
|
|
59
|
+
*/
|
|
60
|
+
export const toFile = (url, fileName, mimeType) => fetch(url)
|
|
61
|
+
.then(result => result.arrayBuffer())
|
|
62
|
+
.then(buffer => new File([buffer], fileName, { type: mimeType }));
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeW5jL3NyYy9saWIvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ2pELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXZDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtJQUNyRCxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTVELElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxTQUFTLHdDQUF3QyxDQUFDLENBQUM7S0FDM0U7QUFDSCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzdDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLENBQUMsVUFBVSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxTQUFTLDJCQUEyQixDQUFDLENBQUM7S0FDMUQ7SUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDO0tBQ3ZEO0FBQ0gsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQ3JDLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBZ0IsQ0FBQyxDQUFDO0lBQ3ZELDBCQUEwQjtJQUMxQixNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQyxDQUFDO0FBRUw7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQUUsRUFBRSxDQUN4RSxLQUFLLENBQUMsR0FBRyxDQUFDO0tBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmV0b3JuYSB1bSAqYXJyYXkqIGNvbnRlbmRvIG9zIHBhcmVzIGBbY2hhdmUsIHZhbG9yXWAgZG8gb2JqZXRvLlxuICpcbiAqIFNlbWVsaGFudGUgYW8gbcOpdG9kbyBgT2JqZWN0LmVudHJpZXMoKWAgbmF0aXZvIGRvIGphdmFzY3JpcHQuXG4gKlxuICogPiBWZWphIG1haXMgZW06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL3B0LUJSL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9lbnRyaWVzXG4gKlxuICogQHBhcmFtIG9iamVjdCBPYmpldG8gcXVlIHNlcsOhIGV4dHJhw61kbyBvcyBwYXJlcyBbY2hhdmUsIHZhbG9yXS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9iamVjdEVudHJpZXMgPSAob2JqZWN0OiBvYmplY3QpID0+IHtcbiAgY29uc3Qgb2JqZWN0TmFtZSA9IE9iamVjdC5rZXlzKG9iamVjdClbMF07XG4gIGNvbnN0IG9iamVjdFZhbHVlID0gb2JqZWN0W29iamVjdE5hbWVdO1xuXG4gIHJldHVybiBbb2JqZWN0TmFtZSwgb2JqZWN0VmFsdWVdO1xufTtcblxuLyoqXG4gKiBSZWNlYmUgdW0gb2JqZXRvIGUgdmFsaWRhIHNlIG8gc2V1IHZhbG9yIMOpIGRpZmVyZW50ZSBkZSAqdW5kZWZpbmVkKiBvdSAqbnVsbCouXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtZXRlciBPYmpldG8gY29udGVudG8gbyBub21lIGRvIHBhcsOibWV0cm8gcXVlIGVzdMOhIHNlbmRvIHZhbGlkYWRvXG4gKiBlIG8gc2V1IHZhbG9yLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVQYXJhbWV0ZXIgPSAocGFyYW1ldGVyOiBvYmplY3QpID0+IHtcbiAgY29uc3QgW3BhcmFtTmFtZSwgcGFyYW1WYWx1ZV0gPSBnZXRPYmplY3RFbnRyaWVzKHBhcmFtZXRlcik7XG5cbiAgaWYgKHBhcmFtVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwYXJhbVZhbHVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHtwYXJhbU5hbWV9IHBhcmFtZXRlciBjYW5ub3QgYmUgdW5kZWZpbmVkIG9yIG51bGxgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZWNlYmUgdW0gb2JqZXRvIGUgdmFsaWRhIHNlIG8gc2V1IHZhbG9yIMOpIHVtYSBpbnN0w6JuY2lhIGRlICpBcnJheSogZSBzZSBuw6NvXG4gKiBlc3TDoSB2YXppby5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgT2JqZXRvIGNvbnRlbnRvIG8gbm9tZSBkYSBwcm9wcmllZGFkZSBxdWUgZXN0w6Egc2VuZG8gdmFsaWRhZGEgZSBvIHNldSB2YWxvci5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQXJyYXkgPSAodmFsdWU6IG9iamVjdCkgPT4ge1xuICB2YWxpZGF0ZVBhcmFtZXRlcih2YWx1ZSk7XG5cbiAgY29uc3QgW3BhcmFtTmFtZSwgcGFyYW1WYWx1ZV0gPSBnZXRPYmplY3RFbnRyaWVzKHZhbHVlKTtcblxuICBpZiAoIShwYXJhbVZhbHVlIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhcmFtTmFtZX0gaXMgbm90IGFuIEFycmF5IGluc3RhbmNlYCk7XG4gIH1cblxuICBpZiAoIXBhcmFtVmFsdWUubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3BhcmFtTmFtZX0gY2Fubm90IGJlIGVtcHR5IGFycmF5YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVjZWJlIHVtIGFycXVpdm8gZSBjb252ZXJ0ZSBwYXJhIHVtYSBzdHJpbmcgYmFzZTY0XG4gKlxuICogQHBhcmFtIE9iamV0byBkbyB0aXBvIGZpbGUuXG4gKi9cbmV4cG9ydCBjb25zdCB0b0Jhc2U2NCA9IChmaWxlOiBGaWxlKSA9PlxuICBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgfSk7XG5cbi8qKlxuICogUmVjZWJlIHVtYSBzdHJpbmcgYmFzZTY0IGUgY29udmVydGUgcGFyYSB1bSBhcnF1aXZvXG4gKlxuICogQHBhcmFtIHN0cmluZyBiYXNlNjQuXG4gKi9cbmV4cG9ydCBjb25zdCB0b0ZpbGUgPSAodXJsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIG1pbWVUeXBlOiBzdHJpbmcpID0+XG4gIGZldGNoKHVybClcbiAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LmFycmF5QnVmZmVyKCkpXG4gICAgLnRoZW4oYnVmZmVyID0+IG5ldyBGaWxlKFtidWZmZXJdLCBmaWxlTmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSk7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdWktbmctc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL3BvLXVpLW5nLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './lib/index';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './lib/index';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3N5bmMvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9pbmRleCc7XG4iXX0=
|