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
package/docs/addons.md
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# Addons
|
|
2
|
+
|
|
3
|
+
Everything in the framework is an addon. An addon is a typed, persistent entity with fields, items, functions, lifecycle events, and in-memory storage.
|
|
4
|
+
|
|
5
|
+
## Defining an addon
|
|
6
|
+
|
|
7
|
+
An addon is defined in an `addon.js` file:
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
import divhunt from '#framework/load.js';
|
|
11
|
+
|
|
12
|
+
const users = divhunt.Addon('users', (addon) => {
|
|
13
|
+
addon.Table('users');
|
|
14
|
+
|
|
15
|
+
addon.Field('id', ['string']);
|
|
16
|
+
addon.Field('name', ['string']);
|
|
17
|
+
addon.Field('email', ['string']);
|
|
18
|
+
addon.Field('password', ['string']);
|
|
19
|
+
addon.Field('is_verified', ['boolean']);
|
|
20
|
+
addon.Field('created_at', ['string']);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export default users;
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Table
|
|
27
|
+
|
|
28
|
+
`addon.Table(tableName, columnPrefix)` maps the addon to a PostgreSQL table.
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
addon.Table('offers', 'offer_');
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
With prefix `offer_`, field `name` maps to column `offer_name` in the database. Without a prefix, field names match column names directly.
|
|
35
|
+
|
|
36
|
+
## Fields
|
|
37
|
+
|
|
38
|
+
`addon.Field(name, [type, default, required])`
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
addon.Field('id', ['number|string']); // union type
|
|
42
|
+
addon.Field('name', ['string', null, true]); // required
|
|
43
|
+
addon.Field('status', ['string', 'Draft']); // with default
|
|
44
|
+
addon.Field('tags', ['array']);
|
|
45
|
+
addon.Field('metadata', ['object']);
|
|
46
|
+
addon.Field('active', ['boolean', false]);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Types:** `string`, `number`, `boolean`, `array`, `object`, `function`, `binary`.
|
|
50
|
+
|
|
51
|
+
**Union types:** `'number|string'` accepts either type.
|
|
52
|
+
|
|
53
|
+
Every `Get()` and `Set()` runs through field transform pipelines (`get[]`, `set[]`) then validates against the schema.
|
|
54
|
+
|
|
55
|
+
## Items
|
|
56
|
+
|
|
57
|
+
Items are instances of an addon. Full CRUD through middleware chains.
|
|
58
|
+
|
|
59
|
+
```js
|
|
60
|
+
// Create an item (in-memory)
|
|
61
|
+
const user = users.Item({
|
|
62
|
+
name: 'Dejan',
|
|
63
|
+
email: 'hi@iamdejan.com'
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Persist to database
|
|
67
|
+
await user.Create();
|
|
68
|
+
|
|
69
|
+
// Read fields
|
|
70
|
+
user.Get('name'); // single field
|
|
71
|
+
user.Get(['id', 'name', 'email', 'created_at']); // multiple → plain object
|
|
72
|
+
|
|
73
|
+
// Update
|
|
74
|
+
user.Set('name', 'Dejan Tomic');
|
|
75
|
+
await user.Update();
|
|
76
|
+
|
|
77
|
+
// Delete
|
|
78
|
+
await user.Delete();
|
|
79
|
+
|
|
80
|
+
// Remove from memory (without database delete)
|
|
81
|
+
user.Remove();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Bulk operations
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
// Add multiple items at once
|
|
88
|
+
addon.ItemsAdd(items, null, false);
|
|
89
|
+
|
|
90
|
+
// Remove all items from memory
|
|
91
|
+
addon.ItemsRemove(false);
|
|
92
|
+
|
|
93
|
+
// Get all items
|
|
94
|
+
const all = Object.values(addon.Items());
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Get by ID
|
|
98
|
+
|
|
99
|
+
```js
|
|
100
|
+
const user = users.Item(42); // get by ID
|
|
101
|
+
const user = users.ItemGet(42); // same thing
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Functions
|
|
105
|
+
|
|
106
|
+
Functions are reusable business logic attached to an addon.
|
|
107
|
+
|
|
108
|
+
```js
|
|
109
|
+
// Define
|
|
110
|
+
users.Fn('password.hash', async function(password) {
|
|
111
|
+
return await bcrypt.hash(password, 10);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
users.Fn('password.verify', async function(password, hash) {
|
|
115
|
+
return await bcrypt.compare(password, hash);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Call
|
|
119
|
+
const hash = await users.Fn('password.hash', 'secret123');
|
|
120
|
+
const valid = await users.Fn('password.verify', 'secret123', hash);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Functions can have any number of arguments. Inside the function, `this` gives access to the addon's methods.
|
|
124
|
+
|
|
125
|
+
## Lifecycle events
|
|
126
|
+
|
|
127
|
+
React to item operations:
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
// When an item is added
|
|
131
|
+
users.ItemOn('add', function(item) {
|
|
132
|
+
console.log('User added:', item.Get('name'));
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// When a field is set
|
|
136
|
+
users.ItemOn('set', async function(item, key, value) {
|
|
137
|
+
if (key === 'password' && value) {
|
|
138
|
+
// false = skip callbacks, prevents infinite loop
|
|
139
|
+
item.Set('password', await users.Fn('password.hash', value), false);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// When an item is modified (before data changes)
|
|
144
|
+
users.ItemOn('modify', function(item, key, value, prevValue) {
|
|
145
|
+
console.log(`${key}: ${prevValue} → ${value}`);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// When an item is removed
|
|
149
|
+
users.ItemOn('remove', function(item) {
|
|
150
|
+
console.log('User removed:', item.Get('id'));
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Available events:** `add`, `added`, `set`, `modify`, `modified`, `remove`, `removed`.
|
|
155
|
+
|
|
156
|
+
The `callback` parameter on `Set(key, value, callback)` controls whether lifecycle events fire. Pass `false` to skip them — essential when setting values inside a `set` listener to avoid loops.
|
|
157
|
+
|
|
158
|
+
## AddonReady
|
|
159
|
+
|
|
160
|
+
Wait for an addon to be loaded before using it:
|
|
161
|
+
|
|
162
|
+
```js
|
|
163
|
+
divhunt.AddonReady('commands', (commands) => {
|
|
164
|
+
commands.Item({
|
|
165
|
+
id: 'users:create',
|
|
166
|
+
method: 'POST',
|
|
167
|
+
endpoint: '/api/users',
|
|
168
|
+
// ...
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Import order doesn't matter. `AddonReady` handles async dependency resolution.
|
|
174
|
+
|
|
175
|
+
## Preloading data
|
|
176
|
+
|
|
177
|
+
Load database data into memory on startup:
|
|
178
|
+
|
|
179
|
+
```js
|
|
180
|
+
divhunt.AddonReady('organizations', async function(organizations) {
|
|
181
|
+
await organizations.Find()?.limit(50000).many(true);
|
|
182
|
+
console.log(`Loaded ${Object.keys(organizations.Items()).length} items`);
|
|
183
|
+
|
|
184
|
+
// Optional: periodic refresh
|
|
185
|
+
setInterval(async () => {
|
|
186
|
+
const items = await organizations.Find()?.limit(50000).many();
|
|
187
|
+
organizations.ItemsRemove(false);
|
|
188
|
+
items.forEach(item => organizations.Item(item.data));
|
|
189
|
+
}, 600000);
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`.many(true)` loads query results into in-memory addon storage.
|
|
194
|
+
|
|
195
|
+
## Store
|
|
196
|
+
|
|
197
|
+
Per-item and per-addon in-memory key-value storage:
|
|
198
|
+
|
|
199
|
+
```js
|
|
200
|
+
// Set
|
|
201
|
+
connection.StoreSet('node', nodeItem);
|
|
202
|
+
connection.StoreSet('stream', streamObject);
|
|
203
|
+
|
|
204
|
+
// Get
|
|
205
|
+
const node = connection.StoreGet('node');
|
|
206
|
+
const stream = connection.StoreGet('stream');
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Useful for attaching runtime state to items without persisting it.
|
|
210
|
+
|
|
211
|
+
## DataSchema
|
|
212
|
+
|
|
213
|
+
Register a named schema for use in command `in`/`out` validation:
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
divhunt.DataSchema('user', {
|
|
217
|
+
id: ['string'],
|
|
218
|
+
name: ['string', null, true],
|
|
219
|
+
email: ['string', null, true],
|
|
220
|
+
is_verified: ['boolean'],
|
|
221
|
+
created_at: ['string']
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Reference it in commands with `config: 'user'`.
|
|
226
|
+
|
|
227
|
+
## Addon file structure
|
|
228
|
+
|
|
229
|
+
Each addon follows this convention:
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
addons/users/
|
|
233
|
+
addon.js Define addon, table, fields
|
|
234
|
+
load.js Import addon + commands + functions + events
|
|
235
|
+
functions/
|
|
236
|
+
password/
|
|
237
|
+
hash.js
|
|
238
|
+
verify.js
|
|
239
|
+
items/
|
|
240
|
+
commands/
|
|
241
|
+
create.js
|
|
242
|
+
get.many.js
|
|
243
|
+
get.one.js
|
|
244
|
+
update.js
|
|
245
|
+
delete.js
|
|
246
|
+
item/
|
|
247
|
+
catch/
|
|
248
|
+
set.js Lifecycle hooks
|
|
249
|
+
events/
|
|
250
|
+
ready.back.js Startup logic (preload data, etc.)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
The `load.js` file imports everything and is the single entry point:
|
|
254
|
+
|
|
255
|
+
```js
|
|
256
|
+
import divhunt from '#framework/load.js';
|
|
257
|
+
import users from './addon.js';
|
|
258
|
+
|
|
259
|
+
import './items/commands/create.js';
|
|
260
|
+
import './items/commands/get.many.js';
|
|
261
|
+
import './items/commands/get.one.js';
|
|
262
|
+
import './items/commands/update.js';
|
|
263
|
+
import './items/commands/delete.js';
|
|
264
|
+
|
|
265
|
+
import './functions/password/hash.js';
|
|
266
|
+
import './functions/password/verify.js';
|
|
267
|
+
|
|
268
|
+
import './item/catch/set.js';
|
|
269
|
+
|
|
270
|
+
import './events/ready.back.js';
|
|
271
|
+
|
|
272
|
+
divhunt.DataSchema('user', {
|
|
273
|
+
id: ['string'],
|
|
274
|
+
name: ['string', null, true],
|
|
275
|
+
email: ['string', null, true],
|
|
276
|
+
is_verified: ['boolean'],
|
|
277
|
+
created_at: ['string']
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
export default users;
|
|
281
|
+
```
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
## File structure
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
lib/ Core Divhunt class + 16 mixins
|
|
7
|
+
load.js Entry point — creates Divhunt instance, handles signals
|
|
8
|
+
src/
|
|
9
|
+
divhunt.js Main class (mixin-composed)
|
|
10
|
+
mixins/ Addons, Emitter, Middleware, Data, DOM, Route,
|
|
11
|
+
Function, Generate, Binaries, Helper, and more
|
|
12
|
+
classes/
|
|
13
|
+
addon/ DivhuntAddon + mixins (fields, items, functions, find, render, store)
|
|
14
|
+
classes/
|
|
15
|
+
item/ DivhuntAddonItem + mixins (get, set, crud, functions, store)
|
|
16
|
+
render/ DivhuntAddonRender + mixins (compile, dom, process, events)
|
|
17
|
+
|
|
18
|
+
addons/ Built-in addon library
|
|
19
|
+
core/
|
|
20
|
+
database/ PostgreSQL ORM (Knex, fluent query builder, 17+ operators)
|
|
21
|
+
servers/ HTTP + gRPC servers
|
|
22
|
+
clients/ HTTP + gRPC clients
|
|
23
|
+
commands/ Typed API command system
|
|
24
|
+
queue/ Concurrency task queue
|
|
25
|
+
render/
|
|
26
|
+
directives/ dh-if, dh-for, dh-click, dh-fetch, dh-show, dh-html, dh-text
|
|
27
|
+
pages/ SPA page router with CSS Grid layouts + async data loading
|
|
28
|
+
elements/ 40+ pre-built UI components
|
|
29
|
+
assets/ Convention-based asset bundler (terser)
|
|
30
|
+
html/ HTML document builder
|
|
31
|
+
tags/ HTML tag system
|
|
32
|
+
transforms/ Data transforms
|
|
33
|
+
modules/
|
|
34
|
+
variables/ Named variable registry
|
|
35
|
+
actions/ Action triggers
|
|
36
|
+
events/ Event bindings
|
|
37
|
+
schedules/ Cron-like scheduling
|
|
38
|
+
shortcuts/ Keyboard shortcut bindings
|
|
39
|
+
sources/ Data source registry
|
|
40
|
+
float/
|
|
41
|
+
modals/ Modal dialogs
|
|
42
|
+
toasts/ Toast notifications
|
|
43
|
+
tooltips/ Tooltip system
|
|
44
|
+
popups/ Popup menus
|
|
45
|
+
overlays/ Overlay backdrops
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Application structure
|
|
49
|
+
|
|
50
|
+
A typical application built on the framework:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
my-app/
|
|
54
|
+
package.json Import aliases (#framework/*, #database/*, etc.)
|
|
55
|
+
index.js Entry point — imports framework, addons, database, servers
|
|
56
|
+
addons/
|
|
57
|
+
users/ Application addon
|
|
58
|
+
addon.js
|
|
59
|
+
load.js
|
|
60
|
+
functions/
|
|
61
|
+
items/commands/
|
|
62
|
+
item/catch/
|
|
63
|
+
events/
|
|
64
|
+
items/
|
|
65
|
+
database/
|
|
66
|
+
primary.js Database connection
|
|
67
|
+
servers/
|
|
68
|
+
http.js HTTP server config
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Entry point:
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
import divhunt from '#framework/load.js';
|
|
75
|
+
import commands from '#commands/load.js';
|
|
76
|
+
import database from '#database/load.js';
|
|
77
|
+
|
|
78
|
+
import './addons/users/load.js';
|
|
79
|
+
import './addons/offers/load.js';
|
|
80
|
+
|
|
81
|
+
import './items/database/primary.js';
|
|
82
|
+
import './items/servers/http.js';
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Import aliases
|
|
86
|
+
|
|
87
|
+
The framework uses Node.js package imports (`#` prefix) defined in `package.json`:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"imports": {
|
|
92
|
+
"#framework/*": "./lib/*",
|
|
93
|
+
"#database/*": "./addons/core/database/back/*",
|
|
94
|
+
"#servers/*": "./addons/core/servers/back/*",
|
|
95
|
+
"#clients/*": "./addons/core/clients/back/*",
|
|
96
|
+
"#commands/*": "./addons/core/commands/back/*",
|
|
97
|
+
"#queue/*": "./addons/core/queue/back/*",
|
|
98
|
+
"#assets/*": "./addons/render/assets/back/*",
|
|
99
|
+
"#html/*": "./addons/render/html/*",
|
|
100
|
+
"#directives/*": "./addons/render/directives/*",
|
|
101
|
+
"#elements/*": "./addons/render/elements/*",
|
|
102
|
+
"#tags/*": "./addons/render/tags/*"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Design decisions
|
|
108
|
+
|
|
109
|
+
### Mixin composition over inheritance
|
|
110
|
+
|
|
111
|
+
Both `Divhunt` and `DivhuntAddon` use `Object.assign(Class.prototype, mixin)`. No class hierarchies, no diamond problems. Each mixin is a plain object of methods that gets merged onto the prototype:
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
import AddonItemGet from './mixins/get.js';
|
|
115
|
+
import AddonItemSet from './mixins/set.js';
|
|
116
|
+
import AddonItemCrud from './mixins/crud.js';
|
|
117
|
+
|
|
118
|
+
Object.assign(DivhuntAddonItem.prototype, AddonItemGet);
|
|
119
|
+
Object.assign(DivhuntAddonItem.prototype, AddonItemSet);
|
|
120
|
+
Object.assign(DivhuntAddonItem.prototype, AddonItemCrud);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Middleware as the extension point
|
|
124
|
+
|
|
125
|
+
CRUD operations and queries are middleware chains:
|
|
126
|
+
- `item.crud.create` — intercepted by database addon for INSERT
|
|
127
|
+
- `item.crud.update` — intercepted for UPDATE
|
|
128
|
+
- `item.crud.delete` — intercepted for DELETE
|
|
129
|
+
- `addon.items.find` — intercepted for SELECT
|
|
130
|
+
|
|
131
|
+
Without the database addon, everything works in-memory. Swap storage without touching business logic.
|
|
132
|
+
|
|
133
|
+
### Self-registering imports
|
|
134
|
+
|
|
135
|
+
Importing an addon's `load.js` registers it with the framework. No manual wiring, no dependency injection container, no configuration object. `AddonReady` handles async dependency resolution — import order doesn't matter.
|
|
136
|
+
|
|
137
|
+
### Field transforms
|
|
138
|
+
|
|
139
|
+
Every field has `get[]` and `set[]` arrays of transform functions plus a `define` schema:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Set('name', value)
|
|
143
|
+
→ run set[] transforms
|
|
144
|
+
→ validate against define schema
|
|
145
|
+
→ fire lifecycle callbacks
|
|
146
|
+
→ store in item.data
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Computed fields, type coercion, and normalization are declared at the field level.
|
|
150
|
+
|
|
151
|
+
### Proxy-driven reactivity
|
|
152
|
+
|
|
153
|
+
Render components return a `Proxy`. Setting a property schedules a debounced `Update()`:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
this.count++
|
|
157
|
+
→ Proxy trap
|
|
158
|
+
→ schedule Update() (16ms debounce)
|
|
159
|
+
→ re-compile template
|
|
160
|
+
→ DOM diff
|
|
161
|
+
→ patch changes
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Batched updates, no virtual DOM overhead.
|
|
165
|
+
|
|
166
|
+
### Binary transport over gRPC
|
|
167
|
+
|
|
168
|
+
gRPC messages are JSON strings. Buffers can't be embedded directly. The framework extracts all Buffer instances into a separate `map<string, bytes>` field before sending:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
Send: { data: { file: <Buffer> } }
|
|
172
|
+
→ extract: { data: { file: "$$bin_0" }, binaries: { "$$bin_0": <Buffer> } }
|
|
173
|
+
→ send JSON + binaries separately
|
|
174
|
+
|
|
175
|
+
Receive:
|
|
176
|
+
→ inject: { data: { file: <Buffer> } }
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Transparent binary transport over the same stream.
|
|
180
|
+
|
|
181
|
+
### Convention-based bundling
|
|
182
|
+
|
|
183
|
+
No webpack, no build configuration. The asset bundler:
|
|
184
|
+
1. Scans directories recursively
|
|
185
|
+
2. Prioritizes `addon.js` files
|
|
186
|
+
3. Strips `import`/`export` statements
|
|
187
|
+
4. Concatenates by priority order
|
|
188
|
+
5. Minifies via terser
|
|
189
|
+
|
|
190
|
+
ES module source files become a browser-loadable bundle.
|