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/frontend.md
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
# Frontend
|
|
2
|
+
|
|
3
|
+
Proxy-based reactivity with DOM diffing, Vue-like directives, SPA page routing, and convention-based asset bundling.
|
|
4
|
+
|
|
5
|
+
## Pages
|
|
6
|
+
|
|
7
|
+
Pages define routes with async data loading, CSS Grid layouts, and template areas.
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
pages.ItemAdd({
|
|
11
|
+
id: 'home',
|
|
12
|
+
route: '/',
|
|
13
|
+
title: 'Home',
|
|
14
|
+
grid: {
|
|
15
|
+
template: '"content"',
|
|
16
|
+
columns: '1fr',
|
|
17
|
+
rows: '1fr'
|
|
18
|
+
},
|
|
19
|
+
areas: {
|
|
20
|
+
content: function() {
|
|
21
|
+
return `
|
|
22
|
+
<div class="page-home">
|
|
23
|
+
<c-navbar></c-navbar>
|
|
24
|
+
<c-hero title="Welcome"></c-hero>
|
|
25
|
+
<c-footer></c-footer>
|
|
26
|
+
</div>
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Route params
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
pages.ItemAdd({
|
|
37
|
+
id: 'offer',
|
|
38
|
+
route: '/ponuda/:id/:type/:location/:name',
|
|
39
|
+
// ...
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Params are available in `this.parameters`:
|
|
44
|
+
|
|
45
|
+
```js
|
|
46
|
+
areas: {
|
|
47
|
+
content: function() {
|
|
48
|
+
const id = this.parameters.id;
|
|
49
|
+
// ...
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Multiple routes
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
route: ['/offers', '/offers/:type/:value']
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Async data loading
|
|
61
|
+
|
|
62
|
+
The `data` function runs before render:
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
pages.ItemAdd({
|
|
66
|
+
id: 'offer',
|
|
67
|
+
route: '/ponuda/:id/:type/:location/:name',
|
|
68
|
+
|
|
69
|
+
title: function(parameters, data) {
|
|
70
|
+
return data?.offer?.name || 'Offer';
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
data: async function(parameters) {
|
|
74
|
+
const offer = await offers.Find()
|
|
75
|
+
.filter('id', parameters.id)
|
|
76
|
+
.join('files', 'cover_id', 'cover')
|
|
77
|
+
.join('countries', 'countries', 'countries')
|
|
78
|
+
.join('cities', 'cities', 'cities')
|
|
79
|
+
.one();
|
|
80
|
+
|
|
81
|
+
return { offer: offer ? offer.data : null };
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
areas: {
|
|
85
|
+
content: function() {
|
|
86
|
+
this.offer = this.data.offer || {};
|
|
87
|
+
|
|
88
|
+
return `
|
|
89
|
+
<div>
|
|
90
|
+
<h1>{{ offer.name }}</h1>
|
|
91
|
+
<span dh-if="offer.stars">{{ offer.stars }} stars</span>
|
|
92
|
+
</div>
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Interactive pages
|
|
100
|
+
|
|
101
|
+
Pages can have local state and methods:
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
areas: {
|
|
105
|
+
content: function() {
|
|
106
|
+
this.items = [];
|
|
107
|
+
this.page = 1;
|
|
108
|
+
this.total = 0;
|
|
109
|
+
|
|
110
|
+
this.fetch = async () => {
|
|
111
|
+
const result = await offers.Find()
|
|
112
|
+
.filter('status', 'Aktivna')
|
|
113
|
+
.sort('score', 'desc')
|
|
114
|
+
.page(this.page)
|
|
115
|
+
.limit(12)
|
|
116
|
+
.plain();
|
|
117
|
+
|
|
118
|
+
this.items = result.items;
|
|
119
|
+
this.total = result.total;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
this.handlePageChange = (newPage) => {
|
|
123
|
+
this.page = newPage;
|
|
124
|
+
this.fetch();
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
this.fetch();
|
|
128
|
+
|
|
129
|
+
return `
|
|
130
|
+
<div>
|
|
131
|
+
<span>{{ total }} results</span>
|
|
132
|
+
|
|
133
|
+
<div dh-if="items.length > 0" class="grid">
|
|
134
|
+
<a dh-for="offer in items" :href="'/offer/' + offer.id">
|
|
135
|
+
<c-offer-card :offer="offer"></c-offer-card>
|
|
136
|
+
</a>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<c-pagination
|
|
140
|
+
:page="page"
|
|
141
|
+
:pages="Math.ceil(total / 12)"
|
|
142
|
+
:_change="handlePageChange"
|
|
143
|
+
></c-pagination>
|
|
144
|
+
</div>
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Setting `this.items`, `this.page`, or `this.total` triggers a 16ms debounced re-render with DOM diffing.
|
|
151
|
+
|
|
152
|
+
## Components
|
|
153
|
+
|
|
154
|
+
Reusable UI elements with typed config and template rendering.
|
|
155
|
+
|
|
156
|
+
```js
|
|
157
|
+
components.ItemAdd({
|
|
158
|
+
id: 'hero',
|
|
159
|
+
config: {
|
|
160
|
+
title: { type: 'string', value: 'Page Title' },
|
|
161
|
+
subtitle: { type: 'string', value: '' },
|
|
162
|
+
image: { type: 'string', value: '' },
|
|
163
|
+
variant: { type: 'array', value: [], options: ['compact', 'tall'] }
|
|
164
|
+
},
|
|
165
|
+
render: function() {
|
|
166
|
+
return `
|
|
167
|
+
<section class="holder" :style="'background-image: url(' + image + ')'">
|
|
168
|
+
<div class="overlay"></div>
|
|
169
|
+
<div class="content">
|
|
170
|
+
<slot name="top"></slot>
|
|
171
|
+
<h1>{{ title }}</h1>
|
|
172
|
+
<p dh-if="subtitle">{{ subtitle }}</p>
|
|
173
|
+
</div>
|
|
174
|
+
</section>
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Using components
|
|
181
|
+
|
|
182
|
+
Components become custom elements prefixed with `c-`:
|
|
183
|
+
|
|
184
|
+
```html
|
|
185
|
+
<c-hero title="Our Offers" subtitle="Find your trip" image="/hero.jpg">
|
|
186
|
+
<div slot="top">
|
|
187
|
+
<c-breadcrumb :items="[{label: 'Home', href: '/'}, {label: 'Offers'}]"></c-breadcrumb>
|
|
188
|
+
</div>
|
|
189
|
+
</c-hero>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Config types
|
|
193
|
+
|
|
194
|
+
```js
|
|
195
|
+
config: {
|
|
196
|
+
title: { type: 'string', value: 'Default' },
|
|
197
|
+
count: { type: 'number', value: 0 },
|
|
198
|
+
active: { type: 'boolean', value: true },
|
|
199
|
+
items: { type: 'array', value: [] },
|
|
200
|
+
data: { type: 'object', value: {} },
|
|
201
|
+
variant: { type: 'array', value: [], options: ['size-s', 'size-m', 'size-l'] },
|
|
202
|
+
_click: { type: 'function' }, // callback (prefixed with _)
|
|
203
|
+
_change: { type: 'function' }
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Component with logic
|
|
208
|
+
|
|
209
|
+
```js
|
|
210
|
+
components.ItemAdd({
|
|
211
|
+
id: 'pagination',
|
|
212
|
+
config: {
|
|
213
|
+
page: { type: 'number', value: 1 },
|
|
214
|
+
pages: { type: 'number', value: 1 },
|
|
215
|
+
_change: { type: 'function' }
|
|
216
|
+
},
|
|
217
|
+
render: function() {
|
|
218
|
+
this.goToPage = (num) => {
|
|
219
|
+
if (num >= 1 && num <= this.pages) {
|
|
220
|
+
this.page = num;
|
|
221
|
+
if (this._change) this._change(num);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
return `
|
|
226
|
+
<div class="pagination">
|
|
227
|
+
<button dh-click="() => goToPage(page - 1)" :disabled="page === 1">Prev</button>
|
|
228
|
+
<span>{{ page }} / {{ pages }}</span>
|
|
229
|
+
<button dh-click="() => goToPage(page + 1)" :disabled="page === pages">Next</button>
|
|
230
|
+
</div>
|
|
231
|
+
`;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Directives
|
|
237
|
+
|
|
238
|
+
Vue-like syntax, processed during compile with priority ordering.
|
|
239
|
+
|
|
240
|
+
### Conditional rendering
|
|
241
|
+
|
|
242
|
+
```html
|
|
243
|
+
<div dh-if="items.length > 0">Has items</div>
|
|
244
|
+
<div dh-if="!loading">Content loaded</div>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### List rendering
|
|
248
|
+
|
|
249
|
+
```html
|
|
250
|
+
<a dh-for="offer in items" :href="'/offer/' + offer.id">
|
|
251
|
+
{{ offer.name }}
|
|
252
|
+
</a>
|
|
253
|
+
|
|
254
|
+
<!-- With index -->
|
|
255
|
+
<div dh-for="item, index in items">
|
|
256
|
+
{{ index }}: {{ item.name }}
|
|
257
|
+
</div>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Event handlers
|
|
261
|
+
|
|
262
|
+
```html
|
|
263
|
+
<button dh-click="submit">Send</button>
|
|
264
|
+
<button dh-click="() => goToPage(3)">Page 3</button>
|
|
265
|
+
<input :_input="(e) => form.name = e.target.value">
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Dynamic attributes
|
|
269
|
+
|
|
270
|
+
```html
|
|
271
|
+
<img :src="getImage()" :alt="name" loading="lazy">
|
|
272
|
+
<div :class="'card ' + (active ? 'active' : '')">
|
|
273
|
+
<div :style="'background-image: url(' + image + ')'">
|
|
274
|
+
<button :disabled="page === 1">
|
|
275
|
+
<article :variant="variant.join(' ')">
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Text interpolation
|
|
279
|
+
|
|
280
|
+
```html
|
|
281
|
+
<span>{{ total }} results</span>
|
|
282
|
+
<h1>{{ offer.name }}</h1>
|
|
283
|
+
<span>{{ getStars() }}</span>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### All directives
|
|
287
|
+
|
|
288
|
+
`dh-if`, `dh-show`, `dh-for`, `dh-click`, `dh-text`, `dh-html`, `dh-fetch`, `dh-render`, `dh-form`, and all DOM event handlers.
|
|
289
|
+
|
|
290
|
+
## Reactivity
|
|
291
|
+
|
|
292
|
+
Setting any property on a render context triggers a re-render:
|
|
293
|
+
|
|
294
|
+
```js
|
|
295
|
+
this.count = 0;
|
|
296
|
+
this.increment = () => this.count++; // triggers DOM update
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Updates are batched with a 16ms debounce. The framework diffs the new DOM against the current DOM and patches only what changed. No virtual DOM — direct DOM diffing.
|
|
300
|
+
|
|
301
|
+
Lifecycle: `init → render → compile → ready → mount → update → unmount → destroy`.
|
|
302
|
+
|
|
303
|
+
## Slots
|
|
304
|
+
|
|
305
|
+
Components can define named slots:
|
|
306
|
+
|
|
307
|
+
```js
|
|
308
|
+
render: function() {
|
|
309
|
+
return `
|
|
310
|
+
<div>
|
|
311
|
+
<slot name="top"></slot>
|
|
312
|
+
<div class="content">
|
|
313
|
+
<slot></slot>
|
|
314
|
+
</div>
|
|
315
|
+
</div>
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Usage:
|
|
321
|
+
|
|
322
|
+
```html
|
|
323
|
+
<c-layout>
|
|
324
|
+
<div slot="top">Header content</div>
|
|
325
|
+
<p>Default slot content</p>
|
|
326
|
+
</c-layout>
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## Asset bundling
|
|
330
|
+
|
|
331
|
+
Convention-based bundler that scans directories, strips ES module syntax, concatenates, and minifies.
|
|
332
|
+
|
|
333
|
+
```js
|
|
334
|
+
import assets from '#assets/load.js';
|
|
335
|
+
|
|
336
|
+
// Scan directories in order
|
|
337
|
+
assets.Item({ type: 'js', order: 0, path: 'framework' });
|
|
338
|
+
assets.Item({ type: 'js', order: 1, path: 'addons/core/commands/front' });
|
|
339
|
+
assets.Item({ type: 'js', order: 1, path: 'addons/render/directives/front' });
|
|
340
|
+
assets.Item({ type: 'js', order: 1, path: 'addons/render/pages/front' });
|
|
341
|
+
|
|
342
|
+
// CSS
|
|
343
|
+
assets.Item({ type: 'css', order: 0, path: 'styles' });
|
|
344
|
+
assets.Item({ type: 'css', order: 1, path: 'addons/render/elements/front' });
|
|
345
|
+
assets.Item({ type: 'css', order: 2, path: 'projects/travel/site/front' });
|
|
346
|
+
|
|
347
|
+
// Ignore specific files
|
|
348
|
+
assets.Item({ type: 'js', order: 0, path: 'framework', ignore: ['framework/load.js'] });
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Dynamic content injection
|
|
352
|
+
|
|
353
|
+
Inject server-side data into the frontend bundle:
|
|
354
|
+
|
|
355
|
+
```js
|
|
356
|
+
assets.Item({
|
|
357
|
+
type: 'js',
|
|
358
|
+
order: 4,
|
|
359
|
+
content: function() {
|
|
360
|
+
const items = Object.values(settings.Items())
|
|
361
|
+
.filter(item => item.Get('organization_id') === 9)
|
|
362
|
+
.map(item => item.data);
|
|
363
|
+
|
|
364
|
+
return `settings.ItemsAdd(${JSON.stringify(items)}, null, false);`;
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
This runs at bundle time — server-side data becomes available client-side without an API call.
|
|
370
|
+
|
|
371
|
+
### How it works
|
|
372
|
+
|
|
373
|
+
1. Scans directories recursively for `.js` or `.css` files
|
|
374
|
+
2. Prioritizes `addon.js` files (loaded first)
|
|
375
|
+
3. Strips `import`/`export` statements
|
|
376
|
+
4. Concatenates by `order` value
|
|
377
|
+
5. Minifies via terser
|
|
378
|
+
|
|
379
|
+
No webpack, no build step, no configuration files.
|
package/docs/servers.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Servers
|
|
2
|
+
|
|
3
|
+
HTTP and gRPC servers, both configured through the commands addon.
|
|
4
|
+
|
|
5
|
+
## HTTP server
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import commands from '#commands/load.js';
|
|
9
|
+
|
|
10
|
+
commands.Fn('http.server', 3000, {
|
|
11
|
+
onStart: (server) => {
|
|
12
|
+
console.log('HTTP server started on port 3000');
|
|
13
|
+
},
|
|
14
|
+
onResponse: (http) => {
|
|
15
|
+
// Called after each response
|
|
16
|
+
},
|
|
17
|
+
onError: (error) => {
|
|
18
|
+
console.log('HTTP server error:', error.message);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## gRPC server
|
|
24
|
+
|
|
25
|
+
Bidirectional streaming with automatic reconnection and binary data transport.
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
commands.Fn('grpc.server', 50000, {
|
|
29
|
+
onStart: function() {
|
|
30
|
+
console.log('gRPC server started on port 50000');
|
|
31
|
+
},
|
|
32
|
+
onStreamConnect: async function(stream) {
|
|
33
|
+
// Authenticate via metadata
|
|
34
|
+
const node = await nodes.Fn('find', stream.metadata.get('token')[0]);
|
|
35
|
+
|
|
36
|
+
// Track the connection as an item
|
|
37
|
+
const connection = streams.Item({
|
|
38
|
+
gateway_id: gateway.Get('id'),
|
|
39
|
+
node_id: node.Get('id')
|
|
40
|
+
});
|
|
41
|
+
await connection.Create();
|
|
42
|
+
|
|
43
|
+
// Attach runtime state via Store
|
|
44
|
+
connection.StoreSet('gateway', gateway);
|
|
45
|
+
connection.StoreSet('node', node);
|
|
46
|
+
connection.StoreSet('stream', stream);
|
|
47
|
+
|
|
48
|
+
stream.connection = connection;
|
|
49
|
+
|
|
50
|
+
console.log('Connection established:', node.Get('name'));
|
|
51
|
+
},
|
|
52
|
+
onStreamEnd: function(stream) {
|
|
53
|
+
if (stream.connection) {
|
|
54
|
+
const node = stream.connection.StoreGet('node');
|
|
55
|
+
console.log('Disconnected:', node.Get('name'));
|
|
56
|
+
|
|
57
|
+
stream.connection.Delete();
|
|
58
|
+
stream.connection.Remove();
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
onStreamError: function(stream) {
|
|
62
|
+
console.log('Stream error');
|
|
63
|
+
},
|
|
64
|
+
onError: function(message) {
|
|
65
|
+
console.log('Server error:', message);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Binary transport
|
|
71
|
+
|
|
72
|
+
gRPC messages are JSON strings. Binary data (Buffers) is automatically extracted into a separate `map<string, bytes>` field before sending and re-injected on receive.
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
// Extract binaries from a data object
|
|
76
|
+
const extracted = divhunt.BinariesExtract(data);
|
|
77
|
+
// extracted.data → JSON-safe object (Buffers replaced with keys)
|
|
78
|
+
// extracted.binaries → map of key → Buffer
|
|
79
|
+
|
|
80
|
+
// Re-inject binaries
|
|
81
|
+
const restored = divhunt.BinariesInject(extracted.data, extracted.binaries);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This enables transparent file transfers over the same gRPC stream without base64 encoding.
|
|
85
|
+
|
|
86
|
+
## Store API
|
|
87
|
+
|
|
88
|
+
Per-item in-memory key-value storage — useful for attaching runtime state (like gRPC streams) to items:
|
|
89
|
+
|
|
90
|
+
```js
|
|
91
|
+
// Set
|
|
92
|
+
connection.StoreSet('node', nodeItem);
|
|
93
|
+
connection.StoreSet('stream', streamObject);
|
|
94
|
+
|
|
95
|
+
// Get
|
|
96
|
+
const node = connection.StoreGet('node');
|
|
97
|
+
const stream = connection.StoreGet('stream');
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Store data is never persisted to the database. It exists only in memory for the lifetime of the item.
|
|
101
|
+
|
|
102
|
+
## Requesting over gRPC
|
|
103
|
+
|
|
104
|
+
Send a request to a connected node and await the response:
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
const response = await stream.request('tool-slug', inputProperties, (chunk) => {
|
|
108
|
+
// Optional: handle streaming chunks
|
|
109
|
+
resolve(chunk.data, chunk.message, chunk.code, false);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// response.data, response.message, response.code, response.time
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Graceful shutdown
|
|
116
|
+
|
|
117
|
+
The framework handles process signals through middleware:
|
|
118
|
+
|
|
119
|
+
```js
|
|
120
|
+
process.on('SIGINT', async () => {
|
|
121
|
+
await divhunt.Middleware('sigint');
|
|
122
|
+
await divhunt.Middleware('shutdown');
|
|
123
|
+
process.exit(0);
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Register shutdown handlers:
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
divhunt.MiddlewareAdd('shutdown', async () => {
|
|
131
|
+
// Close connections, flush data, etc.
|
|
132
|
+
});
|
|
133
|
+
```
|
package/lib/LICENSE.txt
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Copyright © 2025 Divhunt GmbH
|
|
2
|
+
|
|
3
|
+
This License governs use of the Divhunt framework (the "Software"). By accessing or using the Software, you agree to be bound by the terms of this License.
|
|
4
|
+
|
|
5
|
+
1. GRANT OF LICENSE
|
|
6
|
+
You are granted a limited, non-exclusive, non-transferable, non-sublicensable license to use the Software solely for:
|
|
7
|
+
- personal projects;
|
|
8
|
+
- internal business purposes;
|
|
9
|
+
- client work, provided the client is not reselling or redistributing the Software.
|
|
10
|
+
|
|
11
|
+
2. ATTRIBUTION AND BRANDING
|
|
12
|
+
a. All uses of the Software must retain visible attribution to “Divhunt”.
|
|
13
|
+
b. You must not remove, obscure, alter, or suppress any branding, notices, or credits related to Divhunt.
|
|
14
|
+
c. Any public project using the Software must clearly state that it uses the “Divhunt Framework”.
|
|
15
|
+
|
|
16
|
+
3. PROHIBITED USES
|
|
17
|
+
The following are strictly prohibited:
|
|
18
|
+
a. Rebranding, renaming, or representing the Software as your own work;
|
|
19
|
+
b. Creating derivative frameworks or similar software tools based on the Software with the intent of distribution;
|
|
20
|
+
c. Redistributing, sublicensing, or selling the Software or any modified version thereof;
|
|
21
|
+
d. Using the Software in any commercial product, service, or offering without explicit, written permission from Divhunt GmbH.
|
|
22
|
+
|
|
23
|
+
4. MODIFICATIONS
|
|
24
|
+
You may modify the Software for personal or internal use only. Modified versions may not be:
|
|
25
|
+
- redistributed;
|
|
26
|
+
- rebranded or marketed as original work;
|
|
27
|
+
- offered as a service or product.
|
|
28
|
+
|
|
29
|
+
5. ENFORCEMENT AND TERMINATION
|
|
30
|
+
Any violation of this License will result in the immediate termination of all rights granted herein. Divhunt GmbH reserves the right to pursue legal remedies including but not limited to damages, injunctions, and recovery of profits obtained through unauthorized use.
|
|
31
|
+
|
|
32
|
+
6. NO WARRANTY
|
|
33
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL JOVANAT GMBH BE LIABLE FOR ANY DAMAGES ARISING FROM THE USE OR INABILITY TO USE THE SOFTWARE.
|
|
34
|
+
|
|
35
|
+
7. GOVERNING LAW
|
|
36
|
+
This License shall be governed by and construed in accordance with the laws of Switzerland. All disputes shall be subject to the exclusive jurisdiction of the courts of Zug, Switzerland.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
For commercial licensing or other questions, please contact: **dejan@divhunt.com**
|
package/lib/README.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
## Built with the Divhunt Framework – non-commercial use only. For commercial use, contact dejan@divhunt.com.
|
|
2
|
+
|
|
3
|
+
# Divhunt Framework
|
|
4
|
+
|
|
5
|
+
A lightweight, extensible JavaScript framework built around an addon system with powerful data validation, event handling, and DOM manipulation capabilities.
|
|
6
|
+
|
|
7
|
+
## Core Architecture
|
|
8
|
+
|
|
9
|
+
The framework consists of a main `Divhunt` class with modular mixins and an extensible addon system:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Framework Core
|
|
13
|
+
├── Divhunt Class (main)
|
|
14
|
+
├── Mixins (functionality)
|
|
15
|
+
│ ├── Addons
|
|
16
|
+
│ ├── Data Validation
|
|
17
|
+
│ ├── Event System
|
|
18
|
+
│ ├── Middleware
|
|
19
|
+
│ ├── DOM Manipulation
|
|
20
|
+
│ └── Utilities
|
|
21
|
+
└── Addon System
|
|
22
|
+
├── DivhuntAddon
|
|
23
|
+
├── DivhuntAddonItem
|
|
24
|
+
└── DivhuntAddonRender
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
### Server-side
|
|
30
|
+
```javascript
|
|
31
|
+
import Divhunt from './lib/load.js';
|
|
32
|
+
|
|
33
|
+
const divhunt = new Divhunt();
|
|
34
|
+
|
|
35
|
+
// Create an addon
|
|
36
|
+
const users = divhunt.Addon('users', (addon) => {
|
|
37
|
+
addon.Field('name', ['string']);
|
|
38
|
+
addon.Field('email', ['string']);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Add items
|
|
42
|
+
users.Item({
|
|
43
|
+
name: 'John Doe',
|
|
44
|
+
email: 'john@example.com'
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Browser
|
|
49
|
+
```html
|
|
50
|
+
<script src="framework/browser.js"></script>
|
|
51
|
+
<script>
|
|
52
|
+
// window.divhunt is automatically available
|
|
53
|
+
const myAddon = window.divhunt.Addon('myAddon');
|
|
54
|
+
</script>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Core Features
|
|
58
|
+
|
|
59
|
+
### 🔧 Addon System
|
|
60
|
+
Create modular, reusable components with built-in validation
|
|
61
|
+
|
|
62
|
+
### 📊 Data Validation
|
|
63
|
+
Powerful schema-based validation with nested objects and arrays
|
|
64
|
+
|
|
65
|
+
### 🎯 Event System
|
|
66
|
+
Publisher-subscriber pattern for decoupled communication
|
|
67
|
+
|
|
68
|
+
### ⚡ Middleware
|
|
69
|
+
Intercept and modify operations with middleware chains
|
|
70
|
+
|
|
71
|
+
### 🌐 DOM Manipulation
|
|
72
|
+
Efficient DOM operations with state preservation
|
|
73
|
+
|
|
74
|
+
### 🛠️ Utilities
|
|
75
|
+
Helper functions for common operations and data manipulation
|
|
76
|
+
|
|
77
|
+
## Documentation
|
|
78
|
+
|
|
79
|
+
- [Installation](./docs/installation.md)
|
|
80
|
+
- [Addons](./docs/addons.md)
|
|
81
|
+
- [Data Validation](./docs/data-validation.md)
|
|
82
|
+
- [Events & Middleware](./docs/events-middleware.md)
|
|
83
|
+
- [DOM Manipulation](./docs/dom.md)
|
|
84
|
+
- [Utilities](./docs/utilities.md)
|
|
85
|
+
- [API Reference](./docs/api-reference.md)
|
|
86
|
+
|
|
87
|
+
## Example Usage
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
// Create a blog addon
|
|
91
|
+
const blog = divhunt.Addon('blog', (addon) => {
|
|
92
|
+
addon.Field('title', ['string', '', true]);
|
|
93
|
+
addon.Field('content', ['string', '', true]);
|
|
94
|
+
addon.Field('author', ['object', {}, true], null, null, false, {
|
|
95
|
+
name: ['string'],
|
|
96
|
+
email: ['string']
|
|
97
|
+
});
|
|
98
|
+
addon.Field('tags', ['array'], null, null, false, {
|
|
99
|
+
each: ['string']
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Add a post
|
|
104
|
+
const post = blog.Item({
|
|
105
|
+
title: 'Getting Started',
|
|
106
|
+
content: 'Welcome to our blog...',
|
|
107
|
+
author: {
|
|
108
|
+
name: 'Jane Smith',
|
|
109
|
+
email: 'jane@example.com'
|
|
110
|
+
},
|
|
111
|
+
tags: ['tutorial', 'getting-started']
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Listen for events
|
|
115
|
+
divhunt.EmitOn('addon.item.add', (addon, item) => {
|
|
116
|
+
console.log(`New item added to ${addon.GetName()}`);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// Custom function
|
|
120
|
+
blog.Fn('getByTag', function(tag) {
|
|
121
|
+
return Object.values(this.Items()).filter(item =>
|
|
122
|
+
item.Get('tags').includes(tag)
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Use the function
|
|
127
|
+
const tutorials = blog.Fn('getByTag', 'tutorial');
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## License
|
|
131
|
+
|
|
132
|
+
Licensed under the Divhunt Framework License. See LICENSE.txt for terms.
|
package/lib/browser.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// © 2025 Divhunt GmbH — Licensed under the Divhunt Framework License. See LICENSE for terms.
|
|
2
|
+
|
|
3
|
+
window.divhunt = window.divhunt = new Divhunt();
|
|
4
|
+
|
|
5
|
+
if (document.readyState === 'loading')
|
|
6
|
+
{
|
|
7
|
+
document.addEventListener('DOMContentLoaded', initBrowser);
|
|
8
|
+
}
|
|
9
|
+
else
|
|
10
|
+
{
|
|
11
|
+
initBrowser();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function initBrowser()
|
|
15
|
+
{
|
|
16
|
+
divhunt.Addon('browser', function(addon)
|
|
17
|
+
{
|
|
18
|
+
addon.Render('body', () =>
|
|
19
|
+
{
|
|
20
|
+
return document.body.outerHTML;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const render = addon.Render('body', window);
|
|
24
|
+
document.body.replaceChildren(...render.Element.children);
|
|
25
|
+
});
|
|
26
|
+
}
|