@cellarnode/auth 0.10.0 → 0.11.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-guard.d.ts +4 -4
- package/dist/auth-guard.js +4 -4
- package/dist/auth-store.d.ts.map +1 -1
- package/dist/auth-store.js +126 -88
- package/dist/auth-store.js.map +1 -1
- package/dist/types.d.ts +12 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -3
package/dist/auth-guard.d.ts
CHANGED
|
@@ -3,10 +3,10 @@ export declare function validateUserType(user: AuthUser, expected: UserType): bo
|
|
|
3
3
|
/**
|
|
4
4
|
* True if the user/session holds the given entitlement (CEL-599 / Epic A).
|
|
5
5
|
*
|
|
6
|
-
* Accepts an `AuthUser` (from `getMe`, where `entitlements` may be
|
|
7
|
-
* older backends) OR `SessionClaims
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Accepts an `AuthUser` (from `getMe` / `/auth/me`, where `entitlements` may be
|
|
7
|
+
* absent on older backends) OR a `SessionClaims`-shaped object. Null-safe —
|
|
8
|
+
* returns false for a missing source or a source with no entitlements. Mirrors
|
|
9
|
+
* the `validateUserType` guard shape.
|
|
10
10
|
*/
|
|
11
11
|
export declare function hasEntitlement(source: AuthUser | SessionClaims | null | undefined, entitlement: string): boolean;
|
|
12
12
|
//# sourceMappingURL=auth-guard.d.ts.map
|
package/dist/auth-guard.js
CHANGED
|
@@ -4,10 +4,10 @@ export function validateUserType(user, expected) {
|
|
|
4
4
|
/**
|
|
5
5
|
* True if the user/session holds the given entitlement (CEL-599 / Epic A).
|
|
6
6
|
*
|
|
7
|
-
* Accepts an `AuthUser` (from `getMe`, where `entitlements` may be
|
|
8
|
-
* older backends) OR `SessionClaims
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* Accepts an `AuthUser` (from `getMe` / `/auth/me`, where `entitlements` may be
|
|
8
|
+
* absent on older backends) OR a `SessionClaims`-shaped object. Null-safe —
|
|
9
|
+
* returns false for a missing source or a source with no entitlements. Mirrors
|
|
10
|
+
* the `validateUserType` guard shape.
|
|
11
11
|
*/
|
|
12
12
|
export function hasEntitlement(source, entitlement) {
|
|
13
13
|
return source?.entitlements?.includes(entitlement) ?? false;
|
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":"AAAA,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EAKhB,MAAM,YAAY,CAAC;AAuCpB,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAsRlE"}
|
package/dist/auth-store.js
CHANGED
|
@@ -1,73 +1,42 @@
|
|
|
1
|
-
import { decodeJwt } from "jose";
|
|
2
1
|
import { extractAccessToken } from "./extract-token.js";
|
|
3
|
-
const VALID_USER_TYPES = new Set([
|
|
4
|
-
"importer",
|
|
5
|
-
"producer",
|
|
6
|
-
"distributor",
|
|
7
|
-
"admin",
|
|
8
|
-
]);
|
|
9
2
|
/**
|
|
10
|
-
*
|
|
3
|
+
* Map a `/auth/me` AuthUser onto the minimal cached identity.
|
|
11
4
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* informational only (used for clientId / orgId / userType lookups in the
|
|
16
|
-
* UI layer).
|
|
5
|
+
* `AuthUser.id` is the userId. `entitlements` is optional on the wire (older
|
|
6
|
+
* backends omit it) → defaults to `[]`. The element filter guards against a
|
|
7
|
+
* malformed array carrying non-string entries.
|
|
17
8
|
*/
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
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")
|
|
9
|
+
function toIdentity(user) {
|
|
10
|
+
const entitlements = Array.isArray(user.entitlements)
|
|
11
|
+
? user.entitlements.filter((e) => typeof e === "string")
|
|
50
12
|
: [];
|
|
51
|
-
if (typeof userTypeRaw !== "string")
|
|
52
|
-
return null;
|
|
53
|
-
if (!VALID_USER_TYPES.has(userTypeRaw))
|
|
54
|
-
return null;
|
|
55
13
|
return {
|
|
56
|
-
userId,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
roles,
|
|
60
|
-
sessionId,
|
|
61
|
-
userType: userTypeRaw,
|
|
14
|
+
userId: user.id,
|
|
15
|
+
orgId: user.orgId ?? null,
|
|
16
|
+
userType: user.userType,
|
|
62
17
|
entitlements,
|
|
63
18
|
};
|
|
64
19
|
}
|
|
65
20
|
export function createAuthStore(config) {
|
|
66
21
|
const { baseUrl, refreshPath = "/auth/refresh", refreshBuffer = 60 } = config;
|
|
67
22
|
let accessToken = null;
|
|
68
|
-
let
|
|
23
|
+
let identity = null;
|
|
69
24
|
let refreshTimer = null;
|
|
70
25
|
let refreshPromise = null;
|
|
26
|
+
// Tracks the orgId observed at the last emitted state so `onOrgChange` only
|
|
27
|
+
// fires on an actual transition. `hasEmittedOrgId` disambiguates the two
|
|
28
|
+
// meanings `previousOrgId === null` would otherwise carry — "no org emitted
|
|
29
|
+
// yet" vs "the current org is admin/null". Without it, the FIRST admin
|
|
30
|
+
// identity (orgId null) and an admin login right after `clearToken()` would
|
|
31
|
+
// skip `onOrgChange(null)`. Both are reset on logout so a subsequent login
|
|
32
|
+
// re-fires `onOrgChange` even into the same org.
|
|
33
|
+
let previousOrgId = null;
|
|
34
|
+
let hasEmittedOrgId = false;
|
|
35
|
+
// Monotonic generation counter. Bumped on every token change (set / clear /
|
|
36
|
+
// refresh). An in-flight `/auth/me` resolution only commits if its captured
|
|
37
|
+
// generation still matches — this discards stale identity results when the
|
|
38
|
+
// token changed again before the previous fetch resolved.
|
|
39
|
+
let tokenGeneration = 0;
|
|
71
40
|
const orgChangeListeners = new Set();
|
|
72
41
|
const accessTokenSetListeners = new Set();
|
|
73
42
|
const logoutListeners = new Set();
|
|
@@ -111,28 +80,104 @@ export function createAuthStore(config) {
|
|
|
111
80
|
}, delay);
|
|
112
81
|
}
|
|
113
82
|
/**
|
|
114
|
-
*
|
|
83
|
+
* Fetch `/auth/me` with the bearer token and return the parsed identity, or
|
|
84
|
+
* null on any failure (network error, non-2xx, malformed body).
|
|
85
|
+
*
|
|
86
|
+
* Tolerant by design — mirrors how `performRefresh` swallows errors. A failed
|
|
87
|
+
* `/auth/me` must NOT throw out of `setAccessToken` / `performRefresh`; the
|
|
88
|
+
* caller treats null identity as "logged in but identity unknown" and the
|
|
89
|
+
* getters fall back to null/[].
|
|
90
|
+
*/
|
|
91
|
+
async function fetchIdentity(token) {
|
|
92
|
+
try {
|
|
93
|
+
const res = await fetch(`${baseUrl}/auth/me`, {
|
|
94
|
+
method: "GET",
|
|
95
|
+
credentials: "include",
|
|
96
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
97
|
+
});
|
|
98
|
+
if (!res.ok)
|
|
99
|
+
return null;
|
|
100
|
+
const user = (await res.json());
|
|
101
|
+
if (!user || typeof user.id !== "string" || user.id.length === 0) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
return toIdentity(user);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Commit a freshly-resolved identity and emit the dependent events.
|
|
115
112
|
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
113
|
+
* EVENT ORDERING (CRITICAL — consumer realtime hooks depend on it):
|
|
114
|
+
* identity is async, so on a token change the sequence is:
|
|
115
|
+
* 1. set token (synchronous, in `setAccessToken` / `performRefresh`)
|
|
116
|
+
* 2. kick off `fetchIdentity(token)` (async)
|
|
117
|
+
* 3. ON RESOLVE → here:
|
|
118
|
+
* a. cache identity FIRST (so getters return real values)
|
|
119
|
+
* b. emit `onAccessTokenSet(token)` (consumer hooks re-read getOrgId()
|
|
120
|
+
* inside this handler — identity must already be cached)
|
|
121
|
+
* c. emit `onOrgChange(orgId)` IF orgId actually changed vs the last
|
|
122
|
+
* emitted state
|
|
122
123
|
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* effective orgId transitioned).
|
|
124
|
+
* The `generation` guard discards this commit if the token changed again
|
|
125
|
+
* (set/clear/refresh) while this `/auth/me` was in flight.
|
|
126
126
|
*/
|
|
127
|
-
function
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const nextOrgId = claims?.orgId ?? null;
|
|
132
|
-
if (nextOrgId !== previousOrgId) {
|
|
133
|
-
emitOrgChange(nextOrgId);
|
|
127
|
+
function commitIdentity(generation, token, nextIdentity) {
|
|
128
|
+
if (generation !== tokenGeneration) {
|
|
129
|
+
// A newer token change superseded this fetch — drop the stale result.
|
|
130
|
+
return;
|
|
134
131
|
}
|
|
132
|
+
identity = nextIdentity;
|
|
133
|
+
const nextOrgId = nextIdentity?.orgId ?? null;
|
|
134
|
+
// (b) Token-set first — handlers read getOrgId()/getUserId() and must see
|
|
135
|
+
// the just-cached identity.
|
|
135
136
|
emitAccessTokenSet(token);
|
|
137
|
+
// (c) Org-change on the first emission OR an actual transition. The
|
|
138
|
+
// `!hasEmittedOrgId` guard ensures the first identity (incl. an admin
|
|
139
|
+
// orgId of null) always fires once.
|
|
140
|
+
if (!hasEmittedOrgId || nextOrgId !== previousOrgId) {
|
|
141
|
+
hasEmittedOrgId = true;
|
|
142
|
+
previousOrgId = nextOrgId;
|
|
143
|
+
emitOrgChange(nextOrgId);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Apply a new access token, kicking off async identity resolution.
|
|
148
|
+
*
|
|
149
|
+
* The token is committed synchronously (so `getAccessToken()` is immediately
|
|
150
|
+
* correct); identity + `onAccessTokenSet` + `onOrgChange` settle only after
|
|
151
|
+
* `/auth/me` resolves (see `commitIdentity`).
|
|
152
|
+
*/
|
|
153
|
+
function applyToken(token) {
|
|
154
|
+
tokenGeneration += 1;
|
|
155
|
+
const generation = tokenGeneration;
|
|
156
|
+
accessToken = token;
|
|
157
|
+
// Clear the prior session's identity synchronously so the getters return
|
|
158
|
+
// the documented null/[] defaults until the fresh /auth/me resolves —
|
|
159
|
+
// otherwise a token switch (e.g. logging in as a different user) would leak
|
|
160
|
+
// the previous session's userId/orgId/entitlements until the new fetch
|
|
161
|
+
// lands. The realtime consumer hooks read the getters on events (not by
|
|
162
|
+
// polling), so this introduces no flicker: a same-user refresh re-commits
|
|
163
|
+
// the same orgId without firing `onOrgChange`.
|
|
164
|
+
identity = null;
|
|
165
|
+
void fetchIdentity(token).then((next) => commitIdentity(generation, token, next));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Clear all token + identity state synchronously and reset org tracking.
|
|
169
|
+
*
|
|
170
|
+
* `onAccessTokenSet(null)` fires synchronously (no `/auth/me` round-trip on
|
|
171
|
+
* logout). `previousOrgId` is reset so a subsequent login re-fires
|
|
172
|
+
* `onOrgChange` even when the user logs back into the same org.
|
|
173
|
+
*/
|
|
174
|
+
function clearToken() {
|
|
175
|
+
tokenGeneration += 1; // invalidate any in-flight /auth/me
|
|
176
|
+
accessToken = null;
|
|
177
|
+
identity = null;
|
|
178
|
+
previousOrgId = null;
|
|
179
|
+
hasEmittedOrgId = false;
|
|
180
|
+
emitAccessTokenSet(null);
|
|
136
181
|
}
|
|
137
182
|
async function performRefresh() {
|
|
138
183
|
try {
|
|
@@ -142,7 +187,7 @@ export function createAuthStore(config) {
|
|
|
142
187
|
headers: { "Content-Type": "application/json" },
|
|
143
188
|
});
|
|
144
189
|
if (!res.ok) {
|
|
145
|
-
|
|
190
|
+
clearToken();
|
|
146
191
|
return null;
|
|
147
192
|
}
|
|
148
193
|
const json = (await res.json());
|
|
@@ -155,7 +200,7 @@ export function createAuthStore(config) {
|
|
|
155
200
|
return token;
|
|
156
201
|
}
|
|
157
202
|
catch {
|
|
158
|
-
|
|
203
|
+
clearToken();
|
|
159
204
|
return null;
|
|
160
205
|
}
|
|
161
206
|
}
|
|
@@ -171,7 +216,7 @@ export function createAuthStore(config) {
|
|
|
171
216
|
scheduleRefresh(expiresIn);
|
|
172
217
|
},
|
|
173
218
|
clearAccessToken() {
|
|
174
|
-
|
|
219
|
+
clearToken();
|
|
175
220
|
if (refreshTimer) {
|
|
176
221
|
clearTimeout(refreshTimer);
|
|
177
222
|
refreshTimer = null;
|
|
@@ -190,25 +235,18 @@ export function createAuthStore(config) {
|
|
|
190
235
|
});
|
|
191
236
|
return refreshPromise;
|
|
192
237
|
},
|
|
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
238
|
getUserId() {
|
|
201
|
-
return
|
|
239
|
+
return identity?.userId ?? null;
|
|
202
240
|
},
|
|
203
241
|
getOrgId() {
|
|
204
|
-
return
|
|
242
|
+
return identity?.orgId ?? null;
|
|
205
243
|
},
|
|
206
244
|
getUserType() {
|
|
207
|
-
return
|
|
245
|
+
return identity?.userType ?? null;
|
|
208
246
|
},
|
|
209
247
|
getEntitlements() {
|
|
210
|
-
// Defensive copy; [] when logged out
|
|
211
|
-
return
|
|
248
|
+
// Defensive copy; [] when logged out or identity unresolved.
|
|
249
|
+
return identity ? [...identity.entitlements] : [];
|
|
212
250
|
},
|
|
213
251
|
onOrgChange(listener) {
|
|
214
252
|
orgChangeListeners.add(listener);
|
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/types.d.ts
CHANGED
|
@@ -88,18 +88,22 @@ export interface AuthStore {
|
|
|
88
88
|
setAccessToken(token: string, expiresIn: number): void;
|
|
89
89
|
clearAccessToken(): void;
|
|
90
90
|
ensureAccessToken(forceRefresh?: boolean): Promise<string | null>;
|
|
91
|
-
/**
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
/**
|
|
92
|
+
* userId of the current session, or null.
|
|
93
|
+
*
|
|
94
|
+
* CEL-622 — sourced from `GET /auth/me` (the public access token is an opaque
|
|
95
|
+
* encrypted JWE and cannot be decoded client-side). Resolves asynchronously
|
|
96
|
+
* after a token is set/refreshed; reads null until `/auth/me` settles.
|
|
97
|
+
*/
|
|
94
98
|
getUserId(): string | null;
|
|
95
|
-
/** orgId
|
|
99
|
+
/** orgId of the current session, or null. Admin returns null. Sourced from `/auth/me`. */
|
|
96
100
|
getOrgId(): string | null;
|
|
97
|
-
/** userType
|
|
101
|
+
/** userType of the current session, or null. Sourced from `/auth/me`. */
|
|
98
102
|
getUserType(): SessionUserType | null;
|
|
99
103
|
/**
|
|
100
|
-
* Per-user entitlements
|
|
101
|
-
*
|
|
102
|
-
*
|
|
104
|
+
* Per-user entitlements for the current session (CEL-599). Always an array —
|
|
105
|
+
* empty when logged out or when `/auth/me` carries none. Sourced from
|
|
106
|
+
* `/auth/me` (CEL-622), so it reflects the authoritative server-side state.
|
|
103
107
|
*/
|
|
104
108
|
getEntitlements(): string[];
|
|
105
109
|
/** Subscribe to orgId change events. Returns unsubscribe. */
|
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;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,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;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAC/D,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC;AAExC,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;IAElE
|
|
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;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,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;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,OAAO,CAAC;AAEhF;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAC/D,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC;AAExC,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;IAElE;;;;;;OAMG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;IAE3B,0FAA0F;IAC1F,QAAQ,IAAI,MAAM,GAAG,IAAI,CAAC;IAE1B,yEAAyE;IACzE,WAAW,IAAI,eAAe,GAAG,IAAI,CAAC;IAEtC;;;;OAIG;IACH,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B,6DAA6D;IAC7D,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;IAErD,oGAAoG;IACpG,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAAC;IAE/D,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAAC;CAChD;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cellarnode/auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.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",
|
|
@@ -42,8 +42,7 @@
|
|
|
42
42
|
"typecheck": "tsc --noEmit"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"clsx": "^2.1.0"
|
|
46
|
-
"jose": "^6.2.3"
|
|
45
|
+
"clsx": "^2.1.0"
|
|
47
46
|
},
|
|
48
47
|
"peerDependencies": {
|
|
49
48
|
"@react-three/fiber": ">=8.0.0",
|