@albertomarturelo/sii-core 0.8.0 → 0.10.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/CHANGELOG.md +116 -0
- package/dist/adapters/fake/index.d.ts +14 -2
- package/dist/adapters/fake/index.d.ts.map +1 -1
- package/dist/adapters/fake/index.js +21 -1
- package/dist/adapters/fake/index.js.map +1 -1
- package/dist/adapters/node/keyring.d.ts +12 -0
- package/dist/adapters/node/keyring.d.ts.map +1 -0
- package/dist/adapters/node/keyring.js +58 -0
- package/dist/adapters/node/keyring.js.map +1 -0
- package/dist/adapters/node/portal.d.ts.map +1 -1
- package/dist/adapters/node/portal.js +11 -4
- package/dist/adapters/node/portal.js.map +1 -1
- package/dist/adapters/node/response.d.ts +12 -4
- package/dist/adapters/node/response.d.ts.map +1 -1
- package/dist/adapters/node/response.js +32 -7
- package/dist/adapters/node/response.js.map +1 -1
- package/dist/auth/auth.d.ts +42 -6
- package/dist/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth.js +181 -33
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/session.d.ts +16 -1
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js +12 -0
- package/dist/auth/session.js.map +1 -1
- package/dist/auth/www2-login.d.ts +28 -0
- package/dist/auth/www2-login.d.ts.map +1 -0
- package/dist/auth/www2-login.js +101 -0
- package/dist/auth/www2-login.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/config.d.ts +18 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +18 -0
- package/dist/config/config.js.map +1 -1
- package/dist/errors/errors.d.ts +25 -0
- package/dist/errors/errors.d.ts.map +1 -1
- package/dist/errors/errors.js +25 -0
- package/dist/errors/errors.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +6 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +6 -1
- package/dist/node.js.map +1 -1
- package/dist/portal/carpeta-tributaria-regular.d.ts +30 -0
- package/dist/portal/carpeta-tributaria-regular.d.ts.map +1 -0
- package/dist/portal/carpeta-tributaria-regular.js +142 -0
- package/dist/portal/carpeta-tributaria-regular.js.map +1 -0
- package/dist/portal/www2-session.d.ts +13 -0
- package/dist/portal/www2-session.d.ts.map +1 -0
- package/dist/portal/www2-session.js +61 -0
- package/dist/portal/www2-session.js.map +1 -0
- package/dist/seams/index.d.ts +8 -1
- package/dist/seams/index.d.ts.map +1 -1
- package/dist/tasks/auth.d.ts +14 -6
- package/dist/tasks/auth.d.ts.map +1 -1
- package/dist/tasks/auth.js +13 -5
- package/dist/tasks/auth.js.map +1 -1
- package/dist/tasks/carpeta.d.ts +9 -0
- package/dist/tasks/carpeta.d.ts.map +1 -0
- package/dist/tasks/carpeta.js +49 -0
- package/dist/tasks/carpeta.js.map +1 -0
- package/package.json +2 -1
package/dist/tasks/auth.d.ts
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
|
-
import type { AuthIdentity, AuthLoginResult, AuthLogoutResult, AuthStatusLocal, AuthWhoami } from '../auth/index.js';
|
|
1
|
+
import type { AuthIdentity, AuthIdentityRefresh, AuthLoginResult, AuthLogoutResult, AuthStatusLocal, AuthWhoami, AuthWww2Status, LoginOptions } from '../auth/index.js';
|
|
2
2
|
import type { Runtime } from '../seams/index.js';
|
|
3
|
-
|
|
3
|
+
/** Browser login (ADR-006). `www2: true` also mints the www2 app-session layer in the same headed
|
|
4
|
+
* browser (ADR-026) — the user types the Clave into SII's OAuth page; never a password argument. */
|
|
5
|
+
export declare function login(runtime: Runtime, options?: LoginOptions): Promise<AuthLoginResult>;
|
|
4
6
|
/** CLI-only (ADR-010): RUT + Clave from the console → headless login → cookies
|
|
5
7
|
* only. The Clave is used once and never stored. NEVER expose over MCP. */
|
|
6
8
|
export declare function consoleLogin(runtime: Runtime, credentials: {
|
|
7
9
|
rut: string;
|
|
8
10
|
clave: string;
|
|
9
11
|
}): Promise<AuthLoginResult>;
|
|
12
|
+
/** CLI-only (ADR-025): the Clave comes from the OS keyring (service `sii`, username =
|
|
13
|
+
* the RUT) instead of the terminal. ONE attempt, no implicit re-login. NEVER over MCP. */
|
|
14
|
+
export declare function keyringLogin(runtime: Runtime, args: {
|
|
15
|
+
rut: string;
|
|
16
|
+
}): Promise<AuthLoginResult>;
|
|
10
17
|
export declare function logout(runtime: Runtime): Promise<AuthLogoutResult>;
|
|
11
|
-
/** Pure local read (no portal call).
|
|
18
|
+
/** Pure local read (no portal call). The www2 layer's `authenticated` is decided by its stored
|
|
19
|
+
* cookie expiry against the clock. */
|
|
12
20
|
export declare function authStatus(runtime: Runtime): Promise<AuthStatusLocal>;
|
|
13
|
-
/** Curated identity readback from the portal (needs a live session). */
|
|
14
|
-
export declare function statusRefresh(runtime: Runtime): Promise<
|
|
21
|
+
/** Curated identity readback from the portal (needs a live session) + the www2 layer read live. */
|
|
22
|
+
export declare function statusRefresh(runtime: Runtime): Promise<AuthIdentityRefresh>;
|
|
15
23
|
/** whoami — the authenticated principal's own razón social/nombre + email (own PII).
|
|
16
24
|
* Live portal read; session-keyed (ignores the operate pointer). */
|
|
17
25
|
export declare function whoami(runtime: Runtime): Promise<AuthWhoami>;
|
|
18
|
-
export type { AuthIdentity, AuthLoginResult, AuthLogoutResult, AuthStatusLocal, AuthWhoami };
|
|
26
|
+
export type { AuthIdentity, AuthIdentityRefresh, AuthLoginResult, AuthLogoutResult, AuthStatusLocal, AuthWhoami, AuthWww2Status, LoginOptions, };
|
|
19
27
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/tasks/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tasks/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,UAAU,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tasks/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;qGACqG;AACrG,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE5F;AAED;4EAC4E;AAC5E,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;2FAC2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAE9F;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAElE;AAED;uCACuC;AACvC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAErE;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE5E;AAED;qEACqE;AACrE,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAE5D;AAED,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,GACb,CAAC"}
|
package/dist/tasks/auth.js
CHANGED
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
// Public auth API the surfaces call. Uniform: every operation takes a Runtime.
|
|
2
2
|
import * as auth from '../auth/index.js';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/** Browser login (ADR-006). `www2: true` also mints the www2 app-session layer in the same headed
|
|
4
|
+
* browser (ADR-026) — the user types the Clave into SII's OAuth page; never a password argument. */
|
|
5
|
+
export function login(runtime, options = {}) {
|
|
6
|
+
return auth.login(runtime, options);
|
|
5
7
|
}
|
|
6
8
|
/** CLI-only (ADR-010): RUT + Clave from the console → headless login → cookies
|
|
7
9
|
* only. The Clave is used once and never stored. NEVER expose over MCP. */
|
|
8
10
|
export function consoleLogin(runtime, credentials) {
|
|
9
11
|
return auth.consoleLogin(runtime, credentials);
|
|
10
12
|
}
|
|
13
|
+
/** CLI-only (ADR-025): the Clave comes from the OS keyring (service `sii`, username =
|
|
14
|
+
* the RUT) instead of the terminal. ONE attempt, no implicit re-login. NEVER over MCP. */
|
|
15
|
+
export function keyringLogin(runtime, args) {
|
|
16
|
+
return auth.keyringLogin(runtime, args);
|
|
17
|
+
}
|
|
11
18
|
export function logout(runtime) {
|
|
12
19
|
return auth.logout(runtime);
|
|
13
20
|
}
|
|
14
|
-
/** Pure local read (no portal call).
|
|
21
|
+
/** Pure local read (no portal call). The www2 layer's `authenticated` is decided by its stored
|
|
22
|
+
* cookie expiry against the clock. */
|
|
15
23
|
export function authStatus(runtime) {
|
|
16
|
-
return auth.localStatus(runtime.store);
|
|
24
|
+
return auth.localStatus(runtime.store, runtime.clock.now());
|
|
17
25
|
}
|
|
18
|
-
/** Curated identity readback from the portal (needs a live session). */
|
|
26
|
+
/** Curated identity readback from the portal (needs a live session) + the www2 layer read live. */
|
|
19
27
|
export function statusRefresh(runtime) {
|
|
20
28
|
return auth.statusRefresh(runtime);
|
|
21
29
|
}
|
package/dist/tasks/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tasks/auth.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tasks/auth.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAC;AAazC;qGACqG;AACrG,MAAM,UAAU,KAAK,CAAC,OAAgB,EAAE,UAAwB,EAAE;IAChE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;4EAC4E;AAC5E,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,WAA2C;IAE3C,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED;2FAC2F;AAC3F,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,IAAqB;IAClE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAgB;IACrC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED;uCACuC;AACvC,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;qEACqE;AACrE,MAAM,UAAU,MAAM,CAAC,OAAgB;IACrC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CarpetaInstitucion } from '../portal/carpeta-tributaria-regular.js';
|
|
2
|
+
import type { Runtime } from '../seams/index.js';
|
|
3
|
+
export type { CarpetaInstitucion } from '../portal/carpeta-tributaria-regular.js';
|
|
4
|
+
/** SII's LIVE list of destination institutions for the Carpeta Tributaria Regular — the
|
|
5
|
+
* `enfinCodigo` catalog `carpeta regular --institucion` is validated against. Never cached, never
|
|
6
|
+
* hardcoded: the codes drift (#110). Public catalog rows (no taxpayer data); the audit records
|
|
7
|
+
* the read (rut + count) only. */
|
|
8
|
+
export declare function carpetaInstituciones(runtime: Runtime): Promise<readonly CarpetaInstitucion[]>;
|
|
9
|
+
//# sourceMappingURL=carpeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carpeta.d.ts","sourceRoot":"","sources":["../../src/tasks/carpeta.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAkBlF;;;mCAGmC;AACnC,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAoBxC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Public Carpeta Tributaria tasks the surfaces call (ADR-003). Wraps the `cte-api` facade in
|
|
2
|
+
// `withSession` and writes ONE audit receipt per call.
|
|
3
|
+
//
|
|
4
|
+
// Carpeta is SESSION-KEYED (ADR-005): the app serves the principal's own Carpeta, so the tasks
|
|
5
|
+
// read `ctx.sessionRut`, take NO `--rut`, and reject a representing operate pointer up front
|
|
6
|
+
// (same posture as F29). The www2 `cte-api` also needs the www2 APP SESSION (ADR-026): the
|
|
7
|
+
// facade reads it first (`portal/www2-session.ts`) and raises `Www2SessionError` (a
|
|
8
|
+
// NotAuthenticated) when it is missing — minting it is `sii auth login --www2`, pending.
|
|
9
|
+
//
|
|
10
|
+
// #110 ships `carpetaInstituciones` (the live `enfinCodigo` catalog); #109 adds `carpetaRegular`
|
|
11
|
+
// (the PDF, ADR-022 descriptor) on top of the same facade.
|
|
12
|
+
import { assertOperatingSelf, withSession } from '../auth/index.js';
|
|
13
|
+
import { recordAudit } from '../audit/index.js';
|
|
14
|
+
import { CarpetaError } from '../errors/index.js';
|
|
15
|
+
import { listInstituciones } from '../portal/carpeta-tributaria-regular.js';
|
|
16
|
+
function audit(runtime, action, result, extra) {
|
|
17
|
+
recordAudit(runtime, { action, result, ...extra });
|
|
18
|
+
}
|
|
19
|
+
// Session-keyed (ADR-005): the shared guard, with this surface's own error + wording.
|
|
20
|
+
const assertSelfOperating = (runtime) => assertOperatingSelf(runtime, (empresa) => new CarpetaError(`La Carpeta Tributaria es session-keyed: el SII autoriza por el titular de la sesión, no ` +
|
|
21
|
+
`por el RUT operado (${empresa}). Para la carpeta de esa empresa, inicia sesión como ` +
|
|
22
|
+
'ella (`sii auth logout` y luego `sii auth login`).'));
|
|
23
|
+
/** SII's LIVE list of destination institutions for the Carpeta Tributaria Regular — the
|
|
24
|
+
* `enfinCodigo` catalog `carpeta regular --institucion` is validated against. Never cached, never
|
|
25
|
+
* hardcoded: the codes drift (#110). Public catalog rows (no taxpayer data); the audit records
|
|
26
|
+
* the read (rut + count) only. */
|
|
27
|
+
export async function carpetaInstituciones(runtime) {
|
|
28
|
+
await assertSelfOperating(runtime);
|
|
29
|
+
const start = runtime.clock.now().getTime();
|
|
30
|
+
try {
|
|
31
|
+
const { res, rut } = await withSession(runtime, async (session, ctx) => ({
|
|
32
|
+
// session-keyed: the www2 app session IS the principal (the facade reads its userId);
|
|
33
|
+
// the audit records the classic principal we acted for.
|
|
34
|
+
res: await listInstituciones(session),
|
|
35
|
+
rut: ctx.sessionRut,
|
|
36
|
+
}));
|
|
37
|
+
audit(runtime, 'carpeta_instituciones', 'ok', {
|
|
38
|
+
rut,
|
|
39
|
+
count: res.length,
|
|
40
|
+
durationMs: runtime.clock.now().getTime() - start,
|
|
41
|
+
});
|
|
42
|
+
return res;
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
audit(runtime, 'carpeta_instituciones', 'failed', {});
|
|
46
|
+
throw e;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=carpeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carpeta.js","sourceRoot":"","sources":["../../src/tasks/carpeta.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,uDAAuD;AACvD,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,2FAA2F;AAC3F,oFAAoF;AACpF,yFAAyF;AACzF,EAAE;AACF,iGAAiG;AACjG,2DAA2D;AAC3D,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAM5E,SAAS,KAAK,CAAC,OAAgB,EAAE,MAAc,EAAE,MAAc,EAAE,KAA0B;IACzF,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,sFAAsF;AACtF,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAiB,EAAE,CAC9D,mBAAmB,CACjB,OAAO,EACP,CAAC,OAAO,EAAE,EAAE,CACV,IAAI,YAAY,CACd,0FAA0F;IACxF,uBAAuB,OAAO,wDAAwD;IACtF,oDAAoD,CACvD,CACJ,CAAC;AAEJ;;;mCAGmC;AACnC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB;IAEhB,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACvE,sFAAsF;YACtF,wDAAwD;YACxD,GAAG,EAAE,MAAM,iBAAiB,CAAC,OAAO,CAAC;YACrC,GAAG,EAAE,GAAG,CAAC,UAAU;SACpB,CAAC,CAAC,CAAC;QACJ,KAAK,CAAC,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE;YAC5C,GAAG;YACH,KAAK,EAAE,GAAG,CAAC,MAAM;YACjB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK;SAClD,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@albertomarturelo/sii-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Shared SII domain core: rut, config (prod hostnames), contracts, tasks, seams. A Node library; external side-effects (portal, secrets, audit, clock) are injected via seams (ADR-003).",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
+
"@napi-rs/keyring": "2.0.0",
|
|
49
50
|
"playwright": "^1.49.0"
|
|
50
51
|
},
|
|
51
52
|
"scripts": {
|