@qwickapps/server 1.3.1 → 1.5.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 (395) hide show
  1. package/README.md +157 -0
  2. package/dist/core/control-panel.d.ts.map +1 -1
  3. package/dist/core/control-panel.js +114 -0
  4. package/dist/core/control-panel.js.map +1 -1
  5. package/dist/core/types.d.ts +19 -0
  6. package/dist/core/types.d.ts.map +1 -1
  7. package/dist/index.d.ts +2 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +15 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/plugins/auth/adapter-wrapper.d.ts +47 -0
  12. package/dist/plugins/auth/adapter-wrapper.d.ts.map +1 -0
  13. package/dist/plugins/auth/adapter-wrapper.js +166 -0
  14. package/dist/plugins/auth/adapter-wrapper.js.map +1 -0
  15. package/dist/plugins/auth/adapter-wrapper.test.d.ts +7 -0
  16. package/dist/plugins/auth/adapter-wrapper.test.d.ts.map +1 -0
  17. package/dist/plugins/auth/adapter-wrapper.test.js +303 -0
  18. package/dist/plugins/auth/adapter-wrapper.test.js.map +1 -0
  19. package/dist/plugins/auth/config-store.d.ts +11 -0
  20. package/dist/plugins/auth/config-store.d.ts.map +1 -0
  21. package/dist/plugins/auth/config-store.js +232 -0
  22. package/dist/plugins/auth/config-store.js.map +1 -0
  23. package/dist/plugins/auth/config-store.test.d.ts +7 -0
  24. package/dist/plugins/auth/config-store.test.d.ts.map +1 -0
  25. package/dist/plugins/auth/config-store.test.js +299 -0
  26. package/dist/plugins/auth/config-store.test.js.map +1 -0
  27. package/dist/plugins/auth/env-config.d.ts +51 -1
  28. package/dist/plugins/auth/env-config.d.ts.map +1 -1
  29. package/dist/plugins/auth/env-config.js +640 -7
  30. package/dist/plugins/auth/env-config.js.map +1 -1
  31. package/dist/plugins/auth/index.d.ts +6 -2
  32. package/dist/plugins/auth/index.d.ts.map +1 -1
  33. package/dist/plugins/auth/index.js +5 -1
  34. package/dist/plugins/auth/index.js.map +1 -1
  35. package/dist/plugins/auth/types.d.ts +106 -0
  36. package/dist/plugins/auth/types.d.ts.map +1 -1
  37. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -1
  38. package/dist/plugins/bans/bans-plugin.js +12 -3
  39. package/dist/plugins/bans/bans-plugin.js.map +1 -1
  40. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +11 -0
  41. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +1 -0
  42. package/dist/plugins/devices/__tests__/devices-plugin.test.js +410 -0
  43. package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +1 -0
  44. package/dist/plugins/devices/__tests__/token-utils.test.d.ts +7 -0
  45. package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +1 -0
  46. package/dist/plugins/devices/__tests__/token-utils.test.js +197 -0
  47. package/dist/plugins/devices/__tests__/token-utils.test.js.map +1 -0
  48. package/dist/plugins/devices/adapters/compute-adapter.d.ts +36 -0
  49. package/dist/plugins/devices/adapters/compute-adapter.d.ts.map +1 -0
  50. package/dist/plugins/devices/adapters/compute-adapter.js +100 -0
  51. package/dist/plugins/devices/adapters/compute-adapter.js.map +1 -0
  52. package/dist/plugins/devices/adapters/index.d.ts +12 -0
  53. package/dist/plugins/devices/adapters/index.d.ts.map +1 -0
  54. package/dist/plugins/devices/adapters/index.js +10 -0
  55. package/dist/plugins/devices/adapters/index.js.map +1 -0
  56. package/dist/plugins/devices/adapters/mobile-adapter.d.ts +41 -0
  57. package/dist/plugins/devices/adapters/mobile-adapter.d.ts.map +1 -0
  58. package/dist/plugins/devices/adapters/mobile-adapter.js +131 -0
  59. package/dist/plugins/devices/adapters/mobile-adapter.js.map +1 -0
  60. package/dist/plugins/devices/devices-plugin.d.ts +70 -0
  61. package/dist/plugins/devices/devices-plugin.d.ts.map +1 -0
  62. package/dist/plugins/devices/devices-plugin.js +453 -0
  63. package/dist/plugins/devices/devices-plugin.js.map +1 -0
  64. package/dist/plugins/devices/index.d.ts +18 -0
  65. package/dist/plugins/devices/index.d.ts.map +1 -0
  66. package/dist/plugins/devices/index.js +18 -0
  67. package/dist/plugins/devices/index.js.map +1 -0
  68. package/dist/plugins/devices/stores/index.d.ts +9 -0
  69. package/dist/plugins/devices/stores/index.d.ts.map +1 -0
  70. package/dist/plugins/devices/stores/index.js +9 -0
  71. package/dist/plugins/devices/stores/index.js.map +1 -0
  72. package/dist/plugins/devices/stores/postgres-store.d.ts +26 -0
  73. package/dist/plugins/devices/stores/postgres-store.d.ts.map +1 -0
  74. package/dist/plugins/devices/stores/postgres-store.js +199 -0
  75. package/dist/plugins/devices/stores/postgres-store.js.map +1 -0
  76. package/dist/plugins/devices/token-utils.d.ts +100 -0
  77. package/dist/plugins/devices/token-utils.d.ts.map +1 -0
  78. package/dist/plugins/devices/token-utils.js +162 -0
  79. package/dist/plugins/devices/token-utils.js.map +1 -0
  80. package/dist/plugins/devices/types.d.ts +307 -0
  81. package/dist/plugins/devices/types.d.ts.map +1 -0
  82. package/dist/plugins/devices/types.js +10 -0
  83. package/dist/plugins/devices/types.js.map +1 -0
  84. package/dist/plugins/index.d.ts +18 -4
  85. package/dist/plugins/index.d.ts.map +1 -1
  86. package/dist/plugins/index.js +16 -2
  87. package/dist/plugins/index.js.map +1 -1
  88. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +5 -0
  89. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +1 -0
  90. package/dist/plugins/notifications/__tests__/notifications-manager.test.js +470 -0
  91. package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +1 -0
  92. package/dist/plugins/notifications/index.d.ts +71 -0
  93. package/dist/plugins/notifications/index.d.ts.map +1 -0
  94. package/dist/plugins/notifications/index.js +72 -0
  95. package/dist/plugins/notifications/index.js.map +1 -0
  96. package/dist/plugins/notifications/notifications-manager.d.ts +182 -0
  97. package/dist/plugins/notifications/notifications-manager.d.ts.map +1 -0
  98. package/dist/plugins/notifications/notifications-manager.js +610 -0
  99. package/dist/plugins/notifications/notifications-manager.js.map +1 -0
  100. package/dist/plugins/notifications/notifications-plugin.d.ts +83 -0
  101. package/dist/plugins/notifications/notifications-plugin.d.ts.map +1 -0
  102. package/dist/plugins/notifications/notifications-plugin.js +337 -0
  103. package/dist/plugins/notifications/notifications-plugin.js.map +1 -0
  104. package/dist/plugins/notifications/types.d.ts +164 -0
  105. package/dist/plugins/notifications/types.d.ts.map +1 -0
  106. package/dist/plugins/notifications/types.js +9 -0
  107. package/dist/plugins/notifications/types.js.map +1 -0
  108. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +12 -0
  109. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +1 -0
  110. package/dist/plugins/parental/__tests__/parental-plugin.test.js +349 -0
  111. package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +1 -0
  112. package/dist/plugins/parental/adapters/index.d.ts +8 -0
  113. package/dist/plugins/parental/adapters/index.d.ts.map +1 -0
  114. package/dist/plugins/parental/adapters/index.js +7 -0
  115. package/dist/plugins/parental/adapters/index.js.map +1 -0
  116. package/dist/plugins/parental/adapters/kids-adapter.d.ts +24 -0
  117. package/dist/plugins/parental/adapters/kids-adapter.d.ts.map +1 -0
  118. package/dist/plugins/parental/adapters/kids-adapter.js +174 -0
  119. package/dist/plugins/parental/adapters/kids-adapter.js.map +1 -0
  120. package/dist/plugins/parental/index.d.ts +14 -0
  121. package/dist/plugins/parental/index.d.ts.map +1 -0
  122. package/dist/plugins/parental/index.js +15 -0
  123. package/dist/plugins/parental/index.js.map +1 -0
  124. package/dist/plugins/parental/parental-plugin.d.ts +88 -0
  125. package/dist/plugins/parental/parental-plugin.d.ts.map +1 -0
  126. package/dist/plugins/parental/parental-plugin.js +666 -0
  127. package/dist/plugins/parental/parental-plugin.js.map +1 -0
  128. package/dist/plugins/parental/stores/index.d.ts +7 -0
  129. package/dist/plugins/parental/stores/index.d.ts.map +1 -0
  130. package/dist/plugins/parental/stores/index.js +7 -0
  131. package/dist/plugins/parental/stores/index.js.map +1 -0
  132. package/dist/plugins/parental/stores/postgres-store.d.ts +10 -0
  133. package/dist/plugins/parental/stores/postgres-store.d.ts.map +1 -0
  134. package/dist/plugins/parental/stores/postgres-store.js +209 -0
  135. package/dist/plugins/parental/stores/postgres-store.js.map +1 -0
  136. package/dist/plugins/parental/types.d.ts +154 -0
  137. package/dist/plugins/parental/types.d.ts.map +1 -0
  138. package/dist/plugins/parental/types.js +10 -0
  139. package/dist/plugins/parental/types.js.map +1 -0
  140. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +11 -0
  141. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +1 -0
  142. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +243 -0
  143. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +1 -0
  144. package/dist/plugins/profiles/index.d.ts +12 -0
  145. package/dist/plugins/profiles/index.d.ts.map +1 -0
  146. package/dist/plugins/profiles/index.js +13 -0
  147. package/dist/plugins/profiles/index.js.map +1 -0
  148. package/dist/plugins/profiles/profiles-plugin.d.ts +71 -0
  149. package/dist/plugins/profiles/profiles-plugin.d.ts.map +1 -0
  150. package/dist/plugins/profiles/profiles-plugin.js +481 -0
  151. package/dist/plugins/profiles/profiles-plugin.js.map +1 -0
  152. package/dist/plugins/profiles/stores/index.d.ts +9 -0
  153. package/dist/plugins/profiles/stores/index.d.ts.map +1 -0
  154. package/dist/plugins/profiles/stores/index.js +9 -0
  155. package/dist/plugins/profiles/stores/index.js.map +1 -0
  156. package/dist/plugins/profiles/stores/postgres-store.d.ts +18 -0
  157. package/dist/plugins/profiles/stores/postgres-store.d.ts.map +1 -0
  158. package/dist/plugins/profiles/stores/postgres-store.js +310 -0
  159. package/dist/plugins/profiles/stores/postgres-store.js.map +1 -0
  160. package/dist/plugins/profiles/types.d.ts +289 -0
  161. package/dist/plugins/profiles/types.d.ts.map +1 -0
  162. package/dist/plugins/profiles/types.js +10 -0
  163. package/dist/plugins/profiles/types.js.map +1 -0
  164. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts +7 -0
  165. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.d.ts.map +1 -0
  166. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js +220 -0
  167. package/dist/plugins/rate-limit/__tests__/rate-limit-plugin.test.js.map +1 -0
  168. package/dist/plugins/rate-limit/cleanup.d.ts +40 -0
  169. package/dist/plugins/rate-limit/cleanup.d.ts.map +1 -0
  170. package/dist/plugins/rate-limit/cleanup.js +72 -0
  171. package/dist/plugins/rate-limit/cleanup.js.map +1 -0
  172. package/dist/plugins/rate-limit/env-config.d.ts +91 -0
  173. package/dist/plugins/rate-limit/env-config.d.ts.map +1 -0
  174. package/dist/plugins/rate-limit/env-config.js +318 -0
  175. package/dist/plugins/rate-limit/env-config.js.map +1 -0
  176. package/dist/plugins/rate-limit/index.d.ts +76 -0
  177. package/dist/plugins/rate-limit/index.d.ts.map +1 -0
  178. package/dist/plugins/rate-limit/index.js +79 -0
  179. package/dist/plugins/rate-limit/index.js.map +1 -0
  180. package/dist/plugins/rate-limit/middleware.d.ts +40 -0
  181. package/dist/plugins/rate-limit/middleware.d.ts.map +1 -0
  182. package/dist/plugins/rate-limit/middleware.js +169 -0
  183. package/dist/plugins/rate-limit/middleware.js.map +1 -0
  184. package/dist/plugins/rate-limit/rate-limit-plugin.d.ts +44 -0
  185. package/dist/plugins/rate-limit/rate-limit-plugin.d.ts.map +1 -0
  186. package/dist/plugins/rate-limit/rate-limit-plugin.js +354 -0
  187. package/dist/plugins/rate-limit/rate-limit-plugin.js.map +1 -0
  188. package/dist/plugins/rate-limit/rate-limit-service.d.ts +110 -0
  189. package/dist/plugins/rate-limit/rate-limit-service.d.ts.map +1 -0
  190. package/dist/plugins/rate-limit/rate-limit-service.js +172 -0
  191. package/dist/plugins/rate-limit/rate-limit-service.js.map +1 -0
  192. package/dist/plugins/rate-limit/stores/cache-store.d.ts +33 -0
  193. package/dist/plugins/rate-limit/stores/cache-store.d.ts.map +1 -0
  194. package/dist/plugins/rate-limit/stores/cache-store.js +225 -0
  195. package/dist/plugins/rate-limit/stores/cache-store.js.map +1 -0
  196. package/dist/plugins/rate-limit/stores/index.d.ts +8 -0
  197. package/dist/plugins/rate-limit/stores/index.d.ts.map +1 -0
  198. package/dist/plugins/rate-limit/stores/index.js +8 -0
  199. package/dist/plugins/rate-limit/stores/index.js.map +1 -0
  200. package/dist/plugins/rate-limit/stores/postgres-store.d.ts +34 -0
  201. package/dist/plugins/rate-limit/stores/postgres-store.d.ts.map +1 -0
  202. package/dist/plugins/rate-limit/stores/postgres-store.js +320 -0
  203. package/dist/plugins/rate-limit/stores/postgres-store.js.map +1 -0
  204. package/dist/plugins/rate-limit/strategies/fixed-window.d.ts +21 -0
  205. package/dist/plugins/rate-limit/strategies/fixed-window.d.ts.map +1 -0
  206. package/dist/plugins/rate-limit/strategies/fixed-window.js +97 -0
  207. package/dist/plugins/rate-limit/strategies/fixed-window.js.map +1 -0
  208. package/dist/plugins/rate-limit/strategies/index.d.ts +14 -0
  209. package/dist/plugins/rate-limit/strategies/index.d.ts.map +1 -0
  210. package/dist/plugins/rate-limit/strategies/index.js +27 -0
  211. package/dist/plugins/rate-limit/strategies/index.js.map +1 -0
  212. package/dist/plugins/rate-limit/strategies/sliding-window.d.ts +22 -0
  213. package/dist/plugins/rate-limit/strategies/sliding-window.d.ts.map +1 -0
  214. package/dist/plugins/rate-limit/strategies/sliding-window.js +122 -0
  215. package/dist/plugins/rate-limit/strategies/sliding-window.js.map +1 -0
  216. package/dist/plugins/rate-limit/strategies/token-bucket.d.ts +28 -0
  217. package/dist/plugins/rate-limit/strategies/token-bucket.d.ts.map +1 -0
  218. package/dist/plugins/rate-limit/strategies/token-bucket.js +121 -0
  219. package/dist/plugins/rate-limit/strategies/token-bucket.js.map +1 -0
  220. package/dist/plugins/rate-limit/types.d.ts +265 -0
  221. package/dist/plugins/rate-limit/types.d.ts.map +1 -0
  222. package/dist/plugins/rate-limit/types.js +9 -0
  223. package/dist/plugins/rate-limit/types.js.map +1 -0
  224. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +11 -0
  225. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +1 -0
  226. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +305 -0
  227. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +1 -0
  228. package/dist/plugins/subscriptions/index.d.ts +12 -0
  229. package/dist/plugins/subscriptions/index.d.ts.map +1 -0
  230. package/dist/plugins/subscriptions/index.js +13 -0
  231. package/dist/plugins/subscriptions/index.js.map +1 -0
  232. package/dist/plugins/subscriptions/stores/index.d.ts +9 -0
  233. package/dist/plugins/subscriptions/stores/index.d.ts.map +1 -0
  234. package/dist/plugins/subscriptions/stores/index.js +9 -0
  235. package/dist/plugins/subscriptions/stores/index.js.map +1 -0
  236. package/dist/plugins/subscriptions/stores/postgres-store.d.ts +14 -0
  237. package/dist/plugins/subscriptions/stores/postgres-store.d.ts.map +1 -0
  238. package/dist/plugins/subscriptions/stores/postgres-store.js +359 -0
  239. package/dist/plugins/subscriptions/stores/postgres-store.js.map +1 -0
  240. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts +82 -0
  241. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -0
  242. package/dist/plugins/subscriptions/subscriptions-plugin.js +449 -0
  243. package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -0
  244. package/dist/plugins/subscriptions/types.d.ts +308 -0
  245. package/dist/plugins/subscriptions/types.d.ts.map +1 -0
  246. package/dist/plugins/subscriptions/types.js +10 -0
  247. package/dist/plugins/subscriptions/types.js.map +1 -0
  248. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +11 -0
  249. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +1 -0
  250. package/dist/plugins/usage/__tests__/usage-plugin.test.js +218 -0
  251. package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +1 -0
  252. package/dist/plugins/usage/index.d.ts +12 -0
  253. package/dist/plugins/usage/index.d.ts.map +1 -0
  254. package/dist/plugins/usage/index.js +13 -0
  255. package/dist/plugins/usage/index.js.map +1 -0
  256. package/dist/plugins/usage/stores/index.d.ts +9 -0
  257. package/dist/plugins/usage/stores/index.d.ts.map +1 -0
  258. package/dist/plugins/usage/stores/index.js +9 -0
  259. package/dist/plugins/usage/stores/index.js.map +1 -0
  260. package/dist/plugins/usage/stores/postgres-store.d.ts +14 -0
  261. package/dist/plugins/usage/stores/postgres-store.d.ts.map +1 -0
  262. package/dist/plugins/usage/stores/postgres-store.js +146 -0
  263. package/dist/plugins/usage/stores/postgres-store.js.map +1 -0
  264. package/dist/plugins/usage/types.d.ts +195 -0
  265. package/dist/plugins/usage/types.d.ts.map +1 -0
  266. package/dist/plugins/usage/types.js +10 -0
  267. package/dist/plugins/usage/types.js.map +1 -0
  268. package/dist/plugins/usage/usage-plugin.d.ts +51 -0
  269. package/dist/plugins/usage/usage-plugin.d.ts.map +1 -0
  270. package/dist/plugins/usage/usage-plugin.js +412 -0
  271. package/dist/plugins/usage/usage-plugin.js.map +1 -0
  272. package/dist/plugins/users/__tests__/postgres-store.test.d.ts +10 -0
  273. package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +1 -0
  274. package/dist/plugins/users/__tests__/postgres-store.test.js +229 -0
  275. package/dist/plugins/users/__tests__/postgres-store.test.js.map +1 -0
  276. package/dist/plugins/users/__tests__/users-plugin.test.js +3 -0
  277. package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -1
  278. package/dist/plugins/users/index.d.ts +2 -2
  279. package/dist/plugins/users/index.d.ts.map +1 -1
  280. package/dist/plugins/users/index.js +1 -1
  281. package/dist/plugins/users/index.js.map +1 -1
  282. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
  283. package/dist/plugins/users/stores/postgres-store.js +76 -0
  284. package/dist/plugins/users/stores/postgres-store.js.map +1 -1
  285. package/dist/plugins/users/types.d.ts +74 -6
  286. package/dist/plugins/users/types.d.ts.map +1 -1
  287. package/dist/plugins/users/users-plugin.d.ts +15 -1
  288. package/dist/plugins/users/users-plugin.d.ts.map +1 -1
  289. package/dist/plugins/users/users-plugin.js +29 -0
  290. package/dist/plugins/users/users-plugin.js.map +1 -1
  291. package/dist-ui/assets/index-CynOqPkb.js +469 -0
  292. package/dist-ui/assets/{index-BY8OxNgO.js.map → index-CynOqPkb.js.map} +1 -1
  293. package/dist-ui/index.html +1 -1
  294. package/dist-ui-lib/api/controlPanelApi.d.ts +187 -0
  295. package/dist-ui-lib/components/StatCard.d.ts +16 -0
  296. package/dist-ui-lib/dashboard/widgets/AuthStatusWidget.d.ts +9 -0
  297. package/dist-ui-lib/dashboard/widgets/IntegrationStatusWidget.d.ts +9 -0
  298. package/dist-ui-lib/dashboard/widgets/NotificationsStatsWidget.d.ts +12 -0
  299. package/dist-ui-lib/dashboard/widgets/index.d.ts +3 -0
  300. package/dist-ui-lib/index.js +3579 -2379
  301. package/dist-ui-lib/index.js.map +1 -1
  302. package/dist-ui-lib/pages/IntegrationsPage.d.ts +1 -0
  303. package/dist-ui-lib/pages/NotificationsPage.d.ts +9 -0
  304. package/dist-ui-lib/pages/RateLimitPage.d.ts +1 -0
  305. package/dist-ui-lib/utils/formatters.d.ts +19 -0
  306. package/package.json +1 -1
  307. package/src/core/control-panel.ts +128 -0
  308. package/src/core/types.ts +17 -0
  309. package/src/index.ts +216 -0
  310. package/src/plugins/auth/adapter-wrapper.test.ts +395 -0
  311. package/src/plugins/auth/adapter-wrapper.ts +205 -0
  312. package/src/plugins/auth/config-store.test.ts +417 -0
  313. package/src/plugins/auth/config-store.ts +305 -0
  314. package/src/plugins/auth/env-config.ts +714 -7
  315. package/src/plugins/auth/index.ts +22 -1
  316. package/src/plugins/auth/types.ts +138 -0
  317. package/src/plugins/bans/bans-plugin.ts +15 -3
  318. package/src/plugins/devices/__tests__/devices-plugin.test.ts +551 -0
  319. package/src/plugins/devices/__tests__/token-utils.test.ts +264 -0
  320. package/src/plugins/devices/adapters/compute-adapter.ts +139 -0
  321. package/src/plugins/devices/adapters/index.ts +13 -0
  322. package/src/plugins/devices/adapters/mobile-adapter.ts +179 -0
  323. package/src/plugins/devices/devices-plugin.ts +538 -0
  324. package/src/plugins/devices/index.ts +69 -0
  325. package/src/plugins/devices/stores/index.ts +9 -0
  326. package/src/plugins/devices/stores/postgres-store.ts +304 -0
  327. package/src/plugins/devices/token-utils.ts +213 -0
  328. package/src/plugins/devices/types.ts +351 -0
  329. package/src/plugins/index.ts +267 -0
  330. package/src/plugins/notifications/__tests__/notifications-manager.test.ts +637 -0
  331. package/src/plugins/notifications/index.ts +91 -0
  332. package/src/plugins/notifications/notifications-manager.ts +773 -0
  333. package/src/plugins/notifications/notifications-plugin.ts +398 -0
  334. package/src/plugins/notifications/types.ts +207 -0
  335. package/src/plugins/parental/__tests__/parental-plugin.test.ts +465 -0
  336. package/src/plugins/parental/adapters/index.ts +8 -0
  337. package/src/plugins/parental/adapters/kids-adapter.ts +206 -0
  338. package/src/plugins/parental/index.ts +55 -0
  339. package/src/plugins/parental/parental-plugin.ts +759 -0
  340. package/src/plugins/parental/stores/index.ts +7 -0
  341. package/src/plugins/parental/stores/postgres-store.ts +304 -0
  342. package/src/plugins/parental/types.ts +180 -0
  343. package/src/plugins/profiles/__tests__/profiles-plugin.test.ts +321 -0
  344. package/src/plugins/profiles/index.ts +49 -0
  345. package/src/plugins/profiles/profiles-plugin.ts +546 -0
  346. package/src/plugins/profiles/stores/index.ts +9 -0
  347. package/src/plugins/profiles/stores/postgres-store.ts +439 -0
  348. package/src/plugins/profiles/types.ts +338 -0
  349. package/src/plugins/rate-limit/__tests__/rate-limit-plugin.test.ts +259 -0
  350. package/src/plugins/rate-limit/cleanup.ts +117 -0
  351. package/src/plugins/rate-limit/env-config.ts +400 -0
  352. package/src/plugins/rate-limit/index.ts +128 -0
  353. package/src/plugins/rate-limit/middleware.ts +212 -0
  354. package/src/plugins/rate-limit/rate-limit-plugin.ts +400 -0
  355. package/src/plugins/rate-limit/rate-limit-service.ts +228 -0
  356. package/src/plugins/rate-limit/stores/cache-store.ts +261 -0
  357. package/src/plugins/rate-limit/stores/index.ts +8 -0
  358. package/src/plugins/rate-limit/stores/postgres-store.ts +402 -0
  359. package/src/plugins/rate-limit/strategies/fixed-window.ts +116 -0
  360. package/src/plugins/rate-limit/strategies/index.ts +30 -0
  361. package/src/plugins/rate-limit/strategies/sliding-window.ts +157 -0
  362. package/src/plugins/rate-limit/strategies/token-bucket.ts +154 -0
  363. package/src/plugins/rate-limit/types.ts +338 -0
  364. package/src/plugins/subscriptions/__tests__/subscriptions-plugin.test.ts +404 -0
  365. package/src/plugins/subscriptions/index.ts +51 -0
  366. package/src/plugins/subscriptions/stores/index.ts +9 -0
  367. package/src/plugins/subscriptions/stores/postgres-store.ts +482 -0
  368. package/src/plugins/subscriptions/subscriptions-plugin.ts +530 -0
  369. package/src/plugins/subscriptions/types.ts +355 -0
  370. package/src/plugins/usage/__tests__/usage-plugin.test.ts +288 -0
  371. package/src/plugins/usage/index.ts +39 -0
  372. package/src/plugins/usage/stores/index.ts +9 -0
  373. package/src/plugins/usage/stores/postgres-store.ts +213 -0
  374. package/src/plugins/usage/types.ts +222 -0
  375. package/src/plugins/usage/usage-plugin.ts +484 -0
  376. package/src/plugins/users/__tests__/postgres-store.test.ts +326 -0
  377. package/src/plugins/users/__tests__/users-plugin.test.ts +3 -0
  378. package/src/plugins/users/index.ts +6 -0
  379. package/src/plugins/users/stores/postgres-store.ts +104 -0
  380. package/src/plugins/users/types.ts +82 -6
  381. package/src/plugins/users/users-plugin.ts +37 -0
  382. package/ui/src/App.tsx +36 -14
  383. package/ui/src/api/controlPanelApi.ts +329 -6
  384. package/ui/src/components/StatCard.tsx +58 -0
  385. package/ui/src/dashboard/builtInWidgets.tsx +7 -1
  386. package/ui/src/dashboard/widgets/AuthStatusWidget.tsx +143 -0
  387. package/ui/src/dashboard/widgets/IntegrationStatusWidget.tsx +135 -0
  388. package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +167 -0
  389. package/ui/src/dashboard/widgets/index.ts +3 -0
  390. package/ui/src/pages/AuthPage.tsx +986 -142
  391. package/ui/src/pages/IntegrationsPage.tsx +288 -0
  392. package/ui/src/pages/NotificationsPage.tsx +417 -0
  393. package/ui/src/pages/RateLimitPage.tsx +292 -0
  394. package/ui/src/utils/formatters.ts +33 -0
  395. package/dist-ui/assets/index-BY8OxNgO.js +0 -465
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Auth Configuration Store
3
+ *
4
+ * PostgreSQL-based storage for runtime auth configuration.
5
+ * Supports pg_notify for cross-instance hot-reload in scaled deployments.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ /**
10
+ * Create a PostgreSQL-backed auth configuration store
11
+ *
12
+ * @param config Configuration including a pg Pool instance
13
+ * @returns AuthConfigStore implementation
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { Pool } from 'pg';
18
+ * import { postgresAuthConfigStore } from '@qwickapps/server';
19
+ *
20
+ * const pool = new Pool({ connectionString: process.env.DATABASE_URL });
21
+ * const store = postgresAuthConfigStore({ pool });
22
+ *
23
+ * // Or with lazy initialization:
24
+ * const store = postgresAuthConfigStore({ pool: () => getPostgres().getPool() });
25
+ * ```
26
+ */
27
+ // Valid identifier pattern (alphanumeric + underscore, starting with letter or underscore)
28
+ const VALID_IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
29
+ /**
30
+ * Validate SQL identifier to prevent SQL injection
31
+ */
32
+ function validateIdentifier(name, type) {
33
+ if (!VALID_IDENTIFIER.test(name)) {
34
+ throw new Error(`Invalid ${type}: must be alphanumeric with underscores, starting with letter or underscore`);
35
+ }
36
+ if (name.length > 63) {
37
+ throw new Error(`Invalid ${type}: must be 63 characters or less`);
38
+ }
39
+ }
40
+ export function postgresAuthConfigStore(config) {
41
+ const { pool: poolOrFn, tableName = 'auth_config', schema = 'public', autoCreateTable = true, enableNotify = true, notifyChannel = 'auth_config_changed', } = config;
42
+ // Validate identifiers to prevent SQL injection
43
+ validateIdentifier(tableName, 'table name');
44
+ validateIdentifier(schema, 'schema name');
45
+ validateIdentifier(notifyChannel, 'notify channel');
46
+ // Helper to get pool (supports lazy initialization via function)
47
+ const getPool = () => {
48
+ const pool = typeof poolOrFn === 'function' ? poolOrFn() : poolOrFn;
49
+ if (!pool || typeof pool.query !== 'function') {
50
+ throw new Error('Invalid pool: must have query method');
51
+ }
52
+ return pool;
53
+ };
54
+ const tableFullName = `"${schema}"."${tableName}"`;
55
+ // Listeners for config changes
56
+ const listeners = new Set();
57
+ // Client dedicated to listening for notifications
58
+ let listenerClient = null;
59
+ // Reconnection state for exponential backoff
60
+ let reconnectAttempt = 0;
61
+ const maxReconnectDelay = 60000; // Max 60 seconds
62
+ const baseReconnectDelay = 1000; // Start at 1 second
63
+ /**
64
+ * Calculate reconnect delay with exponential backoff
65
+ */
66
+ function getReconnectDelay() {
67
+ // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 32s, 60s (capped)
68
+ const delay = Math.min(baseReconnectDelay * Math.pow(2, reconnectAttempt), maxReconnectDelay);
69
+ reconnectAttempt++;
70
+ return delay;
71
+ }
72
+ /**
73
+ * Reset reconnection state after successful connection
74
+ */
75
+ function resetReconnectState() {
76
+ reconnectAttempt = 0;
77
+ }
78
+ /**
79
+ * Start listening for pg_notify events
80
+ */
81
+ async function startListening() {
82
+ if (!enableNotify || listenerClient)
83
+ return;
84
+ try {
85
+ const pool = getPool();
86
+ listenerClient = await pool.connect();
87
+ // Subscribe to the notification channel
88
+ await listenerClient.query(`LISTEN ${notifyChannel}`);
89
+ // Reset backoff on successful connection
90
+ resetReconnectState();
91
+ // Handle notifications
92
+ listenerClient.on('notification', async (msg) => {
93
+ if (msg.channel === notifyChannel) {
94
+ // Reload config from database and notify listeners
95
+ const newConfig = await loadFromDb();
96
+ for (const listener of listeners) {
97
+ try {
98
+ listener(newConfig);
99
+ }
100
+ catch (err) {
101
+ console.error('[AuthConfigStore] Listener error:', err);
102
+ }
103
+ }
104
+ }
105
+ });
106
+ // Handle errors - try to reconnect with exponential backoff
107
+ // Note: pg client emits 'error' events with Error objects, but our interface
108
+ // only defines 'notification'. We cast to any to handle this.
109
+ listenerClient.on('error', (err) => {
110
+ console.error('[AuthConfigStore] Listener connection error:', err);
111
+ listenerClient?.release(true);
112
+ listenerClient = null;
113
+ // Try to reconnect with exponential backoff
114
+ const delay = getReconnectDelay();
115
+ console.log(`[AuthConfigStore] Reconnecting in ${delay}ms (attempt ${reconnectAttempt})`);
116
+ setTimeout(() => startListening(), delay);
117
+ });
118
+ }
119
+ catch (err) {
120
+ console.error('[AuthConfigStore] Failed to start listener:', err);
121
+ listenerClient = null;
122
+ // Also apply backoff on initial connection failure
123
+ const delay = getReconnectDelay();
124
+ console.log(`[AuthConfigStore] Retrying connection in ${delay}ms (attempt ${reconnectAttempt})`);
125
+ setTimeout(() => startListening(), delay);
126
+ }
127
+ }
128
+ /**
129
+ * Load config from database
130
+ */
131
+ async function loadFromDb() {
132
+ const pool = getPool();
133
+ const result = await pool.query(`SELECT adapter, config, settings, updated_at, updated_by
134
+ FROM ${tableFullName}
135
+ LIMIT 1`);
136
+ if (result.rows.length === 0) {
137
+ return null;
138
+ }
139
+ const row = result.rows[0];
140
+ return {
141
+ adapter: row.adapter,
142
+ config: row.config,
143
+ settings: row.settings,
144
+ updatedAt: row.updated_at.toISOString(),
145
+ updatedBy: row.updated_by || undefined,
146
+ };
147
+ }
148
+ return {
149
+ name: 'postgres',
150
+ async initialize() {
151
+ if (!autoCreateTable) {
152
+ await startListening();
153
+ return;
154
+ }
155
+ const pool = getPool();
156
+ // Create table with singleton pattern (only one row allowed)
157
+ await pool.query(`
158
+ CREATE TABLE IF NOT EXISTS ${tableFullName} (
159
+ id SERIAL PRIMARY KEY,
160
+ adapter VARCHAR(50),
161
+ config JSONB NOT NULL DEFAULT '{}',
162
+ settings JSONB NOT NULL DEFAULT '{}',
163
+ created_at TIMESTAMPTZ DEFAULT NOW(),
164
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
165
+ updated_by VARCHAR(255)
166
+ );
167
+
168
+ -- Ensure only one config row (singleton pattern)
169
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_${tableName}_singleton
170
+ ON ${tableFullName} ((true));
171
+ `);
172
+ // Start listening for notifications
173
+ await startListening();
174
+ },
175
+ async load() {
176
+ return loadFromDb();
177
+ },
178
+ async save(runtimeConfig) {
179
+ const pool = getPool();
180
+ // Upsert the configuration
181
+ await pool.query(`INSERT INTO ${tableFullName} (adapter, config, settings, updated_at, updated_by)
182
+ VALUES ($1, $2, $3, NOW(), $4)
183
+ ON CONFLICT ((true)) DO UPDATE SET
184
+ adapter = $1,
185
+ config = $2,
186
+ settings = $3,
187
+ updated_at = NOW(),
188
+ updated_by = $4`, [
189
+ runtimeConfig.adapter,
190
+ JSON.stringify(runtimeConfig.config),
191
+ JSON.stringify(runtimeConfig.settings),
192
+ runtimeConfig.updatedBy || null,
193
+ ]);
194
+ // Notify other instances
195
+ if (enableNotify) {
196
+ await pool.query(`NOTIFY ${notifyChannel}`);
197
+ }
198
+ },
199
+ async delete() {
200
+ const pool = getPool();
201
+ const result = await pool.query(`DELETE FROM ${tableFullName}`);
202
+ // Notify other instances
203
+ if (enableNotify) {
204
+ await pool.query(`NOTIFY ${notifyChannel}`);
205
+ }
206
+ return (result.rowCount ?? 0) > 0;
207
+ },
208
+ onChange(callback) {
209
+ listeners.add(callback);
210
+ // Return unsubscribe function
211
+ return () => {
212
+ listeners.delete(callback);
213
+ };
214
+ },
215
+ async shutdown() {
216
+ // Release the listener client
217
+ if (listenerClient) {
218
+ try {
219
+ await listenerClient.query(`UNLISTEN ${notifyChannel}`);
220
+ }
221
+ catch {
222
+ // Ignore errors during shutdown
223
+ }
224
+ listenerClient.release(true);
225
+ listenerClient = null;
226
+ }
227
+ // Clear listeners
228
+ listeners.clear();
229
+ },
230
+ };
231
+ }
232
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../../src/plugins/auth/config-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Auth Config Store Tests
3
+ *
4
+ * Unit tests for PostgreSQL-backed auth configuration store.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=config-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.test.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/config-store.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Auth Config Store Tests
3
+ *
4
+ * Unit tests for PostgreSQL-backed auth configuration store.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { postgresAuthConfigStore } from './config-store.js';
8
+ function createMockPool() {
9
+ const mockClient = {
10
+ query: vi.fn().mockResolvedValue({ rows: [], rowCount: 0 }),
11
+ on: vi.fn(),
12
+ release: vi.fn(),
13
+ };
14
+ return {
15
+ query: vi.fn().mockResolvedValue({ rows: [], rowCount: 0 }),
16
+ connect: vi.fn().mockResolvedValue(mockClient),
17
+ on: vi.fn(),
18
+ };
19
+ }
20
+ describe('postgresAuthConfigStore', () => {
21
+ let mockPool;
22
+ beforeEach(() => {
23
+ mockPool = createMockPool();
24
+ });
25
+ afterEach(() => {
26
+ vi.clearAllMocks();
27
+ });
28
+ describe('identifier validation', () => {
29
+ it('should reject invalid table names', () => {
30
+ expect(() => postgresAuthConfigStore({
31
+ pool: mockPool,
32
+ tableName: 'DROP TABLE users;--',
33
+ })).toThrow('Invalid table name');
34
+ });
35
+ it('should reject table names with spaces', () => {
36
+ expect(() => postgresAuthConfigStore({
37
+ pool: mockPool,
38
+ tableName: 'my table',
39
+ })).toThrow('Invalid table name');
40
+ });
41
+ it('should reject table names starting with numbers', () => {
42
+ expect(() => postgresAuthConfigStore({
43
+ pool: mockPool,
44
+ tableName: '123table',
45
+ })).toThrow('Invalid table name');
46
+ });
47
+ it('should reject table names longer than 63 characters', () => {
48
+ const longName = 'a'.repeat(64);
49
+ expect(() => postgresAuthConfigStore({
50
+ pool: mockPool,
51
+ tableName: longName,
52
+ })).toThrow('Invalid table name');
53
+ });
54
+ it('should accept valid table names', () => {
55
+ expect(() => postgresAuthConfigStore({
56
+ pool: mockPool,
57
+ tableName: 'auth_config',
58
+ })).not.toThrow();
59
+ });
60
+ it('should accept table names with underscores', () => {
61
+ expect(() => postgresAuthConfigStore({
62
+ pool: mockPool,
63
+ tableName: '_my_auth_config_table',
64
+ })).not.toThrow();
65
+ });
66
+ it('should reject invalid schema names', () => {
67
+ expect(() => postgresAuthConfigStore({
68
+ pool: mockPool,
69
+ schema: 'public; DROP TABLE users;--',
70
+ })).toThrow('Invalid schema name');
71
+ });
72
+ it('should reject invalid notify channel names', () => {
73
+ expect(() => postgresAuthConfigStore({
74
+ pool: mockPool,
75
+ notifyChannel: 'channel-with-dashes',
76
+ })).toThrow('Invalid notify channel');
77
+ });
78
+ });
79
+ describe('initialize', () => {
80
+ it('should create table if autoCreateTable is true', async () => {
81
+ const store = postgresAuthConfigStore({
82
+ pool: mockPool,
83
+ autoCreateTable: true,
84
+ enableNotify: false,
85
+ });
86
+ await store.initialize();
87
+ expect(mockPool.query).toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE IF NOT EXISTS'));
88
+ });
89
+ it('should not create table if autoCreateTable is false', async () => {
90
+ const store = postgresAuthConfigStore({
91
+ pool: mockPool,
92
+ autoCreateTable: false,
93
+ enableNotify: false,
94
+ });
95
+ await store.initialize();
96
+ expect(mockPool.query).not.toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE IF NOT EXISTS'));
97
+ });
98
+ it('should use custom table name', async () => {
99
+ const store = postgresAuthConfigStore({
100
+ pool: mockPool,
101
+ tableName: 'custom_auth_config',
102
+ autoCreateTable: true,
103
+ enableNotify: false,
104
+ });
105
+ await store.initialize();
106
+ expect(mockPool.query).toHaveBeenCalledWith(expect.stringContaining('"public"."custom_auth_config"'));
107
+ });
108
+ it('should use custom schema name', async () => {
109
+ const store = postgresAuthConfigStore({
110
+ pool: mockPool,
111
+ schema: 'myschema',
112
+ autoCreateTable: true,
113
+ enableNotify: false,
114
+ });
115
+ await store.initialize();
116
+ expect(mockPool.query).toHaveBeenCalledWith(expect.stringContaining('"myschema"."auth_config"'));
117
+ });
118
+ });
119
+ describe('load', () => {
120
+ it('should return null when no config exists', async () => {
121
+ mockPool.query.mockResolvedValueOnce({ rows: [], rowCount: 0 });
122
+ const store = postgresAuthConfigStore({
123
+ pool: mockPool,
124
+ autoCreateTable: false,
125
+ enableNotify: false,
126
+ });
127
+ const result = await store.load();
128
+ expect(result).toBeNull();
129
+ });
130
+ it('should return config when it exists', async () => {
131
+ const mockConfig = {
132
+ adapter: 'basic',
133
+ config: { basic: { username: 'admin', password: 'secret' } },
134
+ settings: {},
135
+ updated_at: new Date('2025-01-15T12:00:00Z'),
136
+ updated_by: 'admin@example.com',
137
+ };
138
+ mockPool.query.mockResolvedValueOnce({ rows: [mockConfig], rowCount: 1 });
139
+ const store = postgresAuthConfigStore({
140
+ pool: mockPool,
141
+ autoCreateTable: false,
142
+ enableNotify: false,
143
+ });
144
+ const result = await store.load();
145
+ expect(result).toEqual({
146
+ adapter: 'basic',
147
+ config: { basic: { username: 'admin', password: 'secret' } },
148
+ settings: {},
149
+ updatedAt: '2025-01-15T12:00:00.000Z',
150
+ updatedBy: 'admin@example.com',
151
+ });
152
+ });
153
+ });
154
+ describe('save', () => {
155
+ it('should upsert config to database', async () => {
156
+ const store = postgresAuthConfigStore({
157
+ pool: mockPool,
158
+ autoCreateTable: false,
159
+ enableNotify: false,
160
+ });
161
+ const config = {
162
+ adapter: 'basic',
163
+ config: { basic: { username: 'admin', password: 'secret', realm: 'Test' } },
164
+ settings: {},
165
+ updatedAt: new Date().toISOString(),
166
+ updatedBy: 'admin@example.com',
167
+ };
168
+ await store.save(config);
169
+ expect(mockPool.query).toHaveBeenCalledWith(expect.stringContaining('INSERT INTO'), expect.arrayContaining(['basic', expect.any(String), expect.any(String), 'admin@example.com']));
170
+ });
171
+ it('should send NOTIFY when enableNotify is true', async () => {
172
+ const store = postgresAuthConfigStore({
173
+ pool: mockPool,
174
+ autoCreateTable: false,
175
+ enableNotify: true,
176
+ });
177
+ const config = {
178
+ adapter: 'basic',
179
+ config: { basic: { username: 'admin', password: 'secret', realm: 'Test' } },
180
+ settings: {},
181
+ updatedAt: new Date().toISOString(),
182
+ };
183
+ await store.save(config);
184
+ expect(mockPool.query).toHaveBeenCalledWith('NOTIFY auth_config_changed');
185
+ });
186
+ it('should not send NOTIFY when enableNotify is false', async () => {
187
+ const store = postgresAuthConfigStore({
188
+ pool: mockPool,
189
+ autoCreateTable: false,
190
+ enableNotify: false,
191
+ });
192
+ const config = {
193
+ adapter: 'basic',
194
+ config: { basic: { username: 'admin', password: 'secret', realm: 'Test' } },
195
+ settings: {},
196
+ updatedAt: new Date().toISOString(),
197
+ };
198
+ await store.save(config);
199
+ expect(mockPool.query).not.toHaveBeenCalledWith('NOTIFY auth_config_changed');
200
+ });
201
+ });
202
+ describe('delete', () => {
203
+ it('should delete config from database', async () => {
204
+ mockPool.query.mockResolvedValueOnce({ rows: [], rowCount: 1 });
205
+ const store = postgresAuthConfigStore({
206
+ pool: mockPool,
207
+ autoCreateTable: false,
208
+ enableNotify: false,
209
+ });
210
+ const result = await store.delete();
211
+ expect(mockPool.query).toHaveBeenCalledWith(expect.stringContaining('DELETE FROM'));
212
+ expect(result).toBe(true);
213
+ });
214
+ it('should return false when no config to delete', async () => {
215
+ mockPool.query.mockResolvedValueOnce({ rows: [], rowCount: 0 });
216
+ const store = postgresAuthConfigStore({
217
+ pool: mockPool,
218
+ autoCreateTable: false,
219
+ enableNotify: false,
220
+ });
221
+ const result = await store.delete();
222
+ expect(result).toBe(false);
223
+ });
224
+ it('should send NOTIFY after delete when enableNotify is true', async () => {
225
+ mockPool.query.mockResolvedValueOnce({ rows: [], rowCount: 1 });
226
+ const store = postgresAuthConfigStore({
227
+ pool: mockPool,
228
+ autoCreateTable: false,
229
+ enableNotify: true,
230
+ });
231
+ await store.delete();
232
+ expect(mockPool.query).toHaveBeenCalledWith('NOTIFY auth_config_changed');
233
+ });
234
+ });
235
+ describe('onChange', () => {
236
+ it('should register listener and return unsubscribe function', () => {
237
+ const store = postgresAuthConfigStore({
238
+ pool: mockPool,
239
+ autoCreateTable: false,
240
+ enableNotify: false,
241
+ });
242
+ const listener = vi.fn();
243
+ const unsubscribe = store.onChange(listener);
244
+ expect(typeof unsubscribe).toBe('function');
245
+ });
246
+ it('should unsubscribe listener when called', () => {
247
+ const store = postgresAuthConfigStore({
248
+ pool: mockPool,
249
+ autoCreateTable: false,
250
+ enableNotify: false,
251
+ });
252
+ const listener = vi.fn();
253
+ const unsubscribe = store.onChange(listener);
254
+ // Unsubscribe
255
+ unsubscribe();
256
+ // Listener should not be called anymore
257
+ // (We can't easily test this without exposing internals, but the function exists)
258
+ expect(unsubscribe).toBeDefined();
259
+ });
260
+ });
261
+ describe('lazy pool initialization', () => {
262
+ it('should accept a function that returns the pool', async () => {
263
+ const poolFn = vi.fn().mockReturnValue(mockPool);
264
+ const store = postgresAuthConfigStore({
265
+ pool: poolFn,
266
+ autoCreateTable: false,
267
+ enableNotify: false,
268
+ });
269
+ mockPool.query.mockResolvedValueOnce({ rows: [], rowCount: 0 });
270
+ await store.load();
271
+ expect(poolFn).toHaveBeenCalled();
272
+ });
273
+ it('should throw if pool is invalid', async () => {
274
+ const store = postgresAuthConfigStore({
275
+ pool: (() => ({})),
276
+ autoCreateTable: false,
277
+ enableNotify: false,
278
+ });
279
+ await expect(store.load()).rejects.toThrow('Invalid pool');
280
+ });
281
+ });
282
+ describe('shutdown', () => {
283
+ it('should release listener client and clear listeners', async () => {
284
+ const store = postgresAuthConfigStore({
285
+ pool: mockPool,
286
+ autoCreateTable: false,
287
+ enableNotify: false,
288
+ });
289
+ // Add a listener
290
+ const listener = vi.fn();
291
+ store.onChange(listener);
292
+ // Shutdown
293
+ await store.shutdown();
294
+ // Should complete without error
295
+ expect(true).toBe(true);
296
+ });
297
+ });
298
+ });
299
+ //# sourceMappingURL=config-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.test.js","sourceRoot":"","sources":["../../../src/plugins/auth/config-store.test.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,8 @@
7
7
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
8
  */
9
9
  import type { Plugin } from '../../core/plugin-registry.js';
10
- import type { Auth0AdapterConfig, SupabaseAdapterConfig, SupertokensAdapterConfig, BasicAdapterConfig, AuthEnvPluginOptions, AuthConfigStatus } from './types.js';
10
+ import type { AuthAdapter, Auth0AdapterConfig, SupabaseAdapterConfig, SupertokensAdapterConfig, BasicAdapterConfig, AuthEnvPluginOptions, AuthConfigStatus, AuthAdapterType, RuntimeAuthConfig, TestProviderResponse, AuthConfigStore } from './types.js';
11
+ import { type AdapterWrapper } from './adapter-wrapper.js';
11
12
  /**
12
13
  * Get an environment variable, treating empty strings as undefined
13
14
  */
@@ -73,6 +74,52 @@ export declare function createAuthPluginFromEnv(options?: AuthEnvPluginOptions):
73
74
  * Get current auth plugin status
74
75
  */
75
76
  export declare function getAuthStatus(): AuthConfigStatus;
77
+ /**
78
+ * Extended options for createAuthPluginFromEnv with runtime config support
79
+ */
80
+ export interface AuthEnvPluginOptionsExtended extends AuthEnvPluginOptions {
81
+ /** Configuration store for runtime config persistence */
82
+ configStore?: AuthConfigStore;
83
+ }
84
+ /**
85
+ * Create an adapter from runtime configuration
86
+ */
87
+ declare function createAdapterFromConfig(adapterType: AuthAdapterType, config: RuntimeAuthConfig['config']): AuthAdapter | null;
88
+ /**
89
+ * Validate adapter configuration
90
+ */
91
+ declare function validateAdapterConfig(adapterType: AuthAdapterType, config: Record<string, unknown>): {
92
+ valid: boolean;
93
+ errors: string[];
94
+ };
95
+ /**
96
+ * Test a provider connection
97
+ */
98
+ declare function testProviderConnection(adapterType: AuthAdapterType, config: Record<string, unknown>): Promise<TestProviderResponse>;
99
+ /**
100
+ * Set the configuration store for runtime auth config persistence.
101
+ *
102
+ * This must be called during application startup to enable runtime configuration
103
+ * features. Without a config store, the PUT/DELETE endpoints will return 503.
104
+ *
105
+ * @param store - PostgreSQL-backed config store from `postgresAuthConfigStore()`
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * import { Pool } from 'pg';
110
+ * import { setAuthConfigStore, postgresAuthConfigStore } from '@qwickapps/server';
111
+ *
112
+ * const pool = new Pool({ connectionString: process.env.DATABASE_URL });
113
+ * const configStore = postgresAuthConfigStore({ pool });
114
+ * await configStore.initialize();
115
+ * setAuthConfigStore(configStore);
116
+ * ```
117
+ */
118
+ export declare function setAuthConfigStore(store: AuthConfigStore): void;
119
+ /**
120
+ * Get the current adapter wrapper
121
+ */
122
+ export declare function getAdapterWrapper(): AdapterWrapper | null;
76
123
  export declare const __testing: {
77
124
  parseSupertokensEnv: typeof parseSupertokensEnv;
78
125
  parseAuth0Env: typeof parseAuth0Env;
@@ -83,6 +130,9 @@ export declare const __testing: {
83
130
  getEnvList: typeof getEnvList;
84
131
  maskValue: typeof maskValue;
85
132
  VALID_ADAPTERS: readonly ["supertokens", "auth0", "supabase", "basic"];
133
+ validateAdapterConfig: typeof validateAdapterConfig;
134
+ testProviderConnection: typeof testProviderConnection;
135
+ createAdapterFromConfig: typeof createAdapterFromConfig;
86
136
  };
87
137
  export {};
88
138
  //# sourceMappingURL=env-config.d.ts.map
@@ -1 +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"}
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,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAEhB,eAAe,EACf,iBAAiB,EAGjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwBjF;;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;AA8aD;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,yDAAyD;IACzD,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,iBAAS,uBAAuB,CAC9B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAClC,WAAW,GAAG,IAAI,CAwBpB;AAED;;GAEG;AACH,iBAAS,qBAAqB,CAC5B,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA4BtC;AA4BD;;GAEG;AACH,iBAAe,sBAAsB,CACnC,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CA2I/B;AAkHD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD;AAOD,eAAO,MAAM,SAAS;;;;;;;;;;;;;CAarB,CAAC"}