@qwickapps/server 1.2.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.
Files changed (299) hide show
  1. package/README.md +392 -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 +120 -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 +307 -0
  15. package/dist/core/plugin-registry.d.ts.map +1 -0
  16. package/dist/core/plugin-registry.js +352 -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 +10 -0
  33. package/dist/plugins/auth/adapters/index.d.ts.map +1 -0
  34. package/dist/plugins/auth/adapters/index.js +10 -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/adapters/supertokens-adapter.d.ts +18 -0
  41. package/dist/plugins/auth/adapters/supertokens-adapter.d.ts.map +1 -0
  42. package/dist/plugins/auth/adapters/supertokens-adapter.js +267 -0
  43. package/dist/plugins/auth/adapters/supertokens-adapter.js.map +1 -0
  44. package/dist/plugins/auth/auth-plugin.d.ts +40 -0
  45. package/dist/plugins/auth/auth-plugin.d.ts.map +1 -0
  46. package/dist/plugins/auth/auth-plugin.js +255 -0
  47. package/dist/plugins/auth/auth-plugin.js.map +1 -0
  48. package/dist/plugins/auth/auth-plugin.test.d.ts +9 -0
  49. package/dist/plugins/auth/auth-plugin.test.d.ts.map +1 -0
  50. package/dist/plugins/auth/auth-plugin.test.js +147 -0
  51. package/dist/plugins/auth/auth-plugin.test.js.map +1 -0
  52. package/dist/plugins/auth/env-config.d.ts +88 -0
  53. package/dist/plugins/auth/env-config.d.ts.map +1 -0
  54. package/dist/plugins/auth/env-config.js +489 -0
  55. package/dist/plugins/auth/env-config.js.map +1 -0
  56. package/dist/plugins/auth/index.d.ts +14 -0
  57. package/dist/plugins/auth/index.d.ts.map +1 -0
  58. package/dist/plugins/auth/index.js +16 -0
  59. package/dist/plugins/auth/index.js.map +1 -0
  60. package/dist/plugins/auth/supertokens-adapter.test.d.ts +10 -0
  61. package/dist/plugins/auth/supertokens-adapter.test.d.ts.map +1 -0
  62. package/dist/plugins/auth/supertokens-adapter.test.js +486 -0
  63. package/dist/plugins/auth/supertokens-adapter.test.js.map +1 -0
  64. package/dist/plugins/auth/types.d.ts +218 -0
  65. package/dist/plugins/auth/types.d.ts.map +1 -0
  66. package/dist/plugins/auth/types.js +14 -0
  67. package/dist/plugins/auth/types.js.map +1 -0
  68. package/dist/plugins/bans/bans-plugin.d.ts +59 -0
  69. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -0
  70. package/dist/plugins/bans/bans-plugin.js +428 -0
  71. package/dist/plugins/bans/bans-plugin.js.map +1 -0
  72. package/dist/plugins/bans/index.d.ts +9 -0
  73. package/dist/plugins/bans/index.d.ts.map +1 -0
  74. package/dist/plugins/bans/index.js +10 -0
  75. package/dist/plugins/bans/index.js.map +1 -0
  76. package/dist/plugins/bans/stores/index.d.ts +7 -0
  77. package/dist/plugins/bans/stores/index.d.ts.map +1 -0
  78. package/dist/plugins/bans/stores/index.js +7 -0
  79. package/dist/plugins/bans/stores/index.js.map +1 -0
  80. package/dist/plugins/bans/stores/postgres-store.d.ts +29 -0
  81. package/dist/plugins/bans/stores/postgres-store.d.ts.map +1 -0
  82. package/dist/plugins/bans/stores/postgres-store.js +132 -0
  83. package/dist/plugins/bans/stores/postgres-store.js.map +1 -0
  84. package/dist/plugins/bans/types.d.ts +128 -0
  85. package/dist/plugins/bans/types.d.ts.map +1 -0
  86. package/dist/plugins/bans/types.js +11 -0
  87. package/dist/plugins/bans/types.js.map +1 -0
  88. package/dist/plugins/cache-plugin.d.ts +14 -3
  89. package/dist/plugins/cache-plugin.d.ts.map +1 -1
  90. package/dist/plugins/cache-plugin.js +27 -7
  91. package/dist/plugins/cache-plugin.js.map +1 -1
  92. package/dist/plugins/cache-plugin.test.js +99 -32
  93. package/dist/plugins/cache-plugin.test.js.map +1 -1
  94. package/dist/plugins/config-plugin.d.ts +3 -2
  95. package/dist/plugins/config-plugin.d.ts.map +1 -1
  96. package/dist/plugins/config-plugin.js +17 -10
  97. package/dist/plugins/config-plugin.js.map +1 -1
  98. package/dist/plugins/diagnostics-plugin.d.ts +2 -2
  99. package/dist/plugins/diagnostics-plugin.d.ts.map +1 -1
  100. package/dist/plugins/diagnostics-plugin.js +17 -10
  101. package/dist/plugins/diagnostics-plugin.js.map +1 -1
  102. package/dist/plugins/entitlements/entitlements-plugin.d.ts +95 -0
  103. package/dist/plugins/entitlements/entitlements-plugin.d.ts.map +1 -0
  104. package/dist/plugins/entitlements/entitlements-plugin.js +707 -0
  105. package/dist/plugins/entitlements/entitlements-plugin.js.map +1 -0
  106. package/dist/plugins/entitlements/index.d.ts +12 -0
  107. package/dist/plugins/entitlements/index.d.ts.map +1 -0
  108. package/dist/plugins/entitlements/index.js +16 -0
  109. package/dist/plugins/entitlements/index.js.map +1 -0
  110. package/dist/plugins/entitlements/sources/index.d.ts +9 -0
  111. package/dist/plugins/entitlements/sources/index.d.ts.map +1 -0
  112. package/dist/plugins/entitlements/sources/index.js +9 -0
  113. package/dist/plugins/entitlements/sources/index.js.map +1 -0
  114. package/dist/plugins/entitlements/sources/postgres-source.d.ts +29 -0
  115. package/dist/plugins/entitlements/sources/postgres-source.d.ts.map +1 -0
  116. package/dist/plugins/entitlements/sources/postgres-source.js +169 -0
  117. package/dist/plugins/entitlements/sources/postgres-source.js.map +1 -0
  118. package/dist/plugins/entitlements/types.d.ts +232 -0
  119. package/dist/plugins/entitlements/types.d.ts.map +1 -0
  120. package/dist/plugins/entitlements/types.js +11 -0
  121. package/dist/plugins/entitlements/types.js.map +1 -0
  122. package/dist/plugins/frontend-app-plugin.d.ts +9 -3
  123. package/dist/plugins/frontend-app-plugin.d.ts.map +1 -1
  124. package/dist/plugins/frontend-app-plugin.js +14 -9
  125. package/dist/plugins/frontend-app-plugin.js.map +1 -1
  126. package/dist/plugins/health-plugin.d.ts +5 -2
  127. package/dist/plugins/health-plugin.d.ts.map +1 -1
  128. package/dist/plugins/health-plugin.js +20 -5
  129. package/dist/plugins/health-plugin.js.map +1 -1
  130. package/dist/plugins/index.d.ts +10 -2
  131. package/dist/plugins/index.d.ts.map +1 -1
  132. package/dist/plugins/index.js +10 -2
  133. package/dist/plugins/index.js.map +1 -1
  134. package/dist/plugins/logs-plugin.d.ts +3 -2
  135. package/dist/plugins/logs-plugin.d.ts.map +1 -1
  136. package/dist/plugins/logs-plugin.js +21 -12
  137. package/dist/plugins/logs-plugin.js.map +1 -1
  138. package/dist/plugins/postgres-plugin.d.ts +3 -3
  139. package/dist/plugins/postgres-plugin.d.ts.map +1 -1
  140. package/dist/plugins/postgres-plugin.js +9 -7
  141. package/dist/plugins/postgres-plugin.js.map +1 -1
  142. package/dist/plugins/postgres-plugin.test.js +50 -29
  143. package/dist/plugins/postgres-plugin.test.js.map +1 -1
  144. package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts +7 -0
  145. package/dist/plugins/preferences/__tests__/deep-merge.test.d.ts.map +1 -0
  146. package/dist/plugins/preferences/__tests__/deep-merge.test.js +215 -0
  147. package/dist/plugins/preferences/__tests__/deep-merge.test.js.map +1 -0
  148. package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts +7 -0
  149. package/dist/plugins/preferences/__tests__/preferences-plugin.test.d.ts.map +1 -0
  150. package/dist/plugins/preferences/__tests__/preferences-plugin.test.js +265 -0
  151. package/dist/plugins/preferences/__tests__/preferences-plugin.test.js.map +1 -0
  152. package/dist/plugins/preferences/index.d.ts +12 -0
  153. package/dist/plugins/preferences/index.d.ts.map +1 -0
  154. package/dist/plugins/preferences/index.js +13 -0
  155. package/dist/plugins/preferences/index.js.map +1 -0
  156. package/dist/plugins/preferences/preferences-plugin.d.ts +39 -0
  157. package/dist/plugins/preferences/preferences-plugin.d.ts.map +1 -0
  158. package/dist/plugins/preferences/preferences-plugin.js +226 -0
  159. package/dist/plugins/preferences/preferences-plugin.js.map +1 -0
  160. package/dist/plugins/preferences/stores/index.d.ts +9 -0
  161. package/dist/plugins/preferences/stores/index.d.ts.map +1 -0
  162. package/dist/plugins/preferences/stores/index.js +9 -0
  163. package/dist/plugins/preferences/stores/index.js.map +1 -0
  164. package/dist/plugins/preferences/stores/postgres-store.d.ts +41 -0
  165. package/dist/plugins/preferences/stores/postgres-store.d.ts.map +1 -0
  166. package/dist/plugins/preferences/stores/postgres-store.js +181 -0
  167. package/dist/plugins/preferences/stores/postgres-store.js.map +1 -0
  168. package/dist/plugins/preferences/types.d.ts +91 -0
  169. package/dist/plugins/preferences/types.d.ts.map +1 -0
  170. package/dist/plugins/preferences/types.js +10 -0
  171. package/dist/plugins/preferences/types.js.map +1 -0
  172. package/dist/plugins/users/__tests__/users-plugin.test.d.ts +9 -0
  173. package/dist/plugins/users/__tests__/users-plugin.test.d.ts.map +1 -0
  174. package/dist/plugins/users/__tests__/users-plugin.test.js +546 -0
  175. package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -0
  176. package/dist/plugins/users/index.d.ts +12 -0
  177. package/dist/plugins/users/index.d.ts.map +1 -0
  178. package/dist/plugins/users/index.js +13 -0
  179. package/dist/plugins/users/index.js.map +1 -0
  180. package/dist/plugins/users/stores/index.d.ts +7 -0
  181. package/dist/plugins/users/stores/index.d.ts.map +1 -0
  182. package/dist/plugins/users/stores/index.js +7 -0
  183. package/dist/plugins/users/stores/index.js.map +1 -0
  184. package/dist/plugins/users/stores/postgres-store.d.ts +28 -0
  185. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -0
  186. package/dist/plugins/users/stores/postgres-store.js +157 -0
  187. package/dist/plugins/users/stores/postgres-store.js.map +1 -0
  188. package/dist/plugins/users/types.d.ts +225 -0
  189. package/dist/plugins/users/types.d.ts.map +1 -0
  190. package/dist/plugins/users/types.js +12 -0
  191. package/dist/plugins/users/types.js.map +1 -0
  192. package/dist/plugins/users/users-plugin.d.ts +45 -0
  193. package/dist/plugins/users/users-plugin.d.ts.map +1 -0
  194. package/dist/plugins/users/users-plugin.js +359 -0
  195. package/dist/plugins/users/users-plugin.js.map +1 -0
  196. package/dist-ui/assets/index-BY8OxNgO.js +465 -0
  197. package/dist-ui/assets/index-BY8OxNgO.js.map +1 -0
  198. package/dist-ui/index.html +1 -1
  199. package/dist-ui-lib/api/controlPanelApi.d.ts +278 -0
  200. package/dist-ui-lib/components/ControlPanelApp.d.ts +61 -0
  201. package/dist-ui-lib/components/index.d.ts +18 -0
  202. package/dist-ui-lib/config/AppConfig.d.ts +7 -0
  203. package/dist-ui-lib/dashboard/DashboardWidgetRegistry.d.ts +62 -0
  204. package/dist-ui-lib/dashboard/DashboardWidgetRenderer.d.ts +8 -0
  205. package/dist-ui-lib/dashboard/PluginWidgetRenderer.d.ts +19 -0
  206. package/dist-ui-lib/dashboard/WidgetComponentRegistry.d.ts +48 -0
  207. package/dist-ui-lib/dashboard/builtInWidgets.d.ts +25 -0
  208. package/dist-ui-lib/dashboard/index.d.ts +13 -0
  209. package/dist-ui-lib/dashboard/widgets/ServiceHealthWidget.d.ts +12 -0
  210. package/dist-ui-lib/dashboard/widgets/index.d.ts +6 -0
  211. package/dist-ui-lib/index.js +5172 -0
  212. package/dist-ui-lib/index.js.map +1 -0
  213. package/dist-ui-lib/pages/AuthPage.d.ts +1 -0
  214. package/dist-ui-lib/pages/ConfigPage.d.ts +1 -0
  215. package/dist-ui-lib/pages/DashboardPage.d.ts +1 -0
  216. package/dist-ui-lib/pages/DiagnosticsPage.d.ts +1 -0
  217. package/dist-ui-lib/pages/EntitlementsPage.d.ts +17 -0
  218. package/dist-ui-lib/pages/LogsPage.d.ts +1 -0
  219. package/dist-ui-lib/pages/NotFoundPage.d.ts +1 -0
  220. package/dist-ui-lib/pages/PluginPage.d.ts +15 -0
  221. package/dist-ui-lib/pages/PluginsPage.d.ts +1 -0
  222. package/dist-ui-lib/pages/SystemPage.d.ts +1 -0
  223. package/dist-ui-lib/pages/UsersPage.d.ts +22 -0
  224. package/package.json +24 -7
  225. package/src/core/control-panel.ts +145 -61
  226. package/src/core/gateway.ts +863 -403
  227. package/src/core/index.ts +21 -2
  228. package/src/core/plugin-registry.ts +716 -0
  229. package/src/core/types.ts +31 -37
  230. package/src/index.ts +125 -19
  231. package/src/plugins/auth/adapters/auth0-adapter.ts +214 -0
  232. package/src/plugins/auth/adapters/basic-adapter.ts +61 -0
  233. package/src/plugins/auth/adapters/index.ts +10 -0
  234. package/src/plugins/auth/adapters/supabase-adapter.ts +149 -0
  235. package/src/plugins/auth/adapters/supertokens-adapter.ts +326 -0
  236. package/src/plugins/auth/auth-plugin.test.ts +176 -0
  237. package/src/plugins/auth/auth-plugin.ts +303 -0
  238. package/src/plugins/auth/env-config.ts +572 -0
  239. package/src/plugins/auth/index.ts +42 -0
  240. package/src/plugins/auth/supertokens-adapter.test.ts +621 -0
  241. package/src/plugins/auth/types.ts +245 -0
  242. package/src/plugins/bans/bans-plugin.ts +485 -0
  243. package/src/plugins/bans/index.ts +31 -0
  244. package/src/plugins/bans/stores/index.ts +7 -0
  245. package/src/plugins/bans/stores/postgres-store.ts +195 -0
  246. package/src/plugins/bans/types.ts +141 -0
  247. package/src/plugins/cache-plugin.test.ts +108 -32
  248. package/src/plugins/cache-plugin.ts +40 -9
  249. package/src/plugins/config-plugin.ts +23 -12
  250. package/src/plugins/diagnostics-plugin.ts +22 -12
  251. package/src/plugins/entitlements/entitlements-plugin.ts +820 -0
  252. package/src/plugins/entitlements/index.ts +51 -0
  253. package/src/plugins/entitlements/sources/index.ts +9 -0
  254. package/src/plugins/entitlements/sources/postgres-source.ts +253 -0
  255. package/src/plugins/entitlements/types.ts +256 -0
  256. package/src/plugins/frontend-app-plugin.ts +24 -12
  257. package/src/plugins/health-plugin.ts +27 -7
  258. package/src/plugins/index.ts +132 -4
  259. package/src/plugins/logs-plugin.ts +28 -14
  260. package/src/plugins/postgres-plugin.test.ts +52 -29
  261. package/src/plugins/postgres-plugin.ts +11 -9
  262. package/src/plugins/preferences/__tests__/deep-merge.test.ts +242 -0
  263. package/src/plugins/preferences/__tests__/preferences-plugin.test.ts +350 -0
  264. package/src/plugins/preferences/index.ts +30 -0
  265. package/src/plugins/preferences/preferences-plugin.ts +270 -0
  266. package/src/plugins/preferences/stores/index.ts +9 -0
  267. package/src/plugins/preferences/stores/postgres-store.ts +252 -0
  268. package/src/plugins/preferences/types.ts +100 -0
  269. package/src/plugins/users/__tests__/users-plugin.test.ts +690 -0
  270. package/src/plugins/users/index.ts +38 -0
  271. package/src/plugins/users/stores/index.ts +7 -0
  272. package/src/plugins/users/stores/postgres-store.ts +225 -0
  273. package/src/plugins/users/types.ts +247 -0
  274. package/src/plugins/users/users-plugin.ts +418 -0
  275. package/ui/src/App.tsx +188 -31
  276. package/ui/src/api/controlPanelApi.ts +453 -1
  277. package/ui/src/components/ControlPanelApp.tsx +212 -0
  278. package/ui/src/components/index.ts +62 -0
  279. package/ui/src/dashboard/DashboardWidgetRegistry.tsx +129 -0
  280. package/ui/src/dashboard/DashboardWidgetRenderer.tsx +34 -0
  281. package/ui/src/dashboard/PluginWidgetRenderer.tsx +118 -0
  282. package/ui/src/dashboard/WidgetComponentRegistry.tsx +120 -0
  283. package/ui/src/dashboard/builtInWidgets.tsx +35 -0
  284. package/ui/src/dashboard/index.ts +35 -0
  285. package/ui/src/dashboard/widgets/ServiceHealthWidget.tsx +140 -0
  286. package/ui/src/dashboard/widgets/index.ts +7 -0
  287. package/ui/src/pages/AuthPage.tsx +259 -0
  288. package/ui/src/pages/DashboardPage.tsx +28 -149
  289. package/ui/src/pages/EntitlementsPage.tsx +557 -0
  290. package/ui/src/pages/LogsPage.tsx +174 -8
  291. package/ui/src/pages/PluginPage.tsx +148 -0
  292. package/ui/src/pages/PluginsPage.tsx +394 -0
  293. package/ui/src/pages/SystemPage.tsx +445 -0
  294. package/ui/src/pages/UsersPage.tsx +837 -0
  295. package/ui/tsconfig.lib.json +11 -0
  296. package/ui/vite.lib.config.ts +56 -0
  297. package/dist-ui/assets/index-CW1BviRn.js +0 -465
  298. package/dist-ui/assets/index-CW1BviRn.js.map +0 -1
  299. package/ui/src/pages/HealthPage.tsx +0 -204
@@ -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,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"}
@@ -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,9 @@
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
+ export {};
9
+ //# sourceMappingURL=auth-plugin.test.d.ts.map
@@ -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"}