@cellarnode/auth 0.8.0 → 0.9.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/auth-store.d.ts +1 -1
- package/dist/auth-store.d.ts.map +1 -1
- package/dist/auth-store.js +158 -5
- package/dist/auth-store.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +46 -23
package/dist/auth-store.d.ts
CHANGED
package/dist/auth-store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EAKhB,MAAM,YAAY,CAAC;AA8DpB,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAuLlE"}
|
package/dist/auth-store.js
CHANGED
|
@@ -1,9 +1,101 @@
|
|
|
1
|
+
import { decodeJwt } from "jose";
|
|
1
2
|
import { extractAccessToken } from "./extract-token.js";
|
|
3
|
+
const VALID_USER_TYPES = new Set([
|
|
4
|
+
"importer",
|
|
5
|
+
"producer",
|
|
6
|
+
"distributor",
|
|
7
|
+
"admin",
|
|
8
|
+
]);
|
|
9
|
+
/**
|
|
10
|
+
* Decode a JWT payload into SessionClaims.
|
|
11
|
+
*
|
|
12
|
+
* Returns null on any decode failure or if required fields are missing /
|
|
13
|
+
* mistyped. Signature verification is intentionally NOT performed — that
|
|
14
|
+
* is the backend's job at the next authenticated request. This decode is
|
|
15
|
+
* informational only (used for clientId / orgId / userType lookups in the
|
|
16
|
+
* UI layer).
|
|
17
|
+
*/
|
|
18
|
+
function decodeSessionClaims(token) {
|
|
19
|
+
let payload;
|
|
20
|
+
try {
|
|
21
|
+
payload = decodeJwt(token);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const userId = payload.userId;
|
|
27
|
+
const email = payload.email;
|
|
28
|
+
const sessionId = payload.sessionId;
|
|
29
|
+
const orgIdRaw = payload.orgId;
|
|
30
|
+
const rolesRaw = payload.roles;
|
|
31
|
+
const userTypeRaw = payload.userType;
|
|
32
|
+
if (typeof userId !== "string" || userId.length === 0)
|
|
33
|
+
return null;
|
|
34
|
+
if (typeof email !== "string")
|
|
35
|
+
return null;
|
|
36
|
+
if (typeof sessionId !== "string" || sessionId.length === 0)
|
|
37
|
+
return null;
|
|
38
|
+
const orgId = orgIdRaw === null || orgIdRaw === undefined
|
|
39
|
+
? null
|
|
40
|
+
: typeof orgIdRaw === "string"
|
|
41
|
+
? orgIdRaw
|
|
42
|
+
: null;
|
|
43
|
+
const roles = Array.isArray(rolesRaw)
|
|
44
|
+
? rolesRaw.filter((r) => typeof r === "string")
|
|
45
|
+
: [];
|
|
46
|
+
if (typeof userTypeRaw !== "string")
|
|
47
|
+
return null;
|
|
48
|
+
if (!VALID_USER_TYPES.has(userTypeRaw))
|
|
49
|
+
return null;
|
|
50
|
+
return {
|
|
51
|
+
userId,
|
|
52
|
+
email,
|
|
53
|
+
orgId,
|
|
54
|
+
roles,
|
|
55
|
+
sessionId,
|
|
56
|
+
userType: userTypeRaw,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
2
59
|
export function createAuthStore(config) {
|
|
3
60
|
const { baseUrl, refreshPath = "/auth/refresh", refreshBuffer = 60 } = config;
|
|
4
61
|
let accessToken = null;
|
|
62
|
+
let claims = null;
|
|
5
63
|
let refreshTimer = null;
|
|
6
64
|
let refreshPromise = null;
|
|
65
|
+
const orgChangeListeners = new Set();
|
|
66
|
+
const accessTokenSetListeners = new Set();
|
|
67
|
+
const logoutListeners = new Set();
|
|
68
|
+
function emitOrgChange(orgId) {
|
|
69
|
+
for (const listener of orgChangeListeners) {
|
|
70
|
+
try {
|
|
71
|
+
listener(orgId);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Swallow listener errors so a single bad subscriber cannot
|
|
75
|
+
// break event fan-out to other subscribers.
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function emitAccessTokenSet(token) {
|
|
80
|
+
for (const listener of accessTokenSetListeners) {
|
|
81
|
+
try {
|
|
82
|
+
listener(token);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Swallow.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function emitLogout() {
|
|
90
|
+
for (const listener of logoutListeners) {
|
|
91
|
+
try {
|
|
92
|
+
listener();
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Swallow.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
7
99
|
function scheduleRefresh(expiresInSeconds) {
|
|
8
100
|
if (refreshTimer)
|
|
9
101
|
clearTimeout(refreshTimer);
|
|
@@ -12,6 +104,30 @@ export function createAuthStore(config) {
|
|
|
12
104
|
performRefresh();
|
|
13
105
|
}, delay);
|
|
14
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Apply a new access-token value to internal state.
|
|
109
|
+
*
|
|
110
|
+
* - Decodes the JWT via `jose.decodeJwt` (no signature verify).
|
|
111
|
+
* - Caches the decoded claims.
|
|
112
|
+
* - Fires `onOrgChange` listeners ONLY when `orgId` actually changes
|
|
113
|
+
* (no-op on a same-orgId refresh).
|
|
114
|
+
* - Always fires `onAccessTokenSet` listeners after the token + claims
|
|
115
|
+
* are committed.
|
|
116
|
+
*
|
|
117
|
+
* Malformed JWTs are tolerated: claims become `null` and `onOrgChange`
|
|
118
|
+
* fires with `null` only if the previous orgId was non-null (i.e. the
|
|
119
|
+
* effective orgId transitioned).
|
|
120
|
+
*/
|
|
121
|
+
function applyToken(token) {
|
|
122
|
+
const previousOrgId = claims?.orgId ?? null;
|
|
123
|
+
accessToken = token;
|
|
124
|
+
claims = token ? decodeSessionClaims(token) : null;
|
|
125
|
+
const nextOrgId = claims?.orgId ?? null;
|
|
126
|
+
if (nextOrgId !== previousOrgId) {
|
|
127
|
+
emitOrgChange(nextOrgId);
|
|
128
|
+
}
|
|
129
|
+
emitAccessTokenSet(token);
|
|
130
|
+
}
|
|
15
131
|
async function performRefresh() {
|
|
16
132
|
try {
|
|
17
133
|
const res = await fetch(`${baseUrl}${refreshPath}`, {
|
|
@@ -20,20 +136,20 @@ export function createAuthStore(config) {
|
|
|
20
136
|
headers: { "Content-Type": "application/json" },
|
|
21
137
|
});
|
|
22
138
|
if (!res.ok) {
|
|
23
|
-
|
|
139
|
+
applyToken(null);
|
|
24
140
|
return null;
|
|
25
141
|
}
|
|
26
142
|
const json = (await res.json());
|
|
27
143
|
const token = extractAccessToken(json);
|
|
28
144
|
if (token) {
|
|
29
145
|
const expiresIn = typeof json.expiresIn === "number" ? json.expiresIn : 900;
|
|
30
|
-
|
|
146
|
+
applyToken(token);
|
|
31
147
|
scheduleRefresh(expiresIn);
|
|
32
148
|
}
|
|
33
149
|
return token;
|
|
34
150
|
}
|
|
35
151
|
catch {
|
|
36
|
-
|
|
152
|
+
applyToken(null);
|
|
37
153
|
return null;
|
|
38
154
|
}
|
|
39
155
|
}
|
|
@@ -45,15 +161,18 @@ export function createAuthStore(config) {
|
|
|
45
161
|
return accessToken !== null;
|
|
46
162
|
},
|
|
47
163
|
setAccessToken(token, expiresIn) {
|
|
48
|
-
|
|
164
|
+
applyToken(token);
|
|
49
165
|
scheduleRefresh(expiresIn);
|
|
50
166
|
},
|
|
51
167
|
clearAccessToken() {
|
|
52
|
-
|
|
168
|
+
applyToken(null);
|
|
53
169
|
if (refreshTimer) {
|
|
54
170
|
clearTimeout(refreshTimer);
|
|
55
171
|
refreshTimer = null;
|
|
56
172
|
}
|
|
173
|
+
// Emits unconditionally so consumers can rely on `onLogout` as a
|
|
174
|
+
// canonical logout signal regardless of prior token state.
|
|
175
|
+
emitLogout();
|
|
57
176
|
},
|
|
58
177
|
async ensureAccessToken(forceRefresh = false) {
|
|
59
178
|
if (!forceRefresh && accessToken)
|
|
@@ -65,6 +184,40 @@ export function createAuthStore(config) {
|
|
|
65
184
|
});
|
|
66
185
|
return refreshPromise;
|
|
67
186
|
},
|
|
187
|
+
getSessionClaims() {
|
|
188
|
+
// Return a defensive copy so external callers cannot mutate the
|
|
189
|
+
// internal claims object (e.g. push to roles, reassign userType).
|
|
190
|
+
return claims
|
|
191
|
+
? { ...claims, roles: [...claims.roles] }
|
|
192
|
+
: null;
|
|
193
|
+
},
|
|
194
|
+
getUserId() {
|
|
195
|
+
return claims?.userId ?? null;
|
|
196
|
+
},
|
|
197
|
+
getOrgId() {
|
|
198
|
+
return claims?.orgId ?? null;
|
|
199
|
+
},
|
|
200
|
+
getUserType() {
|
|
201
|
+
return claims?.userType ?? null;
|
|
202
|
+
},
|
|
203
|
+
onOrgChange(listener) {
|
|
204
|
+
orgChangeListeners.add(listener);
|
|
205
|
+
return () => {
|
|
206
|
+
orgChangeListeners.delete(listener);
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
onAccessTokenSet(listener) {
|
|
210
|
+
accessTokenSetListeners.add(listener);
|
|
211
|
+
return () => {
|
|
212
|
+
accessTokenSetListeners.delete(listener);
|
|
213
|
+
};
|
|
214
|
+
},
|
|
215
|
+
onLogout(listener) {
|
|
216
|
+
logoutListeners.add(listener);
|
|
217
|
+
return () => {
|
|
218
|
+
logoutListeners.delete(listener);
|
|
219
|
+
};
|
|
220
|
+
},
|
|
68
221
|
};
|
|
69
222
|
return store;
|
|
70
223
|
}
|
package/dist/auth-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export { createAuthClient } from "./auth-client.js";
|
|
|
3
3
|
export { createAuthApi } from "./auth-api.js";
|
|
4
4
|
export { validateUserType } from "./auth-guard.js";
|
|
5
5
|
export { extractAccessToken } from "./extract-token.js";
|
|
6
|
-
export { AuthError, type AuthUser, type AuthStore, type AuthStoreConfig, type AuthClient, type AuthClientConfig, type AuthApi, type RegisterInput, type RequestOtpResponse, type VerifyOtpResponse, type AuthErrorResponse, type UserType, type DashboardLink, } from "./types.js";
|
|
6
|
+
export { AuthError, type AuthUser, type AuthStore, type AuthStoreConfig, type AuthClient, type AuthClientConfig, type AuthApi, type RegisterInput, type RequestOtpResponse, type VerifyOtpResponse, type AuthErrorResponse, type UserType, type DashboardLink, type SessionClaims, type SessionUserType, type OrgChangeListener, type AccessTokenSetListener, type LogoutListener, } from "./types.js";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,GAkBV,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -39,12 +39,55 @@ export interface AuthStoreConfig {
|
|
|
39
39
|
refreshPath?: string;
|
|
40
40
|
refreshBuffer?: number;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* userType values carried in the V2 access-token JWT.
|
|
44
|
+
*
|
|
45
|
+
* Mirrors `SessionClaims["userType"]` in cellarnode-backend-v2
|
|
46
|
+
* (`src/middleware/auth.ts`). Kept as a distinct type from `UserType`
|
|
47
|
+
* because the session JWT may also carry `"distributor"` (reserved for
|
|
48
|
+
* future use) whereas the public-facing `UserType` enum currently only
|
|
49
|
+
* advertises importer/producer/admin to consumers.
|
|
50
|
+
*/
|
|
51
|
+
export type SessionUserType = "importer" | "producer" | "distributor" | "admin";
|
|
52
|
+
/**
|
|
53
|
+
* Decoded claims from a V2 access-token JWT.
|
|
54
|
+
*
|
|
55
|
+
* Mirrors the backend `SessionClaims` shape in `cellarnode-backend-v2`
|
|
56
|
+
* (`src/middleware/auth.ts`) — copied locally so consumers do not need
|
|
57
|
+
* to import from the backend. Signature verification still happens
|
|
58
|
+
* server-side; the client-side decode is informational only.
|
|
59
|
+
*/
|
|
60
|
+
export interface SessionClaims {
|
|
61
|
+
userId: string;
|
|
62
|
+
email: string;
|
|
63
|
+
orgId: string | null;
|
|
64
|
+
roles: string[];
|
|
65
|
+
sessionId: string;
|
|
66
|
+
userType: SessionUserType;
|
|
67
|
+
}
|
|
68
|
+
export type OrgChangeListener = (orgId: string | null) => void;
|
|
69
|
+
export type AccessTokenSetListener = (token: string | null) => void;
|
|
70
|
+
export type LogoutListener = () => void;
|
|
42
71
|
export interface AuthStore {
|
|
43
72
|
getAccessToken(): string | null;
|
|
44
73
|
hasAccessToken(): boolean;
|
|
45
74
|
setAccessToken(token: string, expiresIn: number): void;
|
|
46
75
|
clearAccessToken(): void;
|
|
47
76
|
ensureAccessToken(forceRefresh?: boolean): Promise<string | null>;
|
|
77
|
+
/** Decoded session claims from the current access token, or null. */
|
|
78
|
+
getSessionClaims(): SessionClaims | null;
|
|
79
|
+
/** userId from the current access token, or null. */
|
|
80
|
+
getUserId(): string | null;
|
|
81
|
+
/** orgId from the current access token, or null. Admin returns null. */
|
|
82
|
+
getOrgId(): string | null;
|
|
83
|
+
/** userType from the current access token, or null. */
|
|
84
|
+
getUserType(): SessionUserType | null;
|
|
85
|
+
/** Subscribe to orgId change events. Returns unsubscribe. */
|
|
86
|
+
onOrgChange(listener: OrgChangeListener): () => void;
|
|
87
|
+
/** Subscribe to access-token (re-)set events. Fires after the token is set. Returns unsubscribe. */
|
|
88
|
+
onAccessTokenSet(listener: AccessTokenSetListener): () => void;
|
|
89
|
+
/** Subscribe to logout events. Returns unsubscribe. */
|
|
90
|
+
onLogout(listener: LogoutListener): () => void;
|
|
48
91
|
}
|
|
49
92
|
export interface AuthClientConfig {
|
|
50
93
|
baseUrl: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,SAAU,SAAQ,KAAK;aAEhB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;aAEZ,iBAAiB,CAAC,EAAE,MAAM;gBAH1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,iBAAiB,CAAC,EAAE,MAAM,YAAA;CAK7C;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,IAAI,OAAO,CAAC;IAC1B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,gBAAgB,IAAI,IAAI,CAAC;IACzB,iBAAiB,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cellarnode/auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Shared OTP-based authentication — token store, API client, React UI components for CellarNode dashboards.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -23,8 +23,16 @@
|
|
|
23
23
|
},
|
|
24
24
|
"types": "./dist/index.d.ts",
|
|
25
25
|
"sideEffects": false,
|
|
26
|
-
"files": [
|
|
27
|
-
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"keywords": [
|
|
30
|
+
"cellarnode",
|
|
31
|
+
"auth",
|
|
32
|
+
"otp",
|
|
33
|
+
"jwt",
|
|
34
|
+
"react"
|
|
35
|
+
],
|
|
28
36
|
"scripts": {
|
|
29
37
|
"build": "tsc",
|
|
30
38
|
"prepublishOnly": "npm run build",
|
|
@@ -34,39 +42,54 @@
|
|
|
34
42
|
"typecheck": "tsc --noEmit"
|
|
35
43
|
},
|
|
36
44
|
"dependencies": {
|
|
37
|
-
"clsx": "^2.1.0"
|
|
45
|
+
"clsx": "^2.1.0",
|
|
46
|
+
"jose": "^6.2.3"
|
|
38
47
|
},
|
|
39
48
|
"peerDependencies": {
|
|
49
|
+
"@react-three/fiber": ">=8.0.0",
|
|
50
|
+
"input-otp": ">=1.4.0",
|
|
51
|
+
"lucide-react": ">=0.400.0",
|
|
40
52
|
"react": "^18.0.0 || ^19.0.0",
|
|
41
53
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"@react-three/fiber": ">=8.0.0",
|
|
45
|
-
"three": ">=0.160.0",
|
|
46
|
-
"tailwindcss": ">=4.0.0"
|
|
54
|
+
"tailwindcss": ">=4.0.0",
|
|
55
|
+
"three": ">=0.160.0"
|
|
47
56
|
},
|
|
48
57
|
"peerDependenciesMeta": {
|
|
49
|
-
"react": {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"
|
|
58
|
+
"react": {
|
|
59
|
+
"optional": true
|
|
60
|
+
},
|
|
61
|
+
"react-dom": {
|
|
62
|
+
"optional": true
|
|
63
|
+
},
|
|
64
|
+
"lucide-react": {
|
|
65
|
+
"optional": true
|
|
66
|
+
},
|
|
67
|
+
"input-otp": {
|
|
68
|
+
"optional": true
|
|
69
|
+
},
|
|
70
|
+
"@react-three/fiber": {
|
|
71
|
+
"optional": true
|
|
72
|
+
},
|
|
73
|
+
"three": {
|
|
74
|
+
"optional": true
|
|
75
|
+
},
|
|
76
|
+
"tailwindcss": {
|
|
77
|
+
"optional": true
|
|
78
|
+
}
|
|
56
79
|
},
|
|
57
80
|
"engines": {
|
|
58
81
|
"node": ">=20.19.0"
|
|
59
82
|
},
|
|
60
83
|
"devDependencies": {
|
|
61
|
-
"
|
|
62
|
-
"vitest": "^3.0.0",
|
|
63
|
-
"react": "^19.0.0",
|
|
64
|
-
"react-dom": "^19.0.0",
|
|
84
|
+
"@react-three/fiber": ">=8.0.0",
|
|
65
85
|
"@types/react": "^19.0.0",
|
|
66
86
|
"@types/three": ">=0.160.0",
|
|
67
|
-
"
|
|
68
|
-
"three": ">=0.160.0",
|
|
87
|
+
"input-otp": ">=1.4.0",
|
|
69
88
|
"lucide-react": ">=0.400.0",
|
|
70
|
-
"
|
|
89
|
+
"react": "^19.0.0",
|
|
90
|
+
"react-dom": "^19.0.0",
|
|
91
|
+
"three": ">=0.160.0",
|
|
92
|
+
"typescript": "^5.7.0",
|
|
93
|
+
"vitest": "^3.0.0"
|
|
71
94
|
}
|
|
72
95
|
}
|