@qwickapps/server 1.2.0 → 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.
Files changed (240) hide show
  1. package/README.md +238 -0
  2. package/dist/core/control-panel.d.ts +7 -2
  3. package/dist/core/control-panel.d.ts.map +1 -1
  4. package/dist/core/control-panel.js +92 -54
  5. package/dist/core/control-panel.js.map +1 -1
  6. package/dist/core/gateway.d.ts +159 -79
  7. package/dist/core/gateway.d.ts.map +1 -1
  8. package/dist/core/gateway.js +679 -319
  9. package/dist/core/gateway.js.map +1 -1
  10. package/dist/core/index.d.ts +3 -1
  11. package/dist/core/index.d.ts.map +1 -1
  12. package/dist/core/index.js +2 -0
  13. package/dist/core/index.js.map +1 -1
  14. package/dist/core/plugin-registry.d.ts +271 -0
  15. package/dist/core/plugin-registry.d.ts.map +1 -0
  16. package/dist/core/plugin-registry.js +326 -0
  17. package/dist/core/plugin-registry.js.map +1 -0
  18. package/dist/core/types.d.ts +16 -33
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/index.d.ts +8 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +15 -7
  23. package/dist/index.js.map +1 -1
  24. package/dist/plugins/auth/adapters/auth0-adapter.d.ts +14 -0
  25. package/dist/plugins/auth/adapters/auth0-adapter.d.ts.map +1 -0
  26. package/dist/plugins/auth/adapters/auth0-adapter.js +179 -0
  27. package/dist/plugins/auth/adapters/auth0-adapter.js.map +1 -0
  28. package/dist/plugins/auth/adapters/basic-adapter.d.ts +13 -0
  29. package/dist/plugins/auth/adapters/basic-adapter.d.ts.map +1 -0
  30. package/dist/plugins/auth/adapters/basic-adapter.js +51 -0
  31. package/dist/plugins/auth/adapters/basic-adapter.js.map +1 -0
  32. package/dist/plugins/auth/adapters/index.d.ts +9 -0
  33. package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
  34. package/dist/plugins/auth/adapters/index.js +9 -0
  35. package/dist/plugins/auth/adapters/index.js.map +1 -0
  36. package/dist/plugins/auth/adapters/supabase-adapter.d.ts +13 -0
  37. package/dist/plugins/auth/adapters/supabase-adapter.d.ts.map +1 -0
  38. package/dist/plugins/auth/adapters/supabase-adapter.js +109 -0
  39. package/dist/plugins/auth/adapters/supabase-adapter.js.map +1 -0
  40. package/dist/plugins/auth/auth-plugin.d.ts +40 -0
  41. package/dist/plugins/auth/auth-plugin.d.ts.map +1 -0
  42. package/dist/plugins/auth/auth-plugin.js +255 -0
  43. package/dist/plugins/auth/auth-plugin.js.map +1 -0
  44. package/dist/plugins/auth/auth-plugin.test.d.ts +9 -0
  45. package/dist/plugins/auth/auth-plugin.test.d.ts.map +1 -0
  46. package/dist/plugins/auth/auth-plugin.test.js +147 -0
  47. package/dist/plugins/auth/auth-plugin.test.js.map +1 -0
  48. package/dist/plugins/auth/index.d.ts +12 -0
  49. package/dist/plugins/auth/index.d.ts.map +1 -0
  50. package/dist/plugins/auth/index.js +13 -0
  51. package/dist/plugins/auth/index.js.map +1 -0
  52. package/dist/plugins/auth/types.d.ts +148 -0
  53. package/dist/plugins/auth/types.d.ts.map +1 -0
  54. package/dist/plugins/auth/types.js +14 -0
  55. package/dist/plugins/auth/types.js.map +1 -0
  56. package/dist/plugins/bans/bans-plugin.d.ts +59 -0
  57. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -0
  58. package/dist/plugins/bans/bans-plugin.js +428 -0
  59. package/dist/plugins/bans/bans-plugin.js.map +1 -0
  60. package/dist/plugins/bans/index.d.ts +9 -0
  61. package/dist/plugins/bans/index.d.ts.map +1 -0
  62. package/dist/plugins/bans/index.js +10 -0
  63. package/dist/plugins/bans/index.js.map +1 -0
  64. package/dist/plugins/bans/stores/index.d.ts +7 -0
  65. package/dist/plugins/bans/stores/index.d.ts.map +1 -0
  66. package/dist/plugins/bans/stores/index.js +7 -0
  67. package/dist/plugins/bans/stores/index.js.map +1 -0
  68. package/dist/plugins/bans/stores/postgres-store.d.ts +29 -0
  69. package/dist/plugins/bans/stores/postgres-store.d.ts.map +1 -0
  70. package/dist/plugins/bans/stores/postgres-store.js +132 -0
  71. package/dist/plugins/bans/stores/postgres-store.js.map +1 -0
  72. package/dist/plugins/bans/types.d.ts +128 -0
  73. package/dist/plugins/bans/types.d.ts.map +1 -0
  74. package/dist/plugins/bans/types.js +11 -0
  75. package/dist/plugins/bans/types.js.map +1 -0
  76. package/dist/plugins/cache-plugin.d.ts +14 -3
  77. package/dist/plugins/cache-plugin.d.ts.map +1 -1
  78. package/dist/plugins/cache-plugin.js +27 -7
  79. package/dist/plugins/cache-plugin.js.map +1 -1
  80. package/dist/plugins/cache-plugin.test.js +96 -32
  81. package/dist/plugins/cache-plugin.test.js.map +1 -1
  82. package/dist/plugins/config-plugin.d.ts +3 -2
  83. package/dist/plugins/config-plugin.d.ts.map +1 -1
  84. package/dist/plugins/config-plugin.js +17 -10
  85. package/dist/plugins/config-plugin.js.map +1 -1
  86. package/dist/plugins/diagnostics-plugin.d.ts +2 -2
  87. package/dist/plugins/diagnostics-plugin.d.ts.map +1 -1
  88. package/dist/plugins/diagnostics-plugin.js +17 -10
  89. package/dist/plugins/diagnostics-plugin.js.map +1 -1
  90. package/dist/plugins/entitlements/entitlements-plugin.d.ts +95 -0
  91. package/dist/plugins/entitlements/entitlements-plugin.d.ts.map +1 -0
  92. package/dist/plugins/entitlements/entitlements-plugin.js +707 -0
  93. package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -0
  94. package/dist/plugins/entitlements/index.d.ts +12 -0
  95. package/dist/plugins/entitlements/index.d.ts.map +1 -0
  96. package/dist/plugins/entitlements/index.js +16 -0
  97. package/dist/plugins/entitlements/index.js.map +1 -0
  98. package/dist/plugins/entitlements/sources/index.d.ts +9 -0
  99. package/dist/plugins/entitlements/sources/index.d.ts.map +1 -0
  100. package/dist/plugins/entitlements/sources/index.js +9 -0
  101. package/dist/plugins/entitlements/sources/index.js.map +1 -0
  102. package/dist/plugins/entitlements/sources/postgres-source.d.ts +29 -0
  103. package/dist/plugins/entitlements/sources/postgres-source.d.ts.map +1 -0
  104. package/dist/plugins/entitlements/sources/postgres-source.js +169 -0
  105. package/dist/plugins/entitlements/sources/postgres-source.js.map +1 -0
  106. package/dist/plugins/entitlements/types.d.ts +232 -0
  107. package/dist/plugins/entitlements/types.d.ts.map +1 -0
  108. package/dist/plugins/entitlements/types.js +11 -0
  109. package/dist/plugins/entitlements/types.js.map +1 -0
  110. package/dist/plugins/frontend-app-plugin.d.ts +9 -3
  111. package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
  112. package/dist/plugins/frontend-app-plugin.js +14 -9
  113. package/dist/plugins/frontend-app-plugin.js.map +1 -1
  114. package/dist/plugins/health-plugin.d.ts +5 -2
  115. package/dist/plugins/health-plugin.d.ts.map +1 -1
  116. package/dist/plugins/health-plugin.js +20 -5
  117. package/dist/plugins/health-plugin.js.map +1 -1
  118. package/dist/plugins/index.d.ts +8 -2
  119. package/dist/plugins/index.d.ts.map +1 -1
  120. package/dist/plugins/index.js +8 -2
  121. package/dist/plugins/index.js.map +1 -1
  122. package/dist/plugins/logs-plugin.d.ts +3 -2
  123. package/dist/plugins/logs-plugin.d.ts.map +1 -1
  124. package/dist/plugins/logs-plugin.js +21 -12
  125. package/dist/plugins/logs-plugin.js.map +1 -1
  126. package/dist/plugins/postgres-plugin.d.ts +3 -3
  127. package/dist/plugins/postgres-plugin.d.ts.map +1 -1
  128. package/dist/plugins/postgres-plugin.js +9 -7
  129. package/dist/plugins/postgres-plugin.js.map +1 -1
  130. package/dist/plugins/postgres-plugin.test.js +47 -29
  131. package/dist/plugins/postgres-plugin.test.js.map +1 -1
  132. package/dist/plugins/users/index.d.ts +12 -0
  133. package/dist/plugins/users/index.d.ts.map +1 -0
  134. package/dist/plugins/users/index.js +13 -0
  135. package/dist/plugins/users/index.js.map +1 -0
  136. package/dist/plugins/users/stores/index.d.ts +7 -0
  137. package/dist/plugins/users/stores/index.d.ts.map +1 -0
  138. package/dist/plugins/users/stores/index.js +7 -0
  139. package/dist/plugins/users/stores/index.js.map +1 -0
  140. package/dist/plugins/users/stores/postgres-store.d.ts +28 -0
  141. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -0
  142. package/dist/plugins/users/stores/postgres-store.js +157 -0
  143. package/dist/plugins/users/stores/postgres-store.js.map +1 -0
  144. package/dist/plugins/users/types.d.ts +189 -0
  145. package/dist/plugins/users/types.d.ts.map +1 -0
  146. package/dist/plugins/users/types.js +12 -0
  147. package/dist/plugins/users/types.js.map +1 -0
  148. package/dist/plugins/users/users-plugin.d.ts +39 -0
  149. package/dist/plugins/users/users-plugin.d.ts.map +1 -0
  150. package/dist/plugins/users/users-plugin.js +242 -0
  151. package/dist/plugins/users/users-plugin.js.map +1 -0
  152. package/dist-ui/assets/index-Bsp2ntcw.js +465 -0
  153. package/dist-ui/assets/index-Bsp2ntcw.js.map +1 -0
  154. package/dist-ui/index.html +1 -1
  155. package/dist-ui-lib/api/controlPanelApi.d.ts +232 -0
  156. package/dist-ui-lib/components/ControlPanelApp.d.ts +61 -0
  157. package/dist-ui-lib/components/index.d.ts +18 -0
  158. package/dist-ui-lib/config/AppConfig.d.ts +7 -0
  159. package/dist-ui-lib/dashboard/DashboardWidgetRegistry.d.ts +62 -0
  160. package/dist-ui-lib/dashboard/DashboardWidgetRenderer.d.ts +8 -0
  161. package/dist-ui-lib/dashboard/PluginWidgetRenderer.d.ts +19 -0
  162. package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +44 -0
  163. package/dist-ui-lib/dashboard/builtInWidgets.d.ts +19 -0
  164. package/dist-ui-lib/dashboard/index.d.ts +13 -0
  165. package/dist-ui-lib/dashboard/widgets/ServiceHealthWidget.d.ts +12 -0
  166. package/dist-ui-lib/dashboard/widgets/index.d.ts +6 -0
  167. package/dist-ui-lib/index.js +6441 -0
  168. package/dist-ui-lib/index.js.map +1 -0
  169. package/dist-ui-lib/pages/ConfigPage.d.ts +1 -0
  170. package/dist-ui-lib/pages/DashboardPage.d.ts +1 -0
  171. package/dist-ui-lib/pages/DiagnosticsPage.d.ts +1 -0
  172. package/dist-ui-lib/pages/EntitlementsPage.d.ts +17 -0
  173. package/dist-ui-lib/pages/LogsPage.d.ts +1 -0
  174. package/dist-ui-lib/pages/NotFoundPage.d.ts +1 -0
  175. package/dist-ui-lib/pages/PluginPage.d.ts +15 -0
  176. package/dist-ui-lib/pages/SystemPage.d.ts +1 -0
  177. package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
  178. package/package.json +18 -6
  179. package/src/core/control-panel.ts +114 -61
  180. package/src/core/gateway.ts +863 -403
  181. package/src/core/index.ts +21 -2
  182. package/src/core/plugin-registry.ts +653 -0
  183. package/src/core/types.ts +31 -37
  184. package/src/index.ts +118 -19
  185. package/src/plugins/auth/adapters/auth0-adapter.ts +214 -0
  186. package/src/plugins/auth/adapters/basic-adapter.ts +61 -0
  187. package/src/plugins/auth/adapters/index.ts +9 -0
  188. package/src/plugins/auth/adapters/supabase-adapter.ts +141 -0
  189. package/src/plugins/auth/auth-plugin.test.ts +176 -0
  190. package/src/plugins/auth/auth-plugin.ts +303 -0
  191. package/src/plugins/auth/index.ts +33 -0
  192. package/src/plugins/auth/types.ts +165 -0
  193. package/src/plugins/bans/bans-plugin.ts +485 -0
  194. package/src/plugins/bans/index.ts +31 -0
  195. package/src/plugins/bans/stores/index.ts +7 -0
  196. package/src/plugins/bans/stores/postgres-store.ts +195 -0
  197. package/src/plugins/bans/types.ts +141 -0
  198. package/src/plugins/cache-plugin.test.ts +105 -32
  199. package/src/plugins/cache-plugin.ts +40 -9
  200. package/src/plugins/config-plugin.ts +23 -12
  201. package/src/plugins/diagnostics-plugin.ts +22 -12
  202. package/src/plugins/entitlements/entitlements-plugin.ts +820 -0
  203. package/src/plugins/entitlements/index.ts +51 -0
  204. package/src/plugins/entitlements/sources/index.ts +9 -0
  205. package/src/plugins/entitlements/sources/postgres-source.ts +253 -0
  206. package/src/plugins/entitlements/types.ts +256 -0
  207. package/src/plugins/frontend-app-plugin.ts +24 -12
  208. package/src/plugins/health-plugin.ts +27 -7
  209. package/src/plugins/index.ts +106 -4
  210. package/src/plugins/logs-plugin.ts +28 -14
  211. package/src/plugins/postgres-plugin.test.ts +49 -29
  212. package/src/plugins/postgres-plugin.ts +11 -9
  213. package/src/plugins/users/index.ts +35 -0
  214. package/src/plugins/users/stores/index.ts +7 -0
  215. package/src/plugins/users/stores/postgres-store.ts +225 -0
  216. package/src/plugins/users/types.ts +209 -0
  217. package/src/plugins/users/users-plugin.ts +281 -0
  218. package/ui/src/App.tsx +185 -31
  219. package/ui/src/api/controlPanelApi.ts +354 -1
  220. package/ui/src/components/ControlPanelApp.tsx +209 -0
  221. package/ui/src/components/index.ts +62 -0
  222. package/ui/src/dashboard/DashboardWidgetRegistry.tsx +129 -0
  223. package/ui/src/dashboard/DashboardWidgetRenderer.tsx +34 -0
  224. package/ui/src/dashboard/PluginWidgetRenderer.tsx +115 -0
  225. package/ui/src/dashboard/WidgetComponentRegistry.tsx +116 -0
  226. package/ui/src/dashboard/builtInWidgets.tsx +29 -0
  227. package/ui/src/dashboard/index.ts +35 -0
  228. package/ui/src/dashboard/widgets/ServiceHealthWidget.tsx +140 -0
  229. package/ui/src/dashboard/widgets/index.ts +7 -0
  230. package/ui/src/pages/DashboardPage.tsx +28 -149
  231. package/ui/src/pages/EntitlementsPage.tsx +557 -0
  232. package/ui/src/pages/LogsPage.tsx +174 -8
  233. package/ui/src/pages/PluginPage.tsx +148 -0
  234. package/ui/src/pages/SystemPage.tsx +445 -0
  235. package/ui/src/pages/UsersPage.tsx +837 -0
  236. package/ui/tsconfig.lib.json +11 -0
  237. package/ui/vite.lib.config.ts +51 -0
  238. package/dist-ui/assets/index-CW1BviRn.js +0 -465
  239. package/dist-ui/assets/index-CW1BviRn.js.map +0 -1
  240. package/ui/src/pages/HealthPage.tsx +0 -204
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Auth0 Adapter
3
+ *
4
+ * Provides Auth0 authentication using express-openid-connect.
5
+ * Enhanced with RBAC support, domain whitelisting, and token exposure.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ /**
10
+ * Extract user roles from Auth0 claims
11
+ */
12
+ function extractUserRoles(req, domain) {
13
+ const oidc = req.oidc;
14
+ const user = oidc?.user;
15
+ if (!user)
16
+ return [];
17
+ // Check various common locations for roles
18
+ const roles = [];
19
+ // Standard RBAC claim
20
+ if (Array.isArray(user['https://roles'])) {
21
+ roles.push(...user['https://roles']);
22
+ }
23
+ // Namespaced roles (common pattern)
24
+ const namespace = domain ? `https://${domain}/` : '';
25
+ if (namespace && Array.isArray(user[`${namespace}roles`])) {
26
+ roles.push(...user[`${namespace}roles`]);
27
+ }
28
+ // Auth0 authorization extension
29
+ if (Array.isArray(user.roles)) {
30
+ roles.push(...user.roles);
31
+ }
32
+ // Custom claims
33
+ if (Array.isArray(user['custom:roles'])) {
34
+ roles.push(...user['custom:roles']);
35
+ }
36
+ return [...new Set(roles)]; // Deduplicate
37
+ }
38
+ /**
39
+ * Create an Auth0 authentication adapter
40
+ */
41
+ export function auth0Adapter(config) {
42
+ let authMiddleware = null;
43
+ let initializationError = null;
44
+ const adapter = {
45
+ name: 'auth0',
46
+ initialize() {
47
+ // Return a middleware that lazily initializes Auth0
48
+ return async (req, res, next) => {
49
+ // Skip if already initialized with error
50
+ if (initializationError) {
51
+ return res.status(500).json({
52
+ error: 'Auth Configuration Error',
53
+ message: 'Auth0 is not properly configured.',
54
+ });
55
+ }
56
+ // Lazy initialize the Auth0 middleware
57
+ if (!authMiddleware) {
58
+ try {
59
+ const { auth } = await import('express-openid-connect');
60
+ const authConfig = {
61
+ authRequired: false, // We handle auth requirement ourselves
62
+ auth0Logout: true,
63
+ secret: config.secret,
64
+ baseURL: config.baseUrl,
65
+ clientID: config.clientId,
66
+ issuerBaseURL: `https://${config.domain}`,
67
+ clientSecret: config.clientSecret,
68
+ idpLogout: true,
69
+ routes: {
70
+ login: config.routes?.login || '/login',
71
+ logout: config.routes?.logout || '/logout',
72
+ callback: config.routes?.callback || '/callback',
73
+ },
74
+ };
75
+ // Add audience if specified (for API access tokens)
76
+ if (config.audience) {
77
+ authConfig.authorizationParams = {
78
+ audience: config.audience,
79
+ scope: (config.scopes || ['openid', 'profile', 'email']).join(' '),
80
+ };
81
+ }
82
+ // Enable access token fetching if needed
83
+ if (config.exposeAccessToken && config.audience) {
84
+ authConfig.afterCallback = (_req, _res, session) => {
85
+ // Access token is automatically stored in session
86
+ return session;
87
+ };
88
+ }
89
+ authMiddleware = auth(authConfig);
90
+ }
91
+ catch (error) {
92
+ initializationError =
93
+ error instanceof Error ? error : new Error('Failed to initialize Auth0');
94
+ console.error('[Auth0Adapter] Initialization error:', error);
95
+ return res.status(500).json({
96
+ error: 'Auth Configuration Error',
97
+ message: 'Auth0 is not properly configured. Install express-openid-connect package.',
98
+ });
99
+ }
100
+ }
101
+ // Apply the Auth0 middleware
102
+ authMiddleware(req, res, next);
103
+ };
104
+ },
105
+ isAuthenticated(req) {
106
+ const oidc = req.oidc;
107
+ if (!oidc?.isAuthenticated()) {
108
+ return false;
109
+ }
110
+ // Check domain whitelist if configured
111
+ if (config.allowedDomains && config.allowedDomains.length > 0) {
112
+ const email = oidc.user?.email;
113
+ if (!email)
114
+ return false;
115
+ const domain = email.split('@')[1];
116
+ if (!config.allowedDomains.includes(domain) && !config.allowedDomains.includes(`@${domain}`)) {
117
+ return false;
118
+ }
119
+ }
120
+ // Check role whitelist if configured
121
+ if (config.allowedRoles && config.allowedRoles.length > 0) {
122
+ const userRoles = extractUserRoles(req, config.domain);
123
+ const hasRole = config.allowedRoles.some((role) => userRoles.includes(role));
124
+ if (!hasRole) {
125
+ return false;
126
+ }
127
+ }
128
+ return true;
129
+ },
130
+ getUser(req) {
131
+ const oidc = req.oidc;
132
+ if (!adapter.isAuthenticated(req)) {
133
+ return null;
134
+ }
135
+ const user = oidc.user;
136
+ if (!user)
137
+ return null;
138
+ return {
139
+ id: user.sub,
140
+ email: user.email,
141
+ name: user.name || user.nickname,
142
+ picture: user.picture,
143
+ emailVerified: user.email_verified,
144
+ roles: extractUserRoles(req, config.domain),
145
+ raw: user,
146
+ };
147
+ },
148
+ hasRoles(req, roles) {
149
+ const userRoles = extractUserRoles(req, config.domain);
150
+ return roles.every((role) => userRoles.includes(role));
151
+ },
152
+ getAccessToken(req) {
153
+ if (!config.exposeAccessToken) {
154
+ return null;
155
+ }
156
+ const oidc = req.oidc;
157
+ return oidc?.accessToken?.access_token || null;
158
+ },
159
+ onUnauthorized(req, res) {
160
+ // Check if it's an API request
161
+ const isApiRequest = req.headers.accept?.includes('application/json') || req.path.startsWith('/api/');
162
+ if (isApiRequest) {
163
+ res.status(401).json({
164
+ error: 'Unauthorized',
165
+ message: 'Authentication required',
166
+ loginUrl: config.routes?.login || '/login',
167
+ });
168
+ }
169
+ else {
170
+ // Redirect to login for browser requests
171
+ const loginPath = config.routes?.login || '/login';
172
+ const returnTo = encodeURIComponent(req.originalUrl);
173
+ res.redirect(`${loginPath}?returnTo=${returnTo}`);
174
+ }
175
+ },
176
+ };
177
+ return adapter;
178
+ }
179
+ //# sourceMappingURL=auth0-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth0-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/auth0-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Basic Auth Adapter
3
+ *
4
+ * Provides HTTP Basic authentication for simple use cases.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ import type { AuthAdapter, BasicAdapterConfig } from '../types.js';
9
+ /**
10
+ * Create a Basic authentication adapter
11
+ */
12
+ export declare function basicAdapter(config: BasicAdapterConfig): AuthAdapter;
13
+ //# sourceMappingURL=basic-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/basic-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,WAAW,CA8CpE"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Basic Auth Adapter
3
+ *
4
+ * Provides HTTP Basic authentication for simple use cases.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ /**
9
+ * Create a Basic authentication adapter
10
+ */
11
+ export function basicAdapter(config) {
12
+ const expectedAuth = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString('base64')}`;
13
+ const realm = config.realm || 'Protected';
14
+ // Create a static user for basic auth
15
+ const staticUser = {
16
+ id: 'basic-auth-user',
17
+ email: `${config.username}@localhost`,
18
+ name: config.username,
19
+ roles: ['admin'], // Basic auth users typically have full access
20
+ };
21
+ return {
22
+ name: 'basic',
23
+ initialize() {
24
+ // Basic auth doesn't need initialization middleware
25
+ // Just return a pass-through middleware
26
+ return (_req, _res, next) => next();
27
+ },
28
+ isAuthenticated(req) {
29
+ const authHeader = req.headers.authorization;
30
+ return authHeader === expectedAuth;
31
+ },
32
+ getUser(req) {
33
+ if (!this.isAuthenticated(req)) {
34
+ return null;
35
+ }
36
+ return staticUser;
37
+ },
38
+ hasRoles(_req, roles) {
39
+ // Basic auth user has 'admin' role
40
+ return roles.every((role) => staticUser.roles?.includes(role));
41
+ },
42
+ onUnauthorized(_req, res) {
43
+ res.setHeader('WWW-Authenticate', `Basic realm="${realm}"`);
44
+ res.status(401).json({
45
+ error: 'Unauthorized',
46
+ message: 'Authentication required.',
47
+ });
48
+ },
49
+ };
50
+ }
51
+ //# sourceMappingURL=basic-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/basic-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,YAAY,GAAG,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC;IAE1C,sCAAsC;IACtC,MAAM,UAAU,GAAsB;QACpC,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,YAAY;QACrC,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,8CAA8C;KACjE,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,OAAO;QAEb,UAAU;YACR,oDAAoD;YACpD,wCAAwC;YACxC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAED,eAAe,CAAC,GAAY;YAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;YAC7C,OAAO,UAAU,KAAK,YAAY,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,GAAY;YAClB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,QAAQ,CAAC,IAAa,EAAE,KAAe;YACrC,mCAAmC;YACnC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,cAAc,CAAC,IAAa,EAAE,GAAa;YACzC,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,KAAK,GAAG,CAAC,CAAC;YAC5D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Auth Adapters Index
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+ export { auth0Adapter } from './auth0-adapter.js';
7
+ export { basicAdapter } from './basic-adapter.js';
8
+ export { supabaseAdapter } from './supabase-adapter.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Auth Adapters Index
3
+ *
4
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
+ */
6
+ export { auth0Adapter } from './auth0-adapter.js';
7
+ export { basicAdapter } from './basic-adapter.js';
8
+ export { supabaseAdapter } from './supabase-adapter.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Supabase Auth Adapter
3
+ *
4
+ * Provides Supabase authentication using JWT validation.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ import type { AuthAdapter, SupabaseAdapterConfig } from '../types.js';
9
+ /**
10
+ * Create a Supabase authentication adapter
11
+ */
12
+ export declare function supabaseAdapter(config: SupabaseAdapterConfig): AuthAdapter;
13
+ //# sourceMappingURL=supabase-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supabase-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAqB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,WAAW,CA8H1E"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Supabase Auth Adapter
3
+ *
4
+ * Provides Supabase authentication using JWT validation.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ /**
9
+ * Create a Supabase authentication adapter
10
+ */
11
+ export function supabaseAdapter(config) {
12
+ // Cache for validated users (short TTL to avoid stale data)
13
+ const userCache = new Map();
14
+ const CACHE_TTL = 60 * 1000; // 1 minute
15
+ return {
16
+ name: 'supabase',
17
+ initialize() {
18
+ // Supabase validation happens per-request, no initialization needed
19
+ return (_req, _res, next) => next();
20
+ },
21
+ isAuthenticated(req) {
22
+ // Check if we already validated this request
23
+ if (req._supabaseUser) {
24
+ return true;
25
+ }
26
+ const authHeader = req.headers.authorization;
27
+ return !!authHeader && authHeader.startsWith('Bearer ');
28
+ },
29
+ async getUser(req) {
30
+ // Return cached user if available
31
+ if (req._supabaseUser) {
32
+ return req._supabaseUser;
33
+ }
34
+ const authHeader = req.headers.authorization;
35
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
36
+ return null;
37
+ }
38
+ const token = authHeader.substring(7);
39
+ // Check token cache
40
+ const cached = userCache.get(token);
41
+ if (cached && cached.expires > Date.now()) {
42
+ req._supabaseUser = cached.user;
43
+ return cached.user;
44
+ }
45
+ try {
46
+ // Validate the JWT with Supabase
47
+ const response = await fetch(`${config.url}/auth/v1/user`, {
48
+ headers: {
49
+ Authorization: `Bearer ${token}`,
50
+ apikey: config.anonKey,
51
+ },
52
+ });
53
+ if (!response.ok) {
54
+ return null;
55
+ }
56
+ const supabaseUser = (await response.json());
57
+ const user = {
58
+ id: supabaseUser.id,
59
+ email: supabaseUser.email,
60
+ name: supabaseUser.user_metadata?.full_name || supabaseUser.user_metadata?.name,
61
+ picture: supabaseUser.user_metadata?.avatar_url,
62
+ emailVerified: !!supabaseUser.email_confirmed_at,
63
+ roles: supabaseUser.app_metadata?.roles || [],
64
+ raw: supabaseUser,
65
+ };
66
+ // Cache the validated user
67
+ userCache.set(token, { user, expires: Date.now() + CACHE_TTL });
68
+ req._supabaseUser = user;
69
+ // Cleanup old cache entries periodically
70
+ if (userCache.size > 1000) {
71
+ const now = Date.now();
72
+ for (const [key, value] of userCache) {
73
+ if (value.expires < now) {
74
+ userCache.delete(key);
75
+ }
76
+ }
77
+ }
78
+ return user;
79
+ }
80
+ catch (error) {
81
+ console.error('[SupabaseAdapter] Token validation error:', error);
82
+ return null;
83
+ }
84
+ },
85
+ hasRoles(req, roles) {
86
+ const user = req._supabaseUser;
87
+ if (!user?.roles)
88
+ return false;
89
+ return roles.every((role) => user.roles?.includes(role));
90
+ },
91
+ getAccessToken(req) {
92
+ const authHeader = req.headers.authorization;
93
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
94
+ return null;
95
+ }
96
+ return authHeader.substring(7);
97
+ },
98
+ onUnauthorized(_req, res) {
99
+ res.status(401).json({
100
+ error: 'Unauthorized',
101
+ message: 'Missing or invalid authorization header. Expected: Bearer <token>',
102
+ });
103
+ },
104
+ async shutdown() {
105
+ userCache.clear();
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=supabase-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/auth/adapters/supabase-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
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
+ import type { Request, RequestHandler } from 'express';
10
+ import type { Plugin } from '../../core/plugin-registry.js';
11
+ import type { AuthPluginConfig, AuthenticatedUser } from './types.js';
12
+ /**
13
+ * Create the Auth plugin
14
+ */
15
+ export declare function createAuthPlugin(config: AuthPluginConfig): Plugin;
16
+ /**
17
+ * Check if the current request is authenticated
18
+ */
19
+ export declare function isAuthenticated(req: Request): boolean;
20
+ /**
21
+ * Get the authenticated user from the request
22
+ */
23
+ export declare function getAuthenticatedUser(req: Request): AuthenticatedUser | null;
24
+ /**
25
+ * Get the access token from the request
26
+ */
27
+ export declare function getAccessToken(req: Request): string | null;
28
+ /**
29
+ * Middleware to require authentication
30
+ */
31
+ export declare function requireAuth(): RequestHandler;
32
+ /**
33
+ * Middleware to require specific roles
34
+ */
35
+ export declare function requireRoles(...roles: string[]): RequestHandler;
36
+ /**
37
+ * Middleware to require any of the specified roles
38
+ */
39
+ export declare function requireAnyRole(...roles: string[]): RequestHandler;
40
+ //# sourceMappingURL=auth-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/auth-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAA0B,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EACV,gBAAgB,EAEhB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAsLjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAG3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAG1D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAU5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAuB/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAuBjE"}