@fluixi/auth 1.0.0-alpha.83 → 1.0.0-alpha.85
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/client.cjs +136 -1
- package/dist/client.d.ts +17 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +43 -8
- package/dist/client.mjs +116 -1
- package/dist/cookies.cjs +72 -1
- package/dist/cookies.js +1 -1
- package/dist/cookies.mjs +51 -1
- package/dist/server.cjs +148 -1
- package/dist/server.d.ts +3 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.mjs +128 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/types.cjs +26 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.mjs +5 -1
- package/package.json +14 -14
package/dist/server.cjs
CHANGED
|
@@ -1 +1,148 @@
|
|
|
1
|
-
|
|
1
|
+
/*! @fluixi/auth v1.0.0-alpha.85 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/server.ts
|
|
22
|
+
var server_exports = {};
|
|
23
|
+
__export(server_exports, {
|
|
24
|
+
AuthError: () => AuthError,
|
|
25
|
+
authMiddleware: () => authMiddleware,
|
|
26
|
+
defineAuth: () => defineAuth,
|
|
27
|
+
deleteCookie: () => deleteCookie,
|
|
28
|
+
getAuth: () => getAuth,
|
|
29
|
+
getCookie: () => getCookie,
|
|
30
|
+
getCookies: () => getCookies,
|
|
31
|
+
mountAuthRoutes: () => mountAuthRoutes,
|
|
32
|
+
optionalUser: () => optionalUser,
|
|
33
|
+
parseCookies: () => parseCookies,
|
|
34
|
+
requirePermission: () => requirePermission,
|
|
35
|
+
requireRole: () => requireRole,
|
|
36
|
+
requireUser: () => requireUser,
|
|
37
|
+
serializeCookie: () => serializeCookie
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(server_exports);
|
|
40
|
+
var import_server2 = require("@fluixi/server");
|
|
41
|
+
|
|
42
|
+
// src/types.ts
|
|
43
|
+
var AUTH_LOCALS_KEY = "auth";
|
|
44
|
+
|
|
45
|
+
// src/cookies.ts
|
|
46
|
+
var import_server = require("@fluixi/server");
|
|
47
|
+
function parseCookies(header) {
|
|
48
|
+
const out = {};
|
|
49
|
+
if (!header) return out;
|
|
50
|
+
for (const part of header.split(";")) {
|
|
51
|
+
const eq = part.indexOf("=");
|
|
52
|
+
if (eq < 0) continue;
|
|
53
|
+
const k = part.slice(0, eq).trim();
|
|
54
|
+
if (k) out[k] = decodeURIComponent(part.slice(eq + 1).trim());
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
function serializeCookie(name, value, opts = {}) {
|
|
59
|
+
const o = {
|
|
60
|
+
path: "/",
|
|
61
|
+
httpOnly: true,
|
|
62
|
+
secure: true,
|
|
63
|
+
sameSite: "lax",
|
|
64
|
+
...opts
|
|
65
|
+
};
|
|
66
|
+
let s = `${name}=${encodeURIComponent(value)}`;
|
|
67
|
+
if (o.maxAge != null) s += `; Max-Age=${Math.floor(o.maxAge)}`;
|
|
68
|
+
if (o.expires) s += `; Expires=${o.expires.toUTCString()}`;
|
|
69
|
+
if (o.domain) s += `; Domain=${o.domain}`;
|
|
70
|
+
s += `; Path=${o.path}`;
|
|
71
|
+
if (o.httpOnly) s += "; HttpOnly";
|
|
72
|
+
if (o.secure) s += "; Secure";
|
|
73
|
+
s += `; SameSite=${o.sameSite[0].toUpperCase()}${o.sameSite.slice(1)}`;
|
|
74
|
+
return s;
|
|
75
|
+
}
|
|
76
|
+
function deleteCookie(name, opts = {}) {
|
|
77
|
+
return serializeCookie(name, "", { ...opts, maxAge: 0 });
|
|
78
|
+
}
|
|
79
|
+
function requestHeaders() {
|
|
80
|
+
const req = (0, import_server.getRequestEvent)()?.request;
|
|
81
|
+
return req?.headers ?? null;
|
|
82
|
+
}
|
|
83
|
+
function getCookie(name) {
|
|
84
|
+
return parseCookies(requestHeaders()?.get("cookie"))[name] ?? null;
|
|
85
|
+
}
|
|
86
|
+
function getCookies() {
|
|
87
|
+
return parseCookies(requestHeaders()?.get("cookie"));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/server.ts
|
|
91
|
+
var _auth = null;
|
|
92
|
+
function defineAuth(instance) {
|
|
93
|
+
const auth = {
|
|
94
|
+
raw: instance,
|
|
95
|
+
handler: (request) => instance.handler(request),
|
|
96
|
+
getSession: async (request) => {
|
|
97
|
+
const res = await instance.api.getSession({ headers: request.headers });
|
|
98
|
+
return { user: res?.user ?? null, session: res?.session ?? null };
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
_auth = auth;
|
|
102
|
+
return auth;
|
|
103
|
+
}
|
|
104
|
+
function getAuth() {
|
|
105
|
+
if (!_auth) {
|
|
106
|
+
throw new Error("[@fluixi/auth] defineAuth() was not called — no auth instance registered.");
|
|
107
|
+
}
|
|
108
|
+
return _auth;
|
|
109
|
+
}
|
|
110
|
+
function mountAuthRoutes() {
|
|
111
|
+
return (request) => getAuth().handler(request);
|
|
112
|
+
}
|
|
113
|
+
function authMiddleware() {
|
|
114
|
+
return async (request, next) => {
|
|
115
|
+
const session = await getAuth().getSession(request);
|
|
116
|
+
(0, import_server2.getRequestLocals)(request)[AUTH_LOCALS_KEY] = session;
|
|
117
|
+
return next();
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
var AuthError = class extends Error {
|
|
121
|
+
constructor(status, redirectTo, message) {
|
|
122
|
+
super(message ?? (status === 401 ? "Unauthorized" : "Forbidden"));
|
|
123
|
+
this.status = status;
|
|
124
|
+
this.redirectTo = redirectTo;
|
|
125
|
+
this.name = "AuthError";
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
function current() {
|
|
129
|
+
return (0, import_server2.getLocals)()[AUTH_LOCALS_KEY] ?? { user: null, session: null };
|
|
130
|
+
}
|
|
131
|
+
async function optionalUser() {
|
|
132
|
+
return current().user;
|
|
133
|
+
}
|
|
134
|
+
async function requireUser(opts) {
|
|
135
|
+
const user = current().user;
|
|
136
|
+
if (!user) throw new AuthError(401, opts?.redirectTo ?? "/login");
|
|
137
|
+
return user;
|
|
138
|
+
}
|
|
139
|
+
async function requireRole(role, opts) {
|
|
140
|
+
const user = await requireUser(opts);
|
|
141
|
+
if (user.role !== role) throw new AuthError(403, opts?.redirectTo);
|
|
142
|
+
return user;
|
|
143
|
+
}
|
|
144
|
+
async function requirePermission(check, opts) {
|
|
145
|
+
await requireUser(opts);
|
|
146
|
+
const ok = typeof check === "function" ? check() : check;
|
|
147
|
+
if (!ok) throw new AuthError(403, opts?.redirectTo);
|
|
148
|
+
}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fluixi/auth/server
|
|
2
|
+
* @fluixi/auth/server: the server-side bindings.
|
|
3
3
|
*
|
|
4
4
|
* `defineAuth(betterAuth(...))` registers the engine; `authMiddleware()` resolves the
|
|
5
5
|
* session once per request and writes it to `locals.auth` (via the @fluixi/start locals
|
|
6
|
-
* bridge), so the server helpers
|
|
6
|
+
* bridge), so the server helpers: `requireUser`, `requireRole`, `requirePermission` ,
|
|
7
7
|
* are pure reads of request-scoped state. No manual token parsing; works inside loaders
|
|
8
8
|
* AND server functions (same request context).
|
|
9
9
|
*/
|
|
@@ -33,7 +33,7 @@ export declare class AuthError extends Error {
|
|
|
33
33
|
redirectTo?: string | undefined;
|
|
34
34
|
constructor(status: 401 | 403, redirectTo?: string | undefined, message?: string);
|
|
35
35
|
}
|
|
36
|
-
/** The current user or null
|
|
36
|
+
/** The current user or null: never throws. */
|
|
37
37
|
export declare function optionalUser<U = AuthUser>(): Promise<U | null>;
|
|
38
38
|
/** The current user, or throw `AuthError(401, redirectTo)`. */
|
|
39
39
|
export declare function requireUser<U = AuthUser>(opts?: {
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,QAAQ;IACtC,2CAA2C;IAC3C,GAAG,EAAE,gBAAgB,CAAC;IACtB,8BAA8B;IAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,kEAAkE;IAClE,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3D;AAMD,wBAAgB,UAAU,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,CAWlF;AAED,wBAAgB,OAAO,CAAC,CAAC,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAKrD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAM3C;AAED,0FAA0F;AAC1F,qBAAa,SAAU,SAAQ,KAAK;IAEzB,MAAM,EAAE,GAAG,GAAG,GAAG;IACjB,UAAU,CAAC,EAAE,MAAM;gBADnB,MAAM,EAAE,GAAG,GAAG,GAAG,EACjB,UAAU,CAAC,EAAE,MAAM,YAAA,EAC1B,OAAO,CAAC,EAAE,MAAM;CAKnB;AAMD
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,QAAQ;IACtC,2CAA2C;IAC3C,GAAG,EAAE,gBAAgB,CAAC;IACtB,8BAA8B;IAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,kEAAkE;IAClE,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3D;AAMD,wBAAgB,UAAU,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,CAWlF;AAED,wBAAgB,OAAO,CAAC,CAAC,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAKrD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAM3C;AAED,0FAA0F;AAC1F,qBAAa,SAAU,SAAQ,KAAK;IAEzB,MAAM,EAAE,GAAG,GAAG,GAAG;IACjB,UAAU,CAAC,EAAE,MAAM;gBADnB,MAAM,EAAE,GAAG,GAAG,GAAG,EACjB,UAAU,CAAC,EAAE,MAAM,YAAA,EAC1B,OAAO,CAAC,EAAE,MAAM;CAKnB;AAMD,8CAA8C;AAC9C,wBAAsB,YAAY,CAAC,CAAC,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAEpE;AAED,+DAA+D;AAC/D,wBAAsB,WAAW,CAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAI1F;AAED,0DAA0D;AAC1D,wBAAsB,WAAW,CAAC,CAAC,SAAS;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,EACtE,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,CAAC,CAAC,CAIZ;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAIf;AAGD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,SAAS,EACT,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getLocals, getRequestLocals } from '@fluixi/server';
|
|
2
2
|
import { AUTH_LOCALS_KEY, } from './types.js';
|
|
3
|
-
// Registered instance
|
|
3
|
+
// Registered instance: so the helpers/middleware find "the" auth without the app
|
|
4
4
|
// threading it through every call. defineAuth sets it; getAuth reads it.
|
|
5
5
|
let _auth = null;
|
|
6
6
|
export function defineAuth(instance) {
|
|
@@ -51,7 +51,7 @@ export class AuthError extends Error {
|
|
|
51
51
|
function current() {
|
|
52
52
|
return getLocals()[AUTH_LOCALS_KEY] ?? { user: null, session: null };
|
|
53
53
|
}
|
|
54
|
-
/** The current user or null
|
|
54
|
+
/** The current user or null: never throws. */
|
|
55
55
|
export async function optionalUser() {
|
|
56
56
|
return current().user;
|
|
57
57
|
}
|
|
@@ -79,5 +79,5 @@ export async function requirePermission(check, opts) {
|
|
|
79
79
|
if (!ok)
|
|
80
80
|
throw new AuthError(403, opts?.redirectTo);
|
|
81
81
|
}
|
|
82
|
-
// Cookie API
|
|
82
|
+
// Cookie API: proper, secure-by-default cookie management (parse/serialize/request reads).
|
|
83
83
|
export { parseCookies, serializeCookie, deleteCookie, getCookie, getCookies, } from './cookies.js';
|
package/dist/server.mjs
CHANGED
|
@@ -1 +1,128 @@
|
|
|
1
|
-
|
|
1
|
+
/*! @fluixi/auth v1.0.0-alpha.85 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
|
|
2
|
+
|
|
3
|
+
// src/server.ts
|
|
4
|
+
import { getLocals, getRequestLocals } from "@fluixi/server";
|
|
5
|
+
|
|
6
|
+
// src/types.ts
|
|
7
|
+
var AUTH_LOCALS_KEY = "auth";
|
|
8
|
+
|
|
9
|
+
// src/cookies.ts
|
|
10
|
+
import { getRequestEvent } from "@fluixi/server";
|
|
11
|
+
function parseCookies(header) {
|
|
12
|
+
const out = {};
|
|
13
|
+
if (!header) return out;
|
|
14
|
+
for (const part of header.split(";")) {
|
|
15
|
+
const eq = part.indexOf("=");
|
|
16
|
+
if (eq < 0) continue;
|
|
17
|
+
const k = part.slice(0, eq).trim();
|
|
18
|
+
if (k) out[k] = decodeURIComponent(part.slice(eq + 1).trim());
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
function serializeCookie(name, value, opts = {}) {
|
|
23
|
+
const o = {
|
|
24
|
+
path: "/",
|
|
25
|
+
httpOnly: true,
|
|
26
|
+
secure: true,
|
|
27
|
+
sameSite: "lax",
|
|
28
|
+
...opts
|
|
29
|
+
};
|
|
30
|
+
let s = `${name}=${encodeURIComponent(value)}`;
|
|
31
|
+
if (o.maxAge != null) s += `; Max-Age=${Math.floor(o.maxAge)}`;
|
|
32
|
+
if (o.expires) s += `; Expires=${o.expires.toUTCString()}`;
|
|
33
|
+
if (o.domain) s += `; Domain=${o.domain}`;
|
|
34
|
+
s += `; Path=${o.path}`;
|
|
35
|
+
if (o.httpOnly) s += "; HttpOnly";
|
|
36
|
+
if (o.secure) s += "; Secure";
|
|
37
|
+
s += `; SameSite=${o.sameSite[0].toUpperCase()}${o.sameSite.slice(1)}`;
|
|
38
|
+
return s;
|
|
39
|
+
}
|
|
40
|
+
function deleteCookie(name, opts = {}) {
|
|
41
|
+
return serializeCookie(name, "", { ...opts, maxAge: 0 });
|
|
42
|
+
}
|
|
43
|
+
function requestHeaders() {
|
|
44
|
+
const req = getRequestEvent()?.request;
|
|
45
|
+
return req?.headers ?? null;
|
|
46
|
+
}
|
|
47
|
+
function getCookie(name) {
|
|
48
|
+
return parseCookies(requestHeaders()?.get("cookie"))[name] ?? null;
|
|
49
|
+
}
|
|
50
|
+
function getCookies() {
|
|
51
|
+
return parseCookies(requestHeaders()?.get("cookie"));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/server.ts
|
|
55
|
+
var _auth = null;
|
|
56
|
+
function defineAuth(instance) {
|
|
57
|
+
const auth = {
|
|
58
|
+
raw: instance,
|
|
59
|
+
handler: (request) => instance.handler(request),
|
|
60
|
+
getSession: async (request) => {
|
|
61
|
+
const res = await instance.api.getSession({ headers: request.headers });
|
|
62
|
+
return { user: res?.user ?? null, session: res?.session ?? null };
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
_auth = auth;
|
|
66
|
+
return auth;
|
|
67
|
+
}
|
|
68
|
+
function getAuth() {
|
|
69
|
+
if (!_auth) {
|
|
70
|
+
throw new Error("[@fluixi/auth] defineAuth() was not called — no auth instance registered.");
|
|
71
|
+
}
|
|
72
|
+
return _auth;
|
|
73
|
+
}
|
|
74
|
+
function mountAuthRoutes() {
|
|
75
|
+
return (request) => getAuth().handler(request);
|
|
76
|
+
}
|
|
77
|
+
function authMiddleware() {
|
|
78
|
+
return async (request, next) => {
|
|
79
|
+
const session = await getAuth().getSession(request);
|
|
80
|
+
getRequestLocals(request)[AUTH_LOCALS_KEY] = session;
|
|
81
|
+
return next();
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
var AuthError = class extends Error {
|
|
85
|
+
constructor(status, redirectTo, message) {
|
|
86
|
+
super(message ?? (status === 401 ? "Unauthorized" : "Forbidden"));
|
|
87
|
+
this.status = status;
|
|
88
|
+
this.redirectTo = redirectTo;
|
|
89
|
+
this.name = "AuthError";
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
function current() {
|
|
93
|
+
return getLocals()[AUTH_LOCALS_KEY] ?? { user: null, session: null };
|
|
94
|
+
}
|
|
95
|
+
async function optionalUser() {
|
|
96
|
+
return current().user;
|
|
97
|
+
}
|
|
98
|
+
async function requireUser(opts) {
|
|
99
|
+
const user = current().user;
|
|
100
|
+
if (!user) throw new AuthError(401, opts?.redirectTo ?? "/login");
|
|
101
|
+
return user;
|
|
102
|
+
}
|
|
103
|
+
async function requireRole(role, opts) {
|
|
104
|
+
const user = await requireUser(opts);
|
|
105
|
+
if (user.role !== role) throw new AuthError(403, opts?.redirectTo);
|
|
106
|
+
return user;
|
|
107
|
+
}
|
|
108
|
+
async function requirePermission(check, opts) {
|
|
109
|
+
await requireUser(opts);
|
|
110
|
+
const ok = typeof check === "function" ? check() : check;
|
|
111
|
+
if (!ok) throw new AuthError(403, opts?.redirectTo);
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
AuthError,
|
|
115
|
+
authMiddleware,
|
|
116
|
+
defineAuth,
|
|
117
|
+
deleteCookie,
|
|
118
|
+
getAuth,
|
|
119
|
+
getCookie,
|
|
120
|
+
getCookies,
|
|
121
|
+
mountAuthRoutes,
|
|
122
|
+
optionalUser,
|
|
123
|
+
parseCookies,
|
|
124
|
+
requirePermission,
|
|
125
|
+
requireRole,
|
|
126
|
+
requireUser,
|
|
127
|
+
serializeCookie
|
|
128
|
+
};
|