@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,318 @@
1
+ /**
2
+ * Rate Limit Plugin Environment Configuration
3
+ *
4
+ * Factory function for configuring rate limiting via environment variables.
5
+ *
6
+ * Environment Variables:
7
+ * - RATE_LIMIT_ENABLED: Enable rate limiting (default: true)
8
+ * - RATE_LIMIT_STRATEGY: Strategy to use: sliding-window, fixed-window, token-bucket (default: sliding-window)
9
+ * - RATE_LIMIT_WINDOW_MS: Window size in milliseconds (default: 60000 = 1 minute)
10
+ * - RATE_LIMIT_MAX_REQUESTS: Maximum requests per window (default: 100)
11
+ * - RATE_LIMIT_CACHE_TYPE: Cache type: redis, memory, auto (default: auto)
12
+ * - RATE_LIMIT_CLEANUP_ENABLED: Enable cleanup job (default: true)
13
+ * - RATE_LIMIT_CLEANUP_INTERVAL_MS: Cleanup interval in ms (default: 300000 = 5 minutes)
14
+ * - RATE_LIMIT_API_ENABLED: Enable status API endpoints (default: true)
15
+ * - RATE_LIMIT_API_PREFIX: API route prefix (default: /rate-limit)
16
+ * - RATE_LIMIT_DEBUG: Enable debug logging (default: false)
17
+ *
18
+ * PostgreSQL Store (via postgres-plugin):
19
+ * - RATE_LIMIT_TABLE_NAME: Table name (default: rate_limits)
20
+ * - RATE_LIMIT_ENABLE_RLS: Enable Row-Level Security (default: true)
21
+ * - RATE_LIMIT_AUTO_CREATE_TABLES: Auto-create tables (default: true)
22
+ *
23
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
24
+ */
25
+ import { createRateLimitPlugin } from './rate-limit-plugin.js';
26
+ import { postgresRateLimitStore } from './stores/postgres-store.js';
27
+ import { getPostgres, hasPostgres } from '../postgres-plugin.js';
28
+ let currentStatus = {
29
+ state: 'disabled',
30
+ strategy: null,
31
+ };
32
+ // ═══════════════════════════════════════════════════════════════════════════
33
+ // Environment Variable Helpers
34
+ // ═══════════════════════════════════════════════════════════════════════════
35
+ /**
36
+ * Get an environment variable, treating empty strings as undefined
37
+ */
38
+ function getEnv(key) {
39
+ const value = process.env[key];
40
+ if (value === undefined || value === null || value.trim() === '') {
41
+ return undefined;
42
+ }
43
+ return value.trim();
44
+ }
45
+ /**
46
+ * Parse a boolean environment variable
47
+ */
48
+ function getEnvBool(key, defaultValue) {
49
+ const value = getEnv(key);
50
+ if (value === undefined) {
51
+ return defaultValue;
52
+ }
53
+ const lower = value.toLowerCase();
54
+ if (['true', '1', 'yes'].includes(lower)) {
55
+ return true;
56
+ }
57
+ if (['false', '0', 'no'].includes(lower)) {
58
+ return false;
59
+ }
60
+ return defaultValue;
61
+ }
62
+ /**
63
+ * Parse an integer environment variable
64
+ */
65
+ function getEnvInt(key, defaultValue) {
66
+ const value = getEnv(key);
67
+ if (value === undefined) {
68
+ return defaultValue;
69
+ }
70
+ const parsed = parseInt(value, 10);
71
+ return isNaN(parsed) ? defaultValue : parsed;
72
+ }
73
+ // ═══════════════════════════════════════════════════════════════════════════
74
+ // Factory Function
75
+ // ═══════════════════════════════════════════════════════════════════════════
76
+ const VALID_STRATEGIES = ['sliding-window', 'fixed-window', 'token-bucket'];
77
+ const VALID_CACHE_TYPES = ['redis', 'memory', 'auto'];
78
+ /**
79
+ * Create a rate limit plugin configured from environment variables.
80
+ *
81
+ * The plugin state depends on environment configuration:
82
+ * - **disabled**: RATE_LIMIT_ENABLED=false - no rate limiting is applied
83
+ * - **enabled**: Valid configuration - rate limiting is active
84
+ * - **error**: Invalid configuration or missing postgres - plugin is disabled with error details
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * // Zero-config setup - reads everything from env vars
89
+ * // Requires postgres-plugin to be registered first
90
+ * const rateLimitPlugin = createRateLimitPluginFromEnv();
91
+ *
92
+ * // With custom store
93
+ * const rateLimitPlugin = createRateLimitPluginFromEnv({
94
+ * store: myCustomStore,
95
+ * });
96
+ * ```
97
+ *
98
+ * @param options - Optional overrides
99
+ * @returns A Plugin instance
100
+ */
101
+ export function createRateLimitPluginFromEnv(options) {
102
+ const enabled = getEnvBool('RATE_LIMIT_ENABLED', true);
103
+ // Check if disabled
104
+ if (!enabled) {
105
+ currentStatus = {
106
+ state: 'disabled',
107
+ strategy: null,
108
+ };
109
+ return createDisabledPlugin();
110
+ }
111
+ // Parse strategy
112
+ const strategyName = getEnv('RATE_LIMIT_STRATEGY')?.toLowerCase() || 'sliding-window';
113
+ if (!VALID_STRATEGIES.includes(strategyName)) {
114
+ const error = `Invalid RATE_LIMIT_STRATEGY: "${strategyName}". Valid options: ${VALID_STRATEGIES.join(', ')}`;
115
+ currentStatus = {
116
+ state: 'error',
117
+ strategy: null,
118
+ error,
119
+ };
120
+ return createErrorPlugin(error);
121
+ }
122
+ const strategy = strategyName;
123
+ // Parse cache type
124
+ const cacheTypeName = getEnv('RATE_LIMIT_CACHE_TYPE')?.toLowerCase() || 'auto';
125
+ if (!VALID_CACHE_TYPES.includes(cacheTypeName)) {
126
+ const error = `Invalid RATE_LIMIT_CACHE_TYPE: "${cacheTypeName}". Valid options: ${VALID_CACHE_TYPES.join(', ')}`;
127
+ currentStatus = {
128
+ state: 'error',
129
+ strategy: null,
130
+ error,
131
+ };
132
+ return createErrorPlugin(error);
133
+ }
134
+ const cacheType = cacheTypeName;
135
+ // Parse other config
136
+ const windowMs = getEnvInt('RATE_LIMIT_WINDOW_MS', 60000);
137
+ const maxRequests = getEnvInt('RATE_LIMIT_MAX_REQUESTS', 100);
138
+ const cleanupEnabled = getEnvBool('RATE_LIMIT_CLEANUP_ENABLED', true);
139
+ const cleanupIntervalMs = getEnvInt('RATE_LIMIT_CLEANUP_INTERVAL_MS', 300000);
140
+ const apiEnabled = getEnvBool('RATE_LIMIT_API_ENABLED', true);
141
+ const apiPrefix = getEnv('RATE_LIMIT_API_PREFIX') || '/rate-limit';
142
+ const debug = options?.debug ?? getEnvBool('RATE_LIMIT_DEBUG', false);
143
+ // PostgreSQL store config
144
+ const tableName = getEnv('RATE_LIMIT_TABLE_NAME') || 'rate_limits';
145
+ const enableRLS = getEnvBool('RATE_LIMIT_ENABLE_RLS', true);
146
+ const autoCreateTables = getEnvBool('RATE_LIMIT_AUTO_CREATE_TABLES', true);
147
+ // Build config
148
+ const config = {
149
+ defaults: {
150
+ windowMs,
151
+ maxRequests,
152
+ strategy,
153
+ },
154
+ cache: {
155
+ type: cacheType,
156
+ },
157
+ cleanup: {
158
+ enabled: cleanupEnabled,
159
+ intervalMs: cleanupIntervalMs,
160
+ },
161
+ api: {
162
+ enabled: apiEnabled,
163
+ prefix: apiPrefix,
164
+ },
165
+ debug,
166
+ };
167
+ // Update status
168
+ currentStatus = {
169
+ state: 'enabled',
170
+ strategy,
171
+ config: {
172
+ strategy,
173
+ windowMs,
174
+ maxRequests,
175
+ cacheType: cacheType,
176
+ cleanupEnabled,
177
+ cleanupIntervalMs,
178
+ apiEnabled,
179
+ apiPrefix,
180
+ tableName,
181
+ enableRLS,
182
+ autoCreateTables,
183
+ },
184
+ };
185
+ // Return a plugin that will initialize store on start
186
+ return createDeferredPlugin(config, options?.store, {
187
+ tableName,
188
+ enableRLS,
189
+ autoCreateTables,
190
+ });
191
+ }
192
+ // ═══════════════════════════════════════════════════════════════════════════
193
+ // Status API
194
+ // ═══════════════════════════════════════════════════════════════════════════
195
+ /**
196
+ * Get current rate limit plugin status
197
+ */
198
+ export function getRateLimitConfigStatus() {
199
+ return { ...currentStatus };
200
+ }
201
+ /**
202
+ * Register config API routes
203
+ */
204
+ function registerConfigRoutes(registry) {
205
+ // GET /rate-limit/config/status - Get current rate limit status
206
+ registry.addRoute({
207
+ method: 'get',
208
+ path: '/rate-limit/config/status',
209
+ pluginId: 'rate-limit',
210
+ handler: (_req, res) => {
211
+ res.json(getRateLimitConfigStatus());
212
+ },
213
+ });
214
+ }
215
+ /**
216
+ * Create a deferred plugin that initializes the store on start
217
+ * This allows the postgres-plugin to be initialized first
218
+ */
219
+ function createDeferredPlugin(config, customStore, pgOptions) {
220
+ return {
221
+ id: 'rate-limit',
222
+ name: 'Rate Limit Plugin',
223
+ version: '1.0.0',
224
+ async onStart(pluginConfig, registry) {
225
+ const logger = registry.getLogger('rate-limit');
226
+ // Get or create store
227
+ let store = customStore;
228
+ if (!store) {
229
+ // Check if postgres plugin is available
230
+ if (!hasPostgres()) {
231
+ const error = 'Rate limit plugin requires postgres-plugin to be registered and started first';
232
+ logger.error(error);
233
+ currentStatus = {
234
+ state: 'error',
235
+ strategy: null,
236
+ error,
237
+ };
238
+ // Register config routes so admin can see the error
239
+ registerConfigRoutes(registry);
240
+ return;
241
+ }
242
+ // Create postgres store
243
+ store = postgresRateLimitStore({
244
+ pool: () => getPostgres().getPool(),
245
+ tableName: pgOptions.tableName,
246
+ enableRLS: pgOptions.enableRLS,
247
+ autoCreateTables: pgOptions.autoCreateTables,
248
+ });
249
+ }
250
+ // Create the actual plugin and delegate
251
+ const actualPlugin = createRateLimitPlugin({
252
+ ...config,
253
+ store,
254
+ });
255
+ // Call its onStart
256
+ await actualPlugin.onStart?.(pluginConfig, registry);
257
+ // Register config routes
258
+ registerConfigRoutes(registry);
259
+ logger.info('Rate limit plugin started from env config', {
260
+ strategy: config.defaults.strategy,
261
+ windowMs: config.defaults.windowMs,
262
+ maxRequests: config.defaults.maxRequests,
263
+ });
264
+ },
265
+ async onStop() {
266
+ // The actual plugin handles cleanup
267
+ },
268
+ };
269
+ }
270
+ /**
271
+ * Create a disabled plugin (no rate limiting)
272
+ */
273
+ function createDisabledPlugin() {
274
+ return {
275
+ id: 'rate-limit',
276
+ name: 'Rate Limit Plugin (Disabled)',
277
+ version: '1.0.0',
278
+ async onStart(_pluginConfig, registry) {
279
+ const logger = registry.getLogger('rate-limit');
280
+ logger.info('Rate limit plugin disabled - RATE_LIMIT_ENABLED=false');
281
+ // Register status routes even when disabled
282
+ registerConfigRoutes(registry);
283
+ },
284
+ async onStop() {
285
+ // Nothing to cleanup
286
+ },
287
+ };
288
+ }
289
+ /**
290
+ * Create an error plugin (rate limiting disabled due to configuration error)
291
+ */
292
+ function createErrorPlugin(error) {
293
+ return {
294
+ id: 'rate-limit',
295
+ name: 'Rate Limit Plugin (Error)',
296
+ version: '1.0.0',
297
+ async onStart(_pluginConfig, registry) {
298
+ const logger = registry.getLogger('rate-limit');
299
+ logger.error(`Rate limit plugin error: ${error}`);
300
+ // Register status routes so admin can see the error
301
+ registerConfigRoutes(registry);
302
+ },
303
+ async onStop() {
304
+ // Nothing to cleanup
305
+ },
306
+ };
307
+ }
308
+ // ═══════════════════════════════════════════════════════════════════════════
309
+ // Exports for Testing
310
+ // ═══════════════════════════════════════════════════════════════════════════
311
+ export const __testing = {
312
+ getEnv,
313
+ getEnvBool,
314
+ getEnvInt,
315
+ VALID_STRATEGIES,
316
+ VALID_CACHE_TYPES,
317
+ };
318
+ //# sourceMappingURL=env-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-config.js","sourceRoot":"","sources":["../../../src/plugins/rate-limit/env-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAajE,IAAI,aAAa,GAA0B;IACzC,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;GAEG;AACH,SAAS,MAAM,CAAC,GAAW;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,YAAqB;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,YAAoB;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC;AAkBD,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,gBAAgB,GAAwB,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AACjG,MAAM,iBAAiB,GAAmC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEtF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAmC;IAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IAEvD,oBAAoB;IACpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,aAAa,GAAG;YACd,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,iBAAiB;IACjB,MAAM,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,IAAI,gBAAgB,CAAC;IACtF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAiC,CAAC,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,iCAAiC,YAAY,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9G,aAAa,GAAG;YACd,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,KAAK;SACN,CAAC;QACF,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,QAAQ,GAAG,YAAiC,CAAC;IAEnD,mBAAmB;IACnB,MAAM,aAAa,GAAG,MAAM,CAAC,uBAAuB,CAAC,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;IAC/E,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAA6C,CAAC,EAAE,CAAC;QAC/E,MAAM,KAAK,GAAG,mCAAmC,aAAa,qBAAqB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClH,aAAa,GAAG;YACd,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,KAAK;SACN,CAAC;QACF,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,SAAS,GAAG,aAA6C,CAAC;IAEhE,qBAAqB;IACrB,MAAM,QAAQ,GAAG,SAAS,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,SAAS,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,UAAU,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,iBAAiB,GAAG,SAAS,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,UAAU,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,aAAa,CAAC;IACnE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAEtE,0BAA0B;IAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,aAAa,CAAC;IACnE,MAAM,SAAS,GAAG,UAAU,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,UAAU,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;IAE3E,eAAe;IACf,MAAM,MAAM,GAAyC;QACnD,QAAQ,EAAE;YACR,QAAQ;YACR,WAAW;YACX,QAAQ;SACT;QACD,KAAK,EAAE;YACL,IAAI,EAAE,SAAS;SAChB;QACD,OAAO,EAAE;YACP,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,iBAAiB;SAC9B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,SAAS;SAClB;QACD,KAAK;KACN,CAAC;IAEF,gBAAgB;IAChB,aAAa,GAAG;QACd,KAAK,EAAE,SAAS;QAChB,QAAQ;QACR,MAAM,EAAE;YACN,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,SAAS,EAAE,SAAmB;YAC9B,cAAc;YACd,iBAAiB;YACjB,UAAU;YACV,SAAS;YACT,SAAS;YACT,SAAS;YACT,gBAAgB;SACjB;KACF,CAAC;IAEF,sDAAsD;IACtD,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;QAClD,SAAS;QACT,SAAS;QACT,gBAAgB;KACjB,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,QAAwB;IACpD,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC;QAChB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,2BAA2B;QACjC,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YACxC,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;QACvC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAYD;;;GAGG;AACH,SAAS,oBAAoB,CAC3B,MAA4C,EAC5C,WAAuD,EACvD,SAA+B;IAE/B,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO;QAEhB,KAAK,CAAC,OAAO,CAAC,YAA0B,EAAE,QAAwB;YAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAEhD,sBAAsB;YACtB,IAAI,KAAK,GAAG,WAAW,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,wCAAwC;gBACxC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACnB,MAAM,KAAK,GAAG,+EAA+E,CAAC;oBAC9F,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACpB,aAAa,GAAG;wBACd,KAAK,EAAE,OAAO;wBACd,QAAQ,EAAE,IAAI;wBACd,KAAK;qBACN,CAAC;oBACF,oDAAoD;oBACpD,oBAAoB,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBAED,wBAAwB;gBACxB,KAAK,GAAG,sBAAsB,CAAC;oBAC7B,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE;oBACnC,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;iBAC7C,CAAC,CAAC;YACL,CAAC;YAED,wCAAwC;YACxC,MAAM,YAAY,GAAG,qBAAqB,CAAC;gBACzC,GAAG,MAAM;gBACT,KAAK;aACN,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAErD,yBAAyB;YACzB,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAE/B,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;gBACvD,QAAQ,EAAE,MAAM,CAAC,QAAS,CAAC,QAAQ;gBACnC,QAAQ,EAAE,MAAM,CAAC,QAAS,CAAC,QAAQ;gBACnC,WAAW,EAAE,MAAM,CAAC,QAAS,CAAC,WAAW;aAC1C,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,MAAM;YACV,oCAAoC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,8BAA8B;QACpC,OAAO,EAAE,OAAO;QAEhB,KAAK,CAAC,OAAO,CAAC,aAA2B,EAAE,QAAwB;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YAErE,4CAA4C;YAC5C,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,MAAM;YACV,qBAAqB;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,OAAO;QAEhB,KAAK,CAAC,OAAO,CAAC,aAA2B,EAAE,QAAwB;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;YAElD,oDAAoD;YACpD,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,MAAM;YACV,qBAAqB;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM;IACN,UAAU;IACV,SAAS;IACT,gBAAgB;IAChB,iBAAiB;CAClB,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Rate Limit Plugin
3
+ *
4
+ * Provides rate limiting capabilities for @qwickapps/server.
5
+ *
6
+ * ## Features
7
+ * - Multiple strategies: sliding window, fixed window, token bucket
8
+ * - PostgreSQL persistence with RLS for multi-tenant isolation
9
+ * - Redis caching with in-memory fallback
10
+ * - Express middleware for automatic enforcement
11
+ * - Programmatic API for custom rate limiting
12
+ * - Auto-cleanup of expired limits
13
+ *
14
+ * ## Usage
15
+ *
16
+ * ```typescript
17
+ * import {
18
+ * createGateway,
19
+ * createRateLimitPlugin,
20
+ * postgresRateLimitStore,
21
+ * rateLimitMiddleware,
22
+ * isLimited,
23
+ * clearLimit,
24
+ * getPostgres,
25
+ * } from '@qwickapps/server';
26
+ *
27
+ * // Create the gateway with rate limit plugin
28
+ * const gateway = createGateway({
29
+ * plugins: [
30
+ * createRateLimitPlugin({
31
+ * store: postgresRateLimitStore({
32
+ * pool: () => getPostgres().getPool(),
33
+ * }),
34
+ * defaults: {
35
+ * windowMs: 60000, // 1 minute
36
+ * maxRequests: 100, // 100 requests per window
37
+ * strategy: 'sliding-window',
38
+ * },
39
+ * }),
40
+ * ],
41
+ * });
42
+ *
43
+ * // Use middleware
44
+ * app.use('/api', rateLimitMiddleware());
45
+ *
46
+ * // Per-route configuration
47
+ * app.post('/api/chat', rateLimitMiddleware({
48
+ * windowMs: 60000,
49
+ * max: 50,
50
+ * keyGenerator: (req) => `chat:${req.user.id}`,
51
+ * }));
52
+ *
53
+ * // Programmatic API
54
+ * const limited = await isLimited('user:123:api');
55
+ * if (limited) {
56
+ * // Handle rate limit
57
+ * }
58
+ *
59
+ * // Clear limit (e.g., after CAPTCHA)
60
+ * await clearLimit('user:123:api');
61
+ * ```
62
+ *
63
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
64
+ */
65
+ export { createRateLimitPlugin } from './rate-limit-plugin.js';
66
+ export { createRateLimitPluginFromEnv, getRateLimitConfigStatus } from './env-config.js';
67
+ export type { RateLimitEnvPluginOptions } from './env-config.js';
68
+ export { postgresRateLimitStore } from './stores/postgres-store.js';
69
+ export { createRateLimitCache, createNoOpCache } from './stores/cache-store.js';
70
+ export { createSlidingWindowStrategy, createFixedWindowStrategy, createTokenBucketStrategy, getStrategy, } from './strategies/index.js';
71
+ export { rateLimitMiddleware, rateLimitStatusMiddleware } from './middleware.js';
72
+ export { RateLimitService, getRateLimitService, isLimited, checkLimit, incrementLimit, getRemainingRequests, getLimitStatus, clearLimit, } from './rate-limit-service.js';
73
+ export { createCleanupJob } from './cleanup.js';
74
+ export type { CleanupJob, CleanupJobConfig } from './cleanup.js';
75
+ export type { RateLimitStrategy, LimitStatus, Strategy, StrategyOptions, StrategyContext, StoredLimit, IncrementOptions, RateLimitStore, PostgresRateLimitStoreConfig, CachedLimit, RateLimitCache, RateLimitCacheConfig, RateLimitMiddlewareOptions, RateLimitPluginConfig, CheckLimitOptions, } from './types.js';
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/rate-limit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACzF,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGhF,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAGjF,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,UAAU,GACX,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGjE,YAAY,EAEV,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,eAAe,EACf,eAAe,EAGf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,4BAA4B,EAG5B,WAAW,EACX,cAAc,EACd,oBAAoB,EAGpB,0BAA0B,EAG1B,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Rate Limit Plugin
3
+ *
4
+ * Provides rate limiting capabilities for @qwickapps/server.
5
+ *
6
+ * ## Features
7
+ * - Multiple strategies: sliding window, fixed window, token bucket
8
+ * - PostgreSQL persistence with RLS for multi-tenant isolation
9
+ * - Redis caching with in-memory fallback
10
+ * - Express middleware for automatic enforcement
11
+ * - Programmatic API for custom rate limiting
12
+ * - Auto-cleanup of expired limits
13
+ *
14
+ * ## Usage
15
+ *
16
+ * ```typescript
17
+ * import {
18
+ * createGateway,
19
+ * createRateLimitPlugin,
20
+ * postgresRateLimitStore,
21
+ * rateLimitMiddleware,
22
+ * isLimited,
23
+ * clearLimit,
24
+ * getPostgres,
25
+ * } from '@qwickapps/server';
26
+ *
27
+ * // Create the gateway with rate limit plugin
28
+ * const gateway = createGateway({
29
+ * plugins: [
30
+ * createRateLimitPlugin({
31
+ * store: postgresRateLimitStore({
32
+ * pool: () => getPostgres().getPool(),
33
+ * }),
34
+ * defaults: {
35
+ * windowMs: 60000, // 1 minute
36
+ * maxRequests: 100, // 100 requests per window
37
+ * strategy: 'sliding-window',
38
+ * },
39
+ * }),
40
+ * ],
41
+ * });
42
+ *
43
+ * // Use middleware
44
+ * app.use('/api', rateLimitMiddleware());
45
+ *
46
+ * // Per-route configuration
47
+ * app.post('/api/chat', rateLimitMiddleware({
48
+ * windowMs: 60000,
49
+ * max: 50,
50
+ * keyGenerator: (req) => `chat:${req.user.id}`,
51
+ * }));
52
+ *
53
+ * // Programmatic API
54
+ * const limited = await isLimited('user:123:api');
55
+ * if (limited) {
56
+ * // Handle rate limit
57
+ * }
58
+ *
59
+ * // Clear limit (e.g., after CAPTCHA)
60
+ * await clearLimit('user:123:api');
61
+ * ```
62
+ *
63
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
64
+ */
65
+ // Plugin
66
+ export { createRateLimitPlugin } from './rate-limit-plugin.js';
67
+ export { createRateLimitPluginFromEnv, getRateLimitConfigStatus } from './env-config.js';
68
+ // Stores
69
+ export { postgresRateLimitStore } from './stores/postgres-store.js';
70
+ export { createRateLimitCache, createNoOpCache } from './stores/cache-store.js';
71
+ // Strategies
72
+ export { createSlidingWindowStrategy, createFixedWindowStrategy, createTokenBucketStrategy, getStrategy, } from './strategies/index.js';
73
+ // Middleware
74
+ export { rateLimitMiddleware, rateLimitStatusMiddleware } from './middleware.js';
75
+ // Service and programmatic API
76
+ export { RateLimitService, getRateLimitService, isLimited, checkLimit, incrementLimit, getRemainingRequests, getLimitStatus, clearLimit, } from './rate-limit-service.js';
77
+ // Cleanup
78
+ export { createCleanupJob } from './cleanup.js';
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/rate-limit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,SAAS;AACT,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAGzF,SAAS;AACT,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEhF,aAAa;AACb,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAE/B,aAAa;AACb,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,+BAA+B;AAC/B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Rate Limit Middleware
3
+ *
4
+ * Express middleware for automatic rate limiting.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ import type { RequestHandler } from 'express';
9
+ import type { RateLimitMiddlewareOptions } from './types.js';
10
+ /**
11
+ * Create rate limit middleware
12
+ *
13
+ * @param options Middleware configuration
14
+ * @returns Express middleware function
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // Basic usage
19
+ * app.use('/api', rateLimitMiddleware());
20
+ *
21
+ * // Custom configuration
22
+ * app.post('/api/chat', rateLimitMiddleware({
23
+ * windowMs: 60000,
24
+ * max: 50,
25
+ * keyGenerator: (req) => `chat:${req.user.id}`,
26
+ * }));
27
+ *
28
+ * // Tiered limits
29
+ * app.use(rateLimitMiddleware({
30
+ * max: (req) => req.user?.tier === 'premium' ? 1000 : 50,
31
+ * }));
32
+ * ```
33
+ */
34
+ export declare function rateLimitMiddleware(options?: RateLimitMiddlewareOptions): RequestHandler;
35
+ /**
36
+ * Create a rate limit middleware that only checks without incrementing
37
+ * Useful for displaying rate limit status without counting the request
38
+ */
39
+ export declare function rateLimitStatusMiddleware(options?: RateLimitMiddlewareOptions): RequestHandler;
40
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/plugins/rate-limit/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,0BAA0B,EAAe,MAAM,YAAY,CAAC;AAwD1E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,cAAc,CAkE5F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,cAAc,CAkDlG"}