@eetr/eetr-auth-client 0.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/dist/admin.d.ts +44 -0
- package/dist/admin.d.ts.map +1 -0
- package/dist/admin.js +70 -0
- package/dist/admin.js.map +1 -0
- package/dist/api.d.ts +31 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +58 -0
- package/dist/api.js.map +1 -0
- package/dist/discovery.d.ts +4 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +17 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +9 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +27 -0
- package/dist/jwt.js.map +1 -0
- package/dist/tokens.d.ts +12 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +36 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +64 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
package/dist/admin.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface AdminUserRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
username: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
email: string | null;
|
|
6
|
+
emailVerifiedAt: string | null;
|
|
7
|
+
avatarKey: string | null;
|
|
8
|
+
avatarUrl: string | null;
|
|
9
|
+
isAdmin: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface AdminClientConfig {
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
accessToken: string;
|
|
14
|
+
}
|
|
15
|
+
export interface CreateUserParams {
|
|
16
|
+
username: string;
|
|
17
|
+
password: string;
|
|
18
|
+
name?: string | null;
|
|
19
|
+
email?: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface UpdateUserParams {
|
|
22
|
+
username?: string;
|
|
23
|
+
password?: string;
|
|
24
|
+
isAdmin?: boolean;
|
|
25
|
+
name?: string | null;
|
|
26
|
+
email?: string | null;
|
|
27
|
+
emailVerifiedAt?: string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fetch an admin-visible user by internal UUID or username.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getAdminUser(idOrUsername: string, config: AdminClientConfig): Promise<AdminUserRecord>;
|
|
33
|
+
export declare function createAdminUser(params: CreateUserParams, config: AdminClientConfig): Promise<AdminUserRecord>;
|
|
34
|
+
/**
|
|
35
|
+
* Update an admin-visible user. `idOrUsername` accepts either the internal
|
|
36
|
+
* UUID or the username.
|
|
37
|
+
*/
|
|
38
|
+
export declare function updateAdminUser(idOrUsername: string, updates: UpdateUserParams, config: AdminClientConfig): Promise<AdminUserRecord>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete an admin-visible user. `idOrUsername` accepts either the internal
|
|
41
|
+
* UUID or the username.
|
|
42
|
+
*/
|
|
43
|
+
export declare function deleteAdminUser(idOrUsername: string, config: AdminClientConfig): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAqBD;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CAQ1B;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
package/dist/admin.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { OAuthError } from "./api.js";
|
|
2
|
+
function adminUsersUrl(baseUrl, idOrUsername) {
|
|
3
|
+
const trimmed = baseUrl.replace(/\/+$/, "");
|
|
4
|
+
if (idOrUsername === undefined) {
|
|
5
|
+
return `${trimmed}/api/admin/users`;
|
|
6
|
+
}
|
|
7
|
+
return `${trimmed}/api/admin/users/${encodeURIComponent(idOrUsername)}`;
|
|
8
|
+
}
|
|
9
|
+
async function parseError(res) {
|
|
10
|
+
const data = (await res.json().catch(() => ({})));
|
|
11
|
+
return new OAuthError(data.error ?? "server_error", data.error_description ?? `Admin API request failed: ${res.status}`);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Fetch an admin-visible user by internal UUID or username.
|
|
15
|
+
*/
|
|
16
|
+
export async function getAdminUser(idOrUsername, config) {
|
|
17
|
+
const res = await fetch(adminUsersUrl(config.baseUrl, idOrUsername), {
|
|
18
|
+
headers: { Authorization: `Bearer ${config.accessToken}` },
|
|
19
|
+
});
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
throw await parseError(res);
|
|
22
|
+
}
|
|
23
|
+
return res.json();
|
|
24
|
+
}
|
|
25
|
+
export async function createAdminUser(params, config) {
|
|
26
|
+
const res = await fetch(adminUsersUrl(config.baseUrl), {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: {
|
|
29
|
+
Authorization: `Bearer ${config.accessToken}`,
|
|
30
|
+
"Content-Type": "application/json",
|
|
31
|
+
},
|
|
32
|
+
body: JSON.stringify(params),
|
|
33
|
+
});
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
throw await parseError(res);
|
|
36
|
+
}
|
|
37
|
+
return res.json();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Update an admin-visible user. `idOrUsername` accepts either the internal
|
|
41
|
+
* UUID or the username.
|
|
42
|
+
*/
|
|
43
|
+
export async function updateAdminUser(idOrUsername, updates, config) {
|
|
44
|
+
const res = await fetch(adminUsersUrl(config.baseUrl, idOrUsername), {
|
|
45
|
+
method: "PUT",
|
|
46
|
+
headers: {
|
|
47
|
+
Authorization: `Bearer ${config.accessToken}`,
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
},
|
|
50
|
+
body: JSON.stringify(updates),
|
|
51
|
+
});
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
throw await parseError(res);
|
|
54
|
+
}
|
|
55
|
+
return res.json();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Delete an admin-visible user. `idOrUsername` accepts either the internal
|
|
59
|
+
* UUID or the username.
|
|
60
|
+
*/
|
|
61
|
+
export async function deleteAdminUser(idOrUsername, config) {
|
|
62
|
+
const res = await fetch(adminUsersUrl(config.baseUrl, idOrUsername), {
|
|
63
|
+
method: "DELETE",
|
|
64
|
+
headers: { Authorization: `Bearer ${config.accessToken}` },
|
|
65
|
+
});
|
|
66
|
+
if (!res.ok) {
|
|
67
|
+
throw await parseError(res);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { TokenResponse, UserInfoResponse, TokenValidationResponse } from "./types.js";
|
|
2
|
+
export declare class OAuthError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
constructor(code: string, message: string);
|
|
5
|
+
}
|
|
6
|
+
export type GrantType = "authorization_code" | "client_credentials" | "refresh_token";
|
|
7
|
+
export interface ExchangeTokenParams {
|
|
8
|
+
grantType: GrantType;
|
|
9
|
+
clientId: string;
|
|
10
|
+
clientSecret?: string;
|
|
11
|
+
scope?: string;
|
|
12
|
+
code?: string;
|
|
13
|
+
redirectUri?: string;
|
|
14
|
+
codeVerifier?: string;
|
|
15
|
+
refreshToken?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ExchangeTokenConfig {
|
|
18
|
+
tokenEndpoint: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function exchangeToken(params: ExchangeTokenParams, config: ExchangeTokenConfig): Promise<TokenResponse>;
|
|
21
|
+
export interface IntrospectTokenParams {
|
|
22
|
+
token: string;
|
|
23
|
+
scopes?: string[];
|
|
24
|
+
environmentName: string;
|
|
25
|
+
}
|
|
26
|
+
export interface IntrospectTokenConfig {
|
|
27
|
+
introspectionEndpoint: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function introspectToken(params: IntrospectTokenParams, config: IntrospectTokenConfig): Promise<TokenValidationResponse>;
|
|
30
|
+
export declare function getUserInfo(accessToken: string, userInfoEndpoint: string): Promise<UserInfoResponse>;
|
|
31
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE3F,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,MAAM,SAAS,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAEtF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA2BxB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAWlC;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAY3B"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export class OAuthError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.name = "OAuthError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export async function exchangeToken(params, config) {
|
|
10
|
+
const body = new URLSearchParams();
|
|
11
|
+
body.set("grant_type", params.grantType);
|
|
12
|
+
body.set("client_id", params.clientId);
|
|
13
|
+
if (params.clientSecret)
|
|
14
|
+
body.set("client_secret", params.clientSecret);
|
|
15
|
+
if (params.scope)
|
|
16
|
+
body.set("scope", params.scope);
|
|
17
|
+
if (params.code)
|
|
18
|
+
body.set("code", params.code);
|
|
19
|
+
if (params.redirectUri)
|
|
20
|
+
body.set("redirect_uri", params.redirectUri);
|
|
21
|
+
if (params.codeVerifier)
|
|
22
|
+
body.set("code_verifier", params.codeVerifier);
|
|
23
|
+
if (params.refreshToken)
|
|
24
|
+
body.set("refresh_token", params.refreshToken);
|
|
25
|
+
const res = await fetch(config.tokenEndpoint, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
28
|
+
body,
|
|
29
|
+
});
|
|
30
|
+
const data = (await res.json());
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
throw new OAuthError(data.error ?? "server_error", data.error_description ?? `Token exchange failed: ${res.status}`);
|
|
33
|
+
}
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
export async function introspectToken(params, config) {
|
|
37
|
+
const res = await fetch(config.introspectionEndpoint, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
body: JSON.stringify({
|
|
41
|
+
token: params.token,
|
|
42
|
+
scopes: params.scopes ?? [],
|
|
43
|
+
environmentName: params.environmentName,
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
return res.json();
|
|
47
|
+
}
|
|
48
|
+
export async function getUserInfo(accessToken, userInfoEndpoint) {
|
|
49
|
+
const res = await fetch(userInfoEndpoint, {
|
|
50
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
51
|
+
});
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
const data = (await res.json().catch(() => ({})));
|
|
54
|
+
throw new OAuthError(data.error ?? "invalid_token", `UserInfo request failed: ${res.status}`);
|
|
55
|
+
}
|
|
56
|
+
return res.json();
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OIDCDiscovery, OAuthServerMetadata } from "./types.js";
|
|
2
|
+
export declare function fetchOIDCDiscovery(issuerUrl: string): Promise<OIDCDiscovery>;
|
|
3
|
+
export declare function fetchOAuthMetadata(issuerUrl: string): Promise<OAuthServerMetadata>;
|
|
4
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAOlF;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAOxF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function fetchOIDCDiscovery(issuerUrl) {
|
|
2
|
+
const url = new URL("/.well-known/openid-configuration", issuerUrl);
|
|
3
|
+
const res = await fetch(url);
|
|
4
|
+
if (!res.ok) {
|
|
5
|
+
throw new Error(`Failed to fetch OIDC discovery: ${res.status} ${res.statusText}`);
|
|
6
|
+
}
|
|
7
|
+
return res.json();
|
|
8
|
+
}
|
|
9
|
+
export async function fetchOAuthMetadata(issuerUrl) {
|
|
10
|
+
const url = new URL("/.well-known/oauth-authorization-server", issuerUrl);
|
|
11
|
+
const res = await fetch(url);
|
|
12
|
+
if (!res.ok) {
|
|
13
|
+
throw new Error(`Failed to fetch OAuth metadata: ${res.status} ${res.statusText}`);
|
|
14
|
+
}
|
|
15
|
+
return res.json();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAA4B,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,yCAAyC,EAAE,SAAS,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAkC,CAAC;AACpD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { TokenResponse, UserInfoResponse, OIDCDiscovery, OAuthServerMetadata, AuthClientConfig, JWTPayload, TokenValidationResponse, } from "./types.js";
|
|
2
|
+
export { fetchOIDCDiscovery, fetchOAuthMetadata } from "./discovery.js";
|
|
3
|
+
export { OAuthError, exchangeToken, introspectToken, getUserInfo, } from "./api.js";
|
|
4
|
+
export type { GrantType, ExchangeTokenParams, ExchangeTokenConfig, IntrospectTokenParams, IntrospectTokenConfig, } from "./api.js";
|
|
5
|
+
export { TokenManager } from "./tokens.js";
|
|
6
|
+
export { validateJwt, decodeJwtPayload } from "./jwt.js";
|
|
7
|
+
export type { ValidateJwtOptions } from "./jwt.js";
|
|
8
|
+
export { getAdminUser, createAdminUser, updateAdminUser, deleteAdminUser, } from "./admin.js";
|
|
9
|
+
export type { AdminUserRecord, AdminClientConfig, CreateUserParams, UpdateUserParams, } from "./admin.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { fetchOIDCDiscovery, fetchOAuthMetadata } from "./discovery.js";
|
|
2
|
+
export { OAuthError, exchangeToken, introspectToken, getUserInfo, } from "./api.js";
|
|
3
|
+
export { TokenManager } from "./tokens.js";
|
|
4
|
+
export { validateJwt, decodeJwtPayload } from "./jwt.js";
|
|
5
|
+
export { getAdminUser, createAdminUser, updateAdminUser, deleteAdminUser, } from "./admin.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,UAAU,CAAC;AASlB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/jwt.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JWTPayload } from "./types.js";
|
|
2
|
+
export interface ValidateJwtOptions {
|
|
3
|
+
audience?: string | string[];
|
|
4
|
+
issuer?: string;
|
|
5
|
+
clockTolerance?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateJwt(token: string, jwksUri: string, options?: ValidateJwtOptions): Promise<JWTPayload>;
|
|
8
|
+
export declare function decodeJwtPayload(token: string): JWTPayload;
|
|
9
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAWD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAQ1D"}
|
package/dist/jwt.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createRemoteJWKSet, jwtVerify } from "jose";
|
|
2
|
+
const jwksCache = new Map();
|
|
3
|
+
function getJwks(jwksUri) {
|
|
4
|
+
if (!jwksCache.has(jwksUri)) {
|
|
5
|
+
jwksCache.set(jwksUri, createRemoteJWKSet(new URL(jwksUri)));
|
|
6
|
+
}
|
|
7
|
+
return jwksCache.get(jwksUri);
|
|
8
|
+
}
|
|
9
|
+
export async function validateJwt(token, jwksUri, options = {}) {
|
|
10
|
+
const jwks = getJwks(jwksUri);
|
|
11
|
+
const { payload } = await jwtVerify(token, jwks, {
|
|
12
|
+
audience: options.audience,
|
|
13
|
+
issuer: options.issuer,
|
|
14
|
+
clockTolerance: options.clockTolerance ?? 5,
|
|
15
|
+
});
|
|
16
|
+
return payload;
|
|
17
|
+
}
|
|
18
|
+
export function decodeJwtPayload(token) {
|
|
19
|
+
const parts = token.split(".");
|
|
20
|
+
if (parts.length !== 3) {
|
|
21
|
+
throw new Error("Invalid JWT format: expected 3 parts");
|
|
22
|
+
}
|
|
23
|
+
const base64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
|
|
24
|
+
const json = Buffer.from(base64, "base64").toString("utf8");
|
|
25
|
+
return JSON.parse(json);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=jwt.js.map
|
package/dist/jwt.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AASrD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiD,CAAC;AAE3E,SAAS,OAAO,CAAC,OAAe;IAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,OAAe,EACf,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,OAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;AACxC,CAAC"}
|
package/dist/tokens.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TokenResponse, AuthClientConfig } from "./types.js";
|
|
2
|
+
export declare class TokenManager {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private accessToken;
|
|
5
|
+
private refreshToken;
|
|
6
|
+
private expiresAt;
|
|
7
|
+
constructor(config: AuthClientConfig);
|
|
8
|
+
getAccessToken(): Promise<string>;
|
|
9
|
+
setTokens(tokens: TokenResponse): void;
|
|
10
|
+
refresh(refreshToken: string): Promise<TokenResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElE,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuB;gBAEX,MAAM,EAAE,gBAAgB;IAE/C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAcvC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAMhC,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAa5D"}
|
package/dist/tokens.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { exchangeToken, OAuthError } from "./api.js";
|
|
2
|
+
export class TokenManager {
|
|
3
|
+
config;
|
|
4
|
+
accessToken = null;
|
|
5
|
+
refreshToken = null;
|
|
6
|
+
expiresAt = null;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
async getAccessToken() {
|
|
11
|
+
if (this.accessToken && this.expiresAt && Date.now() < this.expiresAt - 30_000) {
|
|
12
|
+
return this.accessToken;
|
|
13
|
+
}
|
|
14
|
+
if (this.refreshToken) {
|
|
15
|
+
await this.refresh(this.refreshToken);
|
|
16
|
+
return this.accessToken;
|
|
17
|
+
}
|
|
18
|
+
throw new OAuthError("no_token", "No valid access token available. Call setTokens() first or perform an initial token exchange.");
|
|
19
|
+
}
|
|
20
|
+
setTokens(tokens) {
|
|
21
|
+
this.accessToken = tokens.access_token;
|
|
22
|
+
this.refreshToken = tokens.refresh_token ?? null;
|
|
23
|
+
this.expiresAt = tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : null;
|
|
24
|
+
}
|
|
25
|
+
async refresh(refreshToken) {
|
|
26
|
+
const tokens = await exchangeToken({
|
|
27
|
+
grantType: "refresh_token",
|
|
28
|
+
clientId: this.config.clientId,
|
|
29
|
+
clientSecret: this.config.clientSecret,
|
|
30
|
+
refreshToken,
|
|
31
|
+
}, { tokenEndpoint: this.config.tokenEndpoint });
|
|
32
|
+
this.setTokens(tokens);
|
|
33
|
+
return tokens;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGrD,MAAM,OAAO,YAAY;IAKM;IAJrB,WAAW,GAAkB,IAAI,CAAC;IAClC,YAAY,GAAkB,IAAI,CAAC;IACnC,SAAS,GAAkB,IAAI,CAAC;IAExC,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEzD,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;YAC/E,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,WAAY,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,UAAU,EACV,+FAA+F,CAChG,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,MAAqB;QAC7B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAoB;QAChC,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC;YACE,SAAS,EAAE,eAAe;YAC1B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,YAAY;SACb,EACD,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAC7C,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export interface TokenResponse {
|
|
2
|
+
access_token: string;
|
|
3
|
+
token_type: string;
|
|
4
|
+
expires_in?: number;
|
|
5
|
+
refresh_token?: string;
|
|
6
|
+
scope?: string;
|
|
7
|
+
id_token?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface UserInfoResponse {
|
|
10
|
+
sub: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
email?: string;
|
|
13
|
+
email_verified?: boolean;
|
|
14
|
+
picture?: string;
|
|
15
|
+
preferred_username?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface OIDCDiscovery {
|
|
18
|
+
issuer: string;
|
|
19
|
+
authorization_endpoint: string;
|
|
20
|
+
token_endpoint: string;
|
|
21
|
+
userinfo_endpoint: string;
|
|
22
|
+
jwks_uri: string;
|
|
23
|
+
response_types_supported: string[];
|
|
24
|
+
scopes_supported: string[];
|
|
25
|
+
grant_types_supported: string[];
|
|
26
|
+
subject_types_supported: string[];
|
|
27
|
+
id_token_signing_alg_values_supported: string[];
|
|
28
|
+
code_challenge_methods_supported: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface OAuthServerMetadata {
|
|
31
|
+
issuer: string;
|
|
32
|
+
authorization_endpoint: string;
|
|
33
|
+
token_endpoint: string;
|
|
34
|
+
jwks_uri: string;
|
|
35
|
+
token_introspection_endpoint?: string;
|
|
36
|
+
response_types_supported: string[];
|
|
37
|
+
scopes_supported: string[];
|
|
38
|
+
grant_types_supported: string[];
|
|
39
|
+
code_challenge_methods_supported: string[];
|
|
40
|
+
}
|
|
41
|
+
export interface AuthClientConfig {
|
|
42
|
+
issuerUrl: string;
|
|
43
|
+
clientId: string;
|
|
44
|
+
clientSecret?: string;
|
|
45
|
+
tokenEndpoint: string;
|
|
46
|
+
}
|
|
47
|
+
export interface JWTPayload {
|
|
48
|
+
sub?: string;
|
|
49
|
+
iss?: string;
|
|
50
|
+
aud?: string | string[];
|
|
51
|
+
exp?: number;
|
|
52
|
+
iat?: number;
|
|
53
|
+
jti?: string;
|
|
54
|
+
scope?: string;
|
|
55
|
+
client_id?: string;
|
|
56
|
+
[key: string]: unknown;
|
|
57
|
+
}
|
|
58
|
+
export interface TokenValidationResponse {
|
|
59
|
+
valid: boolean;
|
|
60
|
+
active: boolean;
|
|
61
|
+
client_id: string | null;
|
|
62
|
+
expires_at: string | null;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,qCAAqC,EAAE,MAAM,EAAE,CAAC;IAChD,gCAAgC,EAAE,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,gCAAgC,EAAE,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@eetr/eetr-auth-client",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "TypeScript client library for eetr-auth OAuth 2.1 / OIDC server",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"build:watch": "tsc --watch",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest",
|
|
22
|
+
"test:coverage": "vitest run --coverage"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"jose": "^5.9.6"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
29
|
+
"@types/node": "^20.19.35",
|
|
30
|
+
"typescript": "^5.8.3",
|
|
31
|
+
"vitest": "^4.1.2"
|
|
32
|
+
}
|
|
33
|
+
}
|