@qwickapps/server 1.1.9 → 1.3.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/README.md +318 -0
- package/dist/core/control-panel.d.ts +7 -2
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +99 -60
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/gateway.d.ts +159 -79
- package/dist/core/gateway.d.ts.map +1 -1
- package/dist/core/gateway.js +683 -315
- package/dist/core/gateway.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +271 -0
- package/dist/core/plugin-registry.d.ts.map +1 -0
- package/dist/core/plugin-registry.js +326 -0
- package/dist/core/plugin-registry.js.map +1 -0
- package/dist/core/types.d.ts +16 -33
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/plugins/auth/adapters/auth0-adapter.d.ts +14 -0
- package/dist/plugins/auth/adapters/auth0-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/auth0-adapter.js +179 -0
- package/dist/plugins/auth/adapters/auth0-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts +13 -0
- package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/basic-adapter.js +51 -0
- package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -0
- package/dist/plugins/auth/adapters/index.d.ts +9 -0
- package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/index.js +9 -0
- package/dist/plugins/auth/adapters/index.js.map +1 -0
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts +13 -0
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/supabase-adapter.js +109 -0
- package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -0
- package/dist/plugins/auth/auth-plugin.d.ts +40 -0
- package/dist/plugins/auth/auth-plugin.d.ts.map +1 -0
- package/dist/plugins/auth/auth-plugin.js +255 -0
- package/dist/plugins/auth/auth-plugin.js.map +1 -0
- package/dist/plugins/auth/auth-plugin.test.d.ts +9 -0
- package/dist/plugins/auth/auth-plugin.test.d.ts.map +1 -0
- package/dist/plugins/auth/auth-plugin.test.js +147 -0
- package/dist/plugins/auth/auth-plugin.test.js.map +1 -0
- package/dist/plugins/auth/index.d.ts +12 -0
- package/dist/plugins/auth/index.d.ts.map +1 -0
- package/dist/plugins/auth/index.js +13 -0
- package/dist/plugins/auth/index.js.map +1 -0
- package/dist/plugins/auth/types.d.ts +148 -0
- package/dist/plugins/auth/types.d.ts.map +1 -0
- package/dist/plugins/auth/types.js +14 -0
- package/dist/plugins/auth/types.js.map +1 -0
- package/dist/plugins/bans/bans-plugin.d.ts +59 -0
- package/dist/plugins/bans/bans-plugin.d.ts.map +1 -0
- package/dist/plugins/bans/bans-plugin.js +428 -0
- package/dist/plugins/bans/bans-plugin.js.map +1 -0
- package/dist/plugins/bans/index.d.ts +9 -0
- package/dist/plugins/bans/index.d.ts.map +1 -0
- package/dist/plugins/bans/index.js +10 -0
- package/dist/plugins/bans/index.js.map +1 -0
- package/dist/plugins/bans/stores/index.d.ts +7 -0
- package/dist/plugins/bans/stores/index.d.ts.map +1 -0
- package/dist/plugins/bans/stores/index.js +7 -0
- package/dist/plugins/bans/stores/index.js.map +1 -0
- package/dist/plugins/bans/stores/postgres-store.d.ts +29 -0
- package/dist/plugins/bans/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/bans/stores/postgres-store.js +132 -0
- package/dist/plugins/bans/stores/postgres-store.js.map +1 -0
- package/dist/plugins/bans/types.d.ts +128 -0
- package/dist/plugins/bans/types.d.ts.map +1 -0
- package/dist/plugins/bans/types.js +11 -0
- package/dist/plugins/bans/types.js.map +1 -0
- package/dist/plugins/cache-plugin.d.ts +14 -3
- package/dist/plugins/cache-plugin.d.ts.map +1 -1
- package/dist/plugins/cache-plugin.js +27 -7
- package/dist/plugins/cache-plugin.js.map +1 -1
- package/dist/plugins/cache-plugin.test.js +96 -32
- package/dist/plugins/cache-plugin.test.js.map +1 -1
- package/dist/plugins/config-plugin.d.ts +3 -2
- package/dist/plugins/config-plugin.d.ts.map +1 -1
- package/dist/plugins/config-plugin.js +17 -10
- package/dist/plugins/config-plugin.js.map +1 -1
- package/dist/plugins/diagnostics-plugin.d.ts +2 -2
- package/dist/plugins/diagnostics-plugin.d.ts.map +1 -1
- package/dist/plugins/diagnostics-plugin.js +17 -10
- package/dist/plugins/diagnostics-plugin.js.map +1 -1
- package/dist/plugins/entitlements/entitlements-plugin.d.ts +95 -0
- package/dist/plugins/entitlements/entitlements-plugin.d.ts.map +1 -0
- package/dist/plugins/entitlements/entitlements-plugin.js +707 -0
- package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -0
- package/dist/plugins/entitlements/index.d.ts +12 -0
- package/dist/plugins/entitlements/index.d.ts.map +1 -0
- package/dist/plugins/entitlements/index.js +16 -0
- package/dist/plugins/entitlements/index.js.map +1 -0
- package/dist/plugins/entitlements/sources/index.d.ts +9 -0
- package/dist/plugins/entitlements/sources/index.d.ts.map +1 -0
- package/dist/plugins/entitlements/sources/index.js +9 -0
- package/dist/plugins/entitlements/sources/index.js.map +1 -0
- package/dist/plugins/entitlements/sources/postgres-source.d.ts +29 -0
- package/dist/plugins/entitlements/sources/postgres-source.d.ts.map +1 -0
- package/dist/plugins/entitlements/sources/postgres-source.js +169 -0
- package/dist/plugins/entitlements/sources/postgres-source.js.map +1 -0
- package/dist/plugins/entitlements/types.d.ts +232 -0
- package/dist/plugins/entitlements/types.d.ts.map +1 -0
- package/dist/plugins/entitlements/types.js +11 -0
- package/dist/plugins/entitlements/types.js.map +1 -0
- package/dist/plugins/frontend-app-plugin.d.ts +9 -3
- package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
- package/dist/plugins/frontend-app-plugin.js +14 -9
- package/dist/plugins/frontend-app-plugin.js.map +1 -1
- package/dist/plugins/health-plugin.d.ts +5 -2
- package/dist/plugins/health-plugin.d.ts.map +1 -1
- package/dist/plugins/health-plugin.js +20 -5
- package/dist/plugins/health-plugin.js.map +1 -1
- package/dist/plugins/index.d.ts +8 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +8 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/logs-plugin.d.ts +3 -2
- package/dist/plugins/logs-plugin.d.ts.map +1 -1
- package/dist/plugins/logs-plugin.js +21 -12
- package/dist/plugins/logs-plugin.js.map +1 -1
- package/dist/plugins/postgres-plugin.d.ts +3 -3
- package/dist/plugins/postgres-plugin.d.ts.map +1 -1
- package/dist/plugins/postgres-plugin.js +9 -7
- package/dist/plugins/postgres-plugin.js.map +1 -1
- package/dist/plugins/postgres-plugin.test.js +47 -29
- package/dist/plugins/postgres-plugin.test.js.map +1 -1
- package/dist/plugins/users/index.d.ts +12 -0
- package/dist/plugins/users/index.d.ts.map +1 -0
- package/dist/plugins/users/index.js +13 -0
- package/dist/plugins/users/index.js.map +1 -0
- package/dist/plugins/users/stores/index.d.ts +7 -0
- package/dist/plugins/users/stores/index.d.ts.map +1 -0
- package/dist/plugins/users/stores/index.js +7 -0
- package/dist/plugins/users/stores/index.js.map +1 -0
- package/dist/plugins/users/stores/postgres-store.d.ts +28 -0
- package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/users/stores/postgres-store.js +157 -0
- package/dist/plugins/users/stores/postgres-store.js.map +1 -0
- package/dist/plugins/users/types.d.ts +189 -0
- package/dist/plugins/users/types.d.ts.map +1 -0
- package/dist/plugins/users/types.js +12 -0
- package/dist/plugins/users/types.js.map +1 -0
- package/dist/plugins/users/users-plugin.d.ts +39 -0
- package/dist/plugins/users/users-plugin.d.ts.map +1 -0
- package/dist/plugins/users/users-plugin.js +242 -0
- package/dist/plugins/users/users-plugin.js.map +1 -0
- package/dist-ui/assets/index-Bsp2ntcw.js +465 -0
- package/dist-ui/assets/index-Bsp2ntcw.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +232 -0
- package/dist-ui-lib/components/ControlPanelApp.d.ts +61 -0
- package/dist-ui-lib/components/index.d.ts +18 -0
- package/dist-ui-lib/config/AppConfig.d.ts +7 -0
- package/dist-ui-lib/dashboard/DashboardWidgetRegistry.d.ts +62 -0
- package/dist-ui-lib/dashboard/DashboardWidgetRenderer.d.ts +8 -0
- package/dist-ui-lib/dashboard/PluginWidgetRenderer.d.ts +19 -0
- package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +44 -0
- package/dist-ui-lib/dashboard/builtInWidgets.d.ts +19 -0
- package/dist-ui-lib/dashboard/index.d.ts +13 -0
- package/dist-ui-lib/dashboard/widgets/ServiceHealthWidget.d.ts +12 -0
- package/dist-ui-lib/dashboard/widgets/index.d.ts +6 -0
- package/dist-ui-lib/index.js +6441 -0
- package/dist-ui-lib/index.js.map +1 -0
- package/dist-ui-lib/pages/ConfigPage.d.ts +1 -0
- package/dist-ui-lib/pages/DashboardPage.d.ts +1 -0
- package/dist-ui-lib/pages/DiagnosticsPage.d.ts +1 -0
- package/dist-ui-lib/pages/EntitlementsPage.d.ts +17 -0
- package/dist-ui-lib/pages/LogsPage.d.ts +1 -0
- package/dist-ui-lib/pages/NotFoundPage.d.ts +1 -0
- package/dist-ui-lib/pages/PluginPage.d.ts +15 -0
- package/dist-ui-lib/pages/SystemPage.d.ts +1 -0
- package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
- package/package.json +18 -6
- package/src/core/control-panel.ts +122 -68
- package/src/core/gateway.ts +870 -399
- package/src/core/index.ts +21 -2
- package/src/core/plugin-registry.ts +653 -0
- package/src/core/types.ts +31 -37
- package/src/index.ts +118 -19
- package/src/plugins/auth/adapters/auth0-adapter.ts +214 -0
- package/src/plugins/auth/adapters/basic-adapter.ts +61 -0
- package/src/plugins/auth/adapters/index.ts +9 -0
- package/src/plugins/auth/adapters/supabase-adapter.ts +141 -0
- package/src/plugins/auth/auth-plugin.test.ts +176 -0
- package/src/plugins/auth/auth-plugin.ts +303 -0
- package/src/plugins/auth/index.ts +33 -0
- package/src/plugins/auth/types.ts +165 -0
- package/src/plugins/bans/bans-plugin.ts +485 -0
- package/src/plugins/bans/index.ts +31 -0
- package/src/plugins/bans/stores/index.ts +7 -0
- package/src/plugins/bans/stores/postgres-store.ts +195 -0
- package/src/plugins/bans/types.ts +141 -0
- package/src/plugins/cache-plugin.test.ts +105 -32
- package/src/plugins/cache-plugin.ts +40 -9
- package/src/plugins/config-plugin.ts +23 -12
- package/src/plugins/diagnostics-plugin.ts +22 -12
- package/src/plugins/entitlements/entitlements-plugin.ts +820 -0
- package/src/plugins/entitlements/index.ts +51 -0
- package/src/plugins/entitlements/sources/index.ts +9 -0
- package/src/plugins/entitlements/sources/postgres-source.ts +253 -0
- package/src/plugins/entitlements/types.ts +256 -0
- package/src/plugins/frontend-app-plugin.ts +24 -12
- package/src/plugins/health-plugin.ts +27 -7
- package/src/plugins/index.ts +106 -4
- package/src/plugins/logs-plugin.ts +28 -14
- package/src/plugins/postgres-plugin.test.ts +49 -29
- package/src/plugins/postgres-plugin.ts +11 -9
- package/src/plugins/users/index.ts +35 -0
- package/src/plugins/users/stores/index.ts +7 -0
- package/src/plugins/users/stores/postgres-store.ts +225 -0
- package/src/plugins/users/types.ts +209 -0
- package/src/plugins/users/users-plugin.ts +281 -0
- package/ui/src/App.tsx +185 -31
- package/ui/src/api/controlPanelApi.ts +354 -1
- package/ui/src/components/ControlPanelApp.tsx +209 -0
- package/ui/src/components/index.ts +62 -0
- package/ui/src/dashboard/DashboardWidgetRegistry.tsx +129 -0
- package/ui/src/dashboard/DashboardWidgetRenderer.tsx +34 -0
- package/ui/src/dashboard/PluginWidgetRenderer.tsx +115 -0
- package/ui/src/dashboard/WidgetComponentRegistry.tsx +116 -0
- package/ui/src/dashboard/builtInWidgets.tsx +29 -0
- package/ui/src/dashboard/index.ts +35 -0
- package/ui/src/dashboard/widgets/ServiceHealthWidget.tsx +140 -0
- package/ui/src/dashboard/widgets/index.ts +7 -0
- package/ui/src/pages/DashboardPage.tsx +28 -149
- package/ui/src/pages/EntitlementsPage.tsx +557 -0
- package/ui/src/pages/LogsPage.tsx +174 -8
- package/ui/src/pages/PluginPage.tsx +148 -0
- package/ui/src/pages/SystemPage.tsx +445 -0
- package/ui/src/pages/UsersPage.tsx +837 -0
- package/ui/tsconfig.lib.json +11 -0
- package/ui/vite.lib.config.ts +51 -0
- package/dist-ui/assets/index-CW1BviRn.js +0 -465
- package/dist-ui/assets/index-CW1BviRn.js.map +0 -1
- package/ui/src/pages/HealthPage.tsx +0 -204
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin
|
|
3
|
+
*
|
|
4
|
+
* Pluggable authentication plugin for @qwickapps/server.
|
|
5
|
+
* Supports multiple adapters (Auth0, Supabase, Basic) with fallback chain.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
// Store the plugin instance for helper access
|
|
10
|
+
let currentAdapter = null;
|
|
11
|
+
let fallbackAdapters = [];
|
|
12
|
+
/**
|
|
13
|
+
* Create the Auth plugin
|
|
14
|
+
*/
|
|
15
|
+
export function createAuthPlugin(config) {
|
|
16
|
+
const excludePaths = config.excludePaths || [];
|
|
17
|
+
const authRequired = config.authRequired !== false;
|
|
18
|
+
const debug = config.debug || false;
|
|
19
|
+
function log(message, data) {
|
|
20
|
+
if (debug) {
|
|
21
|
+
console.log(`[AuthPlugin] ${message}`, data || '');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
id: 'auth',
|
|
26
|
+
name: 'Auth Plugin',
|
|
27
|
+
version: '1.0.0',
|
|
28
|
+
async onStart(_pluginConfig, registry) {
|
|
29
|
+
const app = registry.getApp();
|
|
30
|
+
// Store adapters for helper access
|
|
31
|
+
currentAdapter = config.adapter;
|
|
32
|
+
fallbackAdapters = config.fallback || [];
|
|
33
|
+
log('Initializing auth plugin', {
|
|
34
|
+
adapter: config.adapter.name,
|
|
35
|
+
fallback: fallbackAdapters.map((a) => a.name),
|
|
36
|
+
excludePaths,
|
|
37
|
+
authRequired,
|
|
38
|
+
});
|
|
39
|
+
// Initialize the primary adapter
|
|
40
|
+
const primaryMiddleware = config.adapter.initialize();
|
|
41
|
+
if (Array.isArray(primaryMiddleware)) {
|
|
42
|
+
primaryMiddleware.forEach((mw) => app.use(mw));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
app.use(primaryMiddleware);
|
|
46
|
+
}
|
|
47
|
+
// Initialize fallback adapters
|
|
48
|
+
for (const fallback of fallbackAdapters) {
|
|
49
|
+
const fallbackMiddleware = fallback.initialize();
|
|
50
|
+
if (Array.isArray(fallbackMiddleware)) {
|
|
51
|
+
fallbackMiddleware.forEach((mw) => app.use(mw));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
app.use(fallbackMiddleware);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Add the auth checking middleware
|
|
58
|
+
app.use(createAuthMiddleware());
|
|
59
|
+
// Register auth status route
|
|
60
|
+
registry.addRoute({
|
|
61
|
+
method: 'get',
|
|
62
|
+
path: '/api/auth/status',
|
|
63
|
+
handler: (_req, res) => {
|
|
64
|
+
const authReq = _req;
|
|
65
|
+
res.json({
|
|
66
|
+
authenticated: authReq.auth?.isAuthenticated || false,
|
|
67
|
+
user: authReq.auth?.user
|
|
68
|
+
? {
|
|
69
|
+
id: authReq.auth.user.id,
|
|
70
|
+
email: authReq.auth.user.email,
|
|
71
|
+
name: authReq.auth.user.name,
|
|
72
|
+
picture: authReq.auth.user.picture,
|
|
73
|
+
roles: authReq.auth.user.roles,
|
|
74
|
+
}
|
|
75
|
+
: null,
|
|
76
|
+
adapter: authReq.auth?.adapter,
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
pluginId: 'auth',
|
|
80
|
+
});
|
|
81
|
+
log('Auth plugin initialized');
|
|
82
|
+
},
|
|
83
|
+
async onStop() {
|
|
84
|
+
log('Shutting down auth plugin');
|
|
85
|
+
// Cleanup adapters
|
|
86
|
+
if (currentAdapter?.shutdown) {
|
|
87
|
+
await currentAdapter.shutdown();
|
|
88
|
+
}
|
|
89
|
+
for (const fallback of fallbackAdapters) {
|
|
90
|
+
if (fallback.shutdown) {
|
|
91
|
+
await fallback.shutdown();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
currentAdapter = null;
|
|
95
|
+
fallbackAdapters = [];
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Create the auth checking middleware
|
|
100
|
+
*/
|
|
101
|
+
function createAuthMiddleware() {
|
|
102
|
+
return async (req, res, next) => {
|
|
103
|
+
const authReq = req;
|
|
104
|
+
// Initialize auth object
|
|
105
|
+
authReq.auth = {
|
|
106
|
+
isAuthenticated: false,
|
|
107
|
+
user: null,
|
|
108
|
+
adapter: 'none',
|
|
109
|
+
};
|
|
110
|
+
// Check if path is excluded
|
|
111
|
+
const isExcluded = excludePaths.some((path) => {
|
|
112
|
+
if (path.endsWith('*')) {
|
|
113
|
+
return req.path.startsWith(path.slice(0, -1));
|
|
114
|
+
}
|
|
115
|
+
return req.path === path || req.path.startsWith(path + '/');
|
|
116
|
+
});
|
|
117
|
+
if (isExcluded) {
|
|
118
|
+
log('Path excluded from auth', { path: req.path });
|
|
119
|
+
return next();
|
|
120
|
+
}
|
|
121
|
+
// Try primary adapter
|
|
122
|
+
let authenticated = false;
|
|
123
|
+
let user = null;
|
|
124
|
+
let activeAdapter = config.adapter;
|
|
125
|
+
if (config.adapter.isAuthenticated(req)) {
|
|
126
|
+
user = await Promise.resolve(config.adapter.getUser(req));
|
|
127
|
+
if (user) {
|
|
128
|
+
authenticated = true;
|
|
129
|
+
log('Authenticated via primary adapter', { adapter: config.adapter.name });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Try fallback adapters if primary didn't authenticate
|
|
133
|
+
if (!authenticated && fallbackAdapters.length > 0) {
|
|
134
|
+
for (const fallback of fallbackAdapters) {
|
|
135
|
+
if (fallback.isAuthenticated(req)) {
|
|
136
|
+
user = await Promise.resolve(fallback.getUser(req));
|
|
137
|
+
if (user) {
|
|
138
|
+
authenticated = true;
|
|
139
|
+
activeAdapter = fallback;
|
|
140
|
+
log('Authenticated via fallback adapter', { adapter: fallback.name });
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Set auth info on request
|
|
147
|
+
authReq.auth = {
|
|
148
|
+
isAuthenticated: authenticated,
|
|
149
|
+
user,
|
|
150
|
+
adapter: activeAdapter.name,
|
|
151
|
+
accessToken: activeAdapter.getAccessToken?.(req) || undefined,
|
|
152
|
+
};
|
|
153
|
+
// Check if auth is required but user is not authenticated
|
|
154
|
+
if (authRequired && !authenticated) {
|
|
155
|
+
log('Auth required but not authenticated', { path: req.path });
|
|
156
|
+
// Use custom handler if provided
|
|
157
|
+
if (config.onUnauthorized) {
|
|
158
|
+
return config.onUnauthorized(req, res);
|
|
159
|
+
}
|
|
160
|
+
// Use adapter's unauthorized handler
|
|
161
|
+
if (activeAdapter.onUnauthorized) {
|
|
162
|
+
return activeAdapter.onUnauthorized(req, res);
|
|
163
|
+
}
|
|
164
|
+
// Default unauthorized response
|
|
165
|
+
return res.status(401).json({
|
|
166
|
+
error: 'Unauthorized',
|
|
167
|
+
message: 'Authentication required',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
next();
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if the current request is authenticated
|
|
176
|
+
*/
|
|
177
|
+
export function isAuthenticated(req) {
|
|
178
|
+
const authReq = req;
|
|
179
|
+
return authReq.auth?.isAuthenticated || false;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the authenticated user from the request
|
|
183
|
+
*/
|
|
184
|
+
export function getAuthenticatedUser(req) {
|
|
185
|
+
const authReq = req;
|
|
186
|
+
return authReq.auth?.user || null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get the access token from the request
|
|
190
|
+
*/
|
|
191
|
+
export function getAccessToken(req) {
|
|
192
|
+
const authReq = req;
|
|
193
|
+
return authReq.auth?.accessToken || null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Middleware to require authentication
|
|
197
|
+
*/
|
|
198
|
+
export function requireAuth() {
|
|
199
|
+
return (req, res, next) => {
|
|
200
|
+
if (!isAuthenticated(req)) {
|
|
201
|
+
return res.status(401).json({
|
|
202
|
+
error: 'Unauthorized',
|
|
203
|
+
message: 'Authentication required',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
next();
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Middleware to require specific roles
|
|
211
|
+
*/
|
|
212
|
+
export function requireRoles(...roles) {
|
|
213
|
+
return (req, res, next) => {
|
|
214
|
+
const user = getAuthenticatedUser(req);
|
|
215
|
+
if (!user) {
|
|
216
|
+
return res.status(401).json({
|
|
217
|
+
error: 'Unauthorized',
|
|
218
|
+
message: 'Authentication required',
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const userRoles = user.roles || [];
|
|
222
|
+
const hasAllRoles = roles.every((role) => userRoles.includes(role));
|
|
223
|
+
if (!hasAllRoles) {
|
|
224
|
+
return res.status(403).json({
|
|
225
|
+
error: 'Forbidden',
|
|
226
|
+
message: `Required roles: ${roles.join(', ')}`,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
next();
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Middleware to require any of the specified roles
|
|
234
|
+
*/
|
|
235
|
+
export function requireAnyRole(...roles) {
|
|
236
|
+
return (req, res, next) => {
|
|
237
|
+
const user = getAuthenticatedUser(req);
|
|
238
|
+
if (!user) {
|
|
239
|
+
return res.status(401).json({
|
|
240
|
+
error: 'Unauthorized',
|
|
241
|
+
message: 'Authentication required',
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const userRoles = user.roles || [];
|
|
245
|
+
const hasAnyRole = roles.some((role) => userRoles.includes(role));
|
|
246
|
+
if (!hasAnyRole) {
|
|
247
|
+
return res.status(403).json({
|
|
248
|
+
error: 'Forbidden',
|
|
249
|
+
message: `Required one of roles: ${roles.join(', ')}`,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
next();
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=auth-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-plugin.js","sourceRoot":"","sources":["../../../src/plugins/auth/auth-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-plugin.test.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/auth-plugin.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin Tests
|
|
3
|
+
*
|
|
4
|
+
* Unit tests for the authentication plugin and adapters.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
9
|
+
import { basicAdapter } from './adapters/basic-adapter.js';
|
|
10
|
+
// Mock request/response helpers
|
|
11
|
+
function createMockRequest(overrides = {}) {
|
|
12
|
+
return {
|
|
13
|
+
headers: {},
|
|
14
|
+
path: '/',
|
|
15
|
+
originalUrl: '/',
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function createMockResponse() {
|
|
20
|
+
const res = {
|
|
21
|
+
status: vi.fn().mockReturnThis(),
|
|
22
|
+
json: vi.fn().mockReturnThis(),
|
|
23
|
+
setHeader: vi.fn().mockReturnThis(),
|
|
24
|
+
redirect: vi.fn().mockReturnThis(),
|
|
25
|
+
};
|
|
26
|
+
return res;
|
|
27
|
+
}
|
|
28
|
+
describe('basicAdapter', () => {
|
|
29
|
+
const config = {
|
|
30
|
+
username: 'admin',
|
|
31
|
+
password: 'secret123',
|
|
32
|
+
realm: 'Test Realm',
|
|
33
|
+
};
|
|
34
|
+
let adapter;
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
adapter = basicAdapter(config);
|
|
37
|
+
});
|
|
38
|
+
describe('name', () => {
|
|
39
|
+
it('should return "basic"', () => {
|
|
40
|
+
expect(adapter.name).toBe('basic');
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('initialize', () => {
|
|
44
|
+
it('should return a pass-through middleware', () => {
|
|
45
|
+
const middleware = adapter.initialize();
|
|
46
|
+
const req = createMockRequest();
|
|
47
|
+
const res = createMockResponse();
|
|
48
|
+
const next = vi.fn();
|
|
49
|
+
// Handle both single middleware and array of middlewares
|
|
50
|
+
if (Array.isArray(middleware)) {
|
|
51
|
+
middleware[0](req, res, next);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
middleware(req, res, next);
|
|
55
|
+
}
|
|
56
|
+
expect(next).toHaveBeenCalled();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('isAuthenticated', () => {
|
|
60
|
+
it('should return true for valid basic auth credentials', () => {
|
|
61
|
+
const expectedAuth = `Basic ${Buffer.from('admin:secret123').toString('base64')}`;
|
|
62
|
+
const req = createMockRequest({
|
|
63
|
+
headers: { authorization: expectedAuth },
|
|
64
|
+
});
|
|
65
|
+
expect(adapter.isAuthenticated(req)).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('should return false for invalid credentials', () => {
|
|
68
|
+
const wrongAuth = `Basic ${Buffer.from('admin:wrongpassword').toString('base64')}`;
|
|
69
|
+
const req = createMockRequest({
|
|
70
|
+
headers: { authorization: wrongAuth },
|
|
71
|
+
});
|
|
72
|
+
expect(adapter.isAuthenticated(req)).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
it('should return false for missing authorization header', () => {
|
|
75
|
+
const req = createMockRequest();
|
|
76
|
+
expect(adapter.isAuthenticated(req)).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it('should return false for non-basic auth header', () => {
|
|
79
|
+
const req = createMockRequest({
|
|
80
|
+
headers: { authorization: 'Bearer some-token' },
|
|
81
|
+
});
|
|
82
|
+
expect(adapter.isAuthenticated(req)).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('getUser', () => {
|
|
86
|
+
it('should return user for authenticated request', async () => {
|
|
87
|
+
const expectedAuth = `Basic ${Buffer.from('admin:secret123').toString('base64')}`;
|
|
88
|
+
const req = createMockRequest({
|
|
89
|
+
headers: { authorization: expectedAuth },
|
|
90
|
+
});
|
|
91
|
+
const user = await Promise.resolve(adapter.getUser(req));
|
|
92
|
+
expect(user).not.toBeNull();
|
|
93
|
+
expect(user?.id).toBe('basic-auth-user');
|
|
94
|
+
expect(user?.email).toBe('admin@localhost');
|
|
95
|
+
expect(user?.name).toBe('admin');
|
|
96
|
+
expect(user?.roles).toContain('admin');
|
|
97
|
+
});
|
|
98
|
+
it('should return null for unauthenticated request', async () => {
|
|
99
|
+
const req = createMockRequest();
|
|
100
|
+
expect(await Promise.resolve(adapter.getUser(req))).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('hasRoles', () => {
|
|
104
|
+
it('should return true if user has the role', () => {
|
|
105
|
+
const expectedAuth = `Basic ${Buffer.from('admin:secret123').toString('base64')}`;
|
|
106
|
+
const req = createMockRequest({
|
|
107
|
+
headers: { authorization: expectedAuth },
|
|
108
|
+
});
|
|
109
|
+
expect(adapter.hasRoles(req, ['admin'])).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
it('should return false if user does not have the role', () => {
|
|
112
|
+
const expectedAuth = `Basic ${Buffer.from('admin:secret123').toString('base64')}`;
|
|
113
|
+
const req = createMockRequest({
|
|
114
|
+
headers: { authorization: expectedAuth },
|
|
115
|
+
});
|
|
116
|
+
expect(adapter.hasRoles(req, ['superadmin'])).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('onUnauthorized', () => {
|
|
120
|
+
it('should set WWW-Authenticate header and return 401', () => {
|
|
121
|
+
const req = createMockRequest();
|
|
122
|
+
const res = createMockResponse();
|
|
123
|
+
adapter.onUnauthorized(req, res);
|
|
124
|
+
expect(res.setHeader).toHaveBeenCalledWith('WWW-Authenticate', 'Basic realm="Test Realm"');
|
|
125
|
+
expect(res.status).toHaveBeenCalledWith(401);
|
|
126
|
+
expect(res.json).toHaveBeenCalledWith({
|
|
127
|
+
error: 'Unauthorized',
|
|
128
|
+
message: 'Authentication required.',
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('Auth Plugin helpers', () => {
|
|
134
|
+
// These tests would require more complex setup with express app
|
|
135
|
+
// For now, we test the basic functionality
|
|
136
|
+
it('should export all required functions', async () => {
|
|
137
|
+
const authModule = await import('./auth-plugin.js');
|
|
138
|
+
expect(authModule.createAuthPlugin).toBeDefined();
|
|
139
|
+
expect(authModule.isAuthenticated).toBeDefined();
|
|
140
|
+
expect(authModule.getAuthenticatedUser).toBeDefined();
|
|
141
|
+
expect(authModule.getAccessToken).toBeDefined();
|
|
142
|
+
expect(authModule.requireAuth).toBeDefined();
|
|
143
|
+
expect(authModule.requireRoles).toBeDefined();
|
|
144
|
+
expect(authModule.requireAnyRole).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=auth-plugin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-plugin.test.js","sourceRoot":"","sources":["../../../src/plugins/auth/auth-plugin.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
export { createAuthPlugin, isAuthenticated, getAuthenticatedUser, getAccessToken, requireAuth, requireRoles, requireAnyRole, } from './auth-plugin.js';
|
|
7
|
+
export type { AuthPluginConfig, AuthAdapter, AuthenticatedUser, AuthenticatedRequest, Auth0AdapterConfig, SupabaseAdapterConfig, BasicAdapterConfig, } from './types.js';
|
|
8
|
+
export { isAuthenticatedRequest } from './types.js';
|
|
9
|
+
export { auth0Adapter } from './adapters/auth0-adapter.js';
|
|
10
|
+
export { basicAdapter } from './adapters/basic-adapter.js';
|
|
11
|
+
export { supabaseAdapter } from './adapters/supabase-adapter.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin Index
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
5
|
+
*/
|
|
6
|
+
// Main plugin
|
|
7
|
+
export { createAuthPlugin, isAuthenticated, getAuthenticatedUser, getAccessToken, requireAuth, requireRoles, requireAnyRole, } from './auth-plugin.js';
|
|
8
|
+
export { isAuthenticatedRequest } from './types.js';
|
|
9
|
+
// Adapters
|
|
10
|
+
export { auth0Adapter } from './adapters/auth0-adapter.js';
|
|
11
|
+
export { basicAdapter } from './adapters/basic-adapter.js';
|
|
12
|
+
export { supabaseAdapter } from './adapters/supabase-adapter.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc;AACd,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,kBAAkB,CAAC;AAY1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the pluggable authentication system.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
import type { Request, Response, RequestHandler } from 'express';
|
|
9
|
+
/**
|
|
10
|
+
* Authenticated user information
|
|
11
|
+
*/
|
|
12
|
+
export interface AuthenticatedUser {
|
|
13
|
+
/** Unique user ID from the provider */
|
|
14
|
+
id: string;
|
|
15
|
+
/** User's email address */
|
|
16
|
+
email: string;
|
|
17
|
+
/** User's display name */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** User's profile picture URL */
|
|
20
|
+
picture?: string;
|
|
21
|
+
/** Whether the email is verified */
|
|
22
|
+
emailVerified?: boolean;
|
|
23
|
+
/** User's roles from the provider */
|
|
24
|
+
roles?: string[];
|
|
25
|
+
/** Raw user object from the provider */
|
|
26
|
+
raw?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Auth adapter interface - all adapters must implement this
|
|
30
|
+
*/
|
|
31
|
+
export interface AuthAdapter {
|
|
32
|
+
/** Adapter name (e.g., 'auth0', 'supabase', 'basic') */
|
|
33
|
+
name: string;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the adapter - called once during plugin setup
|
|
36
|
+
* Returns middleware to apply to the Express app
|
|
37
|
+
*/
|
|
38
|
+
initialize(): RequestHandler | RequestHandler[];
|
|
39
|
+
/**
|
|
40
|
+
* Check if the request is authenticated
|
|
41
|
+
*/
|
|
42
|
+
isAuthenticated(req: Request): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Get the authenticated user from the request
|
|
45
|
+
* Can be async for adapters that need to validate tokens
|
|
46
|
+
*/
|
|
47
|
+
getUser(req: Request): AuthenticatedUser | null | Promise<AuthenticatedUser | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Check if user has required roles (optional)
|
|
50
|
+
*/
|
|
51
|
+
hasRoles?(req: Request, roles: string[]): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get the access token for downstream API calls (optional)
|
|
54
|
+
*/
|
|
55
|
+
getAccessToken?(req: Request): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Handler for unauthorized requests (optional custom behavior)
|
|
58
|
+
*/
|
|
59
|
+
onUnauthorized?(req: Request, res: Response): void;
|
|
60
|
+
/**
|
|
61
|
+
* Cleanup resources on shutdown (optional)
|
|
62
|
+
*/
|
|
63
|
+
shutdown?(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Auth0 adapter configuration
|
|
67
|
+
*/
|
|
68
|
+
export interface Auth0AdapterConfig {
|
|
69
|
+
/** Auth0 domain (e.g., 'myapp.auth0.com') */
|
|
70
|
+
domain: string;
|
|
71
|
+
/** Auth0 client ID */
|
|
72
|
+
clientId: string;
|
|
73
|
+
/** Auth0 client secret */
|
|
74
|
+
clientSecret: string;
|
|
75
|
+
/** Base URL of the application */
|
|
76
|
+
baseUrl: string;
|
|
77
|
+
/** Session secret for cookie encryption */
|
|
78
|
+
secret: string;
|
|
79
|
+
/** API audience for access tokens (optional) */
|
|
80
|
+
audience?: string;
|
|
81
|
+
/** Scopes to request (default: ['openid', 'profile', 'email']) */
|
|
82
|
+
scopes?: string[];
|
|
83
|
+
/** Allowed roles - only these roles can access (optional) */
|
|
84
|
+
allowedRoles?: string[];
|
|
85
|
+
/** Allowed email domains - only these domains can access (optional) */
|
|
86
|
+
allowedDomains?: string[];
|
|
87
|
+
/** Whether to expose the access token to handlers (default: false) */
|
|
88
|
+
exposeAccessToken?: boolean;
|
|
89
|
+
/** Auth routes configuration */
|
|
90
|
+
routes?: {
|
|
91
|
+
login?: string;
|
|
92
|
+
logout?: string;
|
|
93
|
+
callback?: string;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Supabase adapter configuration
|
|
98
|
+
*/
|
|
99
|
+
export interface SupabaseAdapterConfig {
|
|
100
|
+
/** Supabase project URL */
|
|
101
|
+
url: string;
|
|
102
|
+
/** Supabase anon key */
|
|
103
|
+
anonKey: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Basic auth adapter configuration
|
|
107
|
+
*/
|
|
108
|
+
export interface BasicAdapterConfig {
|
|
109
|
+
/** Username for basic auth */
|
|
110
|
+
username: string;
|
|
111
|
+
/** Password for basic auth */
|
|
112
|
+
password: string;
|
|
113
|
+
/** Realm name for the WWW-Authenticate header */
|
|
114
|
+
realm?: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Auth plugin configuration
|
|
118
|
+
*/
|
|
119
|
+
export interface AuthPluginConfig {
|
|
120
|
+
/** Primary adapter for authentication */
|
|
121
|
+
adapter: AuthAdapter;
|
|
122
|
+
/** Fallback adapters checked in order if primary fails (optional) */
|
|
123
|
+
fallback?: AuthAdapter[];
|
|
124
|
+
/** Paths to exclude from authentication */
|
|
125
|
+
excludePaths?: string[];
|
|
126
|
+
/** Whether auth is required for all routes (default: true) */
|
|
127
|
+
authRequired?: boolean;
|
|
128
|
+
/** Custom unauthorized handler */
|
|
129
|
+
onUnauthorized?: (req: Request, res: Response) => void;
|
|
130
|
+
/** Enable debug logging */
|
|
131
|
+
debug?: boolean;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Extended Express Request with auth info
|
|
135
|
+
*/
|
|
136
|
+
export interface AuthenticatedRequest extends Request {
|
|
137
|
+
auth: {
|
|
138
|
+
isAuthenticated: boolean;
|
|
139
|
+
user: AuthenticatedUser | null;
|
|
140
|
+
adapter: string;
|
|
141
|
+
accessToken?: string;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Helper type guard for authenticated requests
|
|
146
|
+
*/
|
|
147
|
+
export declare function isAuthenticatedRequest(req: Request): req is AuthenticatedRequest;
|
|
148
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the pluggable authentication system.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Helper type guard for authenticated requests
|
|
10
|
+
*/
|
|
11
|
+
export function isAuthenticatedRequest(req) {
|
|
12
|
+
return 'auth' in req && req.auth?.isAuthenticated === true;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/plugins/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyJH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,OAAO,MAAM,IAAI,GAAG,IAAK,GAA4B,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;AACvF,CAAC"}
|