divhunt 2.0.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 (473) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/addons/core/clients/LICENSE.txt +40 -0
  4. package/addons/core/clients/README.md +123 -0
  5. package/addons/core/clients/back/grpc/addon.js +25 -0
  6. package/addons/core/clients/back/grpc/item/catch/add.js +8 -0
  7. package/addons/core/clients/back/grpc/item/functions/connect.js +73 -0
  8. package/addons/core/clients/back/grpc/item/functions/resolve.js +41 -0
  9. package/addons/core/clients/back/grpc/item/functions/stream.js +103 -0
  10. package/addons/core/clients/back/grpc/load.js +11 -0
  11. package/addons/core/clients/back/grpc/service.proto +20 -0
  12. package/addons/core/clients/back/http/addon.js +21 -0
  13. package/addons/core/clients/back/http/item/catch/add.js +18 -0
  14. package/addons/core/clients/back/http/item/functions/gRPC/create.js +192 -0
  15. package/addons/core/clients/back/http/item/functions/gRPC/execute.js +15 -0
  16. package/addons/core/clients/back/http/item/functions/http/create.js +143 -0
  17. package/addons/core/clients/back/http/item/functions/http/delete.js +8 -0
  18. package/addons/core/clients/back/http/item/functions/http/get.js +8 -0
  19. package/addons/core/clients/back/http/item/functions/http/post.js +8 -0
  20. package/addons/core/clients/back/http/item/functions/http/put.js +8 -0
  21. package/addons/core/clients/back/http/item/functions/http/request.js +15 -0
  22. package/addons/core/clients/back/http/load.js +17 -0
  23. package/addons/core/commands/LICENSE.txt +40 -0
  24. package/addons/core/commands/README.md +294 -0
  25. package/addons/core/commands/back/addon.js +31 -0
  26. package/addons/core/commands/back/functions/find.js +54 -0
  27. package/addons/core/commands/back/functions/grpc/client.js +155 -0
  28. package/addons/core/commands/back/functions/grpc/server.js +71 -0
  29. package/addons/core/commands/back/functions/http/server.js +91 -0
  30. package/addons/core/commands/back/item/functions/run.js +82 -0
  31. package/addons/core/commands/back/items/many.js +76 -0
  32. package/addons/core/commands/back/items/one.js +78 -0
  33. package/addons/core/commands/back/items/run.js +51 -0
  34. package/addons/core/commands/back/load.js +20 -0
  35. package/addons/core/commands/front/#register/addon.js +11 -0
  36. package/addons/core/commands/front/functions/find.js +24 -0
  37. package/addons/core/commands/front/item/functions/run.js +98 -0
  38. package/addons/core/commands/front/items/elements/table/table.css +18 -0
  39. package/addons/core/commands/front/items/elements/table/table.js +254 -0
  40. package/addons/core/database/README.md +276 -0
  41. package/addons/core/database/back/addon.js +14 -0
  42. package/addons/core/database/back/events/addon.add.js +18 -0
  43. package/addons/core/database/back/events/middleware/addon.items.find.js +24 -0
  44. package/addons/core/database/back/events/middleware/item.crud.create.js +24 -0
  45. package/addons/core/database/back/events/middleware/item.crud.delete.js +24 -0
  46. package/addons/core/database/back/events/middleware/item.crud.update.js +24 -0
  47. package/addons/core/database/back/functions/create.js +6 -0
  48. package/addons/core/database/back/functions/delete.js +6 -0
  49. package/addons/core/database/back/functions/find/builder.js +160 -0
  50. package/addons/core/database/back/functions/find/count.js +12 -0
  51. package/addons/core/database/back/functions/find/filter.js +37 -0
  52. package/addons/core/database/back/functions/find/filters.js +7 -0
  53. package/addons/core/database/back/functions/find/many.js +93 -0
  54. package/addons/core/database/back/functions/find/methods.js +235 -0
  55. package/addons/core/database/back/functions/find/plain.js +25 -0
  56. package/addons/core/database/back/functions/find/validation.js +214 -0
  57. package/addons/core/database/back/functions/find.js +25 -0
  58. package/addons/core/database/back/functions/update.js +6 -0
  59. package/addons/core/database/back/item/catch/add.js +25 -0
  60. package/addons/core/database/back/item/functions/create.js +93 -0
  61. package/addons/core/database/back/item/functions/delete.js +25 -0
  62. package/addons/core/database/back/item/functions/find.js +19 -0
  63. package/addons/core/database/back/item/functions/save.js +15 -0
  64. package/addons/core/database/back/item/functions/transaction.js +17 -0
  65. package/addons/core/database/back/item/functions/update.js +76 -0
  66. package/addons/core/database/back/items/commands/expose.js +321 -0
  67. package/addons/core/database/back/load.js +68 -0
  68. package/addons/core/database/front/#register/addon.js +4 -0
  69. package/addons/core/database/front/events/addon.add.js +13 -0
  70. package/addons/core/database/front/functions/find.js +142 -0
  71. package/addons/core/queue/README.md +216 -0
  72. package/addons/core/queue/back/addon.js +21 -0
  73. package/addons/core/queue/back/functions/calculate/art.js +12 -0
  74. package/addons/core/queue/back/functions/calculate/rps.js +22 -0
  75. package/addons/core/queue/back/item/catch/add.js +6 -0
  76. package/addons/core/queue/back/item/catch/remove.js +6 -0
  77. package/addons/core/queue/back/item/functions/add.js +15 -0
  78. package/addons/core/queue/back/item/functions/start.js +135 -0
  79. package/addons/core/queue/back/load.js +12 -0
  80. package/addons/core/queue/index.js +66 -0
  81. package/addons/core/queue/package.json +13 -0
  82. package/addons/core/servers/README.md +85 -0
  83. package/addons/core/servers/back/grpc/addon.js +23 -0
  84. package/addons/core/servers/back/grpc/item/catch/add.js +6 -0
  85. package/addons/core/servers/back/grpc/item/functions/resolve.js +41 -0
  86. package/addons/core/servers/back/grpc/item/functions/start.js +65 -0
  87. package/addons/core/servers/back/grpc/item/functions/stream.js +68 -0
  88. package/addons/core/servers/back/grpc/load.js +9 -0
  89. package/addons/core/servers/back/grpc/service.proto +20 -0
  90. package/addons/core/servers/back/http/addon.js +15 -0
  91. package/addons/core/servers/back/http/functions/extract/data.js +232 -0
  92. package/addons/core/servers/back/http/item/catch/add.js +6 -0
  93. package/addons/core/servers/back/http/item/functions/start.js +135 -0
  94. package/addons/core/servers/back/http/load.js +8 -0
  95. package/addons/float/modals/front/css/modals.css +26 -0
  96. package/addons/float/modals/front/js/#register/addon.js +10 -0
  97. package/addons/float/modals/front/js/item/catch/add.js +48 -0
  98. package/addons/float/modals/front/js/item/catch/remove.js +9 -0
  99. package/addons/float/overlays/front/css/overlays.css +29 -0
  100. package/addons/float/overlays/front/js/#register/addon.js +17 -0
  101. package/addons/float/overlays/front/js/events/click.js +27 -0
  102. package/addons/float/overlays/front/js/events/escape.js +18 -0
  103. package/addons/float/overlays/front/js/functions/flip.js +74 -0
  104. package/addons/float/overlays/front/js/functions/index.js +17 -0
  105. package/addons/float/overlays/front/js/functions/position.js +63 -0
  106. package/addons/float/overlays/front/js/item/catch/add.js +121 -0
  107. package/addons/float/overlays/front/js/item/catch/remove.js +16 -0
  108. package/addons/float/popups/css/popups.css +4 -0
  109. package/addons/float/popups/js/#register/addon.js +18 -0
  110. package/addons/float/popups/js/item/catch/add.js +7 -0
  111. package/addons/float/popups/js/item/catch/remove.js +7 -0
  112. package/addons/float/popups/js/item/catch/set.js +73 -0
  113. package/addons/float/popups/js/items/directives/popup.js +54 -0
  114. package/addons/float/toasts/#register/addon.js +17 -0
  115. package/addons/float/toasts/item/catch/add.js +7 -0
  116. package/addons/float/toasts/item/catch/remove.js +7 -0
  117. package/addons/float/toasts/item/catch/set.js +86 -0
  118. package/addons/float/toasts/items/elements/toast/toast.css +84 -0
  119. package/addons/float/toasts/items/elements/toast/toast.js +61 -0
  120. package/addons/float/tooltips/#register/addon.js +15 -0
  121. package/addons/float/tooltips/item/catch/add.js +7 -0
  122. package/addons/float/tooltips/item/catch/remove.js +26 -0
  123. package/addons/float/tooltips/item/catch/set.js +65 -0
  124. package/addons/float/tooltips/items/directives/tooltip.js +74 -0
  125. package/addons/float/tooltips/items/elements/tooltip.css +64 -0
  126. package/addons/float/tooltips/items/elements/tooltip.js +42 -0
  127. package/addons/modules/actions/front/addon.js +19 -0
  128. package/addons/modules/actions/front/functions/run.js +230 -0
  129. package/addons/modules/actions/front/load.js +5 -0
  130. package/addons/modules/bugs/front/addon.js +16 -0
  131. package/addons/modules/bugs/front/functions/clear.js +14 -0
  132. package/addons/modules/bugs/front/functions/push.js +15 -0
  133. package/addons/modules/bugs/front/functions/resolve.js +13 -0
  134. package/addons/modules/bugs/front/item/catch/add.js +9 -0
  135. package/addons/modules/bugs/front/load.js +9 -0
  136. package/addons/modules/events/front/addon.js +11 -0
  137. package/addons/modules/events/front/functions/clear.js +9 -0
  138. package/addons/modules/events/front/functions/emit.js +60 -0
  139. package/addons/modules/events/front/functions/off.js +23 -0
  140. package/addons/modules/events/front/functions/on.js +40 -0
  141. package/addons/modules/events/front/functions/once.js +6 -0
  142. package/addons/modules/events/front/load.js +9 -0
  143. package/addons/modules/schedules/back/addon.js +26 -0
  144. package/addons/modules/schedules/back/functions/disable.js +17 -0
  145. package/addons/modules/schedules/back/functions/enable.js +17 -0
  146. package/addons/modules/schedules/back/functions/next.js +142 -0
  147. package/addons/modules/schedules/back/functions/start.js +126 -0
  148. package/addons/modules/schedules/back/functions/stop.js +38 -0
  149. package/addons/modules/schedules/back/functions/trigger.js +134 -0
  150. package/addons/modules/schedules/back/items/create.js +82 -0
  151. package/addons/modules/schedules/back/items/delete.js +38 -0
  152. package/addons/modules/schedules/back/items/many.js +90 -0
  153. package/addons/modules/schedules/back/items/one.js +48 -0
  154. package/addons/modules/schedules/back/items/update.js +115 -0
  155. package/addons/modules/schedules/back/load.js +16 -0
  156. package/addons/modules/schedules/front/addon.js +23 -0
  157. package/addons/modules/schedules/front/functions/disable.js +17 -0
  158. package/addons/modules/schedules/front/functions/enable.js +17 -0
  159. package/addons/modules/schedules/front/functions/next.js +142 -0
  160. package/addons/modules/schedules/front/functions/start.js +126 -0
  161. package/addons/modules/schedules/front/functions/stop.js +38 -0
  162. package/addons/modules/schedules/front/functions/trigger.js +161 -0
  163. package/addons/modules/schedules/front/load.js +10 -0
  164. package/addons/modules/shortcuts/front/#register/addon.js +22 -0
  165. package/addons/modules/shortcuts/front/functions/context.js +13 -0
  166. package/addons/modules/shortcuts/front/functions/disable.js +15 -0
  167. package/addons/modules/shortcuts/front/functions/enable.js +15 -0
  168. package/addons/modules/shortcuts/front/functions/register.js +170 -0
  169. package/addons/modules/shortcuts/front/functions/trigger.js +140 -0
  170. package/addons/modules/shortcuts/front/functions/unregister.js +19 -0
  171. package/addons/modules/shortcuts/front/load.js +12 -0
  172. package/addons/modules/sources/back/addon.js +23 -0
  173. package/addons/modules/sources/back/functions/run.js +252 -0
  174. package/addons/modules/sources/back/items/create.js +74 -0
  175. package/addons/modules/sources/back/items/delete.js +36 -0
  176. package/addons/modules/sources/back/items/many.js +80 -0
  177. package/addons/modules/sources/back/items/one.js +46 -0
  178. package/addons/modules/sources/back/items/run.js +28 -0
  179. package/addons/modules/sources/back/items/update.js +110 -0
  180. package/addons/modules/sources/back/load.js +12 -0
  181. package/addons/modules/sources/front/addon.js +20 -0
  182. package/addons/modules/sources/front/functions/run.js +279 -0
  183. package/addons/modules/sources/front/load.js +5 -0
  184. package/addons/modules/variables/addon.js +12 -0
  185. package/addons/modules/variables/functions/filter.js +24 -0
  186. package/addons/modules/variables/functions/process.js +52 -0
  187. package/addons/modules/variables/item/catch/add.js +13 -0
  188. package/addons/modules/variables/load.js +8 -0
  189. package/addons/render/assets/back/README.md +1 -0
  190. package/addons/render/assets/back/addon.js +15 -0
  191. package/addons/render/assets/back/functions/css.js +32 -0
  192. package/addons/render/assets/back/functions/js.js +32 -0
  193. package/addons/render/assets/back/functions/scan/directories.js +38 -0
  194. package/addons/render/assets/back/functions/scan/files.js +58 -0
  195. package/addons/render/assets/back/functions/utils/read.js +26 -0
  196. package/addons/render/assets/back/functions/utils/transform.js +34 -0
  197. package/addons/render/assets/back/items/commands/css.js +20 -0
  198. package/addons/render/assets/back/items/commands/js.js +19 -0
  199. package/addons/render/assets/back/items/html/css.js +18 -0
  200. package/addons/render/assets/back/items/html/js.js +18 -0
  201. package/addons/render/assets/back/load.js +23 -0
  202. package/addons/render/directives/front/js/#register/addon.js +32 -0
  203. package/addons/render/directives/front/js/functions/process/attributes.js +47 -0
  204. package/addons/render/directives/front/js/functions/process/data.js +74 -0
  205. package/addons/render/directives/front/js/functions/process/match.js +43 -0
  206. package/addons/render/directives/front/js/functions/process.js +57 -0
  207. package/addons/render/directives/front/js/items/100-if.js +24 -0
  208. package/addons/render/directives/front/js/items/1000-render.js +36 -0
  209. package/addons/render/directives/front/js/items/110-show.js +25 -0
  210. package/addons/render/directives/front/js/items/160-slot.js +32 -0
  211. package/addons/render/directives/front/js/items/200-for.js +79 -0
  212. package/addons/render/directives/front/js/items/500-blur.js +46 -0
  213. package/addons/render/directives/front/js/items/500-change.js +53 -0
  214. package/addons/render/directives/front/js/items/500-click-outside.js +50 -0
  215. package/addons/render/directives/front/js/items/500-click.js +52 -0
  216. package/addons/render/directives/front/js/items/500-double-click.js +52 -0
  217. package/addons/render/directives/front/js/items/500-focus.js +46 -0
  218. package/addons/render/directives/front/js/items/500-input.js +46 -0
  219. package/addons/render/directives/front/js/items/500-keydown.js +53 -0
  220. package/addons/render/directives/front/js/items/500-keyup.js +53 -0
  221. package/addons/render/directives/front/js/items/500-mouse-enter.js +61 -0
  222. package/addons/render/directives/front/js/items/500-mouse-leave.js +61 -0
  223. package/addons/render/directives/front/js/items/500-mouse-move.js +45 -0
  224. package/addons/render/directives/front/js/items/500-scroll.js +45 -0
  225. package/addons/render/directives/front/js/items/500-submit.js +52 -0
  226. package/addons/render/directives/front/js/items/650-fetch.js +189 -0
  227. package/addons/render/directives/front/js/items/660-form.js +291 -0
  228. package/addons/render/directives/front/js/items/700-text.js +50 -0
  229. package/addons/render/directives/front/js/items/750-html.js +44 -0
  230. package/addons/render/elements/front/#register/addon.js +12 -0
  231. package/addons/render/elements/front/item/catch/add.js +9 -0
  232. package/addons/render/elements/front/items/directives/element.js +76 -0
  233. package/addons/render/elements/front/items/self/base/menu/menu.js +96 -0
  234. package/addons/render/elements/front/items/self/base/menu/styles/base.css +116 -0
  235. package/addons/render/elements/front/items/self/base/menu/styles/sizes.css +27 -0
  236. package/addons/render/elements/front/items/self/base/menu/styles/variants.css +99 -0
  237. package/addons/render/elements/front/items/self/base/tag/tag.css +199 -0
  238. package/addons/render/elements/front/items/self/base/tag/tag.js +37 -0
  239. package/addons/render/elements/front/items/self/cards/basic/basic.js +89 -0
  240. package/addons/render/elements/front/items/self/cards/basic/styles/base.css +66 -0
  241. package/addons/render/elements/front/items/self/cards/basic/styles/sizes.css +32 -0
  242. package/addons/render/elements/front/items/self/cards/basic/styles/variants.css +99 -0
  243. package/addons/render/elements/front/items/self/cards/list/list.js +108 -0
  244. package/addons/render/elements/front/items/self/cards/list/styles/base.css +96 -0
  245. package/addons/render/elements/front/items/self/cards/list/styles/sizes.css +32 -0
  246. package/addons/render/elements/front/items/self/cards/list/styles/variants.css +99 -0
  247. package/addons/render/elements/front/items/self/cards/media/media.js +116 -0
  248. package/addons/render/elements/front/items/self/cards/media/styles/base.css +126 -0
  249. package/addons/render/elements/front/items/self/cards/media/styles/sizes.css +49 -0
  250. package/addons/render/elements/front/items/self/cards/media/styles/variants.css +74 -0
  251. package/addons/render/elements/front/items/self/cards/profile/profile.js +95 -0
  252. package/addons/render/elements/front/items/self/cards/profile/styles/base.css +142 -0
  253. package/addons/render/elements/front/items/self/cards/profile/styles/sizes.css +43 -0
  254. package/addons/render/elements/front/items/self/cards/profile/styles/variants.css +131 -0
  255. package/addons/render/elements/front/items/self/cards/stat/stat.js +117 -0
  256. package/addons/render/elements/front/items/self/cards/stat/styles/base.css +97 -0
  257. package/addons/render/elements/front/items/self/cards/stat/styles/sizes.css +49 -0
  258. package/addons/render/elements/front/items/self/cards/stat/styles/variants.css +124 -0
  259. package/addons/render/elements/front/items/self/content/html/html.css +93 -0
  260. package/addons/render/elements/front/items/self/content/html/html.js +40 -0
  261. package/addons/render/elements/front/items/self/content/markdown/markdown.css +200 -0
  262. package/addons/render/elements/front/items/self/content/markdown/markdown.js +120 -0
  263. package/addons/render/elements/front/items/self/data/comments/comments.css +253 -0
  264. package/addons/render/elements/front/items/self/data/comments/comments.js +134 -0
  265. package/addons/render/elements/front/items/self/data/files/files.css +116 -0
  266. package/addons/render/elements/front/items/self/data/files/files.js +85 -0
  267. package/addons/render/elements/front/items/self/data/folders/folders.css +104 -0
  268. package/addons/render/elements/front/items/self/data/folders/folders.js +73 -0
  269. package/addons/render/elements/front/items/self/data/inbox/inbox.css +225 -0
  270. package/addons/render/elements/front/items/self/data/inbox/inbox.js +111 -0
  271. package/addons/render/elements/front/items/self/data/logs/logs.css +133 -0
  272. package/addons/render/elements/front/items/self/data/logs/logs.js +65 -0
  273. package/addons/render/elements/front/items/self/data/plans/plans.css +231 -0
  274. package/addons/render/elements/front/items/self/data/plans/plans.js +104 -0
  275. package/addons/render/elements/front/items/self/data/properties/properties.css +108 -0
  276. package/addons/render/elements/front/items/self/data/properties/properties.js +156 -0
  277. package/addons/render/elements/front/items/self/data/table/table.css +153 -0
  278. package/addons/render/elements/front/items/self/data/table/table.js +106 -0
  279. package/addons/render/elements/front/items/self/data/timeline/timeline.css +127 -0
  280. package/addons/render/elements/front/items/self/data/timeline/timeline.js +57 -0
  281. package/addons/render/elements/front/items/self/feedback/alert/alert.css +258 -0
  282. package/addons/render/elements/front/items/self/feedback/alert/alert.js +67 -0
  283. package/addons/render/elements/front/items/self/feedback/confirm/confirm.css +229 -0
  284. package/addons/render/elements/front/items/self/feedback/confirm/confirm.js +81 -0
  285. package/addons/render/elements/front/items/self/feedback/loader/loader.css +203 -0
  286. package/addons/render/elements/front/items/self/feedback/loader/loader.js +25 -0
  287. package/addons/render/elements/front/items/self/feedback/progress/progress.css +136 -0
  288. package/addons/render/elements/front/items/self/feedback/progress/progress.js +40 -0
  289. package/addons/render/elements/front/items/self/form/button/button.js +105 -0
  290. package/addons/render/elements/front/items/self/form/button/styles/base.css +176 -0
  291. package/addons/render/elements/front/items/self/form/button/styles/sizes.css +78 -0
  292. package/addons/render/elements/front/items/self/form/button/styles/variants.css +421 -0
  293. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +57 -0
  294. package/addons/render/elements/front/items/self/form/checkbox/styles/base.css +52 -0
  295. package/addons/render/elements/front/items/self/form/checkbox/styles/sizes.css +39 -0
  296. package/addons/render/elements/front/items/self/form/checkbox/styles/variants.css +121 -0
  297. package/addons/render/elements/front/items/self/form/field/field.css +96 -0
  298. package/addons/render/elements/front/items/self/form/field/field.js +39 -0
  299. package/addons/render/elements/front/items/self/form/input/input.css +111 -0
  300. package/addons/render/elements/front/items/self/form/input/input.js +78 -0
  301. package/addons/render/elements/front/items/self/form/input/styles/base.css +26 -0
  302. package/addons/render/elements/front/items/self/form/input/styles/sizes.css +15 -0
  303. package/addons/render/elements/front/items/self/form/input/styles/variants.css +98 -0
  304. package/addons/render/elements/front/items/self/form/radio/radio.js +57 -0
  305. package/addons/render/elements/front/items/self/form/radio/styles/base.css +48 -0
  306. package/addons/render/elements/front/items/self/form/radio/styles/sizes.css +36 -0
  307. package/addons/render/elements/front/items/self/form/radio/styles/variants.css +121 -0
  308. package/addons/render/elements/front/items/self/form/rating/rating.css +95 -0
  309. package/addons/render/elements/front/items/self/form/rating/rating.js +88 -0
  310. package/addons/render/elements/front/items/self/form/section/section.css +107 -0
  311. package/addons/render/elements/front/items/self/form/section/section.js +39 -0
  312. package/addons/render/elements/front/items/self/form/slider/slider.css +244 -0
  313. package/addons/render/elements/front/items/self/form/slider/slider.js +69 -0
  314. package/addons/render/elements/front/items/self/form/textarea/textarea.css +117 -0
  315. package/addons/render/elements/front/items/self/form/textarea/textarea.js +69 -0
  316. package/addons/render/elements/front/items/self/layout/empty/empty.css +154 -0
  317. package/addons/render/elements/front/items/self/layout/empty/empty.js +43 -0
  318. package/addons/render/elements/front/items/self/layout/heading/heading.css +117 -0
  319. package/addons/render/elements/front/items/self/layout/heading/heading.js +47 -0
  320. package/addons/render/elements/front/items/self/layout/hero/hero.js +88 -0
  321. package/addons/render/elements/front/items/self/layout/hero/styles/base.css +81 -0
  322. package/addons/render/elements/front/items/self/layout/hero/styles/sizes.css +24 -0
  323. package/addons/render/elements/front/items/self/layout/hero/styles/variants.css +98 -0
  324. package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/_class/addon.js +9 -0
  325. package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/functions/get.js +22 -0
  326. package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.css +13 -0
  327. package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.js +51 -0
  328. package/addons/render/elements/front/items/self/navigation/footer/addon/_class/addon.js +11 -0
  329. package/addons/render/elements/front/items/self/navigation/footer/addon/functions/columns.js +11 -0
  330. package/addons/render/elements/front/items/self/navigation/footer/addon/functions/get.js +34 -0
  331. package/addons/render/elements/front/items/self/navigation/footer/footer.css +283 -0
  332. package/addons/render/elements/front/items/self/navigation/footer/footer.js +139 -0
  333. package/addons/render/elements/front/items/self/navigation/navbar/addon/_class/addon.js +13 -0
  334. package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/active.js +7 -0
  335. package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/get.js +31 -0
  336. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +140 -0
  337. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +118 -0
  338. package/addons/render/elements/front/items/self/navigation/pagination/pagination.css +160 -0
  339. package/addons/render/elements/front/items/self/navigation/pagination/pagination.js +131 -0
  340. package/addons/render/elements/front/items/self/navigation/sidebar/addon/_class/addon.js +12 -0
  341. package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/active.js +7 -0
  342. package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/get.js +35 -0
  343. package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/groups.js +10 -0
  344. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +278 -0
  345. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +85 -0
  346. package/addons/render/elements/front/items/self/navigation/stepper/stepper.css +202 -0
  347. package/addons/render/elements/front/items/self/navigation/stepper/stepper.js +82 -0
  348. package/addons/render/elements/front/items/self/navigation/tabs/addon.js +32 -0
  349. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +239 -0
  350. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +76 -0
  351. package/addons/render/elements/front/items/self/preview/html/html.css +377 -0
  352. package/addons/render/elements/front/items/self/preview/html/html.js +107 -0
  353. package/addons/render/html/addon.js +13 -0
  354. package/addons/render/html/functions/render.js +85 -0
  355. package/addons/render/html/item/functions/render.js +66 -0
  356. package/addons/render/html/items/assets/favicon.js +12 -0
  357. package/addons/render/html/items/fonts/outfit.js +12 -0
  358. package/addons/render/html/items/fonts/preconnect.js +24 -0
  359. package/addons/render/html/items/meta/charset.js +11 -0
  360. package/addons/render/html/items/meta/description.js +12 -0
  361. package/addons/render/html/items/meta/title.js +9 -0
  362. package/addons/render/html/items/meta/viewport.js +12 -0
  363. package/addons/render/html/items/seo/robots.js +12 -0
  364. package/addons/render/html/items/seo/theme-color.js +12 -0
  365. package/addons/render/html/load.js +26 -0
  366. package/addons/render/items/js/#register/addon.js +14 -0
  367. package/addons/render/items/js/functions/count.js +9 -0
  368. package/addons/render/items/js/functions/get.js +34 -0
  369. package/addons/render/items/js/functions/groups.js +16 -0
  370. package/addons/render/items/js/functions/render.js +44 -0
  371. package/addons/render/items/js/item/catch/add.js +18 -0
  372. package/addons/render/pages/front/css/page.css +17 -0
  373. package/addons/render/pages/front/js/#register/addon.js +29 -0
  374. package/addons/render/pages/front/js/events/click.js +27 -0
  375. package/addons/render/pages/front/js/events/load.js +25 -0
  376. package/addons/render/pages/front/js/functions/change.js +119 -0
  377. package/addons/render/pages/front/js/functions/match.js +34 -0
  378. package/addons/render/pages/front/js/functions/open.js +19 -0
  379. package/addons/render/pages/front/js/item/catch/add.js +24 -0
  380. package/addons/render/pages/front/js/item/catch/remove.js +17 -0
  381. package/addons/render/pages/front/js/item/functions/enter.js +45 -0
  382. package/addons/render/pages/front/js/item/functions/leave.js +27 -0
  383. package/addons/render/pages/front/js/item/functions/render.js +33 -0
  384. package/addons/render/pages/front/js/items/commands/change.js +41 -0
  385. package/addons/render/pages/front/js/items/shortcuts/home.js +9 -0
  386. package/addons/render/pages/front/js/items/shortcuts/login.js +9 -0
  387. package/addons/render/tags/addon.js +11 -0
  388. package/addons/render/tags/functions/groups.js +13 -0
  389. package/addons/render/tags/functions/validate.js +51 -0
  390. package/addons/render/tags/items/block.js +131 -0
  391. package/addons/render/tags/items/form.js +112 -0
  392. package/addons/render/tags/items/media.js +64 -0
  393. package/addons/render/tags/items/meta.js +28 -0
  394. package/addons/render/tags/items/semantic.js +114 -0
  395. package/addons/render/tags/items/table.js +92 -0
  396. package/addons/render/tags/items/text-inline.js +215 -0
  397. package/addons/render/tags/load.js +16 -0
  398. package/addons/render/transforms/front/js/#register/addon.js +11 -0
  399. package/addons/render/transforms/front/js/functions/load/assets.js +49 -0
  400. package/addons/render/transforms/front/js/items/directives/transform.js +40 -0
  401. package/addons/render/transforms/front/js/items/self/accordion.js +174 -0
  402. package/addons/render/transforms/front/js/items/self/chart/area.js +156 -0
  403. package/addons/render/transforms/front/js/items/self/chart/bar.js +140 -0
  404. package/addons/render/transforms/front/js/items/self/chart/bubble.js +169 -0
  405. package/addons/render/transforms/front/js/items/self/chart/doughnut.js +127 -0
  406. package/addons/render/transforms/front/js/items/self/chart/line.js +152 -0
  407. package/addons/render/transforms/front/js/items/self/chart/pie.js +125 -0
  408. package/addons/render/transforms/front/js/items/self/chart/radar.js +157 -0
  409. package/addons/render/transforms/front/js/items/self/chart/scatter.js +152 -0
  410. package/addons/render/transforms/front/js/items/self/codeflask.js +99 -0
  411. package/addons/render/transforms/front/js/items/self/codemirror.js +231 -0
  412. package/addons/render/transforms/front/js/items/self/comparison.js +142 -0
  413. package/addons/render/transforms/front/js/items/self/heatmap.js +494 -0
  414. package/addons/render/transforms/front/js/items/self/interact.js +277 -0
  415. package/addons/render/transforms/front/js/items/self/particles.js +329 -0
  416. package/addons/render/transforms/front/js/items/self/sparkline.js +240 -0
  417. package/addons/render/transforms/front/js/items/self/swiper.js +143 -0
  418. package/addons/render/transforms/front/js/items/self/tabs.js +460 -0
  419. package/addons/render/transforms/front/js/items/self/typed.js +173 -0
  420. package/docs/addons.md +281 -0
  421. package/docs/architecture.md +190 -0
  422. package/docs/commands.md +308 -0
  423. package/docs/database.md +171 -0
  424. package/docs/frontend.md +379 -0
  425. package/docs/servers.md +133 -0
  426. package/lib/LICENSE.txt +40 -0
  427. package/lib/README.md +132 -0
  428. package/lib/browser.js +26 -0
  429. package/lib/events.js +108 -0
  430. package/lib/load.js +39 -0
  431. package/lib/src/classes/addon/class.js +86 -0
  432. package/lib/src/classes/addon/classes/item/class.js +27 -0
  433. package/lib/src/classes/addon/classes/item/mixins/crud.js +30 -0
  434. package/lib/src/classes/addon/classes/item/mixins/functions.js +11 -0
  435. package/lib/src/classes/addon/classes/item/mixins/get.js +78 -0
  436. package/lib/src/classes/addon/classes/item/mixins/remove.js +11 -0
  437. package/lib/src/classes/addon/classes/item/mixins/set.js +69 -0
  438. package/lib/src/classes/addon/classes/item/mixins/store.js +58 -0
  439. package/lib/src/classes/addon/classes/render/class.js +117 -0
  440. package/lib/src/classes/addon/classes/render/mixins/compile.js +91 -0
  441. package/lib/src/classes/addon/classes/render/mixins/dom.js +18 -0
  442. package/lib/src/classes/addon/classes/render/mixins/events.js +152 -0
  443. package/lib/src/classes/addon/classes/render/mixins/get.js +56 -0
  444. package/lib/src/classes/addon/classes/render/mixins/methods.js +191 -0
  445. package/lib/src/classes/addon/classes/render/mixins/process.js +88 -0
  446. package/lib/src/classes/addon/classes/render/mixins/set.js +36 -0
  447. package/lib/src/classes/addon/mixins/fields.js +85 -0
  448. package/lib/src/classes/addon/mixins/find.js +14 -0
  449. package/lib/src/classes/addon/mixins/functions.js +131 -0
  450. package/lib/src/classes/addon/mixins/get.js +11 -0
  451. package/lib/src/classes/addon/mixins/items.js +176 -0
  452. package/lib/src/classes/addon/mixins/remove.js +12 -0
  453. package/lib/src/classes/addon/mixins/render.js +57 -0
  454. package/lib/src/classes/addon/mixins/store.js +52 -0
  455. package/lib/src/classes/addon/mixins/table.js +37 -0
  456. package/lib/src/divhunt.js +84 -0
  457. package/lib/src/mixins/addons.js +150 -0
  458. package/lib/src/mixins/binaries.js +89 -0
  459. package/lib/src/mixins/data.js +312 -0
  460. package/lib/src/mixins/dependencies.js +99 -0
  461. package/lib/src/mixins/dom.js +167 -0
  462. package/lib/src/mixins/emitter.js +77 -0
  463. package/lib/src/mixins/function.js +82 -0
  464. package/lib/src/mixins/generate.js +73 -0
  465. package/lib/src/mixins/helper.js +317 -0
  466. package/lib/src/mixins/logger.js +75 -0
  467. package/lib/src/mixins/middleware.js +52 -0
  468. package/lib/src/mixins/overrides.js +37 -0
  469. package/lib/src/mixins/request.js +28 -0
  470. package/lib/src/mixins/route.js +191 -0
  471. package/lib/src/mixins/string.js +196 -0
  472. package/lib/src/mixins/validate.js +78 -0
  473. package/package.json +70 -0
@@ -0,0 +1,254 @@
1
+ divhunt.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'command-table',
5
+ icon: 'terminal',
6
+ name: 'Command Table',
7
+ description: 'Table that auto-generates columns and fetches data from a command.',
8
+ category: 'Display',
9
+ author: 'Divhunt',
10
+ config: {
11
+ command: {
12
+ type: 'string',
13
+ value: 'commands:get:many'
14
+ },
15
+ key: {
16
+ type: 'string',
17
+ value: 'commands'
18
+ },
19
+ params: {
20
+ type: 'object',
21
+ value: {}
22
+ },
23
+ variant: {
24
+ type: 'array',
25
+ value: ['border', 'hover', 'size-m'],
26
+ options: ['border', 'bg-1', 'bg-2', 'bg-3', 'striped', 'compact', 'hover', 'size-s', 'size-m', 'size-l']
27
+ },
28
+ sortable: {
29
+ type: 'boolean',
30
+ value: false
31
+ },
32
+ onRowClick: {
33
+ type: 'function'
34
+ },
35
+ onLoad: {
36
+ type: 'function'
37
+ },
38
+ onError: {
39
+ type: 'function'
40
+ }
41
+ },
42
+ render: function()
43
+ {
44
+ this.columns = [];
45
+ this.rows = [];
46
+ this.loading = true;
47
+ this.error = null;
48
+
49
+ // Helpers
50
+ this.label = (key) =>
51
+ {
52
+ return key.replace(/_/g, ' ').replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase()).trim();
53
+ };
54
+
55
+ // Schema parsing
56
+ this.parse = (schema) =>
57
+ {
58
+ if (!schema)
59
+ {
60
+ return { valid: false, columns: [] };
61
+ }
62
+
63
+ const target = this.key
64
+ ? schema[this.key]
65
+ : Object.values(schema).find(f => f?.type === 'array');
66
+
67
+ if (!target || target.type !== 'array')
68
+ {
69
+ return { valid: false, columns: [] };
70
+ }
71
+
72
+ const config = target.each?.config || target.config || {};
73
+ const columns = [];
74
+
75
+ for (const [id, field] of Object.entries(config))
76
+ {
77
+ const type = Array.isArray(field) ? field[0] : field?.type;
78
+
79
+ if (type && type !== 'object' && type !== 'array')
80
+ {
81
+ columns.push({ id, label: this.label(id) });
82
+ }
83
+ }
84
+
85
+ return { valid: true, columns };
86
+ };
87
+
88
+ // Data extraction
89
+ this.extract = (data) =>
90
+ {
91
+ if (!data)
92
+ {
93
+ return [];
94
+ }
95
+
96
+ if (this.key)
97
+ {
98
+ return Array.isArray(data[this.key]) ? data[this.key] : [];
99
+ }
100
+
101
+ if (Array.isArray(data))
102
+ {
103
+ return data;
104
+ }
105
+
106
+ for (const value of Object.values(data))
107
+ {
108
+ if (Array.isArray(value))
109
+ {
110
+ return value;
111
+ }
112
+ }
113
+
114
+ return [];
115
+ };
116
+
117
+ // API calls
118
+ this.fetch = async (url, options = {}) =>
119
+ {
120
+ const response = await fetch(url, options);
121
+ return response.json();
122
+ };
123
+
124
+ this.info = async () =>
125
+ {
126
+ const data = await this.fetch('/api/commands/' + encodeURIComponent(this.command));
127
+
128
+ if (data.code !== 200)
129
+ {
130
+ throw new Error(data.message || 'Command not found');
131
+ }
132
+
133
+ if (!data.data.command.exposed)
134
+ {
135
+ throw new Error('Command is not exposed');
136
+ }
137
+
138
+ return data.data.command;
139
+ };
140
+
141
+ this.run = async () =>
142
+ {
143
+ const response = await this.fetch('/api/commands/run', {
144
+ method: 'POST',
145
+ headers: { 'Content-Type': 'application/json' },
146
+ body: JSON.stringify({ id: this.command, in: this.params || {} })
147
+ });
148
+
149
+ if (response.code !== 200)
150
+ {
151
+ throw new Error(response.message || 'Command failed');
152
+ }
153
+
154
+ return response.data;
155
+ };
156
+
157
+ // Local command
158
+ this.local = async () =>
159
+ {
160
+ const commands = divhunt.Addon('commands');
161
+ const command = commands.ItemGet(this.command);
162
+
163
+ if (!command)
164
+ {
165
+ return null;
166
+ }
167
+
168
+ const schema = command.Get('out');
169
+ const parsed = this.parse(schema);
170
+
171
+ if (!parsed.valid)
172
+ {
173
+ throw new Error('Command does not return array data');
174
+ }
175
+
176
+ this.columns = parsed.columns;
177
+
178
+ const result = await command.Fn('run', this.params || {});
179
+
180
+ return result;
181
+ };
182
+
183
+ // Remote command
184
+ this.remote = async () =>
185
+ {
186
+ const command = await this.info();
187
+ const schema = command.data.out;
188
+ const parsed = this.parse(schema);
189
+
190
+ if (!parsed.valid)
191
+ {
192
+ throw new Error('Command does not return array data');
193
+ }
194
+
195
+ this.columns = parsed.columns;
196
+
197
+ const result = await this.run();
198
+
199
+ return result;
200
+ };
201
+
202
+ // Main loader
203
+ this.load = async () =>
204
+ {
205
+ if (!this.command)
206
+ {
207
+ this.error = 'No command specified';
208
+ this.loading = false;
209
+ return;
210
+ }
211
+
212
+ try
213
+ {
214
+ const result = await this.local() || await this.remote();
215
+
216
+ this.rows = this.extract(result?.data);
217
+ this.loading = false;
218
+
219
+ if (this.onLoad)
220
+ {
221
+ this.onLoad({ columns: this.columns, rows: this.rows });
222
+ }
223
+ }
224
+ catch (err)
225
+ {
226
+ this.error = err.message;
227
+ this.loading = false;
228
+
229
+ if (this.onError)
230
+ {
231
+ this.onError({ error: err.message });
232
+ }
233
+ }
234
+ };
235
+
236
+ this.load();
237
+
238
+ return `
239
+ <div class="holder">
240
+ <e-loader dh-if="loading"></e-loader>
241
+ <div dh-if="error" class="error">{{ error }}</div>
242
+ <e-table
243
+ dh-if="!loading && !error"
244
+ :columns="columns"
245
+ :rows="rows"
246
+ :variant="variant"
247
+ :sortable="sortable"
248
+ :onRowClick="onRowClick"
249
+ ></e-table>
250
+ </div>
251
+ `;
252
+ }
253
+ });
254
+ })
@@ -0,0 +1,276 @@
1
+ # Database Service
2
+
3
+ A comprehensive database abstraction layer built on top of Knex.js providing a powerful query builder, CRUD operations, and relationship management for PostgreSQL databases.
4
+
5
+ ## Features
6
+
7
+ - **Advanced Query Builder** - Fluent API for complex queries with filtering, sorting, pagination
8
+ - **CRUD Operations** - Create, read, update, delete with automatic timestamp management
9
+ - **Relationship Management** - One-to-one and one-to-many relationship handling
10
+ - **Transaction Support** - Database transaction wrapper for atomic operations
11
+ - **Validation** - Built-in field and parameter validation
12
+ - **Connection Management** - Automatic PostgreSQL connection pooling via Knex.js
13
+ - **Middleware Integration** - Seamless integration with framework middleware system
14
+
15
+ ## Installation
16
+
17
+ ```javascript
18
+ import database from '#database/load.js';
19
+ ```
20
+
21
+ ## Configuration
22
+
23
+ Create a database connection item:
24
+
25
+ ```javascript
26
+ const dbConnection = database.ItemAdd({
27
+ hostname: 'localhost',
28
+ port: 5432,
29
+ username: 'postgres',
30
+ password: 'password',
31
+ database: 'myapp'
32
+ });
33
+ ```
34
+
35
+ ## Framework Integration
36
+
37
+ The database service integrates seamlessly with the framework's middleware system. Each addon automatically gets `Find()` method, and each item gets `Create()`, `Update()`, `Delete()` methods that call middleware interceptors.
38
+
39
+ ### Addon Methods
40
+
41
+ ```javascript
42
+ // Every addon has a Find() method
43
+ const users = await userAddon.Find()
44
+ .filter('status', 'active')
45
+ .many();
46
+ ```
47
+
48
+ ### Item Methods
49
+
50
+ ```javascript
51
+ // Every item has CRUD methods
52
+ await userItem.Create('primary'); // Creates new record
53
+ await userItem.Update('primary'); // Updates existing record
54
+ await userItem.Delete('primary'); // Deletes record
55
+ ```
56
+
57
+ These methods work by calling middleware interceptors:
58
+
59
+ ```javascript
60
+ // How item methods work internally
61
+ const AddonItemCrud = {
62
+ async Create(connection = 'primary') {
63
+ const value = {item: this, table: this.addon.TableGet(), response: null, connection};
64
+ await this.addon.divhunt.Middleware('item.crud.create', value);
65
+ return value.response;
66
+ },
67
+
68
+ async Update(connection = 'primary') {
69
+ const value = {item: this, table: this.addon.TableGet(), response: null, connection};
70
+ await this.addon.divhunt.Middleware('item.crud.update', value);
71
+ return value.response;
72
+ },
73
+
74
+ async Delete(connection = 'primary') {
75
+ const value = {item: this, table: this.addon.TableGet(), response: null, connection};
76
+ await this.addon.divhunt.Middleware('item.crud.delete', value);
77
+ return value.response;
78
+ }
79
+ };
80
+ ```
81
+
82
+ The database service intercepts these middleware calls:
83
+ - `item.crud.create` → `database.Fn('create')`
84
+ - `item.crud.update` → `database.Fn('update')`
85
+ - `item.crud.delete` → `database.Fn('delete')`
86
+ - `addon.items.find` → `database.Fn('find')`
87
+
88
+ ## Basic Usage
89
+
90
+ ### Finding Records
91
+
92
+ ```javascript
93
+ // Simple find
94
+ const users = await database.Fn('find', connection, table, addon)
95
+ .filter('status', 'active')
96
+ .many();
97
+
98
+ // Complex filtering
99
+ const results = await database.Fn('find', connection, table, addon)
100
+ .filter('age', 18, 'GREATER EQUALS')
101
+ .filter('name', 'John%', 'LIKE')
102
+ .sort('created_at', 'desc')
103
+ .limit(10)
104
+ .page(2)
105
+ .many();
106
+
107
+ // Grouped conditions
108
+ const users = await database.Fn('find', connection, table, addon)
109
+ .group('OR')
110
+ .filter('status', 'premium')
111
+ .filter('trial_expires', new Date(), 'GREATER')
112
+ .end()
113
+ .filter('active', true)
114
+ .many();
115
+ ```
116
+
117
+ ### CRUD Operations
118
+
119
+ ```javascript
120
+ // Framework integration - automatic methods on items
121
+ await userItem.Create('primary');
122
+ await userItem.Update('primary');
123
+ await userItem.Delete('primary');
124
+
125
+ // Direct database service usage
126
+ await database.Fn('create', connection, table, item);
127
+ await database.Fn('update', connection, table, item);
128
+ await database.Fn('delete', connection, table, item);
129
+
130
+ // Item-level functions (bypassing middleware)
131
+ await item.save();
132
+ await item.create(addon);
133
+ await item.update();
134
+ await item.delete();
135
+ ```
136
+
137
+ ### Framework vs Direct Usage
138
+
139
+ ```javascript
140
+ // Framework way (goes through middleware)
141
+ const user = userAddon.ItemAdd({name: 'John', email: 'john@example.com'});
142
+ await user.Create('primary');
143
+
144
+ // Direct way (bypasses middleware)
145
+ const user = userAddon.ItemAdd({name: 'John', email: 'john@example.com'});
146
+ await user.save();
147
+
148
+ // Both achieve the same result, framework way allows middleware interception
149
+ ```
150
+
151
+ ### Item-Level Operations
152
+
153
+ ```javascript
154
+ // Direct item operations
155
+ await item.create(addon);
156
+ await item.update();
157
+ await item.delete();
158
+ await item.save();
159
+
160
+ // Find related items
161
+ const user = await item.relation('user_id', userAddon);
162
+ const comments = await item.relations('post_id', commentAddon);
163
+ ```
164
+
165
+ ## Query Methods
166
+
167
+ ### Filters
168
+
169
+ | Operator | Description | Example |
170
+ |----------|-------------|---------|
171
+ | `EQUALS` | Exact match (default) | `.filter('status', 'active')` |
172
+ | `NOT EQUALS` | Not equal | `.filter('status', 'inactive', 'NOT EQUALS')` |
173
+ | `GREATER` | Greater than | `.filter('age', 18, 'GREATER')` |
174
+ | `LESS` | Less than | `.filter('price', 100, 'LESS')` |
175
+ | `LIKE` | Pattern matching | `.filter('name', 'John%', 'LIKE')` |
176
+ | `IN` | Value in list | `.filter('status', ['active', 'pending'], 'IN')` |
177
+ | `BETWEEN` | Between values | `.filter('age', [18, 65], 'BETWEEN')` |
178
+ | `NULL` | Is null | `.filter('deleted_at', null, 'NULL')` |
179
+
180
+ ### Query Builder Methods
181
+
182
+ ```javascript
183
+ const query = database.Fn('find', connection, table, addon);
184
+
185
+ // Filtering
186
+ query.filter(field, value, operator)
187
+ query.orFilter(field, value, operator)
188
+
189
+ // Grouping
190
+ query.group('AND|OR')
191
+ .filter(...)
192
+ .filter(...)
193
+ .end()
194
+
195
+ // Sorting & Pagination
196
+ query.sort(field, 'asc|desc')
197
+ query.limit(count)
198
+ query.page(number)
199
+
200
+ // Selection
201
+ query.select(['field1', 'field2'])
202
+ query.distinct()
203
+
204
+ // Execution
205
+ await query.many() // Get multiple records
206
+ await query.one() // Get single record
207
+ await query.count() // Get count
208
+ await query.exists() // Check if exists
209
+ ```
210
+
211
+ ## Transactions
212
+
213
+ ```javascript
214
+ await item.transaction(async (trx) => {
215
+ await database.Fn('create', trx, table1, item1);
216
+ await database.Fn('update', trx, table2, item2);
217
+ // Auto-commit on success, auto-rollback on error
218
+ });
219
+ ```
220
+
221
+ ## Relationships
222
+
223
+ ```javascript
224
+ // One-to-one relationship
225
+ const user = await post.relation('user_id', userAddon);
226
+
227
+ // One-to-many relationship
228
+ const comments = await post.relations('post_id', commentAddon);
229
+ ```
230
+
231
+ ## Validation
232
+
233
+ The service includes automatic validation for:
234
+ - Field names (alphanumeric + underscore + dot, max 64 chars)
235
+ - Operators (must be from supported list)
236
+ - Values (string, number, boolean, or null)
237
+ - Pagination parameters (positive integers)
238
+ - Sort directions ('asc' or 'desc')
239
+
240
+ ## Error Handling
241
+
242
+ All operations include comprehensive error handling with descriptive messages:
243
+
244
+ ```javascript
245
+ try {
246
+ const results = await query.filter('invalid-field!', 'value').many();
247
+ } catch (error) {
248
+ // Error: Invalid field name format: 'invalid-field!'...
249
+ }
250
+ ```
251
+
252
+ ## Architecture
253
+
254
+ The service uses a layered architecture:
255
+
256
+ 1. **Item Functions** - Core database operations
257
+ 2. **Main Functions** - Thin wrappers calling item functions
258
+ 3. **Middleware** - Framework integration layer
259
+ 4. **Query Builder** - Fluent API for complex queries
260
+
261
+ This design ensures code reuse and maintains consistency across all access patterns.
262
+
263
+ ## Connection Management
264
+
265
+ Connections are automatically managed with:
266
+ - Connection pooling (0-25 connections)
267
+ - 1-second timeouts for acquisition and idle
268
+ - Automatic cleanup and error handling
269
+
270
+ ## Data Schemas
271
+
272
+ The service defines validation schemas for:
273
+ - `filter` - Query filter structure
274
+ - `query` - Complete query parameters
275
+
276
+ These ensure type safety and parameter validation throughout the system.
@@ -0,0 +1,14 @@
1
+ import divhunt from '#framework/load.js';
2
+
3
+ const database = divhunt.Addon('database', (addon) =>
4
+ {
5
+ addon.Field('id', ['string']);
6
+ addon.Field('port', ['number', 5432]);
7
+ addon.Field('connection', ['function|object']);
8
+ addon.Field('hostname', ['string']);
9
+ addon.Field('username', ['string']);
10
+ addon.Field('password', ['string']);
11
+ addon.Field('database', ['string']);
12
+ });
13
+
14
+ export default database;
@@ -0,0 +1,18 @@
1
+ import divhunt from '#framework/load.js';
2
+
3
+ divhunt.EmitOn('addon.add', (addon) =>
4
+ {
5
+ addon.expose = null;
6
+
7
+ addon.Expose = function(config)
8
+ {
9
+ config = divhunt.DataDefine(config, {
10
+ filter: ['array', []],
11
+ sort: ['array', []],
12
+ select: ['array', []],
13
+ callback: ['function']
14
+ });
15
+
16
+ addon.expose = config;
17
+ };
18
+ });
@@ -0,0 +1,24 @@
1
+ import divhunt from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ divhunt.MiddlewareIntercept('addon.items.find', (middleware) =>
5
+ {
6
+ let { addon, table, connection } = middleware.value;
7
+
8
+ if(!table.name)
9
+ {
10
+ throw new Error('Addon must have table name set.');
11
+ }
12
+
13
+ if(typeof connection === 'string')
14
+ {
15
+ connection = database.ItemGet(connection)?.Get('connection');
16
+ }
17
+
18
+ if(!connection)
19
+ {
20
+ throw new Error('Database connection is not present.');
21
+ }
22
+
23
+ middleware.value.response = database.Fn('find', connection, table, addon);
24
+ });
@@ -0,0 +1,24 @@
1
+ import divhunt from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ divhunt.MiddlewareIntercept('item.crud.create', async (middleware) =>
5
+ {
6
+ let { item, table, connection } = middleware.value;
7
+
8
+ if(!table.name)
9
+ {
10
+ throw new Error('Addon must have table name set.');
11
+ }
12
+
13
+ if(typeof connection === 'string')
14
+ {
15
+ connection = database.ItemGet(connection)?.Get('connection');
16
+ }
17
+
18
+ if(!connection)
19
+ {
20
+ throw new Error('Database connection is not present.');
21
+ }
22
+
23
+ middleware.value.response = database.Fn('create', connection, table, item);
24
+ });
@@ -0,0 +1,24 @@
1
+ import divhunt from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ divhunt.MiddlewareIntercept('item.crud.delete', async (middleware) =>
5
+ {
6
+ let { item, table, connection } = middleware.value;
7
+
8
+ if(!table.name)
9
+ {
10
+ throw new Error('Addon must have table name set.');
11
+ }
12
+
13
+ if(typeof connection === 'string')
14
+ {
15
+ connection = database.ItemGet(connection)?.Get('connection');
16
+ }
17
+
18
+ if(!connection)
19
+ {
20
+ throw new Error('Database connection is not present.');
21
+ }
22
+
23
+ middleware.value.response = database.Fn('delete', connection, table, item);
24
+ });
@@ -0,0 +1,24 @@
1
+ import divhunt from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ divhunt.MiddlewareIntercept('item.crud.update', async (middleware) =>
5
+ {
6
+ let { item, table, connection } = middleware.value;
7
+
8
+ if(!table.name)
9
+ {
10
+ throw new Error('Addon must have table name set.');
11
+ }
12
+
13
+ if(typeof connection === 'string')
14
+ {
15
+ connection = database.ItemGet(connection)?.Get('connection');
16
+ }
17
+
18
+ if(!connection)
19
+ {
20
+ throw new Error('Database connection is not present.');
21
+ }
22
+
23
+ middleware.value.response = database.Fn('update', connection, table, item);
24
+ });
@@ -0,0 +1,6 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('create', async function(connection, table, item)
4
+ {
5
+ return database.Fn('item.create', item, item.addon, connection);
6
+ });
@@ -0,0 +1,6 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('delete', async function(connection, table, item)
4
+ {
5
+ return database.Fn('item.delete', item, connection);
6
+ });