@neodaten/auth-native 0.0.0-stage → 0.1.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 +200 -2
- package/dist/almacen-con-desbloqueo.d.ts +19 -0
- package/dist/almacen-con-desbloqueo.js +117 -0
- package/dist/almacen-con-desbloqueo.js.map +1 -0
- package/dist/almacen-seguro.d.ts +5 -0
- package/dist/almacen-seguro.js +2 -0
- package/dist/almacen-seguro.js.map +1 -0
- package/dist/base64url.d.ts +3 -0
- package/dist/base64url.js +40 -0
- package/dist/base64url.js.map +1 -0
- package/dist/bienvenida/bienvenida-con-ultima-cuenta.d.ts +13 -0
- package/dist/bienvenida/bienvenida-con-ultima-cuenta.js +73 -0
- package/dist/bienvenida/bienvenida-con-ultima-cuenta.js.map +1 -0
- package/dist/bienvenida/estado-de-la-bienvenida.d.ts +14 -0
- package/dist/bienvenida/estado-de-la-bienvenida.js +18 -0
- package/dist/bienvenida/estado-de-la-bienvenida.js.map +1 -0
- package/dist/bienvenida/index.d.ts +5 -0
- package/dist/bienvenida/index.js +5 -0
- package/dist/bienvenida/index.js.map +1 -0
- package/dist/bienvenida/marca-de-la-bienvenida.d.ts +12 -0
- package/dist/bienvenida/marca-de-la-bienvenida.js +2 -0
- package/dist/bienvenida/marca-de-la-bienvenida.js.map +1 -0
- package/dist/bienvenida/textos-de-la-bienvenida.d.ts +9 -0
- package/dist/bienvenida/textos-de-la-bienvenida.js +12 -0
- package/dist/bienvenida/textos-de-la-bienvenida.js.map +1 -0
- package/dist/bienvenida/use-bienvenida.d.ts +13 -0
- package/dist/bienvenida/use-bienvenida.js +42 -0
- package/dist/bienvenida/use-bienvenida.js.map +1 -0
- package/dist/canal-del-canje.d.ts +3 -0
- package/dist/canal-del-canje.js +22 -0
- package/dist/canal-del-canje.js.map +1 -0
- package/dist/cliente-de-identidad-nativa.d.ts +32 -0
- package/dist/cliente-de-identidad-nativa.js +179 -0
- package/dist/cliente-de-identidad-nativa.js.map +1 -0
- package/dist/criptografia.d.ts +15 -0
- package/dist/criptografia.js +28 -0
- package/dist/criptografia.js.map +1 -0
- package/dist/error-de-identidad.d.ts +6 -0
- package/dist/error-de-identidad.js +29 -0
- package/dist/error-de-identidad.js.map +1 -0
- package/dist/expo/crear-almacen-expo.d.ts +17 -0
- package/dist/expo/crear-almacen-expo.js +30 -0
- package/dist/expo/crear-almacen-expo.js.map +1 -0
- package/dist/expo/index.d.ts +1 -0
- package/dist/expo/index.js +2 -0
- package/dist/expo/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/keychain/crear-almacen-keychain.d.ts +34 -0
- package/dist/keychain/crear-almacen-keychain.js +46 -0
- package/dist/keychain/crear-almacen-keychain.js.map +1 -0
- package/dist/keychain/index.d.ts +1 -0
- package/dist/keychain/index.js +2 -0
- package/dist/keychain/index.js.map +1 -0
- package/dist/llaves-del-emisor.d.ts +4 -0
- package/dist/llaves-del-emisor.js +42 -0
- package/dist/llaves-del-emisor.js.map +1 -0
- package/dist/login-hospedado.d.ts +29 -0
- package/dist/login-hospedado.js +123 -0
- package/dist/login-hospedado.js.map +1 -0
- package/dist/navegacion-del-login.d.ts +20 -0
- package/dist/navegacion-del-login.js +27 -0
- package/dist/navegacion-del-login.js.map +1 -0
- package/dist/pantalla/index.d.ts +2 -0
- package/dist/pantalla/index.js +3 -0
- package/dist/pantalla/index.js.map +1 -0
- package/dist/pantalla/manejador-de-carga.d.ts +11 -0
- package/dist/pantalla/manejador-de-carga.js +12 -0
- package/dist/pantalla/manejador-de-carga.js.map +1 -0
- package/dist/pantalla/pantalla-de-login-hospedado.d.ts +6 -0
- package/dist/pantalla/pantalla-de-login-hospedado.js +30 -0
- package/dist/pantalla/pantalla-de-login-hospedado.js.map +1 -0
- package/dist/passkey-de-la-bienvenida.d.ts +20 -0
- package/dist/passkey-de-la-bienvenida.js +50 -0
- package/dist/passkey-de-la-bienvenida.js.map +1 -0
- package/dist/pkce.d.ts +8 -0
- package/dist/pkce.js +13 -0
- package/dist/pkce.js.map +1 -0
- package/dist/respuesta-del-emisor.d.ts +17 -0
- package/dist/respuesta-del-emisor.js +70 -0
- package/dist/respuesta-del-emisor.js.map +1 -0
- package/dist/sesion-guardada.d.ts +12 -0
- package/dist/sesion-guardada.js +44 -0
- package/dist/sesion-guardada.js.map +1 -0
- package/dist/sha256.d.ts +1 -0
- package/dist/sha256.js +84 -0
- package/dist/sha256.js.map +1 -0
- package/dist/textos-del-desbloqueo.d.ts +7 -0
- package/dist/textos-del-desbloqueo.js +7 -0
- package/dist/textos-del-desbloqueo.js.map +1 -0
- package/dist/ticket-de-atestacion.d.ts +21 -0
- package/dist/ticket-de-atestacion.js +33 -0
- package/dist/ticket-de-atestacion.js.map +1 -0
- package/dist/ultima-cuenta.d.ts +13 -0
- package/dist/ultima-cuenta.js +67 -0
- package/dist/ultima-cuenta.js.map +1 -0
- package/dist/validar-id-token.d.ts +15 -0
- package/dist/validar-id-token.js +86 -0
- package/dist/validar-id-token.js.map +1 -0
- package/dist/vuelo-unico.d.ts +1 -0
- package/dist/vuelo-unico.js +10 -0
- package/dist/vuelo-unico.js.map +1 -0
- package/package.json +61 -3
package/dist/sha256.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const CONSTANTES_DE_RONDA = new Uint32Array([
|
|
2
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
3
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
4
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
5
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
6
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
7
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
8
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
9
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
10
|
+
]);
|
|
11
|
+
const ESTADO_INICIAL = [
|
|
12
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
13
|
+
];
|
|
14
|
+
const BYTES_POR_BLOQUE = 64;
|
|
15
|
+
const PALABRAS_DEL_BLOQUE = 16;
|
|
16
|
+
const BYTES_POR_PALABRA = 4;
|
|
17
|
+
const BYTES_DEL_RESUMEN = 32;
|
|
18
|
+
const BITS_POR_PALABRA = 32;
|
|
19
|
+
const BYTES_DEL_LARGO = 8;
|
|
20
|
+
const PALABRAS_DEL_HORARIO = 64;
|
|
21
|
+
const MARCA_DE_FIN = 0x80;
|
|
22
|
+
const BITS_POR_BYTE = 8;
|
|
23
|
+
const DIVISOR_DE_32_BITS = 0x1_0000_0000;
|
|
24
|
+
const rotar = (valor, bits) => (valor >>> bits) | (valor << (BITS_POR_PALABRA - bits));
|
|
25
|
+
const conRelleno = (datos) => {
|
|
26
|
+
const largo = Math.ceil((datos.length + 1 + BYTES_DEL_LARGO) / BYTES_POR_BLOQUE) * BYTES_POR_BLOQUE;
|
|
27
|
+
const rellenado = new Uint8Array(largo);
|
|
28
|
+
rellenado.set(datos);
|
|
29
|
+
rellenado[datos.length] = MARCA_DE_FIN;
|
|
30
|
+
const vista = new DataView(rellenado.buffer);
|
|
31
|
+
const bits = datos.length * BITS_POR_BYTE;
|
|
32
|
+
vista.setUint32(largo - BYTES_DEL_LARGO, Math.floor(bits / DIVISOR_DE_32_BITS));
|
|
33
|
+
vista.setUint32(largo - BYTES_DEL_LARGO / 2, bits >>> 0);
|
|
34
|
+
return rellenado;
|
|
35
|
+
};
|
|
36
|
+
const horarioDelBloque = (vista, inicio) => {
|
|
37
|
+
const horario = new Uint32Array(PALABRAS_DEL_HORARIO);
|
|
38
|
+
for (let indice = 0; indice < PALABRAS_DEL_BLOQUE; indice += 1) {
|
|
39
|
+
horario[indice] = vista.getUint32(inicio + indice * BYTES_POR_PALABRA);
|
|
40
|
+
}
|
|
41
|
+
for (let indice = PALABRAS_DEL_BLOQUE; indice < PALABRAS_DEL_HORARIO; indice += 1) {
|
|
42
|
+
const anterior15 = horario[indice - 15] ?? 0;
|
|
43
|
+
const anterior2 = horario[indice - 2] ?? 0;
|
|
44
|
+
const s0 = rotar(anterior15, 7) ^ rotar(anterior15, 18) ^ (anterior15 >>> 3);
|
|
45
|
+
const s1 = rotar(anterior2, 17) ^ rotar(anterior2, 19) ^ (anterior2 >>> 10);
|
|
46
|
+
horario[indice] = (horario[indice - 16] ?? 0) + s0 + (horario[indice - 7] ?? 0) + s1;
|
|
47
|
+
}
|
|
48
|
+
return horario;
|
|
49
|
+
};
|
|
50
|
+
const comprimir = (estado, horario) => {
|
|
51
|
+
let [a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0] = estado;
|
|
52
|
+
for (let indice = 0; indice < PALABRAS_DEL_HORARIO; indice += 1) {
|
|
53
|
+
const s1 = rotar(e, 6) ^ rotar(e, 11) ^ rotar(e, 25);
|
|
54
|
+
const eleccion = (e & f) ^ (~e & g);
|
|
55
|
+
const temporal1 = (h + s1 + eleccion + (CONSTANTES_DE_RONDA[indice] ?? 0) + (horario[indice] ?? 0)) >>> 0;
|
|
56
|
+
const s0 = rotar(a, 2) ^ rotar(a, 13) ^ rotar(a, 22);
|
|
57
|
+
const mayoria = (a & b) ^ (a & c) ^ (b & c);
|
|
58
|
+
const temporal2 = (s0 + mayoria) >>> 0;
|
|
59
|
+
[h, g, f, e, d, c, b, a] = [
|
|
60
|
+
g,
|
|
61
|
+
f,
|
|
62
|
+
e,
|
|
63
|
+
(d + temporal1) >>> 0,
|
|
64
|
+
c,
|
|
65
|
+
b,
|
|
66
|
+
a,
|
|
67
|
+
(temporal1 + temporal2) >>> 0,
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
return [a, b, c, d, e, f, g, h].map((valor, indice) => (valor + (estado[indice] ?? 0)) >>> 0);
|
|
71
|
+
};
|
|
72
|
+
export const sha256 = (datos) => {
|
|
73
|
+
const rellenado = conRelleno(datos);
|
|
74
|
+
const vista = new DataView(rellenado.buffer);
|
|
75
|
+
let estado = [...ESTADO_INICIAL];
|
|
76
|
+
for (let inicio = 0; inicio < rellenado.length; inicio += BYTES_POR_BLOQUE) {
|
|
77
|
+
estado = comprimir(estado, horarioDelBloque(vista, inicio));
|
|
78
|
+
}
|
|
79
|
+
const resumen = new Uint8Array(BYTES_DEL_RESUMEN);
|
|
80
|
+
const salida = new DataView(resumen.buffer);
|
|
81
|
+
estado.forEach((valor, indice) => salida.setUint32(indice * BYTES_POR_PALABRA, valor));
|
|
82
|
+
return resumen;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=sha256.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../src/sha256.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const TEXTOS_DEL_DESBLOQUEO = {
|
|
2
|
+
interruptor: 'Entrar con Face ID o huella',
|
|
3
|
+
titulo: 'Confirma que eres tú',
|
|
4
|
+
motivo: 'Usa tu rostro o tu huella para entrar a tu cuenta.',
|
|
5
|
+
entrarConCodigo: 'Entrar con código',
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=textos-del-desbloqueo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textos-del-desbloqueo.js","sourceRoot":"","sources":["../src/textos-del-desbloqueo.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE,WAAW,EAAE,6BAA6B;IAC1C,MAAM,EAAE,sBAAsB;IAC9B,MAAM,EAAE,oDAAoD;IAC5D,eAAe,EAAE,mBAAmB;CACrC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type PlataformaDeAtestacion = 'ios' | 'android';
|
|
2
|
+
export interface AtestacionDelDispositivo {
|
|
3
|
+
plataforma: PlataformaDeAtestacion;
|
|
4
|
+
token: string;
|
|
5
|
+
dispositivo: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ProveedorDeAtestacion {
|
|
8
|
+
atestar(reto: string): Promise<AtestacionDelDispositivo>;
|
|
9
|
+
}
|
|
10
|
+
export interface PedidoDeTicket {
|
|
11
|
+
coreApiUrl: string;
|
|
12
|
+
clienteId: string;
|
|
13
|
+
proveedor: ProveedorDeAtestacion;
|
|
14
|
+
pedir: (url: string, init?: RequestInit) => Promise<Response>;
|
|
15
|
+
}
|
|
16
|
+
export interface TicketDelDispositivo {
|
|
17
|
+
ticket: string;
|
|
18
|
+
dispositivo: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const pedirTicketDeAtestacion: (pedido: PedidoDeTicket) => Promise<string>;
|
|
21
|
+
export declare const pedirTicketDelDispositivo: ({ coreApiUrl, clienteId, proveedor, pedir, }: PedidoDeTicket) => Promise<TicketDelDispositivo>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ErrorDeIdentidad } from './error-de-identidad';
|
|
2
|
+
const fallida = (causa) => new ErrorDeIdentidad('atestacion_fallida', causa === undefined ? undefined : { cause: causa });
|
|
3
|
+
const textoDelCampo = async (respuesta, campo) => {
|
|
4
|
+
if (!respuesta.ok)
|
|
5
|
+
throw fallida();
|
|
6
|
+
const cuerpo = await respuesta.json();
|
|
7
|
+
if (typeof cuerpo !== 'object' || cuerpo === null || !(campo in cuerpo))
|
|
8
|
+
throw fallida();
|
|
9
|
+
const valor = Object.getOwnPropertyDescriptor(cuerpo, campo)?.value;
|
|
10
|
+
if (typeof valor !== 'string' || valor.length === 0)
|
|
11
|
+
throw fallida();
|
|
12
|
+
return valor;
|
|
13
|
+
};
|
|
14
|
+
const atestar = (proveedor, reto) => proveedor.atestar(reto).catch((error) => {
|
|
15
|
+
throw fallida(error);
|
|
16
|
+
});
|
|
17
|
+
export const pedirTicketDeAtestacion = async (pedido) => (await pedirTicketDelDispositivo(pedido)).ticket;
|
|
18
|
+
export const pedirTicketDelDispositivo = async ({ coreApiUrl, clienteId, proveedor, pedir, }) => {
|
|
19
|
+
const reto = await textoDelCampo(await pedir(`${coreApiUrl}/auth/atestacion/reto`, { method: 'POST' }), 'reto');
|
|
20
|
+
const { plataforma, token, dispositivo } = await atestar(proveedor, reto);
|
|
21
|
+
const respuesta = await pedir(`${coreApiUrl}/auth/atestacion/ticket`, {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
'x-atestacion-plataforma': plataforma,
|
|
26
|
+
'x-atestacion': token,
|
|
27
|
+
'x-dispositivo': dispositivo,
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ client_id: clienteId }),
|
|
30
|
+
});
|
|
31
|
+
return { ticket: await textoDelCampo(respuesta, 'ticket'), dispositivo };
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=ticket-de-atestacion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticket-de-atestacion.js","sourceRoot":"","sources":["../src/ticket-de-atestacion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqBxD,MAAM,OAAO,GAAG,CAAC,KAAe,EAAoB,EAAE,CACpD,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAEjG,MAAM,aAAa,GAAG,KAAK,EAAE,SAAmB,EAAE,KAAa,EAAmB,EAAE;IAClF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,MAAM,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAY,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACzF,MAAM,KAAK,GAAY,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,OAAO,EAAE,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,SAAgC,EAAE,IAAY,EAAE,EAAE,CACjE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC/C,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAOL,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,MAAsB,EAAmB,EAAE,CACvF,CAAC,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,EAAE,EAC9C,UAAU,EACV,SAAS,EACT,SAAS,EACT,KAAK,GACU,EAAiC,EAAE;IAClD,MAAM,IAAI,GAAG,MAAM,aAAa,CAC9B,MAAM,KAAK,CAAC,GAAG,UAAU,uBAAuB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EACrE,MAAM,CACP,CAAC;IACF,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,yBAAyB,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,yBAAyB,EAAE,UAAU;YACrC,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,WAAW;SAC7B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;AAC3E,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AlmacenSeguro } from './almacen-seguro';
|
|
2
|
+
export declare const LLAVE_DE_LA_ULTIMA_CUENTA = "neodaten.ultima-cuenta";
|
|
3
|
+
export interface UltimaCuenta {
|
|
4
|
+
sub: string;
|
|
5
|
+
nombre: string | null;
|
|
6
|
+
telefonoEnmascarado: string | null;
|
|
7
|
+
tienePasskey: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const enmascararTelefono: (telefono: string) => string | null;
|
|
10
|
+
export declare const ultimaCuentaDe: (reclamos: Record<string, unknown>) => UltimaCuenta | null;
|
|
11
|
+
export declare function leerUltimaCuenta(almacen: AlmacenSeguro): Promise<UltimaCuenta | null>;
|
|
12
|
+
export declare function guardarUltimaCuenta(almacen: AlmacenSeguro, cuenta: UltimaCuenta): Promise<void>;
|
|
13
|
+
export declare function olvidarUltimaCuenta(almacen: AlmacenSeguro): Promise<void>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export const LLAVE_DE_LA_ULTIMA_CUENTA = 'neodaten.ultima-cuenta';
|
|
2
|
+
const DIGITOS_VISIBLES_DEL_TELEFONO = 4;
|
|
3
|
+
const MASCARA_DEL_TELEFONO = '••••';
|
|
4
|
+
const esTextoOVacio = (valor) => valor === null || typeof valor === 'string';
|
|
5
|
+
const esUltimaCuenta = (valor) => {
|
|
6
|
+
if (typeof valor !== 'object' || valor === null)
|
|
7
|
+
return false;
|
|
8
|
+
if (!('sub' in valor) || !('nombre' in valor) || !('telefonoEnmascarado' in valor))
|
|
9
|
+
return false;
|
|
10
|
+
if (!('tienePasskey' in valor))
|
|
11
|
+
return false;
|
|
12
|
+
return (typeof valor.sub === 'string' &&
|
|
13
|
+
valor.sub.length > 0 &&
|
|
14
|
+
esTextoOVacio(valor.nombre) &&
|
|
15
|
+
esTextoOVacio(valor.telefonoEnmascarado) &&
|
|
16
|
+
typeof valor.tienePasskey === 'boolean');
|
|
17
|
+
};
|
|
18
|
+
export const enmascararTelefono = (telefono) => {
|
|
19
|
+
const digitos = telefono.replace(/\D/g, '');
|
|
20
|
+
if (digitos.length < DIGITOS_VISIBLES_DEL_TELEFONO)
|
|
21
|
+
return null;
|
|
22
|
+
return `${MASCARA_DEL_TELEFONO} ${digitos.slice(-DIGITOS_VISIBLES_DEL_TELEFONO)}`;
|
|
23
|
+
};
|
|
24
|
+
const textoDe = (reclamos, nombre) => {
|
|
25
|
+
const valor = reclamos[nombre];
|
|
26
|
+
return typeof valor === 'string' && valor.length > 0 ? valor : null;
|
|
27
|
+
};
|
|
28
|
+
export const ultimaCuentaDe = (reclamos) => {
|
|
29
|
+
const sub = textoDe(reclamos, 'sub');
|
|
30
|
+
if (sub === null)
|
|
31
|
+
return null;
|
|
32
|
+
const telefono = textoDe(reclamos, 'phone_number');
|
|
33
|
+
return {
|
|
34
|
+
sub,
|
|
35
|
+
nombre: textoDe(reclamos, 'name'),
|
|
36
|
+
telefonoEnmascarado: telefono === null ? null : enmascararTelefono(telefono),
|
|
37
|
+
tienePasskey: reclamos.tiene_passkey === true,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
const interpretar = (texto) => {
|
|
41
|
+
try {
|
|
42
|
+
const valor = JSON.parse(texto);
|
|
43
|
+
return valor;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof SyntaxError)
|
|
47
|
+
return null;
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export async function leerUltimaCuenta(almacen) {
|
|
52
|
+
const texto = await almacen.obtener(LLAVE_DE_LA_ULTIMA_CUENTA);
|
|
53
|
+
if (texto === null)
|
|
54
|
+
return null;
|
|
55
|
+
const cuenta = interpretar(texto);
|
|
56
|
+
if (esUltimaCuenta(cuenta))
|
|
57
|
+
return cuenta;
|
|
58
|
+
await almacen.borrar(LLAVE_DE_LA_ULTIMA_CUENTA);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
export async function guardarUltimaCuenta(almacen, cuenta) {
|
|
62
|
+
await almacen.guardar(LLAVE_DE_LA_ULTIMA_CUENTA, JSON.stringify(cuenta));
|
|
63
|
+
}
|
|
64
|
+
export async function olvidarUltimaCuenta(almacen) {
|
|
65
|
+
await almacen.borrar(LLAVE_DE_LA_ULTIMA_CUENTA);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=ultima-cuenta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ultima-cuenta.js","sourceRoot":"","sources":["../src/ultima-cuenta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Criptografia, LlavePublicaEc } from './criptografia';
|
|
2
|
+
export interface IdTokenEsperado {
|
|
3
|
+
emisor: string;
|
|
4
|
+
clienteId: string;
|
|
5
|
+
nonce: string | null;
|
|
6
|
+
ahoraMs: number;
|
|
7
|
+
}
|
|
8
|
+
export interface LlavesDelEmisor {
|
|
9
|
+
llavePorKid(kid: string): Promise<LlavePublicaEc | null>;
|
|
10
|
+
}
|
|
11
|
+
export declare const reclamosDelIdToken: (jwt: string) => Record<string, unknown>;
|
|
12
|
+
export declare const validarIdToken: (jwt: string, esperado: IdTokenEsperado, { llaves, cripto }: {
|
|
13
|
+
llaves: LlavesDelEmisor;
|
|
14
|
+
cripto: Criptografia;
|
|
15
|
+
}) => Promise<Record<string, unknown>>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { deBase64url, textoABytes } from './base64url';
|
|
2
|
+
import { ErrorDeIdentidad } from './error-de-identidad';
|
|
3
|
+
const ALGORITMO_ESPERADO = 'ES256';
|
|
4
|
+
const PARTES_DEL_JWT = 3;
|
|
5
|
+
const TOLERANCIA_DEL_RELOJ_S = 60;
|
|
6
|
+
const MILISEGUNDOS_POR_SEGUNDO = 1000;
|
|
7
|
+
const invalida = () => new ErrorDeIdentidad('identidad_invalida');
|
|
8
|
+
const objetoJson = (bytes) => {
|
|
9
|
+
if (bytes === null)
|
|
10
|
+
return null;
|
|
11
|
+
try {
|
|
12
|
+
const valor = JSON.parse(new TextDecoder().decode(bytes));
|
|
13
|
+
return typeof valor === 'object' && valor !== null && !Array.isArray(valor)
|
|
14
|
+
? Object.fromEntries(Object.entries(valor))
|
|
15
|
+
: null;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (error instanceof SyntaxError)
|
|
19
|
+
return null;
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const leerJwt = (jwt) => {
|
|
24
|
+
const partes = jwt.split('.');
|
|
25
|
+
const [encabezado, carga, firma] = partes;
|
|
26
|
+
if (partes.length !== PARTES_DEL_JWT || encabezado === undefined || carga === undefined) {
|
|
27
|
+
throw invalida();
|
|
28
|
+
}
|
|
29
|
+
const encabezadoLeido = objetoJson(deBase64url(encabezado));
|
|
30
|
+
const cargaLeida = objetoJson(deBase64url(carga));
|
|
31
|
+
const firmaLeida = deBase64url(firma ?? '');
|
|
32
|
+
if (encabezadoLeido === null || cargaLeida === null || firmaLeida === null)
|
|
33
|
+
throw invalida();
|
|
34
|
+
return {
|
|
35
|
+
encabezado: encabezadoLeido,
|
|
36
|
+
carga: cargaLeida,
|
|
37
|
+
firmado: textoABytes(`${encabezado}.${carga}`),
|
|
38
|
+
firma: firmaLeida,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
const incluyeLaAudiencia = (aud, clienteId) => aud === clienteId || (Array.isArray(aud) && aud.includes(clienteId));
|
|
42
|
+
const esElPresentadoCorrecto = (carga, clienteId) => !Array.isArray(carga.aud) || carga.aud.length === 1 || carga.azp === clienteId;
|
|
43
|
+
const esVigente = (carga, ahoraMs) => {
|
|
44
|
+
const ahora = ahoraMs / MILISEGUNDOS_POR_SEGUNDO;
|
|
45
|
+
return (typeof carga.exp === 'number' &&
|
|
46
|
+
carga.exp + TOLERANCIA_DEL_RELOJ_S > ahora &&
|
|
47
|
+
typeof carga.iat === 'number' &&
|
|
48
|
+
carga.iat - TOLERANCIA_DEL_RELOJ_S <= ahora);
|
|
49
|
+
};
|
|
50
|
+
const exigirReclamos = (carga, esperado) => {
|
|
51
|
+
if (carga.iss !== esperado.emisor)
|
|
52
|
+
throw invalida();
|
|
53
|
+
if (!incluyeLaAudiencia(carga.aud, esperado.clienteId))
|
|
54
|
+
throw invalida();
|
|
55
|
+
if (!esElPresentadoCorrecto(carga, esperado.clienteId))
|
|
56
|
+
throw invalida();
|
|
57
|
+
if ((carga.nonce ?? null) !== esperado.nonce)
|
|
58
|
+
throw invalida();
|
|
59
|
+
if (!esVigente(carga, esperado.ahoraMs))
|
|
60
|
+
throw invalida();
|
|
61
|
+
if (typeof carga.sub !== 'string' || carga.sub.length === 0)
|
|
62
|
+
throw invalida();
|
|
63
|
+
};
|
|
64
|
+
const exigirFirma = async ({ kid, firmado, firma }, llaves, verificar) => {
|
|
65
|
+
const llave = await llaves.llavePorKid(kid);
|
|
66
|
+
if (llave === null)
|
|
67
|
+
throw invalida();
|
|
68
|
+
const firmaValida = await verificar(llave, firmado, firma).catch((error) => {
|
|
69
|
+
throw new ErrorDeIdentidad('identidad_invalida', { cause: error });
|
|
70
|
+
});
|
|
71
|
+
if (!firmaValida)
|
|
72
|
+
throw invalida();
|
|
73
|
+
};
|
|
74
|
+
export const reclamosDelIdToken = (jwt) => leerJwt(jwt).carga;
|
|
75
|
+
export const validarIdToken = async (jwt, esperado, { llaves, cripto }) => {
|
|
76
|
+
const { encabezado, carga, firmado, firma } = leerJwt(jwt);
|
|
77
|
+
if (encabezado.alg !== ALGORITMO_ESPERADO || typeof encabezado.kid !== 'string') {
|
|
78
|
+
throw invalida();
|
|
79
|
+
}
|
|
80
|
+
if (cripto.verificarEs256 !== null) {
|
|
81
|
+
await exigirFirma({ kid: encabezado.kid, firmado, firma }, llaves, cripto.verificarEs256);
|
|
82
|
+
}
|
|
83
|
+
exigirReclamos(carga, esperado);
|
|
84
|
+
return carga;
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=validar-id-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validar-id-token.js","sourceRoot":"","sources":["../src/validar-id-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAoBtC,MAAM,QAAQ,GAAG,GAAqB,EAAE,CAAC,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;AAEpF,MAAM,UAAU,GAAG,CAAC,KAAwB,EAAkC,EAAE;IAC9E,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACzE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAY,EAAE;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxF,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;IACD,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5C,IAAI,eAAe,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;QAAE,MAAM,QAAQ,EAAE,CAAC;IAC7F,OAAO;QACL,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,WAAW,CAAC,GAAG,UAAU,IAAI,KAAK,EAAE,CAAC;QAC9C,KAAK,EAAE,UAAU;KAClB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAE,SAAiB,EAAW,EAAE,CACtE,GAAG,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAEvE,MAAM,sBAAsB,GAAG,CAAC,KAA8B,EAAE,SAAiB,EAAW,EAAE,CAC5F,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC;AAEjF,MAAM,SAAS,GAAG,CAAC,KAA8B,EAAE,OAAe,EAAW,EAAE;IAC7E,MAAM,KAAK,GAAG,OAAO,GAAG,wBAAwB,CAAC;IACjD,OAAO,CACL,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,KAAK,CAAC,GAAG,GAAG,sBAAsB,GAAG,KAAK;QAC1C,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,KAAK,CAAC,GAAG,GAAG,sBAAsB,IAAI,KAAK,CAC5C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAA8B,EAAE,QAAyB,EAAQ,EAAE;IACzF,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM;QAAE,MAAM,QAAQ,EAAE,CAAC;IACpD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC;QAAE,MAAM,QAAQ,EAAE,CAAC;IACzE,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC;QAAE,MAAM,QAAQ,EAAE,CAAC;IACzE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK;QAAE,MAAM,QAAQ,EAAE,CAAC;IAC/D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,QAAQ,EAAE,CAAC;IAC1D,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,QAAQ,EAAE,CAAC;AAChF,CAAC,CAAC;AAQF,MAAM,WAAW,GAAG,KAAK,EACvB,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAe,EACpC,MAAuB,EACvB,SAA2B,EACZ,EAAE;IACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,QAAQ,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAClF,MAAM,IAAI,gBAAgB,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,WAAW;QAAE,MAAM,QAAQ,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAA2B,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;AAE/F,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAW,EACX,QAAyB,EACzB,EAAE,MAAM,EAAE,MAAM,EAAqD,EACnC,EAAE;IACpC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,GAAG,KAAK,kBAAkB,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAChF,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAC5F,CAAC;IACD,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function crearVueloUnico<T>(operacion: () => Promise<T>): () => Promise<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vuelo-unico.js","sourceRoot":"","sources":["../src/vuelo-unico.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAI,SAA2B;IAC5D,IAAI,OAAO,GAAsB,IAAI,CAAC;IACtC,OAAO,GAAG,EAAE;QACV,OAAO,KAAK,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACnC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neodaten/auth-native",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Cliente de identidad para apps React Native: login hospedado con código y PKCE, refresh rotativo y almacén seguro inyectado.",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./pantalla": {
|
|
15
|
+
"types": "./dist/pantalla/index.d.ts",
|
|
16
|
+
"import": "./dist/pantalla/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./expo": {
|
|
19
|
+
"types": "./dist/expo/index.d.ts",
|
|
20
|
+
"import": "./dist/expo/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./keychain": {
|
|
23
|
+
"types": "./dist/keychain/index.d.ts",
|
|
24
|
+
"import": "./dist/keychain/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./bienvenida": {
|
|
27
|
+
"types": "./dist/bienvenida/index.d.ts",
|
|
28
|
+
"import": "./dist/bienvenida/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"README.md"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/Neodaten/n360.git",
|
|
38
|
+
"directory": "packages/auth-native"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"registry": "https://registry.npmjs.org",
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"react": "^19.2.0",
|
|
46
|
+
"react-native-webview": ">=13.15.0 <15",
|
|
47
|
+
"react-native": ">=0.80.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/react": "^19.2.0",
|
|
51
|
+
"react": "^19.2.0",
|
|
52
|
+
"react-native": "0.86.3",
|
|
53
|
+
"react-native-webview": "14.0.1",
|
|
54
|
+
"typescript": "^6.0.3",
|
|
55
|
+
"vitest": "^4.1.0",
|
|
56
|
+
"@neodaten/eslint-config": "0.0.0",
|
|
57
|
+
"@neodaten/tsconfig": "0.0.0"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"empaquetar": "tsc -p tsconfig.empaquetado.json",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"test:watch": "vitest"
|
|
63
|
+
}
|
|
6
64
|
}
|