@qwickapps/server 1.3.0 → 1.3.1
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 +154 -0
- package/dist/core/control-panel.d.ts.map +1 -1
- package/dist/core/control-panel.js +30 -2
- package/dist/core/control-panel.js.map +1 -1
- package/dist/core/plugin-registry.d.ts +36 -0
- package/dist/core/plugin-registry.d.ts.map +1 -1
- package/dist/core/plugin-registry.js +26 -0
- package/dist/core/plugin-registry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/auth/adapters/index.d.ts +1 -0
- package/dist/plugins/auth/adapters/index.d.ts.map +1 -1
- package/dist/plugins/auth/adapters/index.js +1 -0
- package/dist/plugins/auth/adapters/index.js.map +1 -1
- package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -1
- package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -1
- package/dist/plugins/auth/adapters/supertokens-adapter.d.ts +18 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.d.ts.map +1 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.js +267 -0
- package/dist/plugins/auth/adapters/supertokens-adapter.js.map +1 -0
- package/dist/plugins/auth/env-config.d.ts +88 -0
- package/dist/plugins/auth/env-config.d.ts.map +1 -0
- package/dist/plugins/auth/env-config.js +489 -0
- package/dist/plugins/auth/env-config.js.map +1 -0
- package/dist/plugins/auth/index.d.ts +3 -1
- package/dist/plugins/auth/index.d.ts.map +1 -1
- package/dist/plugins/auth/index.js +3 -0
- package/dist/plugins/auth/index.js.map +1 -1
- package/dist/plugins/auth/supertokens-adapter.test.d.ts +10 -0
- package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +1 -0
- package/dist/plugins/auth/supertokens-adapter.test.js +486 -0
- package/dist/plugins/auth/supertokens-adapter.test.js.map +1 -0
- package/dist/plugins/auth/types.d.ts +70 -0
- package/dist/plugins/auth/types.d.ts.map +1 -1
- package/dist/plugins/auth/types.js.map +1 -1
- package/dist/plugins/cache-plugin.test.js +3 -0
- package/dist/plugins/cache-plugin.test.js.map +1 -1
- package/dist/plugins/index.d.ts +4 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +3 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/postgres-plugin.test.js +3 -0
- package/dist/plugins/postgres-plugin.test.js.map +1 -1
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +7 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +1 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.js +215 -0
- package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +1 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +7 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +1 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +265 -0
- package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +1 -0
- package/dist/plugins/preferences/index.d.ts +12 -0
- package/dist/plugins/preferences/index.d.ts.map +1 -0
- package/dist/plugins/preferences/index.js +13 -0
- package/dist/plugins/preferences/index.js.map +1 -0
- package/dist/plugins/preferences/preferences-plugin.d.ts +39 -0
- package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -0
- package/dist/plugins/preferences/preferences-plugin.js +226 -0
- package/dist/plugins/preferences/preferences-plugin.js.map +1 -0
- package/dist/plugins/preferences/stores/index.d.ts +9 -0
- package/dist/plugins/preferences/stores/index.d.ts.map +1 -0
- package/dist/plugins/preferences/stores/index.js +9 -0
- package/dist/plugins/preferences/stores/index.js.map +1 -0
- package/dist/plugins/preferences/stores/postgres-store.d.ts +41 -0
- package/dist/plugins/preferences/stores/postgres-store.d.ts.map +1 -0
- package/dist/plugins/preferences/stores/postgres-store.js +181 -0
- package/dist/plugins/preferences/stores/postgres-store.js.map +1 -0
- package/dist/plugins/preferences/types.d.ts +91 -0
- package/dist/plugins/preferences/types.d.ts.map +1 -0
- package/dist/plugins/preferences/types.js +10 -0
- package/dist/plugins/preferences/types.js.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts +9 -0
- package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +1 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js +546 -0
- package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -0
- package/dist/plugins/users/index.d.ts +2 -2
- package/dist/plugins/users/index.d.ts.map +1 -1
- package/dist/plugins/users/index.js +1 -1
- package/dist/plugins/users/index.js.map +1 -1
- package/dist/plugins/users/types.d.ts +36 -0
- package/dist/plugins/users/types.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.d.ts +8 -2
- package/dist/plugins/users/users-plugin.d.ts.map +1 -1
- package/dist/plugins/users/users-plugin.js +122 -5
- package/dist/plugins/users/users-plugin.js.map +1 -1
- package/dist-ui/assets/{index-Bsp2ntcw.js → index-BY8OxNgO.js} +112 -112
- package/dist-ui/assets/index-BY8OxNgO.js.map +1 -0
- package/dist-ui/index.html +1 -1
- package/dist-ui-lib/api/controlPanelApi.d.ts +53 -7
- package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +9 -5
- package/dist-ui-lib/dashboard/builtInWidgets.d.ts +7 -1
- package/dist-ui-lib/index.js +2382 -3651
- package/dist-ui-lib/index.js.map +1 -1
- package/dist-ui-lib/pages/AuthPage.d.ts +1 -0
- package/dist-ui-lib/pages/PluginsPage.d.ts +1 -0
- package/package.json +7 -2
- package/src/core/control-panel.ts +33 -2
- package/src/core/plugin-registry.ts +63 -0
- package/src/index.ts +7 -0
- package/src/plugins/auth/adapters/index.ts +1 -0
- package/src/plugins/auth/adapters/supabase-adapter.ts +22 -14
- package/src/plugins/auth/adapters/supertokens-adapter.ts +326 -0
- package/src/plugins/auth/env-config.ts +572 -0
- package/src/plugins/auth/index.ts +9 -0
- package/src/plugins/auth/supertokens-adapter.test.ts +621 -0
- package/src/plugins/auth/types.ts +80 -0
- package/src/plugins/cache-plugin.test.ts +3 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/postgres-plugin.test.ts +3 -0
- package/src/plugins/preferences/__tests__/deep-merge.test.ts +242 -0
- package/src/plugins/preferences/__tests__/preferences-plugin.test.ts +350 -0
- package/src/plugins/preferences/index.ts +30 -0
- package/src/plugins/preferences/preferences-plugin.ts +270 -0
- package/src/plugins/preferences/stores/index.ts +9 -0
- package/src/plugins/preferences/stores/postgres-store.ts +252 -0
- package/src/plugins/preferences/types.ts +100 -0
- package/src/plugins/users/__tests__/users-plugin.test.ts +690 -0
- package/src/plugins/users/index.ts +3 -0
- package/src/plugins/users/types.ts +38 -0
- package/src/plugins/users/users-plugin.ts +142 -5
- package/ui/src/App.tsx +4 -1
- package/ui/src/api/controlPanelApi.ts +100 -1
- package/ui/src/components/ControlPanelApp.tsx +3 -0
- package/ui/src/dashboard/PluginWidgetRenderer.tsx +13 -10
- package/ui/src/dashboard/WidgetComponentRegistry.tsx +13 -9
- package/ui/src/dashboard/builtInWidgets.tsx +8 -2
- package/ui/src/pages/AuthPage.tsx +259 -0
- package/ui/src/pages/PluginsPage.tsx +394 -0
- package/ui/vite.lib.config.ts +5 -0
- package/dist-ui/assets/index-Bsp2ntcw.js.map +0 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supertokens Auth Adapter
|
|
3
|
+
*
|
|
4
|
+
* Provides Supertokens authentication using EmailPassword and ThirdParty recipes.
|
|
5
|
+
* Supports email/password and social logins (Google, Apple, GitHub).
|
|
6
|
+
*
|
|
7
|
+
* Note: Requires supertokens-node v20+
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
10
|
+
*/
|
|
11
|
+
// Keys for storing data on the request object
|
|
12
|
+
const REQUEST_USER_KEY = '_supertokensUser';
|
|
13
|
+
const REQUEST_RES_KEY = '_supertokensRes';
|
|
14
|
+
const REQUEST_SESSION_KEY = '_supertokensSession';
|
|
15
|
+
/**
|
|
16
|
+
* Create a Supertokens authentication adapter
|
|
17
|
+
*
|
|
18
|
+
* Uses EmailPassword and ThirdParty recipes (Supertokens v20+)
|
|
19
|
+
*/
|
|
20
|
+
export function supertokensAdapter(config) {
|
|
21
|
+
// Track initialization state
|
|
22
|
+
let initialized = false;
|
|
23
|
+
let initializationError = null;
|
|
24
|
+
return {
|
|
25
|
+
name: 'supertokens',
|
|
26
|
+
initialize() {
|
|
27
|
+
// Return middleware that lazily initializes Supertokens
|
|
28
|
+
const initMiddleware = async (req, res, next) => {
|
|
29
|
+
// Store response on request for later use in getUser()
|
|
30
|
+
req[REQUEST_RES_KEY] = res;
|
|
31
|
+
// Skip if already initialized with error
|
|
32
|
+
if (initializationError) {
|
|
33
|
+
return res.status(500).json({
|
|
34
|
+
error: 'Auth Configuration Error',
|
|
35
|
+
message: 'Supertokens is not properly configured. Install supertokens-node package: npm install supertokens-node',
|
|
36
|
+
details: initializationError.message,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Lazy initialize Supertokens
|
|
40
|
+
if (!initialized) {
|
|
41
|
+
try {
|
|
42
|
+
const supertokens = await import('supertokens-node');
|
|
43
|
+
const Session = await import('supertokens-node/recipe/session');
|
|
44
|
+
const EmailPassword = await import('supertokens-node/recipe/emailpassword');
|
|
45
|
+
const ThirdParty = await import('supertokens-node/recipe/thirdparty');
|
|
46
|
+
// Build recipe list - using any[] for Supertokens internal types
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
+
const recipeList = [];
|
|
49
|
+
// Add EmailPassword recipe if enabled (default: true)
|
|
50
|
+
if (config.enableEmailPassword !== false) {
|
|
51
|
+
recipeList.push(EmailPassword.default.init());
|
|
52
|
+
}
|
|
53
|
+
// Add ThirdParty recipe if any social providers configured
|
|
54
|
+
if (config.socialProviders) {
|
|
55
|
+
// Build provider configurations using Supertokens ProviderInput type
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
+
const providers = [];
|
|
58
|
+
if (config.socialProviders.google) {
|
|
59
|
+
providers.push({
|
|
60
|
+
config: {
|
|
61
|
+
thirdPartyId: 'google',
|
|
62
|
+
clients: [
|
|
63
|
+
{
|
|
64
|
+
clientId: config.socialProviders.google.clientId,
|
|
65
|
+
clientSecret: config.socialProviders.google.clientSecret,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (config.socialProviders.apple) {
|
|
72
|
+
// Apple requires keyId, teamId, and privateKey in additionalConfig
|
|
73
|
+
providers.push({
|
|
74
|
+
config: {
|
|
75
|
+
thirdPartyId: 'apple',
|
|
76
|
+
clients: [
|
|
77
|
+
{
|
|
78
|
+
clientId: config.socialProviders.apple.clientId,
|
|
79
|
+
clientSecret: config.socialProviders.apple.clientSecret,
|
|
80
|
+
additionalConfig: {
|
|
81
|
+
keyId: config.socialProviders.apple.keyId,
|
|
82
|
+
teamId: config.socialProviders.apple.teamId,
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (config.socialProviders.github) {
|
|
90
|
+
providers.push({
|
|
91
|
+
config: {
|
|
92
|
+
thirdPartyId: 'github',
|
|
93
|
+
clients: [
|
|
94
|
+
{
|
|
95
|
+
clientId: config.socialProviders.github.clientId,
|
|
96
|
+
clientSecret: config.socialProviders.github.clientSecret,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (providers.length > 0) {
|
|
103
|
+
recipeList.push(ThirdParty.default.init({
|
|
104
|
+
signInAndUpFeature: {
|
|
105
|
+
providers,
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Always add Session recipe
|
|
111
|
+
recipeList.push(Session.default.init());
|
|
112
|
+
// Initialize Supertokens
|
|
113
|
+
supertokens.default.init({
|
|
114
|
+
framework: 'express',
|
|
115
|
+
supertokens: {
|
|
116
|
+
connectionURI: config.connectionUri,
|
|
117
|
+
apiKey: config.apiKey,
|
|
118
|
+
},
|
|
119
|
+
appInfo: {
|
|
120
|
+
appName: config.appName,
|
|
121
|
+
apiDomain: config.apiDomain,
|
|
122
|
+
websiteDomain: config.websiteDomain,
|
|
123
|
+
apiBasePath: config.apiBasePath ?? '/auth',
|
|
124
|
+
websiteBasePath: config.websiteBasePath ?? '/auth',
|
|
125
|
+
},
|
|
126
|
+
recipeList,
|
|
127
|
+
});
|
|
128
|
+
initialized = true;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
initializationError =
|
|
132
|
+
error instanceof Error ? error : new Error('Failed to initialize Supertokens');
|
|
133
|
+
console.error('[SupertokensAdapter] Initialization error:', error);
|
|
134
|
+
return res.status(500).json({
|
|
135
|
+
error: 'Auth Configuration Error',
|
|
136
|
+
message: 'Supertokens is not properly configured. Install supertokens-node package: npm install supertokens-node',
|
|
137
|
+
details: initializationError.message,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
next();
|
|
142
|
+
};
|
|
143
|
+
// Supertokens middleware for handling auth routes
|
|
144
|
+
const supertokensMiddleware = async (req, res, next) => {
|
|
145
|
+
if (!initialized) {
|
|
146
|
+
return next();
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const { middleware } = await import('supertokens-node/framework/express');
|
|
150
|
+
middleware()(req, res, next);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
next();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
return [initMiddleware, supertokensMiddleware];
|
|
157
|
+
},
|
|
158
|
+
isAuthenticated(req) {
|
|
159
|
+
const extReq = req;
|
|
160
|
+
// Check if we already validated this request
|
|
161
|
+
if (extReq[REQUEST_USER_KEY]) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
// Check if session was already retrieved
|
|
165
|
+
if (extReq[REQUEST_SESSION_KEY]) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
// For synchronous check, we can only check if session cookies exist
|
|
169
|
+
// Full validation happens in getUser()
|
|
170
|
+
// Supertokens uses cookies, so we check for session tokens
|
|
171
|
+
const cookies = req.cookies || {};
|
|
172
|
+
const accessToken = cookies.sAccessToken;
|
|
173
|
+
const refreshToken = cookies.sRefreshToken;
|
|
174
|
+
// Also check for Authorization header (for API clients)
|
|
175
|
+
const authHeader = req.headers.authorization;
|
|
176
|
+
const hasBearerToken = authHeader?.startsWith('Bearer ');
|
|
177
|
+
return !!(accessToken || refreshToken || hasBearerToken);
|
|
178
|
+
},
|
|
179
|
+
async getUser(req) {
|
|
180
|
+
const extReq = req;
|
|
181
|
+
// Return cached user if available
|
|
182
|
+
const cachedUser = extReq[REQUEST_USER_KEY];
|
|
183
|
+
if (cachedUser) {
|
|
184
|
+
return cachedUser;
|
|
185
|
+
}
|
|
186
|
+
if (!initialized) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
// Get response object stored during middleware
|
|
190
|
+
const res = extReq[REQUEST_RES_KEY];
|
|
191
|
+
if (!res) {
|
|
192
|
+
console.error('[SupertokensAdapter] Response object not found on request');
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
const Session = await import('supertokens-node/recipe/session');
|
|
197
|
+
const supertokens = await import('supertokens-node');
|
|
198
|
+
// Get session - sessionRequired: false means it won't throw if no session
|
|
199
|
+
const session = await Session.default.getSession(req, res, {
|
|
200
|
+
sessionRequired: false,
|
|
201
|
+
});
|
|
202
|
+
if (!session) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
// Cache session for isAuthenticated check
|
|
206
|
+
extReq[REQUEST_SESSION_KEY] = session;
|
|
207
|
+
const userId = session.getUserId();
|
|
208
|
+
// Get user info from Supertokens
|
|
209
|
+
const userInfo = await supertokens.default.getUser(userId);
|
|
210
|
+
if (!userInfo) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
// Get roles from session access token payload if available
|
|
214
|
+
const accessTokenPayload = session.getAccessTokenPayload();
|
|
215
|
+
const roles = accessTokenPayload?.roles || [];
|
|
216
|
+
// Map Supertokens user to AuthenticatedUser
|
|
217
|
+
const user = {
|
|
218
|
+
id: userId,
|
|
219
|
+
email: userInfo.emails?.[0] ?? '',
|
|
220
|
+
name: accessTokenPayload?.name ||
|
|
221
|
+
userInfo.thirdParty?.[0]?.userId ||
|
|
222
|
+
userInfo.emails?.[0]?.split('@')[0],
|
|
223
|
+
picture: accessTokenPayload?.picture,
|
|
224
|
+
emailVerified: userInfo.emails?.[0] ? true : false,
|
|
225
|
+
roles,
|
|
226
|
+
raw: {
|
|
227
|
+
...userInfo,
|
|
228
|
+
sessionHandle: session.getHandle(),
|
|
229
|
+
accessTokenPayload,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
// Cache on request object
|
|
233
|
+
extReq[REQUEST_USER_KEY] = user;
|
|
234
|
+
return user;
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
console.error('[SupertokensAdapter] Error getting user:', error);
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
hasRoles(req, roles) {
|
|
242
|
+
const extReq = req;
|
|
243
|
+
const user = extReq[REQUEST_USER_KEY];
|
|
244
|
+
if (!user?.roles)
|
|
245
|
+
return false;
|
|
246
|
+
return roles.every((role) => user.roles?.includes(role));
|
|
247
|
+
},
|
|
248
|
+
getAccessToken(_req) {
|
|
249
|
+
// Supertokens uses session cookies, not access tokens
|
|
250
|
+
// Return null as per the design decision
|
|
251
|
+
return null;
|
|
252
|
+
},
|
|
253
|
+
onUnauthorized(_req, res) {
|
|
254
|
+
res.status(401).json({
|
|
255
|
+
error: 'Unauthorized',
|
|
256
|
+
message: 'Authentication required. Please sign in.',
|
|
257
|
+
hint: 'Use the /auth endpoints to authenticate',
|
|
258
|
+
});
|
|
259
|
+
},
|
|
260
|
+
async shutdown() {
|
|
261
|
+
// Supertokens doesn't require explicit cleanup
|
|
262
|
+
initialized = false;
|
|
263
|
+
initializationError = null;
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=supertokens-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supertokens-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supertokens-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Plugin Environment Configuration
|
|
3
|
+
*
|
|
4
|
+
* Factory function and utilities for configuring auth adapters via environment variables.
|
|
5
|
+
* Supports all adapters: Auth0, Supabase, Supertokens, Basic.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
8
|
+
*/
|
|
9
|
+
import type { Plugin } from '../../core/plugin-registry.js';
|
|
10
|
+
import type { Auth0AdapterConfig, SupabaseAdapterConfig, SupertokensAdapterConfig, BasicAdapterConfig, AuthEnvPluginOptions, AuthConfigStatus } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get an environment variable, treating empty strings as undefined
|
|
13
|
+
*/
|
|
14
|
+
declare function getEnv(key: string): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Parse a boolean environment variable
|
|
17
|
+
* Supports: true/false, 1/0, yes/no (case-insensitive)
|
|
18
|
+
*/
|
|
19
|
+
declare function getEnvBool(key: string, defaultValue: boolean): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Parse a comma-separated list environment variable
|
|
22
|
+
*/
|
|
23
|
+
declare function getEnvList(key: string): string[] | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Mask a sensitive value for display
|
|
26
|
+
*/
|
|
27
|
+
declare function maskValue(value: string): string;
|
|
28
|
+
interface EnvParseResult<T> {
|
|
29
|
+
config: T | null;
|
|
30
|
+
errors: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse Supertokens configuration from environment variables
|
|
34
|
+
*/
|
|
35
|
+
declare function parseSupertokensEnv(): EnvParseResult<SupertokensAdapterConfig>;
|
|
36
|
+
/**
|
|
37
|
+
* Parse Auth0 configuration from environment variables
|
|
38
|
+
*/
|
|
39
|
+
declare function parseAuth0Env(): EnvParseResult<Auth0AdapterConfig>;
|
|
40
|
+
/**
|
|
41
|
+
* Parse Supabase configuration from environment variables
|
|
42
|
+
*/
|
|
43
|
+
declare function parseSupabaseEnv(): EnvParseResult<SupabaseAdapterConfig>;
|
|
44
|
+
/**
|
|
45
|
+
* Parse Basic Auth configuration from environment variables
|
|
46
|
+
*/
|
|
47
|
+
declare function parseBasicAuthEnv(): EnvParseResult<BasicAdapterConfig>;
|
|
48
|
+
/**
|
|
49
|
+
* Create an auth plugin configured from environment variables.
|
|
50
|
+
*
|
|
51
|
+
* The plugin state depends on environment configuration:
|
|
52
|
+
* - **disabled**: AUTH_ADAPTER not set - no authentication middleware is applied
|
|
53
|
+
* - **enabled**: Valid configuration - adapter is active and working
|
|
54
|
+
* - **error**: Invalid configuration - plugin is disabled with error details
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* // Zero-config setup - reads everything from env vars
|
|
59
|
+
* const authPlugin = createAuthPluginFromEnv();
|
|
60
|
+
*
|
|
61
|
+
* // With overrides
|
|
62
|
+
* const authPlugin = createAuthPluginFromEnv({
|
|
63
|
+
* excludePaths: ['/health', '/metrics'],
|
|
64
|
+
* authRequired: true,
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @param options - Optional overrides (env vars take precedence for adapter config)
|
|
69
|
+
* @returns A Plugin instance
|
|
70
|
+
*/
|
|
71
|
+
export declare function createAuthPluginFromEnv(options?: AuthEnvPluginOptions): Plugin;
|
|
72
|
+
/**
|
|
73
|
+
* Get current auth plugin status
|
|
74
|
+
*/
|
|
75
|
+
export declare function getAuthStatus(): AuthConfigStatus;
|
|
76
|
+
export declare const __testing: {
|
|
77
|
+
parseSupertokensEnv: typeof parseSupertokensEnv;
|
|
78
|
+
parseAuth0Env: typeof parseAuth0Env;
|
|
79
|
+
parseSupabaseEnv: typeof parseSupabaseEnv;
|
|
80
|
+
parseBasicAuthEnv: typeof parseBasicAuthEnv;
|
|
81
|
+
getEnv: typeof getEnv;
|
|
82
|
+
getEnvBool: typeof getEnvBool;
|
|
83
|
+
getEnvList: typeof getEnvList;
|
|
84
|
+
maskValue: typeof maskValue;
|
|
85
|
+
VALID_ADAPTERS: readonly ["supertokens", "auth0", "supabase", "basic"];
|
|
86
|
+
};
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=env-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/env-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EAEV,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAoBpB;;GAEG;AACH,iBAAS,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM/C;AAED;;;GAGG;AACH,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAa/D;AAED;;GAEG;AACH,iBAAS,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CASrD;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxC;AAMD,UAAU,cAAc,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,iBAAS,mBAAmB,IAAI,cAAc,CAAC,wBAAwB,CAAC,CAoEvE;AAED;;GAEG;AACH,iBAAS,aAAa,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAwC3D;AAED;;GAEG;AACH,iBAAS,gBAAgB,IAAI,cAAc,CAAC,qBAAqB,CAAC,CAoBjE;AAED;;GAEG;AACH,iBAAS,iBAAiB,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAqB/D;AAYD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CA0G9E;AAMD;;GAEG;AACH,wBAAgB,aAAa,IAAI,gBAAgB,CAEhD;AA2ID,eAAO,MAAM,SAAS;;;;;;;;;;CAUrB,CAAC"}
|