@lina-openx/react-native-lina-pay-sdk 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -2
- package/lib/module/config/environment.js +10 -3
- package/lib/module/config/environment.js.map +1 -1
- package/lib/module/controllers/config.controller.js +22 -0
- package/lib/module/controllers/config.controller.js.map +1 -0
- package/lib/module/controllers/consent.controller.js +50 -0
- package/lib/module/controllers/consent.controller.js.map +1 -0
- package/lib/module/controllers/enrollment.controller.js +179 -0
- package/lib/module/controllers/enrollment.controller.js.map +1 -0
- package/lib/module/controllers/participants.controller.js +26 -0
- package/lib/module/controllers/participants.controller.js.map +1 -0
- package/lib/module/controllers/payment.controller.js +37 -0
- package/lib/module/controllers/payment.controller.js.map +1 -0
- package/lib/module/index.js +6 -128
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/consent.service.js.map +1 -1
- package/lib/module/services/enrollment.service.js +318 -0
- package/lib/module/services/enrollment.service.js.map +1 -0
- package/lib/module/services/fido.service.js +94 -0
- package/lib/module/services/fido.service.js.map +1 -0
- package/lib/module/types/enrollment.types.js +49 -0
- package/lib/module/types/enrollment.types.js.map +1 -0
- package/lib/module/types/fido.types.js +2 -0
- package/lib/module/types/fido.types.js.map +1 -0
- package/lib/module/utils/consent.utils.js.map +1 -1
- package/lib/module/utils/enrollment.utils.js +182 -0
- package/lib/module/utils/enrollment.utils.js.map +1 -0
- package/lib/module/utils/payment.utils.js.map +1 -1
- package/lib/typescript/src/config/environment.d.ts +7 -0
- package/lib/typescript/src/config/environment.d.ts.map +1 -1
- package/lib/typescript/src/controllers/config.controller.d.ts +17 -0
- package/lib/typescript/src/controllers/config.controller.d.ts.map +1 -0
- package/lib/typescript/src/controllers/consent.controller.d.ts +40 -0
- package/lib/typescript/src/controllers/consent.controller.d.ts.map +1 -0
- package/lib/typescript/src/controllers/enrollment.controller.d.ts +144 -0
- package/lib/typescript/src/controllers/enrollment.controller.d.ts.map +1 -0
- package/lib/typescript/src/controllers/participants.controller.d.ts +17 -0
- package/lib/typescript/src/controllers/participants.controller.d.ts.map +1 -0
- package/lib/typescript/src/controllers/payment.controller.d.ts +28 -0
- package/lib/typescript/src/controllers/payment.controller.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +7 -103
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/services/enrollment.service.d.ts +22 -0
- package/lib/typescript/src/services/enrollment.service.d.ts.map +1 -0
- package/lib/typescript/src/services/fido.service.d.ts +7 -0
- package/lib/typescript/src/services/fido.service.d.ts.map +1 -0
- package/lib/typescript/src/types/enrollment.types.d.ts +305 -0
- package/lib/typescript/src/types/enrollment.types.d.ts.map +1 -0
- package/lib/typescript/src/types/fido.types.d.ts +56 -0
- package/lib/typescript/src/types/fido.types.d.ts.map +1 -0
- package/lib/typescript/src/types/index.d.ts +1 -0
- package/lib/typescript/src/types/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/consent.utils.d.ts.map +1 -1
- package/lib/typescript/src/utils/enrollment.utils.d.ts +177 -0
- package/lib/typescript/src/utils/enrollment.utils.d.ts.map +1 -0
- package/lib/typescript/src/utils/payment.utils.d.ts.map +1 -1
- package/package.json +10 -1
- package/src/config/environment.ts +9 -3
- package/src/controllers/config.controller.ts +22 -0
- package/src/controllers/consent.controller.ts +56 -0
- package/src/controllers/enrollment.controller.ts +210 -0
- package/src/controllers/participants.controller.ts +28 -0
- package/src/controllers/payment.controller.ts +44 -0
- package/src/index.tsx +40 -155
- package/src/services/consent.service.ts +2 -3
- package/src/services/enrollment.service.ts +458 -0
- package/src/services/fido.service.ts +126 -0
- package/src/services/payment.service.ts +0 -1
- package/src/types/consent.types.ts +0 -1
- package/src/types/enrollment.types.ts +360 -0
- package/src/types/fido.types.ts +58 -0
- package/src/types/index.ts +13 -0
- package/src/types/payment.types.ts +0 -1
- package/src/utils/consent.utils.ts +3 -11
- package/src/utils/enrollment.utils.ts +246 -0
- package/src/utils/payment.utils.ts +1 -4
package/README.md
CHANGED
|
@@ -152,6 +152,204 @@ async function processPayment() {
|
|
|
152
152
|
}
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
+
### Enrollment (Cadastro de Dispositivo)
|
|
156
|
+
|
|
157
|
+
O **Enrollment** permite cadastrar um dispositivo do usuário usando autenticação FIDO2/Passkeys. Uma vez cadastrado, o usuário pode realizar pagamentos sem precisar redirecionar para o banco a cada transação.
|
|
158
|
+
|
|
159
|
+
#### Criar Enrollment
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { createEnrollment, type CreateEnrollmentRequest, LinaPayError } from 'react-native-lina-pay-sdk';
|
|
163
|
+
import { Linking } from 'react-native';
|
|
164
|
+
|
|
165
|
+
async function createDeviceEnrollment() {
|
|
166
|
+
try {
|
|
167
|
+
const enrollment = await createEnrollment(
|
|
168
|
+
{
|
|
169
|
+
subtenantId: 'seu-subtenant-id',
|
|
170
|
+
subtenantSecret: 'seu-subtenant-secret'
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
organisationId: 'org-uuid',
|
|
174
|
+
authorisationServerId: 'auth-uuid',
|
|
175
|
+
enrollment: {
|
|
176
|
+
document: '12345678901', // CPF do usuário
|
|
177
|
+
deviceName: 'iPhone do João',
|
|
178
|
+
debtor: {
|
|
179
|
+
accountNumber: '123456',
|
|
180
|
+
accountIssuer: '0001',
|
|
181
|
+
accountIspb: '12345678',
|
|
182
|
+
accountType: 'CACC'
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
redirectUri: 'https://seu-app.com/enrollment-callback'
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
console.log('Enrollment criado:', enrollment.id);
|
|
190
|
+
|
|
191
|
+
// Redirecionar usuário para autorização
|
|
192
|
+
if (enrollment.redirectUrl) {
|
|
193
|
+
Linking.openURL(enrollment.redirectUrl);
|
|
194
|
+
}
|
|
195
|
+
} catch (error) {
|
|
196
|
+
if (error instanceof LinaPayError) {
|
|
197
|
+
console.error('Erro ao criar enrollment:', error.message);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
#### Registrar Dispositivo (após callback)
|
|
204
|
+
|
|
205
|
+
Após o usuário autorizar no banco e receber o callback, registre o dispositivo:
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
import { registerDevice, type RegisterDeviceRequest, LinaPayError } from 'react-native-lina-pay-sdk';
|
|
209
|
+
import { Platform } from 'react-native';
|
|
210
|
+
|
|
211
|
+
async function registerDeviceAfterCallback(state: string, code: string, idToken: string) {
|
|
212
|
+
try {
|
|
213
|
+
const platform = Platform.OS === 'ios' ? 'IOS' : Platform.OS === 'android' ? 'ANDROID' : 'WEB';
|
|
214
|
+
|
|
215
|
+
const enrollment = await registerDevice(
|
|
216
|
+
{
|
|
217
|
+
subtenantId: 'seu-subtenant-id',
|
|
218
|
+
subtenantSecret: 'seu-subtenant-secret'
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
state,
|
|
222
|
+
code,
|
|
223
|
+
idToken,
|
|
224
|
+
tenantId: 'seu-subtenant-id',
|
|
225
|
+
platform
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
console.log('Dispositivo registrado:', enrollment.enrollmentId);
|
|
230
|
+
console.log('Status:', enrollment.status); // Deve ser 'AUTHORISED'
|
|
231
|
+
} catch (error) {
|
|
232
|
+
if (error instanceof LinaPayError) {
|
|
233
|
+
console.error('Erro ao registrar dispositivo:', error.message);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### Listar Enrollments
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
import { getEnrollmentList, LinaPayError } from 'react-native-lina-pay-sdk';
|
|
243
|
+
|
|
244
|
+
async function listUserEnrollments() {
|
|
245
|
+
try {
|
|
246
|
+
const enrollmentList = await getEnrollmentList(
|
|
247
|
+
{
|
|
248
|
+
subtenantId: 'seu-subtenant-id',
|
|
249
|
+
subtenantSecret: 'seu-subtenant-secret'
|
|
250
|
+
},
|
|
251
|
+
'12345678901' // CPF do usuário
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
console.log('Total de enrollments:', enrollmentList.enrollments.length);
|
|
255
|
+
enrollmentList.enrollments.forEach(enrollment => {
|
|
256
|
+
console.log(`- ${enrollment.enrollmentId}: ${enrollment.status}`);
|
|
257
|
+
});
|
|
258
|
+
} catch (error) {
|
|
259
|
+
if (error instanceof LinaPayError) {
|
|
260
|
+
console.error('Erro ao listar enrollments:', error.message);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### Revogar Enrollment
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
import { revokeEnrollment, LinaPayError } from 'react-native-lina-pay-sdk';
|
|
270
|
+
|
|
271
|
+
async function removeEnrollment() {
|
|
272
|
+
try {
|
|
273
|
+
await revokeEnrollment(
|
|
274
|
+
{
|
|
275
|
+
subtenantId: 'seu-subtenant-id',
|
|
276
|
+
subtenantSecret: 'seu-subtenant-secret'
|
|
277
|
+
},
|
|
278
|
+
'enrollment-id-aqui'
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
console.log('Enrollment revogado com sucesso');
|
|
282
|
+
} catch (error) {
|
|
283
|
+
if (error instanceof LinaPayError) {
|
|
284
|
+
console.error('Erro ao revogar enrollment:', error.message);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Pagamento com Enrollment
|
|
291
|
+
|
|
292
|
+
Após ter um enrollment ativo, você pode realizar pagamentos sem redirecionar o usuário ao banco. O pagamento é autorizado usando autenticação biométrica FIDO2/Passkeys:
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
import { createPaymentWithEnrollment, type PaymentWithEnrollmentRequest, LinaPayError } from 'react-native-lina-pay-sdk';
|
|
296
|
+
import { Platform } from 'react-native';
|
|
297
|
+
|
|
298
|
+
async function payWithEnrollment() {
|
|
299
|
+
try {
|
|
300
|
+
const platform = Platform.OS === 'ios' ? 'IOS' : Platform.OS === 'android' ? 'ANDROID' : 'WEB';
|
|
301
|
+
|
|
302
|
+
const payment = await createPaymentWithEnrollment(
|
|
303
|
+
{
|
|
304
|
+
subtenantId: 'seu-subtenant-id',
|
|
305
|
+
subtenantSecret: 'seu-subtenant-secret'
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
enrollmentId: 'enrollment-id-ativo',
|
|
309
|
+
organisationId: 'org-uuid',
|
|
310
|
+
authorisationServerId: 'auth-uuid',
|
|
311
|
+
payment: {
|
|
312
|
+
value: 1500.50,
|
|
313
|
+
details: 'Pagamento de serviço',
|
|
314
|
+
externalId: 'payment-123',
|
|
315
|
+
redirectUri: 'https://seu-app.com/payment-success',
|
|
316
|
+
cpfCnpj: '12345678901',
|
|
317
|
+
creditor: {
|
|
318
|
+
name: 'Empresa Beneficiária',
|
|
319
|
+
personType: 'PESSOA_JURIDICA',
|
|
320
|
+
cpfCnpj: '12345678000190',
|
|
321
|
+
accountNumber: '123456',
|
|
322
|
+
accountIssuer: '0001',
|
|
323
|
+
accountPixKey: 'empresa@email.com',
|
|
324
|
+
accountIspb: '12345678',
|
|
325
|
+
accountType: 'CACC'
|
|
326
|
+
},
|
|
327
|
+
txId: []
|
|
328
|
+
},
|
|
329
|
+
fidoSignOptions: {
|
|
330
|
+
rp: 'app.linaopenx.com.br',
|
|
331
|
+
platform
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
console.log('Pagamento processado:', payment.id);
|
|
337
|
+
console.log('Consent ID:', payment.consentId);
|
|
338
|
+
// O usuário será solicitado a autorizar com biometria automaticamente
|
|
339
|
+
} catch (error) {
|
|
340
|
+
if (error instanceof LinaPayError) {
|
|
341
|
+
console.error('Erro ao processar pagamento:', error.message);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Vantagens do Pagamento com Enrollment:**
|
|
348
|
+
- ⚡ Mais rápido: sem redirecionamento ao banco
|
|
349
|
+
- 🔒 Seguro: autenticação biométrica obrigatória
|
|
350
|
+
- 📱 Melhor UX: tudo acontece dentro do app
|
|
351
|
+
- 🔄 Ideal para pagamentos recorrentes
|
|
352
|
+
|
|
155
353
|
### Exemplo Completo com React
|
|
156
354
|
|
|
157
355
|
```typescript
|
|
@@ -389,6 +587,148 @@ interface Participant {
|
|
|
389
587
|
- Participantes sem servidores de autorização são automaticamente filtrados
|
|
390
588
|
- O token de autenticação é gerenciado automaticamente pelo SDK (com cache)
|
|
391
589
|
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
### `createEnrollment(credentials, payload)`
|
|
593
|
+
|
|
594
|
+
Cria um enrollment inicial para registrar um dispositivo do usuário.
|
|
595
|
+
|
|
596
|
+
**Parâmetros:**
|
|
597
|
+
- `credentials` (objeto, obrigatório):
|
|
598
|
+
- `subtenantId` (string): ID do subtenant fornecido pela Lina
|
|
599
|
+
- `subtenantSecret` (string): Secret do subtenant fornecido pela Lina
|
|
600
|
+
- `payload` (objeto, obrigatório):
|
|
601
|
+
- `organisationId` (string, obrigatório): UUID da organização participante
|
|
602
|
+
- `authorisationServerId` (string, obrigatório): UUID do servidor de autorização
|
|
603
|
+
- `enrollment` (objeto, obrigatório):
|
|
604
|
+
- `document` (string, opcional): CPF do usuário
|
|
605
|
+
- `externalId` (string, opcional): ID externo
|
|
606
|
+
- `deviceName` (string, opcional): Nome do dispositivo
|
|
607
|
+
- `debtor` (objeto, obrigatório): Dados da conta do pagador
|
|
608
|
+
- `accountNumber` (string): Número da conta
|
|
609
|
+
- `accountIssuer` (string): Agência
|
|
610
|
+
- `accountIspb` (string): Código ISPB
|
|
611
|
+
- `accountType` (string): Tipo de conta ('CACC' | 'SLRY' | 'SVGS' | 'TRAN')
|
|
612
|
+
- `redirectUri` (string, obrigatório): URL do callback após autorização
|
|
613
|
+
- `paymentId` (string, opcional): ID do pagamento relacionado
|
|
614
|
+
|
|
615
|
+
**Retorna:** `Promise<CreateEnrollmentResponse>`
|
|
616
|
+
|
|
617
|
+
**Estrutura do CreateEnrollmentResponse:**
|
|
618
|
+
```typescript
|
|
619
|
+
interface CreateEnrollmentResponse {
|
|
620
|
+
id: string; // UUID do enrollment
|
|
621
|
+
redirectUrl?: string; // URL para redirecionar o usuário
|
|
622
|
+
consentId?: string | null; // ID do consentimento (pode ser null)
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
### `registerDevice(credentials, payload)`
|
|
629
|
+
|
|
630
|
+
Registra um dispositivo usando autenticação FIDO2/Passkeys após o callback de autorização.
|
|
631
|
+
|
|
632
|
+
**Parâmetros:**
|
|
633
|
+
- `credentials` (objeto, obrigatório):
|
|
634
|
+
- `subtenantId` (string): ID do subtenant fornecido pela Lina
|
|
635
|
+
- `subtenantSecret` (string): Secret do subtenant fornecido pela Lina
|
|
636
|
+
- `payload` (objeto, obrigatório):
|
|
637
|
+
- `state` (string): Estado retornado no callback
|
|
638
|
+
- `code` (string): Código retornado no callback
|
|
639
|
+
- `idToken` (string): Token ID retornado no callback
|
|
640
|
+
- `tenantId` (string): Mesmo valor do subtenantId
|
|
641
|
+
- `platform` (string): Plataforma ('ANDROID' | 'IOS' | 'WEB' | 'BROWSER' | 'CROSS_PLATFORM')
|
|
642
|
+
- `rp` (string, opcional): Relying Party ID
|
|
643
|
+
|
|
644
|
+
**Retorna:** `Promise<Enrollment>`
|
|
645
|
+
|
|
646
|
+
**Estrutura do Enrollment:**
|
|
647
|
+
```typescript
|
|
648
|
+
interface Enrollment {
|
|
649
|
+
enrollmentId: string;
|
|
650
|
+
creationDateTime: string;
|
|
651
|
+
status: 'AWAITING_RISK_SIGNALS' | 'AWAITING_ACCOUNT_HOLDER_VALIDATION' |
|
|
652
|
+
'AWAITING_ENROLLMENT' | 'AUTHORISED' | 'REJECTED' | 'REVOKED';
|
|
653
|
+
statusUpdateDateTime: string;
|
|
654
|
+
permissions: 'PAYMENTS_INITIATE';
|
|
655
|
+
expirationDateTime: string | null;
|
|
656
|
+
// ... outros campos
|
|
657
|
+
}
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**Observações:**
|
|
661
|
+
- O dispositivo deve suportar FIDO2/Passkeys
|
|
662
|
+
- O usuário precisará autorizar com biometria (Face ID, Touch ID, etc.)
|
|
663
|
+
- O enrollment só estará pronto quando o status for `AUTHORISED`
|
|
664
|
+
|
|
665
|
+
---
|
|
666
|
+
|
|
667
|
+
### `getEnrollmentList(credentials, cpf)`
|
|
668
|
+
|
|
669
|
+
Lista todos os enrollments de um usuário pelo CPF.
|
|
670
|
+
|
|
671
|
+
**Parâmetros:**
|
|
672
|
+
- `credentials` (objeto, obrigatório):
|
|
673
|
+
- `subtenantId` (string): ID do subtenant fornecido pela Lina
|
|
674
|
+
- `subtenantSecret` (string): Secret do subtenant fornecido pela Lina
|
|
675
|
+
- `cpf` (string, obrigatório): CPF do usuário (11 dígitos)
|
|
676
|
+
|
|
677
|
+
**Retorna:** `Promise<EnrollmentList>`
|
|
678
|
+
|
|
679
|
+
**Estrutura do EnrollmentList:**
|
|
680
|
+
```typescript
|
|
681
|
+
interface EnrollmentList {
|
|
682
|
+
id: string;
|
|
683
|
+
username: string;
|
|
684
|
+
subTenant: string;
|
|
685
|
+
enrollments: EnrollmentUser[];
|
|
686
|
+
}
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
### `revokeEnrollment(credentials, enrollmentId)`
|
|
692
|
+
|
|
693
|
+
Revoga um enrollment, desativando o dispositivo cadastrado.
|
|
694
|
+
|
|
695
|
+
**Parâmetros:**
|
|
696
|
+
- `credentials` (objeto, obrigatório):
|
|
697
|
+
- `subtenantId` (string): ID do subtenant fornecido pela Lina
|
|
698
|
+
- `subtenantSecret` (string): Secret do subtenant fornecido pela Lina
|
|
699
|
+
- `enrollmentId` (string, obrigatório): ID do enrollment a ser revogado
|
|
700
|
+
|
|
701
|
+
**Retorna:** `Promise<RevokeEnrollmentResponse>`
|
|
702
|
+
|
|
703
|
+
---
|
|
704
|
+
|
|
705
|
+
### `createPaymentWithEnrollment(credentials, payload)`
|
|
706
|
+
|
|
707
|
+
Cria um pagamento usando um enrollment ativo, sem necessidade de redirecionamento ao banco.
|
|
708
|
+
|
|
709
|
+
**Parâmetros:**
|
|
710
|
+
- `credentials` (objeto, obrigatório):
|
|
711
|
+
- `subtenantId` (string): ID do subtenant fornecido pela Lina
|
|
712
|
+
- `subtenantSecret` (string): Secret do subtenant fornecido pela Lina
|
|
713
|
+
- `payload` (objeto, obrigatório):
|
|
714
|
+
- `enrollmentId` (string, obrigatório): ID do enrollment ativo
|
|
715
|
+
- `organisationId` (string, obrigatório): UUID da organização participante
|
|
716
|
+
- `authorisationServerId` (string, obrigatório): UUID do servidor de autorização
|
|
717
|
+
- `paymentId` (string, opcional): ID do pagamento se já foi criado
|
|
718
|
+
- `payment` (objeto, opcional): Dados do pagamento (similar ao `createConsent`)
|
|
719
|
+
- `fidoSignOptions` (objeto, obrigatório):
|
|
720
|
+
- `rp` (string): Relying Party ID
|
|
721
|
+
- `platform` (string): Plataforma ('ANDROID' | 'IOS' | 'WEB' | 'BROWSER' | 'CROSS_PLATFORM')
|
|
722
|
+
|
|
723
|
+
**Retorna:** `Promise<PaymentWithEnrollmentResponse>`
|
|
724
|
+
|
|
725
|
+
**Observações:**
|
|
726
|
+
- Esta função realiza internamente: criação do consentimento, obtenção de opções FIDO, solicitação de biometria, assinatura e autorização
|
|
727
|
+
- O usuário será solicitado a autorizar com biometria automaticamente
|
|
728
|
+
- O enrollment deve estar com status `AUTHORISED`
|
|
729
|
+
|
|
730
|
+
---
|
|
731
|
+
|
|
392
732
|
### `configure(config)`
|
|
393
733
|
|
|
394
734
|
Configura as URLs base do SDK para diferentes ambientes.
|
|
@@ -507,14 +847,28 @@ yarn lint
|
|
|
507
847
|
src/
|
|
508
848
|
├── config/
|
|
509
849
|
│ └── environment.ts # Configuração de URLs
|
|
850
|
+
├── controllers/
|
|
851
|
+
│ ├── consent.controller.ts # Controller de consentimentos
|
|
852
|
+
│ ├── enrollment.controller.ts # Controller de enrollments
|
|
853
|
+
│ ├── participants.controller.ts # Controller de participantes
|
|
854
|
+
│ └── payment.controller.ts # Controller de pagamentos
|
|
510
855
|
├── services/
|
|
511
856
|
│ ├── auth.service.ts # Autenticação OAuth2
|
|
512
|
-
│
|
|
857
|
+
│ ├── consent.service.ts # API de consentimentos
|
|
858
|
+
│ ├── enrollment.service.ts # API de enrollments
|
|
859
|
+
│ ├── fido.service.ts # Serviço FIDO2/Passkeys
|
|
860
|
+
│ ├── participants.service.ts # API de participantes
|
|
861
|
+
│ └── payment.service.ts # API de pagamentos
|
|
513
862
|
├── types/
|
|
514
863
|
│ ├── auth.types.ts # Tipos de autenticação
|
|
515
|
-
│ ├──
|
|
864
|
+
│ ├── consent.types.ts # Tipos de consentimento
|
|
865
|
+
│ ├── enrollment.types.ts # Tipos de enrollment
|
|
866
|
+
│ ├── fido.types.ts # Tipos FIDO
|
|
867
|
+
│ ├── participants.types.ts # Tipos de participantes
|
|
868
|
+
│ ├── payment.types.ts # Tipos de pagamento
|
|
516
869
|
│ └── index.ts # Re-exports
|
|
517
870
|
├── utils/
|
|
871
|
+
│ ├── enrollment.utils.ts # Utilitários de enrollment
|
|
518
872
|
│ └── http.utils.ts # Utilidades HTTP
|
|
519
873
|
└── index.tsx # API pública do SDK
|
|
520
874
|
```
|
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Environment configuration for Lina Pay SDK
|
|
5
5
|
* Allows configuration of base URLs for different environments (HML, Production)
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* LinaPaySdk.configure({
|
|
9
|
+
* iamBaseUrl: 'https://iam.prod.linaob.com.br',
|
|
10
|
+
* apiBaseUrl: 'https://embedded-payment-manager.prod.linaob.com.br'
|
|
11
|
+
* });
|
|
6
12
|
*/
|
|
7
13
|
|
|
8
14
|
const DEFAULT_CONFIG = {
|
|
9
|
-
iamBaseUrl: 'https://iam.
|
|
10
|
-
apiBaseUrl: 'https://embedded-payment-manager.
|
|
15
|
+
iamBaseUrl: 'https://iam.linaob.com.br',
|
|
16
|
+
apiBaseUrl: 'https://embedded-payment-manager.linaob.com.br'
|
|
11
17
|
};
|
|
12
18
|
let currentConfig = {
|
|
13
19
|
...DEFAULT_CONFIG
|
|
@@ -56,6 +62,7 @@ export const ENDPOINTS = {
|
|
|
56
62
|
TOKEN: '/realms/ob-epp/protocol/openid-connect/token',
|
|
57
63
|
PARTICIPANTS: '/api/v1/open-integration/participants/registered',
|
|
58
64
|
CONSENTS: '/api/v1/open-integration/consents',
|
|
59
|
-
PAYMENTS: '/api/v1/open-integration/payments'
|
|
65
|
+
PAYMENTS: '/api/v1/open-integration/payments',
|
|
66
|
+
ENROLLMENTS: '/api/v1/jsr'
|
|
60
67
|
};
|
|
61
68
|
//# sourceMappingURL=environment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_CONFIG","iamBaseUrl","apiBaseUrl","currentConfig","configure","config","getConfig","resetConfig","ENDPOINTS","TOKEN","PARTICIPANTS","CONSENTS","PAYMENTS"],"sourceRoot":"../../../src","sources":["config/environment.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"names":["DEFAULT_CONFIG","iamBaseUrl","apiBaseUrl","currentConfig","configure","config","getConfig","resetConfig","ENDPOINTS","TOKEN","PARTICIPANTS","CONSENTS","PAYMENTS","ENROLLMENTS"],"sourceRoot":"../../../src","sources":["config/environment.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,MAAMA,cAA6B,GAAG;EACpCC,UAAU,EAAE,2BAA2B;EACvCC,UAAU,EAAE;AACd,CAAC;AAED,IAAIC,aAA4B,GAAG;EAAE,GAAGH;AAAe,CAAC;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,SAASA,CAACC,MAA8B,EAAQ;EAC9DF,aAAa,GAAG;IACd,GAAGA,aAAa;IAChB,GAAGE;EACL,CAAC;AACH;;AAEA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAAA,EAAkB;EACzC,OAAO;IAAE,GAAGH;EAAc,CAAC;AAC7B;;AAEA;AACA;AACA;AACA,OAAO,SAASI,WAAWA,CAAA,EAAS;EAClCJ,aAAa,GAAG;IAAE,GAAGH;EAAe,CAAC;AACvC;;AAEA;AACA;AACA;AACA,OAAO,MAAMQ,SAAS,GAAG;EACvBC,KAAK,EAAE,8CAA8C;EACrDC,YAAY,EAAE,kDAAkD;EAChEC,QAAQ,EAAE,mCAAmC;EAC7CC,QAAQ,EAAE,mCAAmC;EAC7CC,WAAW,EAAE;AACf,CAAU","ignoreList":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { configure as configureEnvironment } from "../config/environment.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Configure SDK environment (base URLs)
|
|
7
|
+
*
|
|
8
|
+
* @param config Partial configuration to override defaults
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Configure for production
|
|
13
|
+
* LinaPaySdk.configure({
|
|
14
|
+
* iamBaseUrl: 'https://iam.prod.linaob.com.br',
|
|
15
|
+
* apiBaseUrl: 'https://embedded-payment-manager.prod.linaob.com.br'
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function configure(config) {
|
|
20
|
+
configureEnvironment(config);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["configure","configureEnvironment","config"],"sourceRoot":"../../../src","sources":["controllers/config.controller.ts"],"mappings":";;AAAA,SACEA,SAAS,IAAIC,oBAAoB,QAE5B,0BAAuB;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASD,SAASA,CAACE,MAA8B,EAAQ;EAC9DD,oBAAoB,CAACC,MAAM,CAAC;AAC9B","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createConsent as createConsentService } from "../services/consent.service.js";
|
|
4
|
+
import { getAccessToken } from "../services/auth.service.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create payment consent
|
|
8
|
+
*
|
|
9
|
+
* @param credentials Subtenant credentials (subtenantId and subtenantSecret)
|
|
10
|
+
* @param payload Consent creation payload with payment details
|
|
11
|
+
* @returns Promise with consent creation response including consentId and status
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const consent = await LinaPaySdk.createConsent(
|
|
16
|
+
* {
|
|
17
|
+
* subtenantId: 'your-subtenant-id',
|
|
18
|
+
* subtenantSecret: 'your-subtenant-secret'
|
|
19
|
+
* },
|
|
20
|
+
* {
|
|
21
|
+
* organisationId: 'c8f0bf49-4744-4933-8960-7add6e590841',
|
|
22
|
+
* authorisationServerId: 'c8f0bf49-4744-4933-8960-7add6e590841',
|
|
23
|
+
* payment: {
|
|
24
|
+
* redirectUri: 'http://example.com/redirect',
|
|
25
|
+
* value: 1500.50,
|
|
26
|
+
* creditor: {
|
|
27
|
+
* name: 'John Doe',
|
|
28
|
+
* personType: 'PESSOA_NATURAL',
|
|
29
|
+
* cpfCnpj: '12345678901234',
|
|
30
|
+
* accountNumber: '1234567890',
|
|
31
|
+
* accountIssuer: '0001',
|
|
32
|
+
* accountPixKey: 'email@example.com',
|
|
33
|
+
* accountIspb: '12345678',
|
|
34
|
+
* accountType: 'CACC'
|
|
35
|
+
* }
|
|
36
|
+
* },
|
|
37
|
+
* platform: 'APP'
|
|
38
|
+
* }
|
|
39
|
+
* );
|
|
40
|
+
* console.log('Consent ID:', consent.consentId);
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export async function createConsent(credentials, payload) {
|
|
44
|
+
// Get access token (uses cache if available)
|
|
45
|
+
const accessToken = await getAccessToken(credentials);
|
|
46
|
+
|
|
47
|
+
// Create consent
|
|
48
|
+
return await createConsentService(accessToken, payload);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=consent.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createConsent","createConsentService","getAccessToken","credentials","payload","accessToken"],"sourceRoot":"../../../src","sources":["controllers/consent.controller.ts"],"mappings":";;AAMA,SAASA,aAAa,IAAIC,oBAAoB,QAAQ,gCAA6B;AACnF,SAASC,cAAc,QAAQ,6BAA0B;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeF,aAAaA,CACjCG,WAA+B,EAC/BC,OAA6B,EACG;EAChC;EACA,MAAMC,WAAW,GAAG,MAAMH,cAAc,CAACC,WAAW,CAAC;;EAErD;EACA,OAAO,MAAMF,oBAAoB,CAACI,WAAW,EAAED,OAAO,CAAC;AACzD","ignoreList":[]}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getAccessToken } from "../services/auth.service.js";
|
|
4
|
+
import { createPaymentWithEnrollment as createPaymentWithEnrollmentService, registerDevice as registerDeviceToEnrollmentService, getEnrollmentList as getEnrollmentListService, createEnrollment as createEnrollmentService, revokeEnrollment as revokeEnrollmentService } from "../services/enrollment.service.js";
|
|
5
|
+
/**
|
|
6
|
+
* Create enrollment consent
|
|
7
|
+
*
|
|
8
|
+
* @param credentials Subtenant credentials (subtenantId and subtenantSecret)
|
|
9
|
+
* @param payload Consent creation payload with enrollment details
|
|
10
|
+
* @returns Promise with consent creation response including consentId and redirectUrl
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const consent = await LinaPaySdk.createEnrollment(
|
|
15
|
+
* {
|
|
16
|
+
* subtenantId: 'your-subtenant-id',
|
|
17
|
+
* subtenantSecret: 'your-subtenant-secret'
|
|
18
|
+
* },
|
|
19
|
+
* {
|
|
20
|
+
* organisationId: 'c8f0bf49-4744-4933-8960-7add6e590841',
|
|
21
|
+
* authorisationServerId: 'c8f0bf49-4744-4933-8960-7add6e590841',
|
|
22
|
+
* enrollment: {
|
|
23
|
+
* deviceName: 'Teste Device',
|
|
24
|
+
* document: cpf.replace(/\D/g, ''),
|
|
25
|
+
* debtor: {
|
|
26
|
+
* accountIspb: '00000000',
|
|
27
|
+
* accountIssuer: '2558',
|
|
28
|
+
* accountNumber: '5271110',
|
|
29
|
+
* accountType: 'CACC',
|
|
30
|
+
* },
|
|
31
|
+
* },
|
|
32
|
+
* }
|
|
33
|
+
* );
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export async function createEnrollment(credentials, payload) {
|
|
37
|
+
// Get access token (uses cache if available)
|
|
38
|
+
const accessToken = await getAccessToken(credentials);
|
|
39
|
+
|
|
40
|
+
// Create enrollment
|
|
41
|
+
return await createEnrollmentService(accessToken, payload);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Validate callback from enrollment fido registration options open fido registration
|
|
46
|
+
*
|
|
47
|
+
* @param credentials Subtenant credentials (subtenantId and subtenantSecret)
|
|
48
|
+
* @param payload Callback payload with state, code, idToken, and tenantId
|
|
49
|
+
* @returns Call registration options, return challenge and open fido registration
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const consent = await LinaPaySdk.createEnrollment(
|
|
54
|
+
* {
|
|
55
|
+
* subtenantId: 'your-subtenant-id',
|
|
56
|
+
* subtenantSecret: 'your-subtenant-secret'
|
|
57
|
+
* },
|
|
58
|
+
* {
|
|
59
|
+
* state: 'rumUP',
|
|
60
|
+
* code: '1RDYVFQnPn721',
|
|
61
|
+
* idToken: 'eyJhbGciOiJQUz',
|
|
62
|
+
* tenantId: 'tenantId'
|
|
63
|
+
* }
|
|
64
|
+
* );
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export async function registerDevice(credentials, payload) {
|
|
68
|
+
const accessToken = await getAccessToken(credentials);
|
|
69
|
+
|
|
70
|
+
// Register device
|
|
71
|
+
return await registerDeviceToEnrollmentService(accessToken, payload);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get list of registered enrollments from current user and device
|
|
76
|
+
*
|
|
77
|
+
* @param credentials Subtenant credentials (subtenantId and subtenantSecret)
|
|
78
|
+
* @param cpf CPF of current user
|
|
79
|
+
* @returns Promise with array of enrollments
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const enrollments = await LinaPaySdk.getEnrollmentList({
|
|
84
|
+
* subtenantId: 'your-subtenant-id',
|
|
85
|
+
* subtenantSecret: 'your-subtenant-secret'
|
|
86
|
+
* }, '1234567890');
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export async function getEnrollmentList(credentials, cpf) {
|
|
90
|
+
// Get access token (uses cache if available)
|
|
91
|
+
const accessToken = await getAccessToken(credentials);
|
|
92
|
+
|
|
93
|
+
// Get enrollment list
|
|
94
|
+
return await getEnrollmentListService(accessToken, cpf);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Revoke enrollment
|
|
99
|
+
*
|
|
100
|
+
* @param credentials Subtenant credentials (subtenantId and subtenantSecret)
|
|
101
|
+
* @param enrollmentId Enrollment ID
|
|
102
|
+
* @returns Promise with status of revocation
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const = await LinaPaySdk.revokeEnrollment({
|
|
107
|
+
* subtenantId: 'your-subtenant-id',
|
|
108
|
+
* subtenantSecret: 'your-subtenant-secret'
|
|
109
|
+
* }, '1728979312391739');
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export async function revokeEnrollment(credentials, enrollmentId) {
|
|
113
|
+
// Get access token (uses cache if available)
|
|
114
|
+
const accessToken = await getAccessToken(credentials);
|
|
115
|
+
|
|
116
|
+
// Revoke enrollment
|
|
117
|
+
return await revokeEnrollmentService(accessToken, enrollmentId);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Create payment with enrollment
|
|
122
|
+
*
|
|
123
|
+
* @param credentials Subtenant credentials (subtenantId and subtenantSecret)
|
|
124
|
+
* @param payload Payment creation payload with enrollmentId, payment details, and fidoAssertion
|
|
125
|
+
* @returns Promise with challenge and open fido registration
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* const payment = await LinaPaySdk.createPaymentWithEnrollment(
|
|
130
|
+
* {
|
|
131
|
+
* subtenantId: 'your-subtenant-id',
|
|
132
|
+
* subtenantSecret: 'your-subtenant-secret'
|
|
133
|
+
* },
|
|
134
|
+
* {
|
|
135
|
+
* enrollmentId: 'enrollmentId',
|
|
136
|
+
* organisationId: 'c8f0bf49-4744-4933-8960-7add6e590841',
|
|
137
|
+
* authorisationServerId: 'c8f0bf49-4744-4933-8960-7add6e590841',
|
|
138
|
+
* payment: {
|
|
139
|
+
* details: 'Payment details',
|
|
140
|
+
* externalId: 'externalId',
|
|
141
|
+
* redirectUri: 'http://example.com/redirect',
|
|
142
|
+
* cpfCnpj: '12345678901234',
|
|
143
|
+
* value: 1500.50,
|
|
144
|
+
* creditor: {
|
|
145
|
+
* name: 'John Doe',
|
|
146
|
+
* personType: 'PESSOA_NATURAL',
|
|
147
|
+
* cpfCnpj: '12345678901234',
|
|
148
|
+
* accountNumber: '1234567890',
|
|
149
|
+
* accountIssuer: '0001',
|
|
150
|
+
* accountPixKey: 'email@example.com',
|
|
151
|
+
* accountIspb: '12345678',
|
|
152
|
+
* accountType: 'CACC'
|
|
153
|
+
* }
|
|
154
|
+
* },
|
|
155
|
+
* fidoAssertion: {
|
|
156
|
+
* id: 'id',
|
|
157
|
+
* rawId: 'rawId',
|
|
158
|
+
* response: {
|
|
159
|
+
* authenticatorData: 'authenticatorData',
|
|
160
|
+
* clientDataJSON: 'clientDataJSON',
|
|
161
|
+
* signature: 'signature',
|
|
162
|
+
* userHandle: 'userHandle'
|
|
163
|
+
* },
|
|
164
|
+
* type: 'public-key'
|
|
165
|
+
* },
|
|
166
|
+
* }
|
|
167
|
+
* );
|
|
168
|
+
* console.log('Payment ID:', payment.id);
|
|
169
|
+
* console.log('Status:', payment.status);
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export async function createPaymentWithEnrollment(credentials, payload) {
|
|
173
|
+
// Get access token (uses cache if available)
|
|
174
|
+
const accessToken = await getAccessToken(credentials);
|
|
175
|
+
|
|
176
|
+
// Create payment with enrollment
|
|
177
|
+
return await createPaymentWithEnrollmentService(accessToken, payload);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=enrollment.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getAccessToken","createPaymentWithEnrollment","createPaymentWithEnrollmentService","registerDevice","registerDeviceToEnrollmentService","getEnrollmentList","getEnrollmentListService","createEnrollment","createEnrollmentService","revokeEnrollment","revokeEnrollmentService","credentials","payload","accessToken","cpf","enrollmentId"],"sourceRoot":"../../../src","sources":["controllers/enrollment.controller.ts"],"mappings":";;AACA,SAASA,cAAc,QAAQ,6BAA0B;AACzD,SACEC,2BAA2B,IAAIC,kCAAkC,EACjEC,cAAc,IAAIC,iCAAiC,EACnDC,iBAAiB,IAAIC,wBAAwB,EAC7CC,gBAAgB,IAAIC,uBAAuB,EAC3CC,gBAAgB,IAAIC,uBAAuB,QACtC,mCAAgC;AAavC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeH,gBAAgBA,CACpCI,WAA+B,EAC/BC,OAAgC,EACG;EACnC;EACA,MAAMC,WAAW,GAAG,MAAMb,cAAc,CAACW,WAAW,CAAC;;EAErD;EACA,OAAO,MAAMH,uBAAuB,CAACK,WAAW,EAAED,OAAO,CAAC;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeT,cAAcA,CAClCQ,WAA+B,EAC/BC,OAA8B,EACT;EACrB,MAAMC,WAAW,GAAG,MAAMb,cAAc,CAACW,WAAW,CAAC;;EAErD;EACA,OAAO,MAAMP,iCAAiC,CAACS,WAAW,EAAED,OAAO,CAAC;AACtE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeP,iBAAiBA,CACrCM,WAA+B,EAC/BG,GAAW,EACc;EACzB;EACA,MAAMD,WAAW,GAAG,MAAMb,cAAc,CAACW,WAAW,CAAC;;EAErD;EACA,OAAO,MAAML,wBAAwB,CAACO,WAAW,EAAEC,GAAG,CAAC;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeL,gBAAgBA,CACpCE,WAA+B,EAC/BI,YAAoB,EACe;EACnC;EACA,MAAMF,WAAW,GAAG,MAAMb,cAAc,CAACW,WAAW,CAAC;;EAErD;EACA,OAAO,MAAMD,uBAAuB,CAACG,WAAW,EAAEE,YAAY,CAAC;AACjE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAed,2BAA2BA,CAC/CU,WAA+B,EAC/BC,OAAqC,EACN;EAC/B;EACA,MAAMC,WAAW,GAAG,MAAMb,cAAc,CAACW,WAAW,CAAC;;EAErD;EACA,OAAO,MAAMT,kCAAkC,CAACW,WAAW,EAAED,OAAO,CAAC;AACvE","ignoreList":[]}
|