@oneunit/auth 2.0.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.
Files changed (75) hide show
  1. package/ARCHITECTURE.md +465 -0
  2. package/CHANGELOG.md +214 -0
  3. package/LICENSE +21 -0
  4. package/README.md +647 -0
  5. package/dist/adapters.d.ts +51 -0
  6. package/dist/adapters.d.ts.map +1 -0
  7. package/dist/adapters.js +301 -0
  8. package/dist/adapters.js.map +1 -0
  9. package/dist/auth.d.ts +59 -0
  10. package/dist/auth.d.ts.map +1 -0
  11. package/dist/auth.js +560 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/errors.d.ts +39 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +65 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/index.d.ts +11 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +10 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jwt.d.ts +11 -0
  22. package/dist/jwt.d.ts.map +1 -0
  23. package/dist/jwt.js +125 -0
  24. package/dist/jwt.js.map +1 -0
  25. package/dist/oauth.d.ts +31 -0
  26. package/dist/oauth.d.ts.map +1 -0
  27. package/dist/oauth.js +178 -0
  28. package/dist/oauth.js.map +1 -0
  29. package/dist/password.d.ts +5 -0
  30. package/dist/password.d.ts.map +1 -0
  31. package/dist/password.js +90 -0
  32. package/dist/password.js.map +1 -0
  33. package/dist/providers.d.ts +37 -0
  34. package/dist/providers.d.ts.map +1 -0
  35. package/dist/providers.js +471 -0
  36. package/dist/providers.js.map +1 -0
  37. package/dist/rbac.d.ts +40 -0
  38. package/dist/rbac.d.ts.map +1 -0
  39. package/dist/rbac.js +240 -0
  40. package/dist/rbac.js.map +1 -0
  41. package/dist/roles.d.ts +2 -0
  42. package/dist/roles.d.ts.map +1 -0
  43. package/dist/roles.js +2 -0
  44. package/dist/roles.js.map +1 -0
  45. package/dist/token.d.ts +2 -0
  46. package/dist/token.d.ts.map +1 -0
  47. package/dist/token.js +2 -0
  48. package/dist/token.js.map +1 -0
  49. package/dist/types.d.ts +383 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/utils.d.ts +35 -0
  54. package/dist/utils.d.ts.map +1 -0
  55. package/dist/utils.js +192 -0
  56. package/dist/utils.js.map +1 -0
  57. package/examples/express.ts +111 -0
  58. package/examples/fastify.ts +59 -0
  59. package/examples/oauth-social.ts +83 -0
  60. package/examples/standalone.ts +67 -0
  61. package/examples/uwebsockets.ts +143 -0
  62. package/package.json +86 -0
  63. package/src/adapters.ts +333 -0
  64. package/src/auth.ts +684 -0
  65. package/src/errors.ts +76 -0
  66. package/src/index.ts +124 -0
  67. package/src/jwt.ts +159 -0
  68. package/src/oauth.ts +226 -0
  69. package/src/password.ts +111 -0
  70. package/src/providers.ts +551 -0
  71. package/src/rbac.ts +285 -0
  72. package/src/roles.ts +1 -0
  73. package/src/token.ts +1 -0
  74. package/src/types.ts +432 -0
  75. package/src/utils.ts +231 -0
@@ -0,0 +1,471 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { ProviderError, ValidationError } from "./errors.js";
3
+ import { buildUrl, formEncode, requestJson } from "./utils.js";
4
+ export function pkceVerifier() {
5
+ return randomBytes(32).toString("base64url");
6
+ }
7
+ export function pkceChallenge(verifier) {
8
+ return createHash("sha256").update(verifier).digest("base64url");
9
+ }
10
+ function requireConfig(config, keys) {
11
+ for (const key of keys) {
12
+ if (!config[key]) {
13
+ throw new ValidationError(`OAuth provider is missing ${String(key)}`);
14
+ }
15
+ }
16
+ }
17
+ function mapProfile(source, mapping) {
18
+ const profile = {};
19
+ const record = isRecord(source) ? source : {};
20
+ for (const [key, path] of Object.entries(mapping)) {
21
+ profile[key] = typeof path === "function" ? path(record) : getPath(record, path);
22
+ }
23
+ return profile;
24
+ }
25
+ function isRecord(value) {
26
+ return value !== null && typeof value === "object" && !Array.isArray(value);
27
+ }
28
+ function getPath(object, path) {
29
+ if (!path) {
30
+ return undefined;
31
+ }
32
+ return String(path).split(".").reduce((acc, key) => {
33
+ if (!isRecord(acc) && !Array.isArray(acc)) {
34
+ return undefined;
35
+ }
36
+ return acc[key];
37
+ }, object);
38
+ }
39
+ function errorMessage(body, fallback) {
40
+ if (isRecord(body)) {
41
+ if (typeof body.error_description === "string")
42
+ return body.error_description;
43
+ if (typeof body.error === "string")
44
+ return body.error;
45
+ }
46
+ return fallback;
47
+ }
48
+ export function createProvider(definition) {
49
+ const { id, name = id, authorizationUrl, tokenUrl, userInfoUrl, scopes = [], profileMap = {}, tokenAuthMethod = "body", pkce = false, extraAuthParams = {}, extraTokenParams = {}, userInfoHeaders = {}, parseProfile, } = definition;
50
+ if (!id || !authorizationUrl || !tokenUrl) {
51
+ throw new ValidationError("Provider requires id, authorizationUrl, and tokenUrl");
52
+ }
53
+ return {
54
+ id,
55
+ name,
56
+ authorizationUrl,
57
+ tokenUrl,
58
+ userInfoUrl,
59
+ scopes,
60
+ pkce,
61
+ tokenAuthMethod,
62
+ createAuthorizationUrl(config, { state, redirectUri, codeVerifier, extraParams = {} } = {}) {
63
+ requireConfig(config, ["clientId"]);
64
+ const params = {
65
+ client_id: config.clientId,
66
+ redirect_uri: redirectUri ?? config.redirectUri,
67
+ response_type: "code",
68
+ scope: (config.scopes ?? scopes).join(" "),
69
+ state,
70
+ ...extraAuthParams,
71
+ ...(config.extraAuthParams ?? {}),
72
+ ...extraParams,
73
+ };
74
+ let verifier;
75
+ if (pkce || config.pkce) {
76
+ verifier = codeVerifier ?? pkceVerifier();
77
+ params.code_challenge = pkceChallenge(verifier);
78
+ params.code_challenge_method = "S256";
79
+ }
80
+ return {
81
+ url: buildUrl(authorizationUrl, "", params),
82
+ state,
83
+ codeVerifier: verifier,
84
+ };
85
+ },
86
+ async exchangeCode(config, { code, redirectUri, codeVerifier } = {}) {
87
+ requireConfig(config, ["clientId"]);
88
+ if (!code) {
89
+ throw new ValidationError("Authorization code is required");
90
+ }
91
+ const body = {
92
+ grant_type: "authorization_code",
93
+ code,
94
+ redirect_uri: redirectUri ?? config.redirectUri,
95
+ ...extraTokenParams,
96
+ ...(config.extraTokenParams ?? {}),
97
+ };
98
+ if (codeVerifier) {
99
+ body.code_verifier = codeVerifier;
100
+ }
101
+ const headers = {
102
+ "content-type": "application/x-www-form-urlencoded",
103
+ accept: "application/json",
104
+ };
105
+ if ((config.tokenAuthMethod ?? tokenAuthMethod) === "basic") {
106
+ const credentials = Buffer.from(`${config.clientId}:${config.clientSecret ?? ""}`).toString("base64");
107
+ headers.authorization = `Basic ${credentials}`;
108
+ }
109
+ else {
110
+ body.client_id = config.clientId;
111
+ if (config.clientSecret) {
112
+ body.client_secret = config.clientSecret;
113
+ }
114
+ }
115
+ const response = await requestJson(tokenUrl, {
116
+ method: "POST",
117
+ headers,
118
+ body: formEncode(body),
119
+ });
120
+ if (!response.ok) {
121
+ throw new ProviderError(errorMessage(response.body, `${name} token exchange failed`), {
122
+ status: response.status,
123
+ });
124
+ }
125
+ return (isRecord(response.body) ? response.body : {});
126
+ },
127
+ async fetchProfile(config, tokens) {
128
+ if (typeof parseProfile === "function") {
129
+ return parseProfile(tokens, config);
130
+ }
131
+ if (!userInfoUrl) {
132
+ return { provider: id, ...mapProfile(tokens, profileMap) };
133
+ }
134
+ const accessToken = tokens?.access_token;
135
+ if (!accessToken) {
136
+ throw new ProviderError(`${name} did not return an access token`);
137
+ }
138
+ const response = await requestJson(userInfoUrl, {
139
+ method: "GET",
140
+ headers: {
141
+ authorization: `Bearer ${accessToken}`,
142
+ ...userInfoHeaders,
143
+ ...(config.userInfoHeaders ?? {}),
144
+ },
145
+ });
146
+ if (!response.ok) {
147
+ throw new ProviderError(errorMessage(response.body, `${name} profile fetch failed`), {
148
+ status: response.status,
149
+ });
150
+ }
151
+ return {
152
+ raw: response.body,
153
+ provider: id,
154
+ ...mapProfile(response.body, profileMap),
155
+ };
156
+ },
157
+ };
158
+ }
159
+ export const google = createProvider({
160
+ id: "google",
161
+ name: "Google",
162
+ authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
163
+ tokenUrl: "https://oauth2.googleapis.com/token",
164
+ userInfoUrl: "https://openidconnect.googleapis.com/v1/userinfo",
165
+ scopes: ["openid", "email", "profile"],
166
+ extraAuthParams: { access_type: "offline", prompt: "consent" },
167
+ profileMap: {
168
+ id: "sub",
169
+ email: "email",
170
+ emailVerified: "email_verified",
171
+ name: "name",
172
+ firstName: "given_name",
173
+ lastName: "family_name",
174
+ avatar: "picture",
175
+ locale: "locale",
176
+ },
177
+ });
178
+ export const github = createProvider({
179
+ id: "github",
180
+ name: "GitHub",
181
+ authorizationUrl: "https://github.com/login/oauth/authorize",
182
+ tokenUrl: "https://github.com/login/oauth/access_token",
183
+ userInfoUrl: "https://api.github.com/user",
184
+ scopes: ["read:user", "user:email"],
185
+ userInfoHeaders: { "user-agent": "@oneunit/auth" },
186
+ async parseProfile(tokens) {
187
+ const accessToken = tokens?.access_token;
188
+ if (!accessToken) {
189
+ throw new ProviderError("GitHub did not return an access token");
190
+ }
191
+ const headers = {
192
+ authorization: `Bearer ${accessToken}`,
193
+ "user-agent": "@oneunit/auth",
194
+ accept: "application/vnd.github+json",
195
+ };
196
+ const userRes = await requestJson("https://api.github.com/user", { headers });
197
+ if (!userRes.ok) {
198
+ throw new ProviderError("GitHub profile fetch failed", { status: userRes.status });
199
+ }
200
+ const data = isRecord(userRes.body) ? userRes.body : {};
201
+ let email = typeof data.email === "string" ? data.email : undefined;
202
+ if (!email) {
203
+ const emailsRes = await requestJson("https://api.github.com/user/emails", { headers });
204
+ if (emailsRes.ok && Array.isArray(emailsRes.body)) {
205
+ const emails = emailsRes.body;
206
+ const primary = emails.find((item) => item.primary && item.verified)
207
+ ?? emails.find((item) => item.verified)
208
+ ?? emails[0];
209
+ email = primary?.email;
210
+ }
211
+ }
212
+ return {
213
+ provider: "github",
214
+ id: data.id,
215
+ username: data.login,
216
+ name: data.name,
217
+ email,
218
+ avatar: data.avatar_url,
219
+ profileUrl: data.html_url,
220
+ raw: data,
221
+ };
222
+ },
223
+ });
224
+ export const instagram = createProvider({
225
+ id: "instagram",
226
+ name: "Instagram",
227
+ authorizationUrl: "https://api.instagram.com/oauth/authorize",
228
+ tokenUrl: "https://api.instagram.com/oauth/access_token",
229
+ userInfoUrl: "https://graph.instagram.com/me?fields=id,username,account_type,name",
230
+ scopes: ["user_profile"],
231
+ profileMap: {
232
+ id: "id",
233
+ username: "username",
234
+ name: "name",
235
+ accountType: "account_type",
236
+ },
237
+ });
238
+ export const facebook = createProvider({
239
+ id: "facebook",
240
+ name: "Facebook",
241
+ authorizationUrl: "https://www.facebook.com/v21.0/dialog/oauth",
242
+ tokenUrl: "https://graph.facebook.com/v21.0/oauth/access_token",
243
+ userInfoUrl: "https://graph.facebook.com/me?fields=id,name,email,picture.type(large)",
244
+ scopes: ["email", "public_profile"],
245
+ profileMap: {
246
+ id: "id",
247
+ name: "name",
248
+ email: "email",
249
+ avatar: (data) => {
250
+ const picture = data.picture;
251
+ if (isRecord(picture) && isRecord(picture.data)) {
252
+ return picture.data.url;
253
+ }
254
+ return undefined;
255
+ },
256
+ },
257
+ });
258
+ export const twitter = createProvider({
259
+ id: "twitter",
260
+ name: "X",
261
+ authorizationUrl: "https://twitter.com/i/oauth2/authorize",
262
+ tokenUrl: "https://api.twitter.com/2/oauth2/token",
263
+ userInfoUrl: "https://api.twitter.com/2/users/me?user.fields=profile_image_url,name,username",
264
+ scopes: ["tweet.read", "users.read", "offline.access"],
265
+ pkce: true,
266
+ tokenAuthMethod: "basic",
267
+ extraAuthParams: { code_challenge_method: "S256" },
268
+ profileMap: {
269
+ id: "data.id",
270
+ username: "data.username",
271
+ name: "data.name",
272
+ avatar: "data.profile_image_url",
273
+ },
274
+ });
275
+ export const discord = createProvider({
276
+ id: "discord",
277
+ name: "Discord",
278
+ authorizationUrl: "https://discord.com/oauth2/authorize",
279
+ tokenUrl: "https://discord.com/api/oauth2/token",
280
+ userInfoUrl: "https://discord.com/api/users/@me",
281
+ scopes: ["identify", "email"],
282
+ profileMap: {
283
+ id: "id",
284
+ username: "username",
285
+ email: "email",
286
+ emailVerified: "verified",
287
+ avatar: (data) => typeof data.avatar === "string"
288
+ ? `https://cdn.discordapp.com/avatars/${String(data.id)}/${data.avatar}.png`
289
+ : undefined,
290
+ locale: "locale",
291
+ },
292
+ });
293
+ const APPLE_ISSUER = "https://appleid.apple.com";
294
+ export const apple = createProvider({
295
+ id: "apple",
296
+ name: "Apple",
297
+ authorizationUrl: "https://appleid.apple.com/auth/authorize",
298
+ tokenUrl: "https://appleid.apple.com/auth/token",
299
+ scopes: ["name", "email"],
300
+ extraAuthParams: { response_mode: "form_post" },
301
+ parseProfile(tokens, config) {
302
+ const idToken = tokens?.id_token;
303
+ if (!idToken) {
304
+ return { provider: "apple", raw: tokens };
305
+ }
306
+ // Apple is the only built-in provider whose profile comes from a token in
307
+ // the response rather than a server-side userinfo call, so the claims are
308
+ // checked here instead. See ARCHITECTURE.md for the signature caveat.
309
+ const payload = JSON.parse(Buffer.from(idToken.split(".")[1], "base64url").toString("utf8"));
310
+ const iss = typeof payload.iss === "string" ? payload.iss : undefined;
311
+ if (iss !== APPLE_ISSUER) {
312
+ throw new ProviderError(`Apple id_token has an unexpected issuer: ${String(iss)}`);
313
+ }
314
+ const aud = payload.aud;
315
+ const clientId = config.clientId;
316
+ if (clientId) {
317
+ const matches = Array.isArray(aud) ? aud.includes(clientId) : aud === clientId;
318
+ if (!matches) {
319
+ throw new ProviderError("Apple id_token audience does not match the configured clientId");
320
+ }
321
+ }
322
+ if (typeof payload.exp === "number" && payload.exp <= Math.floor(Date.now() / 1000)) {
323
+ throw new ProviderError("Apple id_token has expired");
324
+ }
325
+ return {
326
+ provider: "apple",
327
+ id: payload.sub,
328
+ email: payload.email,
329
+ emailVerified: payload.email_verified === "true" || payload.email_verified === true,
330
+ raw: { tokens, claims: payload },
331
+ };
332
+ },
333
+ });
334
+ export const linkedin = createProvider({
335
+ id: "linkedin",
336
+ name: "LinkedIn",
337
+ authorizationUrl: "https://www.linkedin.com/oauth/v2/authorization",
338
+ tokenUrl: "https://www.linkedin.com/oauth/v2/accessToken",
339
+ userInfoUrl: "https://api.linkedin.com/v2/userinfo",
340
+ scopes: ["openid", "profile", "email"],
341
+ profileMap: {
342
+ id: "sub",
343
+ name: "name",
344
+ email: "email",
345
+ emailVerified: "email_verified",
346
+ avatar: "picture",
347
+ locale: "locale",
348
+ },
349
+ });
350
+ export const microsoft = createProvider({
351
+ id: "microsoft",
352
+ name: "Microsoft",
353
+ authorizationUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
354
+ tokenUrl: "https://login.microsoftonline.com/common/oauth2/v2.0/token",
355
+ userInfoUrl: "https://graph.microsoft.com/oidc/userinfo",
356
+ scopes: ["openid", "profile", "email", "offline_access"],
357
+ profileMap: {
358
+ id: "sub",
359
+ email: "email",
360
+ name: "name",
361
+ firstName: "given_name",
362
+ lastName: "family_name",
363
+ avatar: "picture",
364
+ },
365
+ });
366
+ export const reddit = createProvider({
367
+ id: "reddit",
368
+ name: "Reddit",
369
+ authorizationUrl: "https://www.reddit.com/api/v1/authorize",
370
+ tokenUrl: "https://www.reddit.com/api/v1/access_token",
371
+ userInfoUrl: "https://oauth.reddit.com/api/v1/me",
372
+ scopes: ["identity"],
373
+ tokenAuthMethod: "basic",
374
+ extraAuthParams: { duration: "permanent" },
375
+ userInfoHeaders: { "user-agent": "@oneunit/auth" },
376
+ profileMap: {
377
+ id: "id",
378
+ username: "name",
379
+ avatar: "icon_img",
380
+ },
381
+ });
382
+ export const twitch = createProvider({
383
+ id: "twitch",
384
+ name: "Twitch",
385
+ authorizationUrl: "https://id.twitch.tv/oauth2/authorize",
386
+ tokenUrl: "https://id.twitch.tv/oauth2/token",
387
+ userInfoUrl: "https://api.twitch.tv/helix/users",
388
+ scopes: ["user:read:email"],
389
+ profileMap: {
390
+ id: "data.0.id",
391
+ username: "data.0.login",
392
+ name: "data.0.display_name",
393
+ email: "data.0.email",
394
+ avatar: "data.0.profile_image_url",
395
+ },
396
+ });
397
+ export const slack = createProvider({
398
+ id: "slack",
399
+ name: "Slack",
400
+ authorizationUrl: "https://slack.com/oauth/v2/authorize",
401
+ tokenUrl: "https://slack.com/api/oauth.v2.access",
402
+ userInfoUrl: "https://slack.com/api/users.identity",
403
+ scopes: ["identity.basic", "identity.email", "identity.avatar"],
404
+ profileMap: {
405
+ id: "user.id",
406
+ name: "user.name",
407
+ email: "user.email",
408
+ avatar: "user.image_512",
409
+ },
410
+ });
411
+ export const spotify = createProvider({
412
+ id: "spotify",
413
+ name: "Spotify",
414
+ authorizationUrl: "https://accounts.spotify.com/authorize",
415
+ tokenUrl: "https://accounts.spotify.com/api/token",
416
+ userInfoUrl: "https://api.spotify.com/v1/me",
417
+ scopes: ["user-read-email", "user-read-private"],
418
+ tokenAuthMethod: "basic",
419
+ profileMap: {
420
+ id: "id",
421
+ email: "email",
422
+ name: "display_name",
423
+ avatar: (data) => {
424
+ const images = data.images;
425
+ if (Array.isArray(images) && isRecord(images[0])) {
426
+ return images[0].url;
427
+ }
428
+ return undefined;
429
+ },
430
+ profileUrl: "external_urls.spotify",
431
+ },
432
+ });
433
+ export const tiktok = createProvider({
434
+ id: "tiktok",
435
+ name: "TikTok",
436
+ authorizationUrl: "https://www.tiktok.com/v2/auth/authorize/",
437
+ tokenUrl: "https://open.tiktokapis.com/v2/oauth/token/",
438
+ userInfoUrl: "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
439
+ scopes: ["user.info.basic"],
440
+ extraAuthParams: { response_type: "code" },
441
+ profileMap: {
442
+ id: "data.user.open_id",
443
+ name: "data.user.display_name",
444
+ avatar: "data.user.avatar_url",
445
+ },
446
+ });
447
+ export const builtinProviders = Object.freeze({
448
+ google,
449
+ github,
450
+ instagram,
451
+ facebook,
452
+ twitter,
453
+ x: twitter,
454
+ discord,
455
+ apple,
456
+ linkedin,
457
+ microsoft,
458
+ reddit,
459
+ twitch,
460
+ slack,
461
+ spotify,
462
+ tiktok,
463
+ });
464
+ export function getProvider(id) {
465
+ const provider = builtinProviders[String(id).toLowerCase()];
466
+ if (!provider) {
467
+ throw new ValidationError(`Unknown OAuth provider: ${id}`);
468
+ }
469
+ return provider;
470
+ }
471
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
package/dist/rbac.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { AuthSubject, RBACOptions, RoleDefinition, StoredRole } from "./types.js";
2
+ export declare class RBAC {
3
+ roles: Map<string, StoredRole>;
4
+ permissions: Set<string>;
5
+ rolePermissions: Map<string, Set<string>>;
6
+ roleParents: Map<string, string[]>;
7
+ defaultRole: string | null;
8
+ constructor(options?: RBACOptions);
9
+ addPermission(permission: string): this;
10
+ addRole(role: string | RoleDefinition, config?: RoleDefinition): this;
11
+ grant(role: string, permissions: string | string[]): this;
12
+ revoke(role: string, permissions: string | string[]): this;
13
+ inherit(role: string, parents: string | string[]): this;
14
+ hasRole(role: string): boolean;
15
+ requireRole(role: string): string;
16
+ getRoles(): string[];
17
+ getPermissions(role?: string): string[];
18
+ resolveParents(role: string, seen?: Set<string>): string[];
19
+ resolvePermissions(role: string): Set<string>;
20
+ subjectRoles(subject?: AuthSubject | string | null): string[];
21
+ subjectPermissions(subject?: AuthSubject | string | null): Set<string>;
22
+ can(subject: AuthSubject | string | null | undefined, permission: string | string[]): boolean;
23
+ cannot(subject: AuthSubject | string | null | undefined, permission: string | string[]): boolean;
24
+ authorize(subject: AuthSubject | string | null | undefined, permission: string | string[]): true;
25
+ hasAnyRole(subject: AuthSubject | string | null | undefined, roles: string | string[]): boolean;
26
+ hasAllRoles(subject: AuthSubject | string | null | undefined, roles: string | string[]): boolean;
27
+ snapshot(): {
28
+ defaultRole: string | null;
29
+ permissions: string[];
30
+ roles: Record<string, {
31
+ description: string;
32
+ permissions: string[];
33
+ inherits: string[];
34
+ }>;
35
+ };
36
+ }
37
+ export declare function matchPermission(granted: string, needed: string): boolean;
38
+ export declare function createRBAC(options?: RBACOptions): RBAC;
39
+ export declare function defineRoles(roles: RBACOptions["roles"]): RBAC;
40
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../src/rbac.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAavF,qBAAa,IAAI;IACf,KAAK,0BAAiC;IACtC,WAAW,cAAqB;IAChC,eAAe,2BAAkC;IACjD,WAAW,wBAA+B;IAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEf,OAAO,GAAE,WAAgB;IAoBrC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IASvC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,MAAM,GAAE,cAAmB,GAAG,IAAI;IAgCzE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAYzD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAU1D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAUvD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQjC,QAAQ,IAAI,MAAM,EAAE;IAIpB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAOvC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,cAAoB,GAAG,MAAM,EAAE;IAchE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAW7C,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE;IAqB7D,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IAYtE,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAiB7F,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAIhG,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAOhG,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAK/F,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAMhG,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,EAAE,CAAC;YAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;KAC3F;CAeF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAqBxE;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAgB,GAAG,IAAI,CAE1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAE7D"}