@cellarnode/auth 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.
@@ -1,3 +1,12 @@
1
- import type { AuthUser, UserType } from "./types.js";
1
+ import type { AuthUser, SessionClaims, UserType } from "./types.js";
2
2
  export declare function validateUserType(user: AuthUser, expected: UserType): boolean;
3
+ /**
4
+ * True if the user/session holds the given entitlement (CEL-599 / Epic A).
5
+ *
6
+ * Accepts an `AuthUser` (from `getMe`, where `entitlements` may be absent on
7
+ * older backends) OR `SessionClaims` (from `authStore.getSessionClaims()`,
8
+ * always populated). Null-safe — returns false for a missing source or a source
9
+ * with no entitlements. Mirrors the `validateUserType` guard shape.
10
+ */
11
+ export declare function hasEntitlement(source: AuthUser | SessionClaims | null | undefined, entitlement: string): boolean;
3
12
  //# sourceMappingURL=auth-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI,GAAG,SAAS,EACnD,WAAW,EAAE,MAAM,GAClB,OAAO,CAET"}
@@ -1,4 +1,15 @@
1
1
  export function validateUserType(user, expected) {
2
2
  return user.userType === expected;
3
3
  }
4
+ /**
5
+ * True if the user/session holds the given entitlement (CEL-599 / Epic A).
6
+ *
7
+ * Accepts an `AuthUser` (from `getMe`, where `entitlements` may be absent on
8
+ * older backends) OR `SessionClaims` (from `authStore.getSessionClaims()`,
9
+ * always populated). Null-safe — returns false for a missing source or a source
10
+ * with no entitlements. Mirrors the `validateUserType` guard shape.
11
+ */
12
+ export function hasEntitlement(source, entitlement) {
13
+ return source?.entitlements?.includes(entitlement) ?? false;
14
+ }
4
15
  //# sourceMappingURL=auth-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,QAAkB;IACjE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../src/auth-guard.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,QAAkB;IACjE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAmD,EACnD,WAAmB;IAEnB,OAAO,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AAC9D,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { AuthStoreConfig, AuthStore } from "./types.js";
1
+ import type { AuthStore, AuthStoreConfig } from "./types.js";
2
2
  export declare function createAuthStore(config: AuthStoreConfig): AuthStore;
3
3
  //# sourceMappingURL=auth-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG7D,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CA0ElE"}
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;AAqEpB,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CA4LlE"}
@@ -1,9 +1,107 @@
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
+ const entitlementsRaw = payload.entitlements;
33
+ if (typeof userId !== "string" || userId.length === 0)
34
+ return null;
35
+ if (typeof email !== "string")
36
+ return null;
37
+ if (typeof sessionId !== "string" || sessionId.length === 0)
38
+ return null;
39
+ const orgId = orgIdRaw === null || orgIdRaw === undefined
40
+ ? null
41
+ : typeof orgIdRaw === "string"
42
+ ? orgIdRaw
43
+ : null;
44
+ const roles = Array.isArray(rolesRaw)
45
+ ? rolesRaw.filter((r) => typeof r === "string")
46
+ : [];
47
+ // CEL-599: tolerate tokens minted before entitlements existed (→ []).
48
+ const entitlements = Array.isArray(entitlementsRaw)
49
+ ? entitlementsRaw.filter((e) => typeof e === "string")
50
+ : [];
51
+ if (typeof userTypeRaw !== "string")
52
+ return null;
53
+ if (!VALID_USER_TYPES.has(userTypeRaw))
54
+ return null;
55
+ return {
56
+ userId,
57
+ email,
58
+ orgId,
59
+ roles,
60
+ sessionId,
61
+ userType: userTypeRaw,
62
+ entitlements,
63
+ };
64
+ }
2
65
  export function createAuthStore(config) {
3
66
  const { baseUrl, refreshPath = "/auth/refresh", refreshBuffer = 60 } = config;
4
67
  let accessToken = null;
68
+ let claims = null;
5
69
  let refreshTimer = null;
6
70
  let refreshPromise = null;
71
+ const orgChangeListeners = new Set();
72
+ const accessTokenSetListeners = new Set();
73
+ const logoutListeners = new Set();
74
+ function emitOrgChange(orgId) {
75
+ for (const listener of orgChangeListeners) {
76
+ try {
77
+ listener(orgId);
78
+ }
79
+ catch {
80
+ // Swallow listener errors so a single bad subscriber cannot
81
+ // break event fan-out to other subscribers.
82
+ }
83
+ }
84
+ }
85
+ function emitAccessTokenSet(token) {
86
+ for (const listener of accessTokenSetListeners) {
87
+ try {
88
+ listener(token);
89
+ }
90
+ catch {
91
+ // Swallow.
92
+ }
93
+ }
94
+ }
95
+ function emitLogout() {
96
+ for (const listener of logoutListeners) {
97
+ try {
98
+ listener();
99
+ }
100
+ catch {
101
+ // Swallow.
102
+ }
103
+ }
104
+ }
7
105
  function scheduleRefresh(expiresInSeconds) {
8
106
  if (refreshTimer)
9
107
  clearTimeout(refreshTimer);
@@ -12,6 +110,30 @@ export function createAuthStore(config) {
12
110
  performRefresh();
13
111
  }, delay);
14
112
  }
113
+ /**
114
+ * Apply a new access-token value to internal state.
115
+ *
116
+ * - Decodes the JWT via `jose.decodeJwt` (no signature verify).
117
+ * - Caches the decoded claims.
118
+ * - Fires `onOrgChange` listeners ONLY when `orgId` actually changes
119
+ * (no-op on a same-orgId refresh).
120
+ * - Always fires `onAccessTokenSet` listeners after the token + claims
121
+ * are committed.
122
+ *
123
+ * Malformed JWTs are tolerated: claims become `null` and `onOrgChange`
124
+ * fires with `null` only if the previous orgId was non-null (i.e. the
125
+ * effective orgId transitioned).
126
+ */
127
+ function applyToken(token) {
128
+ const previousOrgId = claims?.orgId ?? null;
129
+ accessToken = token;
130
+ claims = token ? decodeSessionClaims(token) : null;
131
+ const nextOrgId = claims?.orgId ?? null;
132
+ if (nextOrgId !== previousOrgId) {
133
+ emitOrgChange(nextOrgId);
134
+ }
135
+ emitAccessTokenSet(token);
136
+ }
15
137
  async function performRefresh() {
16
138
  try {
17
139
  const res = await fetch(`${baseUrl}${refreshPath}`, {
@@ -20,20 +142,20 @@ export function createAuthStore(config) {
20
142
  headers: { "Content-Type": "application/json" },
21
143
  });
22
144
  if (!res.ok) {
23
- accessToken = null;
145
+ applyToken(null);
24
146
  return null;
25
147
  }
26
148
  const json = (await res.json());
27
149
  const token = extractAccessToken(json);
28
150
  if (token) {
29
151
  const expiresIn = typeof json.expiresIn === "number" ? json.expiresIn : 900;
30
- accessToken = token;
152
+ applyToken(token);
31
153
  scheduleRefresh(expiresIn);
32
154
  }
33
155
  return token;
34
156
  }
35
157
  catch {
36
- accessToken = null;
158
+ applyToken(null);
37
159
  return null;
38
160
  }
39
161
  }
@@ -45,15 +167,18 @@ export function createAuthStore(config) {
45
167
  return accessToken !== null;
46
168
  },
47
169
  setAccessToken(token, expiresIn) {
48
- accessToken = token;
170
+ applyToken(token);
49
171
  scheduleRefresh(expiresIn);
50
172
  },
51
173
  clearAccessToken() {
52
- accessToken = null;
174
+ applyToken(null);
53
175
  if (refreshTimer) {
54
176
  clearTimeout(refreshTimer);
55
177
  refreshTimer = null;
56
178
  }
179
+ // Emits unconditionally so consumers can rely on `onLogout` as a
180
+ // canonical logout signal regardless of prior token state.
181
+ emitLogout();
57
182
  },
58
183
  async ensureAccessToken(forceRefresh = false) {
59
184
  if (!forceRefresh && accessToken)
@@ -65,6 +190,44 @@ export function createAuthStore(config) {
65
190
  });
66
191
  return refreshPromise;
67
192
  },
193
+ getSessionClaims() {
194
+ // Return a defensive copy so external callers cannot mutate the
195
+ // internal claims object (e.g. push to roles, reassign userType).
196
+ return claims
197
+ ? { ...claims, roles: [...claims.roles], entitlements: [...claims.entitlements] }
198
+ : null;
199
+ },
200
+ getUserId() {
201
+ return claims?.userId ?? null;
202
+ },
203
+ getOrgId() {
204
+ return claims?.orgId ?? null;
205
+ },
206
+ getUserType() {
207
+ return claims?.userType ?? null;
208
+ },
209
+ getEntitlements() {
210
+ // Defensive copy; [] when logged out (consistent with roles).
211
+ return claims ? [...claims.entitlements] : [];
212
+ },
213
+ onOrgChange(listener) {
214
+ orgChangeListeners.add(listener);
215
+ return () => {
216
+ orgChangeListeners.delete(listener);
217
+ };
218
+ },
219
+ onAccessTokenSet(listener) {
220
+ accessTokenSetListeners.add(listener);
221
+ return () => {
222
+ accessTokenSetListeners.delete(listener);
223
+ };
224
+ },
225
+ onLogout(listener) {
226
+ logoutListeners.add(listener);
227
+ return () => {
228
+ logoutListeners.delete(listener);
229
+ };
230
+ },
68
231
  };
69
232
  return store;
70
233
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../src/auth-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,eAAe,EAAE,aAAa,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE9E,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,YAAY,GAAyC,IAAI,CAAC;IAC9D,IAAI,cAAc,GAAkC,IAAI,CAAC;IAEzD,SAAS,eAAe,CAAC,gBAAwB;QAC/C,IAAI,YAAY;YAAE,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,cAAc,EAAE,CAAC;QACnB,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAED,KAAK,UAAU,cAAc;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,WAAW,EAAE,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,SAAS;gBACtB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,WAAW,GAAG,IAAI,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC3D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC5D,WAAW,GAAG,KAAK,CAAC;gBACpB,eAAe,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAc;QACvB,cAAc;YACZ,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,cAAc;YACZ,OAAO,WAAW,KAAK,IAAI,CAAC;QAC9B,CAAC;QAED,cAAc,CAAC,KAAa,EAAE,SAAiB;YAC7C,WAAW,GAAG,KAAK,CAAC;YACpB,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,gBAAgB;YACd,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,YAAY,GAAG,KAAK;YAC1C,IAAI,CAAC,YAAY,IAAI,WAAW;gBAAE,OAAO,WAAW,CAAC;YACrD,IAAI,cAAc;gBAAE,OAAO,cAAc,CAAC;YAC1C,cAAc,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC7C,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC,CAAC,CAAC;YACH,OAAO,cAAc,CAAC;QACxB,CAAC;KACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
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
@@ -1,7 +1,7 @@
1
1
  export { createAuthStore } from "./auth-store.js";
2
2
  export { createAuthClient } from "./auth-client.js";
3
3
  export { createAuthApi } from "./auth-api.js";
4
- export { validateUserType } from "./auth-guard.js";
4
+ export { validateUserType, hasEntitlement } 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
@@ -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,GACnB,MAAM,YAAY,CAAC"}
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,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,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 CHANGED
@@ -1,7 +1,7 @@
1
1
  export { createAuthStore } from "./auth-store.js";
2
2
  export { createAuthClient } from "./auth-client.js";
3
3
  export { createAuthApi } from "./auth-api.js";
4
- export { validateUserType } from "./auth-guard.js";
4
+ export { validateUserType, hasEntitlement } from "./auth-guard.js";
5
5
  export { extractAccessToken } from "./extract-token.js";
6
6
  export { AuthError, } from "./types.js";
7
7
  //# sourceMappingURL=index.js.map
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,GAaV,MAAM,YAAY,CAAC"}
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,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,SAAS,GAkBV,MAAM,YAAY,CAAC"}
package/dist/types.d.ts CHANGED
@@ -6,6 +6,13 @@ export interface AuthUser {
6
6
  userType: "importer" | "producer" | "admin";
7
7
  orgId: string | null;
8
8
  roles: string[];
9
+ /**
10
+ * Per-user entitlements (CEL-599 / Epic A). Optional on the `/auth/me` wire
11
+ * shape: present once the backend's `/auth/me` mapper returns it, absent for
12
+ * older backends. Consumers should read it as `user.entitlements ?? []`, or
13
+ * prefer `authStore.getEntitlements()` (decoded from the JWT, always present).
14
+ */
15
+ entitlements?: string[];
9
16
  createdAt: string;
10
17
  }
11
18
  export interface RegisterInput {
@@ -39,12 +46,68 @@ export interface AuthStoreConfig {
39
46
  refreshPath?: string;
40
47
  refreshBuffer?: number;
41
48
  }
49
+ /**
50
+ * userType values carried in the V2 access-token JWT.
51
+ *
52
+ * Mirrors `SessionClaims["userType"]` in cellarnode-backend-v2
53
+ * (`src/middleware/auth.ts`). Kept as a distinct type from `UserType`
54
+ * because the session JWT may also carry `"distributor"` (reserved for
55
+ * future use) whereas the public-facing `UserType` enum currently only
56
+ * advertises importer/producer/admin to consumers.
57
+ */
58
+ export type SessionUserType = "importer" | "producer" | "distributor" | "admin";
59
+ /**
60
+ * Decoded claims from a V2 access-token JWT.
61
+ *
62
+ * Mirrors the backend `SessionClaims` shape in `cellarnode-backend-v2`
63
+ * (`src/middleware/auth.ts`) — copied locally so consumers do not need
64
+ * to import from the backend. Signature verification still happens
65
+ * server-side; the client-side decode is informational only.
66
+ */
67
+ export interface SessionClaims {
68
+ userId: string;
69
+ email: string;
70
+ orgId: string | null;
71
+ roles: string[];
72
+ sessionId: string;
73
+ userType: SessionUserType;
74
+ /**
75
+ * Per-user entitlements carried in the JWT (CEL-599 / Epic A) — e.g.
76
+ * `"producer-dashboard"`, `"importer-dashboard"`, `"elabel"`. Always an array
77
+ * on the decoded claims (empty if the token predates entitlements or the user
78
+ * holds none); the backend mints them from the `user_entitlements` table.
79
+ */
80
+ entitlements: string[];
81
+ }
82
+ export type OrgChangeListener = (orgId: string | null) => void;
83
+ export type AccessTokenSetListener = (token: string | null) => void;
84
+ export type LogoutListener = () => void;
42
85
  export interface AuthStore {
43
86
  getAccessToken(): string | null;
44
87
  hasAccessToken(): boolean;
45
88
  setAccessToken(token: string, expiresIn: number): void;
46
89
  clearAccessToken(): void;
47
90
  ensureAccessToken(forceRefresh?: boolean): Promise<string | null>;
91
+ /** Decoded session claims from the current access token, or null. */
92
+ getSessionClaims(): SessionClaims | null;
93
+ /** userId from the current access token, or null. */
94
+ getUserId(): string | null;
95
+ /** orgId from the current access token, or null. Admin returns null. */
96
+ getOrgId(): string | null;
97
+ /** userType from the current access token, or null. */
98
+ getUserType(): SessionUserType | null;
99
+ /**
100
+ * Per-user entitlements from the current access token (CEL-599). Always an
101
+ * array — empty when logged out or when the token carries none. Decoded from
102
+ * the JWT, so it reflects the freshest minted token.
103
+ */
104
+ getEntitlements(): string[];
105
+ /** Subscribe to orgId change events. Returns unsubscribe. */
106
+ onOrgChange(listener: OrgChangeListener): () => void;
107
+ /** Subscribe to access-token (re-)set events. Fires after the token is set. Returns unsubscribe. */
108
+ onAccessTokenSet(listener: AccessTokenSetListener): () => void;
109
+ /** Subscribe to logout events. Returns unsubscribe. */
110
+ onLogout(listener: LogoutListener): () => void;
48
111
  }
49
112
  export interface AuthClientConfig {
50
113
  baseUrl: string;
@@ -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;CACnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmCA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IAEA;IAJlB,YACkB,MAAc,EACd,IAAY,EAC5B,OAAe,EACC,iBAA0B;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAEZ,sBAAiB,GAAjB,iBAAiB,CAAS;QAG1C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA0CA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IAEA;IAJlB,YACkB,MAAc,EACd,IAAY,EAC5B,OAAe,EACC,iBAA0B;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAEZ,sBAAiB,GAAjB,iBAAiB,CAAS;QAG1C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cellarnode/auth",
3
- "version": "0.8.0",
3
+ "version": "0.10.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": ["dist"],
27
- "keywords": ["cellarnode", "auth", "otp", "jwt", "react"],
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
- "lucide-react": ">=0.400.0",
43
- "input-otp": ">=1.4.0",
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": { "optional": true },
50
- "react-dom": { "optional": true },
51
- "lucide-react": { "optional": true },
52
- "input-otp": { "optional": true },
53
- "@react-three/fiber": { "optional": true },
54
- "three": { "optional": true },
55
- "tailwindcss": { "optional": true }
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
- "typescript": "^5.7.0",
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
- "@react-three/fiber": ">=8.0.0",
68
- "three": ">=0.160.0",
87
+ "input-otp": ">=1.4.0",
69
88
  "lucide-react": ">=0.400.0",
70
- "input-otp": ">=1.4.0"
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
  }