@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,481 @@
1
+ /**
2
+ * Profiles Plugin
3
+ *
4
+ * Generic multi-profile management plugin for @qwickapps/server.
5
+ * Supports age-based categorization and content filtering.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ // Store instance for helper access
10
+ let currentStore = null;
11
+ let currentConfig = null;
12
+ /**
13
+ * Calculate age from birth date
14
+ */
15
+ function calculateAge(birthDate) {
16
+ const today = new Date();
17
+ const birth = new Date(birthDate);
18
+ let age = today.getFullYear() - birth.getFullYear();
19
+ const monthDiff = today.getMonth() - birth.getMonth();
20
+ if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
21
+ age--;
22
+ }
23
+ return age;
24
+ }
25
+ /**
26
+ * Check if current time is within allowed hours
27
+ */
28
+ function isWithinAllowedHours(start, end) {
29
+ if (!start || !end) {
30
+ return true; // No restriction
31
+ }
32
+ const now = new Date();
33
+ const currentTime = now.getHours() * 60 + now.getMinutes();
34
+ const [startHour, startMin] = start.split(':').map(Number);
35
+ const [endHour, endMin] = end.split(':').map(Number);
36
+ const startTime = startHour * 60 + startMin;
37
+ const endTime = endHour * 60 + endMin;
38
+ if (startTime <= endTime) {
39
+ // Normal range (e.g., 08:00 - 20:00)
40
+ return currentTime >= startTime && currentTime <= endTime;
41
+ }
42
+ else {
43
+ // Overnight range (e.g., 20:00 - 08:00)
44
+ return currentTime >= startTime || currentTime <= endTime;
45
+ }
46
+ }
47
+ /**
48
+ * Create the Profiles plugin
49
+ */
50
+ export function createProfilesPlugin(config) {
51
+ const debug = config.debug || false;
52
+ const maxProfilesPerUser = config.maxProfilesPerUser || 10;
53
+ const defaultFilterLevel = config.defaultFilterLevel || 'moderate';
54
+ const apiPrefix = config.api?.prefix || '/profiles';
55
+ function log(message, data) {
56
+ if (debug) {
57
+ console.log(`[ProfilesPlugin] ${message}`, data || '');
58
+ }
59
+ }
60
+ return {
61
+ id: 'profiles',
62
+ name: 'Profiles',
63
+ version: '1.0.0',
64
+ async onStart(_pluginConfig, registry) {
65
+ log('Starting profiles plugin');
66
+ // Initialize the store (creates tables if needed)
67
+ await config.store.initialize();
68
+ log('Profiles plugin migrations complete');
69
+ // Store references for helper access
70
+ currentStore = config.store;
71
+ currentConfig = config;
72
+ // Register health check
73
+ registry.registerHealthCheck({
74
+ name: 'profiles-store',
75
+ type: 'custom',
76
+ check: async () => {
77
+ try {
78
+ await config.store.search({ limit: 1 });
79
+ return {
80
+ healthy: true,
81
+ details: {
82
+ maxProfilesPerUser,
83
+ defaultFilterLevel,
84
+ },
85
+ };
86
+ }
87
+ catch {
88
+ return { healthy: false };
89
+ }
90
+ },
91
+ });
92
+ // Add API routes if enabled
93
+ if (config.api?.crud !== false) {
94
+ // List/Search profiles
95
+ registry.addRoute({
96
+ method: 'get',
97
+ path: apiPrefix,
98
+ pluginId: 'profiles',
99
+ handler: async (req, res) => {
100
+ try {
101
+ const params = {
102
+ org_id: req.query.org_id,
103
+ user_id: req.query.user_id,
104
+ age_group: req.query.age_group,
105
+ is_active: req.query.is_active === 'true' ? true : req.query.is_active === 'false' ? false : undefined,
106
+ query: req.query.q,
107
+ page: parseInt(req.query.page) || 1,
108
+ limit: Math.min(parseInt(req.query.limit) || 20, 100),
109
+ sortBy: req.query.sortBy || 'created_at',
110
+ sortOrder: req.query.sortOrder || 'desc',
111
+ };
112
+ const result = await config.store.search(params);
113
+ res.json(result);
114
+ }
115
+ catch (error) {
116
+ console.error('[ProfilesPlugin] Search error:', error);
117
+ res.status(500).json({ error: 'Failed to search profiles' });
118
+ }
119
+ },
120
+ });
121
+ // Get profile by ID
122
+ registry.addRoute({
123
+ method: 'get',
124
+ path: `${apiPrefix}/:id`,
125
+ pluginId: 'profiles',
126
+ handler: async (req, res) => {
127
+ try {
128
+ const profile = await config.store.getById(req.params.id);
129
+ if (!profile) {
130
+ return res.status(404).json({ error: 'Profile not found' });
131
+ }
132
+ res.json(profile);
133
+ }
134
+ catch (error) {
135
+ console.error('[ProfilesPlugin] Get profile error:', error);
136
+ res.status(500).json({ error: 'Failed to get profile' });
137
+ }
138
+ },
139
+ });
140
+ // Create profile
141
+ registry.addRoute({
142
+ method: 'post',
143
+ path: apiPrefix,
144
+ pluginId: 'profiles',
145
+ handler: async (req, res) => {
146
+ try {
147
+ const input = {
148
+ org_id: req.body.org_id,
149
+ user_id: req.body.user_id,
150
+ name: req.body.name,
151
+ avatar: req.body.avatar,
152
+ birth_date: req.body.birth_date ? new Date(req.body.birth_date) : undefined,
153
+ age: req.body.age,
154
+ content_filter_level: req.body.content_filter_level || defaultFilterLevel,
155
+ daily_time_limit_minutes: req.body.daily_time_limit_minutes,
156
+ allowed_hours_start: req.body.allowed_hours_start,
157
+ allowed_hours_end: req.body.allowed_hours_end,
158
+ is_default: req.body.is_default,
159
+ metadata: req.body.metadata,
160
+ };
161
+ // Validate required fields
162
+ if (!input.user_id) {
163
+ return res.status(400).json({ error: 'user_id is required' });
164
+ }
165
+ if (!input.name || input.name.trim().length === 0) {
166
+ return res.status(400).json({ error: 'name is required' });
167
+ }
168
+ // Check profile limit
169
+ const currentCount = await config.store.getProfileCount(input.user_id);
170
+ if (currentCount >= maxProfilesPerUser) {
171
+ return res.status(400).json({
172
+ error: `Maximum profiles (${maxProfilesPerUser}) reached for this user`,
173
+ });
174
+ }
175
+ const profile = await config.store.create(input);
176
+ res.status(201).json(profile);
177
+ }
178
+ catch (error) {
179
+ console.error('[ProfilesPlugin] Create profile error:', error);
180
+ res.status(500).json({ error: 'Failed to create profile' });
181
+ }
182
+ },
183
+ });
184
+ // Update profile
185
+ registry.addRoute({
186
+ method: 'put',
187
+ path: `${apiPrefix}/:id`,
188
+ pluginId: 'profiles',
189
+ handler: async (req, res) => {
190
+ try {
191
+ const input = {
192
+ name: req.body.name,
193
+ avatar: req.body.avatar,
194
+ birth_date: req.body.birth_date !== undefined
195
+ ? (req.body.birth_date ? new Date(req.body.birth_date) : null)
196
+ : undefined,
197
+ age: req.body.age,
198
+ content_filter_level: req.body.content_filter_level,
199
+ daily_time_limit_minutes: req.body.daily_time_limit_minutes,
200
+ allowed_hours_start: req.body.allowed_hours_start,
201
+ allowed_hours_end: req.body.allowed_hours_end,
202
+ is_active: req.body.is_active,
203
+ is_default: req.body.is_default,
204
+ metadata: req.body.metadata,
205
+ };
206
+ const profile = await config.store.update(req.params.id, input);
207
+ if (!profile) {
208
+ return res.status(404).json({ error: 'Profile not found' });
209
+ }
210
+ res.json(profile);
211
+ }
212
+ catch (error) {
213
+ console.error('[ProfilesPlugin] Update profile error:', error);
214
+ res.status(500).json({ error: 'Failed to update profile' });
215
+ }
216
+ },
217
+ });
218
+ // Delete profile
219
+ registry.addRoute({
220
+ method: 'delete',
221
+ path: `${apiPrefix}/:id`,
222
+ pluginId: 'profiles',
223
+ handler: async (req, res) => {
224
+ try {
225
+ const deleted = await config.store.delete(req.params.id);
226
+ if (!deleted) {
227
+ return res.status(404).json({ error: 'Profile not found' });
228
+ }
229
+ res.status(204).send();
230
+ }
231
+ catch (error) {
232
+ console.error('[ProfilesPlugin] Delete profile error:', error);
233
+ res.status(500).json({ error: 'Failed to delete profile' });
234
+ }
235
+ },
236
+ });
237
+ // List profiles for a user
238
+ registry.addRoute({
239
+ method: 'get',
240
+ path: `${apiPrefix}/user/:userId`,
241
+ pluginId: 'profiles',
242
+ handler: async (req, res) => {
243
+ try {
244
+ const profiles = await config.store.listByUser(req.params.userId);
245
+ res.json({ profiles });
246
+ }
247
+ catch (error) {
248
+ console.error('[ProfilesPlugin] List user profiles error:', error);
249
+ res.status(500).json({ error: 'Failed to list profiles' });
250
+ }
251
+ },
252
+ });
253
+ // Get default profile for a user
254
+ registry.addRoute({
255
+ method: 'get',
256
+ path: `${apiPrefix}/user/:userId/default`,
257
+ pluginId: 'profiles',
258
+ handler: async (req, res) => {
259
+ try {
260
+ const profile = await config.store.getDefaultProfile(req.params.userId);
261
+ if (!profile) {
262
+ return res.status(404).json({ error: 'No default profile found' });
263
+ }
264
+ res.json(profile);
265
+ }
266
+ catch (error) {
267
+ console.error('[ProfilesPlugin] Get default profile error:', error);
268
+ res.status(500).json({ error: 'Failed to get default profile' });
269
+ }
270
+ },
271
+ });
272
+ // Set default profile
273
+ registry.addRoute({
274
+ method: 'post',
275
+ path: `${apiPrefix}/:id/set-default`,
276
+ pluginId: 'profiles',
277
+ handler: async (req, res) => {
278
+ try {
279
+ const profile = await config.store.getById(req.params.id);
280
+ if (!profile) {
281
+ return res.status(404).json({ error: 'Profile not found' });
282
+ }
283
+ const success = await config.store.setDefaultProfile(req.params.id, profile.user_id);
284
+ if (!success) {
285
+ return res.status(500).json({ error: 'Failed to set default profile' });
286
+ }
287
+ const updated = await config.store.getById(req.params.id);
288
+ res.json(updated);
289
+ }
290
+ catch (error) {
291
+ console.error('[ProfilesPlugin] Set default profile error:', error);
292
+ res.status(500).json({ error: 'Failed to set default profile' });
293
+ }
294
+ },
295
+ });
296
+ // Check time restrictions
297
+ registry.addRoute({
298
+ method: 'get',
299
+ path: `${apiPrefix}/:id/time-check`,
300
+ pluginId: 'profiles',
301
+ handler: async (req, res) => {
302
+ try {
303
+ const profile = await config.store.getById(req.params.id);
304
+ if (!profile) {
305
+ return res.status(404).json({ error: 'Profile not found' });
306
+ }
307
+ const result = checkTimeRestrictions(profile);
308
+ res.json(result);
309
+ }
310
+ catch (error) {
311
+ console.error('[ProfilesPlugin] Time check error:', error);
312
+ res.status(500).json({ error: 'Failed to check time restrictions' });
313
+ }
314
+ },
315
+ });
316
+ }
317
+ log('Profiles plugin started');
318
+ },
319
+ async onStop() {
320
+ log('Stopping profiles plugin');
321
+ await config.store.shutdown();
322
+ currentStore = null;
323
+ currentConfig = null;
324
+ log('Profiles plugin stopped');
325
+ },
326
+ };
327
+ }
328
+ // ═══════════════════════════════════════════════════════════════════════════
329
+ // Helper Functions
330
+ // ═══════════════════════════════════════════════════════════════════════════
331
+ /**
332
+ * Get the current profile store instance
333
+ */
334
+ export function getProfileStore() {
335
+ return currentStore;
336
+ }
337
+ /**
338
+ * Create a new profile
339
+ */
340
+ export async function createProfile(input) {
341
+ if (!currentStore || !currentConfig) {
342
+ throw new Error('Profiles plugin not initialized');
343
+ }
344
+ // Check profile limit
345
+ const currentCount = await currentStore.getProfileCount(input.user_id);
346
+ const maxProfiles = currentConfig.maxProfilesPerUser || 10;
347
+ if (currentCount >= maxProfiles) {
348
+ throw new Error(`Maximum profiles (${maxProfiles}) reached for this user`);
349
+ }
350
+ // Apply default filter level
351
+ if (!input.content_filter_level) {
352
+ input.content_filter_level = currentConfig.defaultFilterLevel || 'moderate';
353
+ }
354
+ return currentStore.create(input);
355
+ }
356
+ /**
357
+ * Get a profile by ID
358
+ */
359
+ export async function getProfileById(id) {
360
+ if (!currentStore) {
361
+ throw new Error('Profiles plugin not initialized');
362
+ }
363
+ return currentStore.getById(id);
364
+ }
365
+ /**
366
+ * Update a profile
367
+ */
368
+ export async function updateProfile(id, input) {
369
+ if (!currentStore) {
370
+ throw new Error('Profiles plugin not initialized');
371
+ }
372
+ return currentStore.update(id, input);
373
+ }
374
+ /**
375
+ * Delete a profile
376
+ */
377
+ export async function deleteProfile(id) {
378
+ if (!currentStore) {
379
+ throw new Error('Profiles plugin not initialized');
380
+ }
381
+ return currentStore.delete(id);
382
+ }
383
+ /**
384
+ * List profiles for a user
385
+ */
386
+ export async function listUserProfiles(userId) {
387
+ if (!currentStore) {
388
+ throw new Error('Profiles plugin not initialized');
389
+ }
390
+ return currentStore.listByUser(userId);
391
+ }
392
+ /**
393
+ * Get the default profile for a user
394
+ */
395
+ export async function getDefaultProfile(userId) {
396
+ if (!currentStore) {
397
+ throw new Error('Profiles plugin not initialized');
398
+ }
399
+ return currentStore.getDefaultProfile(userId);
400
+ }
401
+ /**
402
+ * Set a profile as the default
403
+ */
404
+ export async function setDefaultProfile(profileId, userId) {
405
+ if (!currentStore) {
406
+ throw new Error('Profiles plugin not initialized');
407
+ }
408
+ return currentStore.setDefaultProfile(profileId, userId);
409
+ }
410
+ /**
411
+ * Get profiles by age group
412
+ */
413
+ export async function getProfilesByAgeGroup(userId, ageGroup) {
414
+ if (!currentStore) {
415
+ throw new Error('Profiles plugin not initialized');
416
+ }
417
+ return currentStore.getByAgeGroup(userId, ageGroup);
418
+ }
419
+ /**
420
+ * Get child profiles (age_group = 'child')
421
+ */
422
+ export async function getChildProfiles(userId) {
423
+ return getProfilesByAgeGroup(userId, 'child');
424
+ }
425
+ /**
426
+ * Get the current age for a profile
427
+ */
428
+ export function getProfileAge(profile) {
429
+ if (profile.birth_date) {
430
+ return calculateAge(profile.birth_date);
431
+ }
432
+ return profile.age || null;
433
+ }
434
+ /**
435
+ * Check time restrictions for a profile
436
+ */
437
+ export function checkTimeRestrictions(profile) {
438
+ // Check allowed hours
439
+ const withinHours = isWithinAllowedHours(profile.allowed_hours_start, profile.allowed_hours_end);
440
+ if (!withinHours) {
441
+ // Calculate when access will be available
442
+ const now = new Date();
443
+ let availableAt;
444
+ if (profile.allowed_hours_start) {
445
+ const [hour, min] = profile.allowed_hours_start.split(':').map(Number);
446
+ availableAt = new Date(now);
447
+ availableAt.setHours(hour, min, 0, 0);
448
+ if (availableAt <= now) {
449
+ availableAt.setDate(availableAt.getDate() + 1);
450
+ }
451
+ }
452
+ return {
453
+ allowed: false,
454
+ reason: 'Outside allowed hours',
455
+ available_at: availableAt,
456
+ };
457
+ }
458
+ // Note: Daily time limit tracking requires usage plugin integration
459
+ // For now, just return allowed if within hours
460
+ return {
461
+ allowed: true,
462
+ minutes_remaining: profile.daily_time_limit_minutes || undefined,
463
+ };
464
+ }
465
+ /**
466
+ * Get content filter level for a profile
467
+ */
468
+ export function getContentFilterLevel(profile) {
469
+ return profile.content_filter_level;
470
+ }
471
+ /**
472
+ * Check if profile can access content based on filter level
473
+ */
474
+ export function canAccessContent(profile, requiredLevel) {
475
+ const levels = ['strict', 'moderate', 'minimal', 'none'];
476
+ const profileLevelIndex = levels.indexOf(profile.content_filter_level);
477
+ const requiredLevelIndex = levels.indexOf(requiredLevel);
478
+ // Profile level must be >= required level (stricter or equal)
479
+ return profileLevelIndex <= requiredLevelIndex;
480
+ }
481
+ //# sourceMappingURL=profiles-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles-plugin.js","sourceRoot":"","sources":["../../../src/plugins/profiles/profiles-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Profile Stores
3
+ *
4
+ * Export all profile storage implementations.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ export { postgresProfileStore } from './postgres-store.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/profiles/stores/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Profile Stores
3
+ *
4
+ * Export all profile storage implementations.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ export { postgresProfileStore } from './postgres-store.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/profiles/stores/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * PostgreSQL Profile Store
3
+ *
4
+ * Profile storage implementation using PostgreSQL.
5
+ * Includes automatic age group calculation.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ import type { ProfileStore, PostgresProfileStoreConfig, AgeThresholds } from '../types.js';
10
+ /**
11
+ * Create a PostgreSQL profile store
12
+ *
13
+ * @param config Configuration including a pg Pool instance
14
+ * @param ageThresholds Optional age thresholds for categorization
15
+ * @returns ProfileStore implementation
16
+ */
17
+ export declare function postgresProfileStore(config: PostgresProfileStoreConfig, ageThresholds?: AgeThresholds): ProfileStore;
18
+ //# sourceMappingURL=postgres-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../../../src/plugins/profiles/stores/postgres-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EAMZ,0BAA0B,EAE1B,aAAa,EACd,MAAM,aAAa,CAAC;AAgDrB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,0BAA0B,EAClC,aAAa,GAAE,aAAsC,GACpD,YAAY,CAyWd"}