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.
- package/LICENSE +21 -0
- package/README.md +86 -0
- package/addons/core/clients/LICENSE.txt +40 -0
- package/addons/core/clients/README.md +123 -0
- package/addons/core/clients/back/grpc/addon.js +25 -0
- package/addons/core/clients/back/grpc/item/catch/add.js +8 -0
- package/addons/core/clients/back/grpc/item/functions/connect.js +73 -0
- package/addons/core/clients/back/grpc/item/functions/resolve.js +41 -0
- package/addons/core/clients/back/grpc/item/functions/stream.js +103 -0
- package/addons/core/clients/back/grpc/load.js +11 -0
- package/addons/core/clients/back/grpc/service.proto +20 -0
- package/addons/core/clients/back/http/addon.js +21 -0
- package/addons/core/clients/back/http/item/catch/add.js +18 -0
- package/addons/core/clients/back/http/item/functions/gRPC/create.js +192 -0
- package/addons/core/clients/back/http/item/functions/gRPC/execute.js +15 -0
- package/addons/core/clients/back/http/item/functions/http/create.js +143 -0
- package/addons/core/clients/back/http/item/functions/http/delete.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/get.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/post.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/put.js +8 -0
- package/addons/core/clients/back/http/item/functions/http/request.js +15 -0
- package/addons/core/clients/back/http/load.js +17 -0
- package/addons/core/commands/LICENSE.txt +40 -0
- package/addons/core/commands/README.md +294 -0
- package/addons/core/commands/back/addon.js +31 -0
- package/addons/core/commands/back/functions/find.js +54 -0
- package/addons/core/commands/back/functions/grpc/client.js +155 -0
- package/addons/core/commands/back/functions/grpc/server.js +71 -0
- package/addons/core/commands/back/functions/http/server.js +91 -0
- package/addons/core/commands/back/item/functions/run.js +82 -0
- package/addons/core/commands/back/items/many.js +76 -0
- package/addons/core/commands/back/items/one.js +78 -0
- package/addons/core/commands/back/items/run.js +51 -0
- package/addons/core/commands/back/load.js +20 -0
- package/addons/core/commands/front/#register/addon.js +11 -0
- package/addons/core/commands/front/functions/find.js +24 -0
- package/addons/core/commands/front/item/functions/run.js +98 -0
- package/addons/core/commands/front/items/elements/table/table.css +18 -0
- package/addons/core/commands/front/items/elements/table/table.js +254 -0
- package/addons/core/database/README.md +276 -0
- package/addons/core/database/back/addon.js +14 -0
- package/addons/core/database/back/events/addon.add.js +18 -0
- package/addons/core/database/back/events/middleware/addon.items.find.js +24 -0
- package/addons/core/database/back/events/middleware/item.crud.create.js +24 -0
- package/addons/core/database/back/events/middleware/item.crud.delete.js +24 -0
- package/addons/core/database/back/events/middleware/item.crud.update.js +24 -0
- package/addons/core/database/back/functions/create.js +6 -0
- package/addons/core/database/back/functions/delete.js +6 -0
- package/addons/core/database/back/functions/find/builder.js +160 -0
- package/addons/core/database/back/functions/find/count.js +12 -0
- package/addons/core/database/back/functions/find/filter.js +37 -0
- package/addons/core/database/back/functions/find/filters.js +7 -0
- package/addons/core/database/back/functions/find/many.js +93 -0
- package/addons/core/database/back/functions/find/methods.js +235 -0
- package/addons/core/database/back/functions/find/plain.js +25 -0
- package/addons/core/database/back/functions/find/validation.js +214 -0
- package/addons/core/database/back/functions/find.js +25 -0
- package/addons/core/database/back/functions/update.js +6 -0
- package/addons/core/database/back/item/catch/add.js +25 -0
- package/addons/core/database/back/item/functions/create.js +93 -0
- package/addons/core/database/back/item/functions/delete.js +25 -0
- package/addons/core/database/back/item/functions/find.js +19 -0
- package/addons/core/database/back/item/functions/save.js +15 -0
- package/addons/core/database/back/item/functions/transaction.js +17 -0
- package/addons/core/database/back/item/functions/update.js +76 -0
- package/addons/core/database/back/items/commands/expose.js +321 -0
- package/addons/core/database/back/load.js +68 -0
- package/addons/core/database/front/#register/addon.js +4 -0
- package/addons/core/database/front/events/addon.add.js +13 -0
- package/addons/core/database/front/functions/find.js +142 -0
- package/addons/core/queue/README.md +216 -0
- package/addons/core/queue/back/addon.js +21 -0
- package/addons/core/queue/back/functions/calculate/art.js +12 -0
- package/addons/core/queue/back/functions/calculate/rps.js +22 -0
- package/addons/core/queue/back/item/catch/add.js +6 -0
- package/addons/core/queue/back/item/catch/remove.js +6 -0
- package/addons/core/queue/back/item/functions/add.js +15 -0
- package/addons/core/queue/back/item/functions/start.js +135 -0
- package/addons/core/queue/back/load.js +12 -0
- package/addons/core/queue/index.js +66 -0
- package/addons/core/queue/package.json +13 -0
- package/addons/core/servers/README.md +85 -0
- package/addons/core/servers/back/grpc/addon.js +23 -0
- package/addons/core/servers/back/grpc/item/catch/add.js +6 -0
- package/addons/core/servers/back/grpc/item/functions/resolve.js +41 -0
- package/addons/core/servers/back/grpc/item/functions/start.js +65 -0
- package/addons/core/servers/back/grpc/item/functions/stream.js +68 -0
- package/addons/core/servers/back/grpc/load.js +9 -0
- package/addons/core/servers/back/grpc/service.proto +20 -0
- package/addons/core/servers/back/http/addon.js +15 -0
- package/addons/core/servers/back/http/functions/extract/data.js +232 -0
- package/addons/core/servers/back/http/item/catch/add.js +6 -0
- package/addons/core/servers/back/http/item/functions/start.js +135 -0
- package/addons/core/servers/back/http/load.js +8 -0
- package/addons/float/modals/front/css/modals.css +26 -0
- package/addons/float/modals/front/js/#register/addon.js +10 -0
- package/addons/float/modals/front/js/item/catch/add.js +48 -0
- package/addons/float/modals/front/js/item/catch/remove.js +9 -0
- package/addons/float/overlays/front/css/overlays.css +29 -0
- package/addons/float/overlays/front/js/#register/addon.js +17 -0
- package/addons/float/overlays/front/js/events/click.js +27 -0
- package/addons/float/overlays/front/js/events/escape.js +18 -0
- package/addons/float/overlays/front/js/functions/flip.js +74 -0
- package/addons/float/overlays/front/js/functions/index.js +17 -0
- package/addons/float/overlays/front/js/functions/position.js +63 -0
- package/addons/float/overlays/front/js/item/catch/add.js +121 -0
- package/addons/float/overlays/front/js/item/catch/remove.js +16 -0
- package/addons/float/popups/css/popups.css +4 -0
- package/addons/float/popups/js/#register/addon.js +18 -0
- package/addons/float/popups/js/item/catch/add.js +7 -0
- package/addons/float/popups/js/item/catch/remove.js +7 -0
- package/addons/float/popups/js/item/catch/set.js +73 -0
- package/addons/float/popups/js/items/directives/popup.js +54 -0
- package/addons/float/toasts/#register/addon.js +17 -0
- package/addons/float/toasts/item/catch/add.js +7 -0
- package/addons/float/toasts/item/catch/remove.js +7 -0
- package/addons/float/toasts/item/catch/set.js +86 -0
- package/addons/float/toasts/items/elements/toast/toast.css +84 -0
- package/addons/float/toasts/items/elements/toast/toast.js +61 -0
- package/addons/float/tooltips/#register/addon.js +15 -0
- package/addons/float/tooltips/item/catch/add.js +7 -0
- package/addons/float/tooltips/item/catch/remove.js +26 -0
- package/addons/float/tooltips/item/catch/set.js +65 -0
- package/addons/float/tooltips/items/directives/tooltip.js +74 -0
- package/addons/float/tooltips/items/elements/tooltip.css +64 -0
- package/addons/float/tooltips/items/elements/tooltip.js +42 -0
- package/addons/modules/actions/front/addon.js +19 -0
- package/addons/modules/actions/front/functions/run.js +230 -0
- package/addons/modules/actions/front/load.js +5 -0
- package/addons/modules/bugs/front/addon.js +16 -0
- package/addons/modules/bugs/front/functions/clear.js +14 -0
- package/addons/modules/bugs/front/functions/push.js +15 -0
- package/addons/modules/bugs/front/functions/resolve.js +13 -0
- package/addons/modules/bugs/front/item/catch/add.js +9 -0
- package/addons/modules/bugs/front/load.js +9 -0
- package/addons/modules/events/front/addon.js +11 -0
- package/addons/modules/events/front/functions/clear.js +9 -0
- package/addons/modules/events/front/functions/emit.js +60 -0
- package/addons/modules/events/front/functions/off.js +23 -0
- package/addons/modules/events/front/functions/on.js +40 -0
- package/addons/modules/events/front/functions/once.js +6 -0
- package/addons/modules/events/front/load.js +9 -0
- package/addons/modules/schedules/back/addon.js +26 -0
- package/addons/modules/schedules/back/functions/disable.js +17 -0
- package/addons/modules/schedules/back/functions/enable.js +17 -0
- package/addons/modules/schedules/back/functions/next.js +142 -0
- package/addons/modules/schedules/back/functions/start.js +126 -0
- package/addons/modules/schedules/back/functions/stop.js +38 -0
- package/addons/modules/schedules/back/functions/trigger.js +134 -0
- package/addons/modules/schedules/back/items/create.js +82 -0
- package/addons/modules/schedules/back/items/delete.js +38 -0
- package/addons/modules/schedules/back/items/many.js +90 -0
- package/addons/modules/schedules/back/items/one.js +48 -0
- package/addons/modules/schedules/back/items/update.js +115 -0
- package/addons/modules/schedules/back/load.js +16 -0
- package/addons/modules/schedules/front/addon.js +23 -0
- package/addons/modules/schedules/front/functions/disable.js +17 -0
- package/addons/modules/schedules/front/functions/enable.js +17 -0
- package/addons/modules/schedules/front/functions/next.js +142 -0
- package/addons/modules/schedules/front/functions/start.js +126 -0
- package/addons/modules/schedules/front/functions/stop.js +38 -0
- package/addons/modules/schedules/front/functions/trigger.js +161 -0
- package/addons/modules/schedules/front/load.js +10 -0
- package/addons/modules/shortcuts/front/#register/addon.js +22 -0
- package/addons/modules/shortcuts/front/functions/context.js +13 -0
- package/addons/modules/shortcuts/front/functions/disable.js +15 -0
- package/addons/modules/shortcuts/front/functions/enable.js +15 -0
- package/addons/modules/shortcuts/front/functions/register.js +170 -0
- package/addons/modules/shortcuts/front/functions/trigger.js +140 -0
- package/addons/modules/shortcuts/front/functions/unregister.js +19 -0
- package/addons/modules/shortcuts/front/load.js +12 -0
- package/addons/modules/sources/back/addon.js +23 -0
- package/addons/modules/sources/back/functions/run.js +252 -0
- package/addons/modules/sources/back/items/create.js +74 -0
- package/addons/modules/sources/back/items/delete.js +36 -0
- package/addons/modules/sources/back/items/many.js +80 -0
- package/addons/modules/sources/back/items/one.js +46 -0
- package/addons/modules/sources/back/items/run.js +28 -0
- package/addons/modules/sources/back/items/update.js +110 -0
- package/addons/modules/sources/back/load.js +12 -0
- package/addons/modules/sources/front/addon.js +20 -0
- package/addons/modules/sources/front/functions/run.js +279 -0
- package/addons/modules/sources/front/load.js +5 -0
- package/addons/modules/variables/addon.js +12 -0
- package/addons/modules/variables/functions/filter.js +24 -0
- package/addons/modules/variables/functions/process.js +52 -0
- package/addons/modules/variables/item/catch/add.js +13 -0
- package/addons/modules/variables/load.js +8 -0
- package/addons/render/assets/back/README.md +1 -0
- package/addons/render/assets/back/addon.js +15 -0
- package/addons/render/assets/back/functions/css.js +32 -0
- package/addons/render/assets/back/functions/js.js +32 -0
- package/addons/render/assets/back/functions/scan/directories.js +38 -0
- package/addons/render/assets/back/functions/scan/files.js +58 -0
- package/addons/render/assets/back/functions/utils/read.js +26 -0
- package/addons/render/assets/back/functions/utils/transform.js +34 -0
- package/addons/render/assets/back/items/commands/css.js +20 -0
- package/addons/render/assets/back/items/commands/js.js +19 -0
- package/addons/render/assets/back/items/html/css.js +18 -0
- package/addons/render/assets/back/items/html/js.js +18 -0
- package/addons/render/assets/back/load.js +23 -0
- package/addons/render/directives/front/js/#register/addon.js +32 -0
- package/addons/render/directives/front/js/functions/process/attributes.js +47 -0
- package/addons/render/directives/front/js/functions/process/data.js +74 -0
- package/addons/render/directives/front/js/functions/process/match.js +43 -0
- package/addons/render/directives/front/js/functions/process.js +57 -0
- package/addons/render/directives/front/js/items/100-if.js +24 -0
- package/addons/render/directives/front/js/items/1000-render.js +36 -0
- package/addons/render/directives/front/js/items/110-show.js +25 -0
- package/addons/render/directives/front/js/items/160-slot.js +32 -0
- package/addons/render/directives/front/js/items/200-for.js +79 -0
- package/addons/render/directives/front/js/items/500-blur.js +46 -0
- package/addons/render/directives/front/js/items/500-change.js +53 -0
- package/addons/render/directives/front/js/items/500-click-outside.js +50 -0
- package/addons/render/directives/front/js/items/500-click.js +52 -0
- package/addons/render/directives/front/js/items/500-double-click.js +52 -0
- package/addons/render/directives/front/js/items/500-focus.js +46 -0
- package/addons/render/directives/front/js/items/500-input.js +46 -0
- package/addons/render/directives/front/js/items/500-keydown.js +53 -0
- package/addons/render/directives/front/js/items/500-keyup.js +53 -0
- package/addons/render/directives/front/js/items/500-mouse-enter.js +61 -0
- package/addons/render/directives/front/js/items/500-mouse-leave.js +61 -0
- package/addons/render/directives/front/js/items/500-mouse-move.js +45 -0
- package/addons/render/directives/front/js/items/500-scroll.js +45 -0
- package/addons/render/directives/front/js/items/500-submit.js +52 -0
- package/addons/render/directives/front/js/items/650-fetch.js +189 -0
- package/addons/render/directives/front/js/items/660-form.js +291 -0
- package/addons/render/directives/front/js/items/700-text.js +50 -0
- package/addons/render/directives/front/js/items/750-html.js +44 -0
- package/addons/render/elements/front/#register/addon.js +12 -0
- package/addons/render/elements/front/item/catch/add.js +9 -0
- package/addons/render/elements/front/items/directives/element.js +76 -0
- package/addons/render/elements/front/items/self/base/menu/menu.js +96 -0
- package/addons/render/elements/front/items/self/base/menu/styles/base.css +116 -0
- package/addons/render/elements/front/items/self/base/menu/styles/sizes.css +27 -0
- package/addons/render/elements/front/items/self/base/menu/styles/variants.css +99 -0
- package/addons/render/elements/front/items/self/base/tag/tag.css +199 -0
- package/addons/render/elements/front/items/self/base/tag/tag.js +37 -0
- package/addons/render/elements/front/items/self/cards/basic/basic.js +89 -0
- package/addons/render/elements/front/items/self/cards/basic/styles/base.css +66 -0
- package/addons/render/elements/front/items/self/cards/basic/styles/sizes.css +32 -0
- package/addons/render/elements/front/items/self/cards/basic/styles/variants.css +99 -0
- package/addons/render/elements/front/items/self/cards/list/list.js +108 -0
- package/addons/render/elements/front/items/self/cards/list/styles/base.css +96 -0
- package/addons/render/elements/front/items/self/cards/list/styles/sizes.css +32 -0
- package/addons/render/elements/front/items/self/cards/list/styles/variants.css +99 -0
- package/addons/render/elements/front/items/self/cards/media/media.js +116 -0
- package/addons/render/elements/front/items/self/cards/media/styles/base.css +126 -0
- package/addons/render/elements/front/items/self/cards/media/styles/sizes.css +49 -0
- package/addons/render/elements/front/items/self/cards/media/styles/variants.css +74 -0
- package/addons/render/elements/front/items/self/cards/profile/profile.js +95 -0
- package/addons/render/elements/front/items/self/cards/profile/styles/base.css +142 -0
- package/addons/render/elements/front/items/self/cards/profile/styles/sizes.css +43 -0
- package/addons/render/elements/front/items/self/cards/profile/styles/variants.css +131 -0
- package/addons/render/elements/front/items/self/cards/stat/stat.js +117 -0
- package/addons/render/elements/front/items/self/cards/stat/styles/base.css +97 -0
- package/addons/render/elements/front/items/self/cards/stat/styles/sizes.css +49 -0
- package/addons/render/elements/front/items/self/cards/stat/styles/variants.css +124 -0
- package/addons/render/elements/front/items/self/content/html/html.css +93 -0
- package/addons/render/elements/front/items/self/content/html/html.js +40 -0
- package/addons/render/elements/front/items/self/content/markdown/markdown.css +200 -0
- package/addons/render/elements/front/items/self/content/markdown/markdown.js +120 -0
- package/addons/render/elements/front/items/self/data/comments/comments.css +253 -0
- package/addons/render/elements/front/items/self/data/comments/comments.js +134 -0
- package/addons/render/elements/front/items/self/data/files/files.css +116 -0
- package/addons/render/elements/front/items/self/data/files/files.js +85 -0
- package/addons/render/elements/front/items/self/data/folders/folders.css +104 -0
- package/addons/render/elements/front/items/self/data/folders/folders.js +73 -0
- package/addons/render/elements/front/items/self/data/inbox/inbox.css +225 -0
- package/addons/render/elements/front/items/self/data/inbox/inbox.js +111 -0
- package/addons/render/elements/front/items/self/data/logs/logs.css +133 -0
- package/addons/render/elements/front/items/self/data/logs/logs.js +65 -0
- package/addons/render/elements/front/items/self/data/plans/plans.css +231 -0
- package/addons/render/elements/front/items/self/data/plans/plans.js +104 -0
- package/addons/render/elements/front/items/self/data/properties/properties.css +108 -0
- package/addons/render/elements/front/items/self/data/properties/properties.js +156 -0
- package/addons/render/elements/front/items/self/data/table/table.css +153 -0
- package/addons/render/elements/front/items/self/data/table/table.js +106 -0
- package/addons/render/elements/front/items/self/data/timeline/timeline.css +127 -0
- package/addons/render/elements/front/items/self/data/timeline/timeline.js +57 -0
- package/addons/render/elements/front/items/self/feedback/alert/alert.css +258 -0
- package/addons/render/elements/front/items/self/feedback/alert/alert.js +67 -0
- package/addons/render/elements/front/items/self/feedback/confirm/confirm.css +229 -0
- package/addons/render/elements/front/items/self/feedback/confirm/confirm.js +81 -0
- package/addons/render/elements/front/items/self/feedback/loader/loader.css +203 -0
- package/addons/render/elements/front/items/self/feedback/loader/loader.js +25 -0
- package/addons/render/elements/front/items/self/feedback/progress/progress.css +136 -0
- package/addons/render/elements/front/items/self/feedback/progress/progress.js +40 -0
- package/addons/render/elements/front/items/self/form/button/button.js +105 -0
- package/addons/render/elements/front/items/self/form/button/styles/base.css +176 -0
- package/addons/render/elements/front/items/self/form/button/styles/sizes.css +78 -0
- package/addons/render/elements/front/items/self/form/button/styles/variants.css +421 -0
- package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +57 -0
- package/addons/render/elements/front/items/self/form/checkbox/styles/base.css +52 -0
- package/addons/render/elements/front/items/self/form/checkbox/styles/sizes.css +39 -0
- package/addons/render/elements/front/items/self/form/checkbox/styles/variants.css +121 -0
- package/addons/render/elements/front/items/self/form/field/field.css +96 -0
- package/addons/render/elements/front/items/self/form/field/field.js +39 -0
- package/addons/render/elements/front/items/self/form/input/input.css +111 -0
- package/addons/render/elements/front/items/self/form/input/input.js +78 -0
- package/addons/render/elements/front/items/self/form/input/styles/base.css +26 -0
- package/addons/render/elements/front/items/self/form/input/styles/sizes.css +15 -0
- package/addons/render/elements/front/items/self/form/input/styles/variants.css +98 -0
- package/addons/render/elements/front/items/self/form/radio/radio.js +57 -0
- package/addons/render/elements/front/items/self/form/radio/styles/base.css +48 -0
- package/addons/render/elements/front/items/self/form/radio/styles/sizes.css +36 -0
- package/addons/render/elements/front/items/self/form/radio/styles/variants.css +121 -0
- package/addons/render/elements/front/items/self/form/rating/rating.css +95 -0
- package/addons/render/elements/front/items/self/form/rating/rating.js +88 -0
- package/addons/render/elements/front/items/self/form/section/section.css +107 -0
- package/addons/render/elements/front/items/self/form/section/section.js +39 -0
- package/addons/render/elements/front/items/self/form/slider/slider.css +244 -0
- package/addons/render/elements/front/items/self/form/slider/slider.js +69 -0
- package/addons/render/elements/front/items/self/form/textarea/textarea.css +117 -0
- package/addons/render/elements/front/items/self/form/textarea/textarea.js +69 -0
- package/addons/render/elements/front/items/self/layout/empty/empty.css +154 -0
- package/addons/render/elements/front/items/self/layout/empty/empty.js +43 -0
- package/addons/render/elements/front/items/self/layout/heading/heading.css +117 -0
- package/addons/render/elements/front/items/self/layout/heading/heading.js +47 -0
- package/addons/render/elements/front/items/self/layout/hero/hero.js +88 -0
- package/addons/render/elements/front/items/self/layout/hero/styles/base.css +81 -0
- package/addons/render/elements/front/items/self/layout/hero/styles/sizes.css +24 -0
- package/addons/render/elements/front/items/self/layout/hero/styles/variants.css +98 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/_class/addon.js +9 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/addon/functions/get.js +22 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.css +13 -0
- package/addons/render/elements/front/items/self/navigation/breadcrumb/breadcrumb.js +51 -0
- package/addons/render/elements/front/items/self/navigation/footer/addon/_class/addon.js +11 -0
- package/addons/render/elements/front/items/self/navigation/footer/addon/functions/columns.js +11 -0
- package/addons/render/elements/front/items/self/navigation/footer/addon/functions/get.js +34 -0
- package/addons/render/elements/front/items/self/navigation/footer/footer.css +283 -0
- package/addons/render/elements/front/items/self/navigation/footer/footer.js +139 -0
- package/addons/render/elements/front/items/self/navigation/navbar/addon/_class/addon.js +13 -0
- package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/active.js +7 -0
- package/addons/render/elements/front/items/self/navigation/navbar/addon/functions/get.js +31 -0
- package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +140 -0
- package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +118 -0
- package/addons/render/elements/front/items/self/navigation/pagination/pagination.css +160 -0
- package/addons/render/elements/front/items/self/navigation/pagination/pagination.js +131 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/_class/addon.js +12 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/active.js +7 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/get.js +35 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/addon/functions/groups.js +10 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +278 -0
- package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +85 -0
- package/addons/render/elements/front/items/self/navigation/stepper/stepper.css +202 -0
- package/addons/render/elements/front/items/self/navigation/stepper/stepper.js +82 -0
- package/addons/render/elements/front/items/self/navigation/tabs/addon.js +32 -0
- package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +239 -0
- package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +76 -0
- package/addons/render/elements/front/items/self/preview/html/html.css +377 -0
- package/addons/render/elements/front/items/self/preview/html/html.js +107 -0
- package/addons/render/html/addon.js +13 -0
- package/addons/render/html/functions/render.js +85 -0
- package/addons/render/html/item/functions/render.js +66 -0
- package/addons/render/html/items/assets/favicon.js +12 -0
- package/addons/render/html/items/fonts/outfit.js +12 -0
- package/addons/render/html/items/fonts/preconnect.js +24 -0
- package/addons/render/html/items/meta/charset.js +11 -0
- package/addons/render/html/items/meta/description.js +12 -0
- package/addons/render/html/items/meta/title.js +9 -0
- package/addons/render/html/items/meta/viewport.js +12 -0
- package/addons/render/html/items/seo/robots.js +12 -0
- package/addons/render/html/items/seo/theme-color.js +12 -0
- package/addons/render/html/load.js +26 -0
- package/addons/render/items/js/#register/addon.js +14 -0
- package/addons/render/items/js/functions/count.js +9 -0
- package/addons/render/items/js/functions/get.js +34 -0
- package/addons/render/items/js/functions/groups.js +16 -0
- package/addons/render/items/js/functions/render.js +44 -0
- package/addons/render/items/js/item/catch/add.js +18 -0
- package/addons/render/pages/front/css/page.css +17 -0
- package/addons/render/pages/front/js/#register/addon.js +29 -0
- package/addons/render/pages/front/js/events/click.js +27 -0
- package/addons/render/pages/front/js/events/load.js +25 -0
- package/addons/render/pages/front/js/functions/change.js +119 -0
- package/addons/render/pages/front/js/functions/match.js +34 -0
- package/addons/render/pages/front/js/functions/open.js +19 -0
- package/addons/render/pages/front/js/item/catch/add.js +24 -0
- package/addons/render/pages/front/js/item/catch/remove.js +17 -0
- package/addons/render/pages/front/js/item/functions/enter.js +45 -0
- package/addons/render/pages/front/js/item/functions/leave.js +27 -0
- package/addons/render/pages/front/js/item/functions/render.js +33 -0
- package/addons/render/pages/front/js/items/commands/change.js +41 -0
- package/addons/render/pages/front/js/items/shortcuts/home.js +9 -0
- package/addons/render/pages/front/js/items/shortcuts/login.js +9 -0
- package/addons/render/tags/addon.js +11 -0
- package/addons/render/tags/functions/groups.js +13 -0
- package/addons/render/tags/functions/validate.js +51 -0
- package/addons/render/tags/items/block.js +131 -0
- package/addons/render/tags/items/form.js +112 -0
- package/addons/render/tags/items/media.js +64 -0
- package/addons/render/tags/items/meta.js +28 -0
- package/addons/render/tags/items/semantic.js +114 -0
- package/addons/render/tags/items/table.js +92 -0
- package/addons/render/tags/items/text-inline.js +215 -0
- package/addons/render/tags/load.js +16 -0
- package/addons/render/transforms/front/js/#register/addon.js +11 -0
- package/addons/render/transforms/front/js/functions/load/assets.js +49 -0
- package/addons/render/transforms/front/js/items/directives/transform.js +40 -0
- package/addons/render/transforms/front/js/items/self/accordion.js +174 -0
- package/addons/render/transforms/front/js/items/self/chart/area.js +156 -0
- package/addons/render/transforms/front/js/items/self/chart/bar.js +140 -0
- package/addons/render/transforms/front/js/items/self/chart/bubble.js +169 -0
- package/addons/render/transforms/front/js/items/self/chart/doughnut.js +127 -0
- package/addons/render/transforms/front/js/items/self/chart/line.js +152 -0
- package/addons/render/transforms/front/js/items/self/chart/pie.js +125 -0
- package/addons/render/transforms/front/js/items/self/chart/radar.js +157 -0
- package/addons/render/transforms/front/js/items/self/chart/scatter.js +152 -0
- package/addons/render/transforms/front/js/items/self/codeflask.js +99 -0
- package/addons/render/transforms/front/js/items/self/codemirror.js +231 -0
- package/addons/render/transforms/front/js/items/self/comparison.js +142 -0
- package/addons/render/transforms/front/js/items/self/heatmap.js +494 -0
- package/addons/render/transforms/front/js/items/self/interact.js +277 -0
- package/addons/render/transforms/front/js/items/self/particles.js +329 -0
- package/addons/render/transforms/front/js/items/self/sparkline.js +240 -0
- package/addons/render/transforms/front/js/items/self/swiper.js +143 -0
- package/addons/render/transforms/front/js/items/self/tabs.js +460 -0
- package/addons/render/transforms/front/js/items/self/typed.js +173 -0
- package/docs/addons.md +281 -0
- package/docs/architecture.md +190 -0
- package/docs/commands.md +308 -0
- package/docs/database.md +171 -0
- package/docs/frontend.md +379 -0
- package/docs/servers.md +133 -0
- package/lib/LICENSE.txt +40 -0
- package/lib/README.md +132 -0
- package/lib/browser.js +26 -0
- package/lib/events.js +108 -0
- package/lib/load.js +39 -0
- package/lib/src/classes/addon/class.js +86 -0
- package/lib/src/classes/addon/classes/item/class.js +27 -0
- package/lib/src/classes/addon/classes/item/mixins/crud.js +30 -0
- package/lib/src/classes/addon/classes/item/mixins/functions.js +11 -0
- package/lib/src/classes/addon/classes/item/mixins/get.js +78 -0
- package/lib/src/classes/addon/classes/item/mixins/remove.js +11 -0
- package/lib/src/classes/addon/classes/item/mixins/set.js +69 -0
- package/lib/src/classes/addon/classes/item/mixins/store.js +58 -0
- package/lib/src/classes/addon/classes/render/class.js +117 -0
- package/lib/src/classes/addon/classes/render/mixins/compile.js +91 -0
- package/lib/src/classes/addon/classes/render/mixins/dom.js +18 -0
- package/lib/src/classes/addon/classes/render/mixins/events.js +152 -0
- package/lib/src/classes/addon/classes/render/mixins/get.js +56 -0
- package/lib/src/classes/addon/classes/render/mixins/methods.js +191 -0
- package/lib/src/classes/addon/classes/render/mixins/process.js +88 -0
- package/lib/src/classes/addon/classes/render/mixins/set.js +36 -0
- package/lib/src/classes/addon/mixins/fields.js +85 -0
- package/lib/src/classes/addon/mixins/find.js +14 -0
- package/lib/src/classes/addon/mixins/functions.js +131 -0
- package/lib/src/classes/addon/mixins/get.js +11 -0
- package/lib/src/classes/addon/mixins/items.js +176 -0
- package/lib/src/classes/addon/mixins/remove.js +12 -0
- package/lib/src/classes/addon/mixins/render.js +57 -0
- package/lib/src/classes/addon/mixins/store.js +52 -0
- package/lib/src/classes/addon/mixins/table.js +37 -0
- package/lib/src/divhunt.js +84 -0
- package/lib/src/mixins/addons.js +150 -0
- package/lib/src/mixins/binaries.js +89 -0
- package/lib/src/mixins/data.js +312 -0
- package/lib/src/mixins/dependencies.js +99 -0
- package/lib/src/mixins/dom.js +167 -0
- package/lib/src/mixins/emitter.js +77 -0
- package/lib/src/mixins/function.js +82 -0
- package/lib/src/mixins/generate.js +73 -0
- package/lib/src/mixins/helper.js +317 -0
- package/lib/src/mixins/logger.js +75 -0
- package/lib/src/mixins/middleware.js +52 -0
- package/lib/src/mixins/overrides.js +37 -0
- package/lib/src/mixins/request.js +28 -0
- package/lib/src/mixins/route.js +191 -0
- package/lib/src/mixins/string.js +196 -0
- package/lib/src/mixins/validate.js +78 -0
- 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
|
+
});
|