@onetype/framework 2.0.41 → 2.0.43
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/addons/ai/addon.js +78 -0
- package/addons/ai/addons/agents/item/functions/describe.js +28 -0
- package/addons/ai/addons/agents/item/functions/execute.js +41 -0
- package/addons/ai/addons/agents/item/functions/messages.js +38 -0
- package/addons/ai/addons/agents/item/functions/run.js +49 -0
- package/addons/ai/addons/agents/item/functions/schema.js +45 -0
- package/addons/ai/addons/agents/load.js +9 -0
- package/addons/ai/addons/orchestrators/item/functions/agents/execute.js +14 -0
- package/addons/ai/addons/orchestrators/item/functions/agents/steps.js +23 -0
- package/addons/ai/addons/orchestrators/item/functions/modes/action.js +131 -0
- package/addons/ai/addons/orchestrators/item/functions/run.js +28 -0
- package/addons/ai/addons/orchestrators/item/functions/utils/emit.js +11 -0
- package/addons/ai/addons/orchestrators/item/functions/utils/history.js +8 -0
- package/addons/ai/addons/orchestrators/item/functions/utils/state.js +29 -0
- package/addons/ai/addons/orchestrators/load.js +15 -0
- package/addons/ai/addons/pipelines/functions/execute.js +56 -0
- package/addons/ai/addons/pipelines/functions/run.js +72 -0
- package/addons/ai/addons/pipelines/load.js +6 -0
- package/addons/ai/addons/providers/functions/default.js +8 -0
- package/addons/ai/addons/providers/item/functions/request.js +108 -0
- package/addons/ai/addons/providers/items/nue.js +69 -0
- package/addons/ai/addons/providers/items/ollama.js +79 -0
- package/addons/ai/addons/providers/load.js +8 -0
- package/addons/ai/items/agents/steps.js +159 -0
- package/addons/ai/items/agents/summary.js +29 -0
- package/addons/ai/items/orchestrators/general.js +7 -0
- package/addons/ai/load.js +13 -0
- package/addons/ai/test/agents.js +149 -0
- package/addons/ai/test/index.js +63 -0
- package/addons/core/assets/back/functions/utils/transform.js +21 -23
- package/addons/core/assets/back/items/html/css.js +2 -2
- package/addons/core/assets/back/items/html/js.js +2 -2
- package/addons/core/clients/back/http/item/functions/gRPC/create.js +3 -3
- package/addons/core/clients/back/http/item/functions/http/create.js +3 -3
- package/addons/core/commands/back/functions/grpc/client.js +3 -3
- package/addons/core/commands/back/functions/grpc/server.js +2 -2
- package/addons/core/commands/core/addon.js +4 -1
- package/addons/core/commands/core/functions/run.js +1 -1
- package/addons/core/commands/core/item/functions/run.js +1 -1
- package/addons/core/commands/core/load.js +27 -9
- package/addons/core/database/back/events/addon.add.js +1 -1
- package/addons/core/database/back/events/middleware/addon.items.find.js +2 -2
- package/addons/core/database/back/events/middleware/item.crud.create.js +2 -2
- package/addons/core/database/back/events/middleware/item.crud.delete.js +2 -2
- package/addons/core/database/back/events/middleware/item.crud.update.js +2 -2
- package/addons/core/database/back/item/functions/create.js +4 -3
- package/addons/core/database/back/item/functions/delete.js +1 -1
- package/addons/core/database/back/item/functions/find.js +1 -1
- package/addons/core/database/back/item/functions/update.js +3 -3
- package/addons/core/database/front/events/addon.add.js +1 -1
- package/addons/core/servers/back/grpc/item/functions/start.js +1 -1
- package/addons/core/servers/back/http/item/functions/start.js +6 -6
- package/addons/float/overlays/css/overlay.css +35 -0
- package/addons/float/overlays/js/addon.js +18 -0
- package/addons/float/overlays/js/events/click.js +27 -0
- package/addons/float/overlays/js/events/escape.js +18 -0
- package/addons/float/overlays/js/functions/flip.js +51 -0
- package/addons/float/overlays/js/functions/index.js +17 -0
- package/addons/float/overlays/js/functions/position.js +62 -0
- package/addons/float/overlays/js/functions/reposition.js +29 -0
- package/addons/float/overlays/js/item/catch/add.js +123 -0
- package/addons/float/overlays/js/item/catch/remove.js +29 -0
- package/addons/float/popup/css/popup.css +93 -0
- package/addons/float/popup/js/addon.js +34 -0
- package/addons/float/popup/js/functions/close.js +25 -0
- package/addons/float/popup/js/functions/modal.js +31 -0
- package/addons/float/popup/js/functions/popup.js +21 -0
- package/addons/float/popup/js/functions/toast.js +55 -0
- package/addons/float/popup/js/functions/tooltip.js +34 -0
- package/addons/float/popup/js/items/directives/popup.js +58 -0
- package/addons/float/popup/js/items/directives/tooltip.js +72 -0
- package/addons/render/directives/front/{js/#register/addon.js → addon.js} +8 -8
- package/addons/render/directives/front/{js/functions → functions}/process/attributes.js +7 -2
- package/addons/render/directives/front/{js/functions → functions}/process/match.js +8 -8
- package/addons/render/directives/front/functions/process.js +88 -0
- package/{lib/items/directives → addons/render/directives/front/items/self}/1000-render.js +1 -0
- package/{lib/items/directives → addons/render/directives/front/items/self}/110-show.js +3 -5
- package/{lib/items/directives → addons/render/directives/front/items/self}/160-slot.js +2 -1
- package/{lib/items/directives → addons/render/directives/front/items/self}/200-for.js +3 -3
- package/addons/render/directives/front/items/self/500-click-outside.js +45 -0
- package/addons/render/directives/front/items/self/500-events.js +68 -0
- package/addons/render/directives/front/items/self/500-mouse-enter.js +62 -0
- package/addons/render/directives/front/items/self/500-mouse-leave.js +62 -0
- package/{lib/items/directives → addons/render/directives/front/items/self}/650-fetch.js +2 -3
- package/{lib/items/directives → addons/render/directives/front/items/self}/660-form.js +5 -6
- package/addons/render/{elements/front/items/directives → directives/front/items/self}/element.js +7 -1
- package/addons/render/directives/front/items/self/node.js +43 -0
- package/addons/render/elements/front/functions/runtime.js +25 -0
- package/addons/render/elements/front/items/self/cards/pricing/pricing.css +174 -0
- package/{lib/items/elements/sections → addons/render/elements/front/items/self/cards}/pricing/pricing.js +30 -11
- package/addons/render/elements/front/items/self/core/builder/builder.css +180 -0
- package/addons/render/elements/front/items/self/core/builder/builder.js +257 -0
- package/addons/render/elements/front/items/self/core/repeater/repeater.css +197 -0
- package/addons/render/elements/front/items/self/core/repeater/repeater.js +224 -0
- package/addons/render/elements/front/items/self/form/button/button.css +250 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/form/button/button.js +16 -21
- package/addons/render/elements/front/items/self/form/checkbox/checkbox.css +109 -0
- package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +75 -0
- package/addons/render/elements/front/items/self/form/color/color.css +156 -0
- package/addons/render/elements/front/items/self/form/color/color.js +122 -0
- package/addons/render/elements/front/items/self/form/date/date.css +84 -0
- package/addons/render/elements/front/items/self/form/date/date.js +68 -0
- package/addons/render/elements/front/items/self/form/field/field.css +72 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/form/field/field.js +4 -4
- package/addons/render/elements/front/items/self/form/input/input.css +86 -0
- package/addons/render/elements/front/items/self/form/input/input.js +124 -0
- package/addons/render/elements/front/items/self/form/radio/radio.css +118 -0
- package/addons/render/elements/front/items/self/form/radio/radio.js +80 -0
- package/addons/render/elements/front/items/self/form/rating/rating.css +57 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/form/rating/rating.js +18 -21
- package/addons/render/elements/front/items/self/form/section/section.css +86 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/form/section/section.js +5 -5
- package/addons/render/elements/front/items/self/form/select/select.css +186 -0
- package/addons/render/elements/front/items/self/form/select/select.js +161 -0
- package/addons/render/elements/front/items/self/form/slider/slider.css +123 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/form/slider/slider.js +89 -70
- package/addons/render/elements/front/items/self/form/tags/tags.css +152 -0
- package/addons/render/elements/front/items/self/form/tags/tags.js +166 -0
- package/addons/render/elements/front/items/self/form/textarea/textarea.css +80 -0
- package/addons/render/elements/front/items/self/form/textarea/textarea.js +113 -0
- package/addons/render/elements/front/items/self/form/toggle/toggle.css +105 -0
- package/addons/render/elements/front/items/self/form/toggle/toggle.js +66 -0
- package/addons/render/elements/front/items/self/global/code/code.css +97 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/code/code.js +10 -6
- package/addons/render/elements/front/items/self/global/faq/faq.css +98 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/faq/faq.js +16 -4
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/heading/heading.css +37 -14
- package/addons/render/elements/front/items/self/global/heading/heading.js +46 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/markdown/markdown.css +22 -15
- package/addons/render/elements/front/items/self/global/markdown/markdown.js +26 -0
- package/addons/render/elements/front/items/self/global/menu/menu.css +173 -0
- package/addons/render/elements/front/items/self/global/menu/menu.js +103 -0
- package/addons/render/elements/front/items/self/global/notice/notice.css +57 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/notice/notice.js +4 -4
- package/addons/render/elements/front/items/self/global/parameters/parameters.css +96 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/parameters/parameters.js +15 -6
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/tags/tags.css +18 -5
- package/{lib/items/elements → addons/render/elements/front/items/self}/global/tags/tags.js +11 -3
- package/{lib/items/elements → addons/render/elements/front/items/self}/navigation/navbar/navbar.css +39 -17
- package/{lib/items/elements → addons/render/elements/front/items/self}/navigation/navbar/navbar.js +24 -10
- package/{lib/items/elements → addons/render/elements/front/items/self}/navigation/sidebar/sidebar.css +25 -39
- package/{lib/items/elements → addons/render/elements/front/items/self}/navigation/sidebar/sidebar.js +29 -7
- package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +66 -0
- package/{lib/items/elements → addons/render/elements/front/items/self}/navigation/tabs/tabs.js +17 -3
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/code/code.css +21 -12
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/empty/empty.css +23 -18
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/empty/empty.js +5 -1
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/error/error.css +22 -12
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/error/error.js +2 -2
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/loading/loading.css +31 -14
- package/{lib/items/elements → addons/render/elements/front/items/self}/status/loading/loading.js +4 -4
- package/addons/render/pages/core/load.js +1 -1
- package/addons/render/pages/front/events/click.js +1 -1
- package/addons/render/pages/front/events/load.js +6 -16
- package/addons/render/pages/front/functions/change.js +21 -110
- package/addons/render/pages/front/functions/match.js +2 -3
- package/addons/render/pages/front/functions/open.js +3 -35
- package/addons/render/pages/front/functions/resolve.js +30 -0
- package/addons/render/pages/front/item/catch/add.js +12 -10
- package/addons/render/pages/front/item/catch/remove.js +5 -7
- package/addons/render/pages/front/item/functions/enter.js +15 -28
- package/addons/render/pages/front/item/functions/leave.js +6 -8
- package/addons/render/pages/front/items/commands/change.js +60 -0
- package/addons/render/pages/front/items/commands/list.js +38 -0
- package/addons/render/pages/front/items/directives/change.js +1 -1
- package/addons/render/transforms/css/transforms.css +4 -0
- package/addons/render/transforms/{addon.js → js/addon.js} +7 -0
- package/addons/render/transforms/js/item/functions/run.js +87 -0
- package/addons/services/cloudflare/images/back/addon.js +23 -0
- package/addons/services/cloudflare/images/back/expose.js +22 -0
- package/addons/services/cloudflare/images/back/functions/api.js +47 -0
- package/addons/services/cloudflare/images/back/functions/meta/detect.js +28 -0
- package/addons/services/cloudflare/images/back/functions/meta/dimensions/gif.js +11 -0
- package/addons/services/cloudflare/images/back/functions/meta/dimensions/jpeg.js +31 -0
- package/addons/services/cloudflare/images/back/functions/meta/dimensions/png.js +11 -0
- package/addons/services/cloudflare/images/back/functions/meta/dimensions/webp.js +36 -0
- package/addons/services/cloudflare/images/back/functions/meta.js +16 -0
- package/addons/services/cloudflare/images/back/items/commands/delete.js +38 -0
- package/addons/services/cloudflare/images/back/items/commands/get.js +56 -0
- package/addons/services/cloudflare/images/back/items/commands/list.js +49 -0
- package/addons/services/cloudflare/images/back/items/commands/upload.js +79 -0
- package/addons/services/cloudflare/images/back/load.js +21 -0
- package/addons/services/cloudflare/images/front/items/elements/browse/browse.css +235 -0
- package/addons/services/cloudflare/images/front/items/elements/browse/browse.js +193 -0
- package/addons/services/cloudflare/images/front/items/elements/input/input.css +154 -0
- package/addons/services/cloudflare/images/front/items/elements/input/input.js +147 -0
- package/addons/services/cloudflare/images/sql.txt +43 -0
- package/lib/browser.js +1 -24
- package/lib/events.js +12 -12
- package/lib/load.js +12 -42
- package/lib/src/classes/addon/class.js +1 -2
- package/lib/src/classes/addon/classes/item/mixins/get.js +3 -3
- package/lib/src/classes/addon/classes/item/mixins/set.js +3 -5
- package/lib/src/classes/addon/classes/item/mixins/store.js +1 -1
- package/lib/src/classes/addon/classes/render/class.js +8 -22
- package/lib/src/classes/addon/classes/render/mixins/compile.js +6 -4
- package/lib/src/classes/addon/classes/render/mixins/dom.js +3 -1
- package/lib/src/classes/addon/classes/render/mixins/events.js +30 -43
- package/lib/src/classes/addon/classes/render/mixins/get.js +0 -5
- package/lib/src/classes/addon/classes/render/mixins/methods.js +105 -40
- package/lib/src/classes/addon/classes/render/mixins/process.js +7 -3
- package/lib/src/classes/addon/classes/render/mixins/set.js +3 -1
- package/lib/src/classes/addon/mixins/fields.js +4 -6
- package/lib/src/classes/addon/mixins/functions.js +11 -11
- package/lib/src/classes/addon/mixins/items.js +17 -9
- package/lib/src/classes/addon/mixins/render.js +1 -1
- package/lib/src/classes/addon/mixins/table.js +1 -1
- package/lib/src/classes/error/class.js +10 -0
- package/lib/src/mixins/addons.js +7 -20
- package/lib/src/mixins/assets.js +1 -1
- package/lib/src/mixins/data.js +14 -14
- package/lib/src/mixins/dependencies.js +5 -5
- package/lib/src/mixins/dom.js +204 -201
- package/lib/src/mixins/emitter.js +13 -14
- package/lib/src/mixins/error.js +14 -1
- package/lib/src/mixins/function.js +1 -0
- package/lib/src/mixins/generate.js +1 -1
- package/lib/src/mixins/helper.js +3 -31
- package/lib/{items/elements/global/markdown → src/mixins}/markdown.js +90 -139
- package/lib/src/mixins/middleware.js +2 -2
- package/lib/src/mixins/observer.js +337 -0
- package/lib/src/mixins/request.js +2 -2
- package/lib/src/mixins/route.js +11 -2
- package/lib/src/mixins/state.js +17 -3
- package/lib/src/onetype.js +11 -18
- package/lib/styles/classes/layout.css +1 -3
- package/lib/styles/reset.css +1 -1
- package/lib/styles/variables.css +2 -1
- package/package.json +7 -3
- package/README.md +0 -86
- package/addons/core/queue/index.js +0 -66
- package/addons/float/modals/front/css/modals.css +0 -26
- package/addons/float/modals/front/js/addon.js +0 -10
- package/addons/float/modals/front/js/item/catch/add.js +0 -48
- package/addons/float/modals/front/js/item/catch/remove.js +0 -9
- package/addons/float/overlays/front/css/overlays.css +0 -29
- package/addons/float/overlays/front/js/addon.js +0 -17
- package/addons/float/overlays/front/js/events/click.js +0 -27
- package/addons/float/overlays/front/js/events/escape.js +0 -18
- package/addons/float/overlays/front/js/functions/flip.js +0 -74
- package/addons/float/overlays/front/js/functions/index.js +0 -17
- package/addons/float/overlays/front/js/functions/position.js +0 -63
- package/addons/float/overlays/front/js/item/catch/add.js +0 -121
- package/addons/float/overlays/front/js/item/catch/remove.js +0 -16
- package/addons/float/popups/css/popups.css +0 -4
- package/addons/float/popups/js/addon.js +0 -18
- package/addons/float/popups/js/item/catch/add.js +0 -7
- package/addons/float/popups/js/item/catch/remove.js +0 -7
- package/addons/float/popups/js/item/catch/set.js +0 -73
- package/addons/float/popups/js/items/directives/popup.js +0 -54
- package/addons/float/toasts/addon.js +0 -17
- package/addons/float/toasts/item/catch/add.js +0 -7
- package/addons/float/toasts/item/catch/remove.js +0 -7
- package/addons/float/toasts/item/catch/set.js +0 -86
- package/addons/float/toasts/items/elements/toast/toast.css +0 -84
- package/addons/float/toasts/items/elements/toast/toast.js +0 -61
- package/addons/float/tooltips/addon.js +0 -15
- package/addons/float/tooltips/item/catch/add.js +0 -7
- package/addons/float/tooltips/item/catch/remove.js +0 -26
- package/addons/float/tooltips/item/catch/set.js +0 -65
- package/addons/float/tooltips/items/directives/tooltip.js +0 -74
- package/addons/float/tooltips/items/elements/tooltip.css +0 -64
- package/addons/float/tooltips/items/elements/tooltip.js +0 -42
- package/addons/render/directives/front/js/functions/process.js +0 -57
- package/addons/render/transforms/item/functions/run.js +0 -18
- package/docs/addons.md +0 -281
- package/docs/architecture.md +0 -238
- package/docs/commands.md +0 -308
- package/docs/database.md +0 -171
- package/docs/frontend.md +0 -396
- package/docs/servers.md +0 -187
- package/examples/basic-api/README.md +0 -34
- package/examples/basic-api/addons/tasks/addon.js +0 -10
- package/examples/basic-api/addons/tasks/items/commands/create.js +0 -22
- package/examples/basic-api/addons/tasks/items/commands/delete.js +0 -26
- package/examples/basic-api/addons/tasks/items/commands/list.js +0 -17
- package/examples/basic-api/addons/tasks/items/commands/toggle.js +0 -26
- package/examples/basic-api/addons/tasks/load.js +0 -8
- package/examples/basic-api/index.js +0 -15
- package/examples/basic-api/package.json +0 -7
- package/examples/basic-front/back/assets.js +0 -12
- package/examples/basic-front/back/index.js +0 -13
- package/examples/basic-front/back/items/commands/html.js +0 -14
- package/examples/basic-front/back/items/commands/test.js +0 -19
- package/examples/basic-front/back/items/html/fonts.js +0 -12
- package/examples/basic-front/front/pages/home.js +0 -16
- package/examples/basic-front/front/styles/main.css +0 -31
- package/examples/basic-front/front/test.js +0 -7
- package/examples/basic-front/package.json +0 -7
- package/lib/items/directives/500-blur.js +0 -46
- package/lib/items/directives/500-change.js +0 -53
- package/lib/items/directives/500-click-outside.js +0 -50
- package/lib/items/directives/500-click.js +0 -52
- package/lib/items/directives/500-double-click.js +0 -52
- package/lib/items/directives/500-focus.js +0 -46
- package/lib/items/directives/500-input.js +0 -46
- package/lib/items/directives/500-keydown.js +0 -53
- package/lib/items/directives/500-keyup.js +0 -53
- package/lib/items/directives/500-mouse-enter.js +0 -61
- package/lib/items/directives/500-mouse-leave.js +0 -61
- package/lib/items/directives/500-mouse-move.js +0 -45
- package/lib/items/directives/500-scroll.js +0 -45
- package/lib/items/directives/500-submit.js +0 -52
- package/lib/items/elements/form/button/styles/base.css +0 -176
- package/lib/items/elements/form/button/styles/sizes.css +0 -78
- package/lib/items/elements/form/button/styles/variants.css +0 -421
- package/lib/items/elements/form/checkbox/checkbox.js +0 -58
- package/lib/items/elements/form/checkbox/styles/base.css +0 -52
- package/lib/items/elements/form/checkbox/styles/sizes.css +0 -39
- package/lib/items/elements/form/checkbox/styles/variants.css +0 -121
- package/lib/items/elements/form/field/field.css +0 -96
- package/lib/items/elements/form/input/input.css +0 -111
- package/lib/items/elements/form/input/input.js +0 -79
- package/lib/items/elements/form/input/styles/base.css +0 -26
- package/lib/items/elements/form/input/styles/sizes.css +0 -15
- package/lib/items/elements/form/input/styles/variants.css +0 -98
- package/lib/items/elements/form/radio/radio.js +0 -58
- package/lib/items/elements/form/radio/styles/base.css +0 -48
- package/lib/items/elements/form/radio/styles/sizes.css +0 -36
- package/lib/items/elements/form/radio/styles/variants.css +0 -121
- package/lib/items/elements/form/rating/rating.css +0 -95
- package/lib/items/elements/form/section/section.css +0 -129
- package/lib/items/elements/form/slider/slider.css +0 -244
- package/lib/items/elements/form/textarea/textarea.css +0 -117
- package/lib/items/elements/form/textarea/textarea.js +0 -70
- package/lib/items/elements/global/card/card.css +0 -57
- package/lib/items/elements/global/card/card.js +0 -48
- package/lib/items/elements/global/code/code.css +0 -66
- package/lib/items/elements/global/faq/faq.css +0 -76
- package/lib/items/elements/global/heading/heading.js +0 -52
- package/lib/items/elements/global/notice/notice.css +0 -91
- package/lib/items/elements/global/parameters/parameters.css +0 -77
- package/lib/items/elements/navigation/tabs/tabs.css +0 -47
- package/lib/items/elements/sections/footer/footer.css +0 -205
- package/lib/items/elements/sections/footer/footer.js +0 -109
- package/lib/items/elements/sections/hero/hero.css +0 -100
- package/lib/items/elements/sections/hero/hero.js +0 -54
- package/lib/items/elements/sections/pricing/pricing.css +0 -148
- package/lib/items/elements/sections/stats/stats.css +0 -34
- package/lib/items/elements/sections/stats/stats.js +0 -74
- package/lib/src/mixins/logger.js +0 -83
- package/lib/styles/queries.css +0 -6
- /package/addons/modules/shortcuts/front/{#register/addon.js → addon.js} +0 -0
- /package/addons/render/directives/front/{js/functions → functions}/process/data.js +0 -0
- /package/{lib/items/directives → addons/render/directives/front/items/self}/100-if.js +0 -0
- /package/{lib/items/directives → addons/render/directives/front/items/self}/700-text.js +0 -0
- /package/{lib/items/directives → addons/render/directives/front/items/self}/750-html.js +0 -0
- /package/addons/render/elements/front/{#register/addon.js → addon.js} +0 -0
- /package/{lib/items/elements → addons/render/elements/front/items/self}/status/code/code.js +0 -0
- /package/addons/render/transforms/{functions → js/functions}/data.js +0 -0
- /package/addons/render/transforms/{functions → js/functions}/run.js +0 -0
- /package/addons/render/transforms/{functions → js/functions}/runtime.js +0 -0
- /package/addons/render/transforms/{item → js/item}/functions/load.js +0 -0
- /package/addons/render/transforms/{items/directives → js/items/self}/transform.js +0 -0
package/docs/architecture.md
DELETED
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
# Architecture
|
|
2
|
-
|
|
3
|
-
## File structure
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
lib/ Core OneType class + mixins
|
|
7
|
-
load.js Entry point — creates OneType instance, registers all assets, handles signals
|
|
8
|
-
src/
|
|
9
|
-
onetype.js Main class (mixin-composed)
|
|
10
|
-
mixins/ Addons, Emitter, Middleware, Data, DOM, Route,
|
|
11
|
-
Function, Generate, Binaries, Helper, Cookie, Assets, and more
|
|
12
|
-
classes/
|
|
13
|
-
addon/ OneTypeAddon + mixins (fields, items, functions, find, render, store)
|
|
14
|
-
classes/
|
|
15
|
-
item/ OneTypeAddonItem + mixins (get, set, crud, functions, store)
|
|
16
|
-
render/ OneTypeAddonRender + mixins (compile, dom, process, events)
|
|
17
|
-
styles/ Shared CSS (variables, reset, queries, utility classes)
|
|
18
|
-
items/
|
|
19
|
-
elements/ Shared UI elements (grouped, IDs are group-prefixed)
|
|
20
|
-
form/ button, checkbox, field, input, radio, rating, section, slider, textarea
|
|
21
|
-
global/ card, code, faq, heading, markdown, notice, parameters, tabs, tags
|
|
22
|
-
sections/ footer, hero, navbar, stats
|
|
23
|
-
status/ code, empty, error, loading
|
|
24
|
-
transforms/ Shared transforms
|
|
25
|
-
accordion, chart, codeflask, codemirror, comparison,
|
|
26
|
-
heatmap, interact, particles, sparkline, swiper, tabs, typed
|
|
27
|
-
|
|
28
|
-
addons/ Built-in addon library
|
|
29
|
-
core/
|
|
30
|
-
database/ PostgreSQL ORM (Knex, fluent query builder, 17+ operators)
|
|
31
|
-
servers/ HTTP + gRPC servers
|
|
32
|
-
clients/ HTTP + gRPC clients
|
|
33
|
-
commands/ Typed API command system
|
|
34
|
-
queue/ Concurrency task queue
|
|
35
|
-
assets/ Convention-based asset bundler (terser)
|
|
36
|
-
render/
|
|
37
|
-
directives/ ot-if, ot-for, ot-click, ot-fetch, ot-show, ot-html, ot-text
|
|
38
|
-
pages/ SPA page router with CSS Grid layouts + async data loading
|
|
39
|
-
elements/ UI component addon (registration, directives)
|
|
40
|
-
html/ HTML document builder
|
|
41
|
-
tags/ HTML tag system
|
|
42
|
-
transforms/ Transform addon (registration, loading, directives)
|
|
43
|
-
modules/
|
|
44
|
-
variables/ Named variable registry
|
|
45
|
-
actions/ Action triggers
|
|
46
|
-
events/ Event bindings
|
|
47
|
-
schedules/ Cron-like scheduling
|
|
48
|
-
shortcuts/ Keyboard shortcut bindings
|
|
49
|
-
sources/ Data source registry
|
|
50
|
-
float/
|
|
51
|
-
modals/ Modal dialogs
|
|
52
|
-
toasts/ Toast notifications
|
|
53
|
-
tooltips/ Tooltip system
|
|
54
|
-
popups/ Popup menus
|
|
55
|
-
overlays/ Overlay backdrops
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Application structure
|
|
59
|
-
|
|
60
|
-
A typical application built on the framework:
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
my-app/
|
|
64
|
-
package.json Import aliases (#framework/*, #database/*, etc.)
|
|
65
|
-
index.js Entry point — imports framework, addons, database, servers
|
|
66
|
-
addons/
|
|
67
|
-
users/ Application addon
|
|
68
|
-
addon.js
|
|
69
|
-
load.js
|
|
70
|
-
functions/
|
|
71
|
-
items/commands/
|
|
72
|
-
item/catch/
|
|
73
|
-
events/
|
|
74
|
-
items/
|
|
75
|
-
database/
|
|
76
|
-
primary.js Database connection
|
|
77
|
-
servers/
|
|
78
|
-
http.js HTTP server config
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Entry point:
|
|
82
|
-
|
|
83
|
-
```js
|
|
84
|
-
import onetype from '#framework/load.js';
|
|
85
|
-
import commands from '#commands/load.js';
|
|
86
|
-
import database from '#database/load.js';
|
|
87
|
-
|
|
88
|
-
import './addons/users/load.js';
|
|
89
|
-
import './addons/offers/load.js';
|
|
90
|
-
|
|
91
|
-
import './items/database/primary.js';
|
|
92
|
-
import './items/servers/http.js';
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Import aliases
|
|
96
|
-
|
|
97
|
-
The framework uses Node.js package imports (`#` prefix) defined in `package.json`:
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
{
|
|
101
|
-
"imports": {
|
|
102
|
-
"#framework/*": "./lib/*",
|
|
103
|
-
"#database/*": "./addons/core/database/back/*",
|
|
104
|
-
"#servers/*": "./addons/core/servers/back/*",
|
|
105
|
-
"#clients/*": "./addons/core/clients/back/*",
|
|
106
|
-
"#commands/*": "./addons/core/commands/*",
|
|
107
|
-
"#queue/*": "./addons/core/queue/back/*",
|
|
108
|
-
"#assets/*": "./addons/core/assets/back/*",
|
|
109
|
-
"#html/*": "./addons/render/html/*",
|
|
110
|
-
"#directives/*": "./addons/render/directives/*",
|
|
111
|
-
"#pages/*": "./addons/render/pages/*",
|
|
112
|
-
"#elements/*": "./addons/render/elements/*",
|
|
113
|
-
"#tags/*": "./addons/render/tags/*",
|
|
114
|
-
"#sources/*": "./addons/modules/sources/*",
|
|
115
|
-
"#variables/*": "./addons/modules/variables/*"
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Design decisions
|
|
121
|
-
|
|
122
|
-
### Mixin composition over inheritance
|
|
123
|
-
|
|
124
|
-
Both `OneType` and `OneTypeAddon` use `Object.assign(Class.prototype, mixin)`. No class hierarchies, no diamond problems. Each mixin is a plain object of methods merged onto the prototype:
|
|
125
|
-
|
|
126
|
-
```js
|
|
127
|
-
import AddonItemGet from './mixins/get.js';
|
|
128
|
-
import AddonItemSet from './mixins/set.js';
|
|
129
|
-
import AddonItemCrud from './mixins/crud.js';
|
|
130
|
-
|
|
131
|
-
Object.assign(OneTypeAddonItem.prototype, AddonItemGet);
|
|
132
|
-
Object.assign(OneTypeAddonItem.prototype, AddonItemSet);
|
|
133
|
-
Object.assign(OneTypeAddonItem.prototype, AddonItemCrud);
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### Middleware as the extension point
|
|
137
|
-
|
|
138
|
-
CRUD operations and queries are middleware chains:
|
|
139
|
-
- `item.crud.create` — intercepted by database addon for INSERT
|
|
140
|
-
- `item.crud.update` — intercepted for UPDATE
|
|
141
|
-
- `item.crud.delete` — intercepted for DELETE
|
|
142
|
-
- `addon.items.find` — intercepted for SELECT
|
|
143
|
-
|
|
144
|
-
Without the database addon, everything works in-memory. Swap storage without touching business logic.
|
|
145
|
-
|
|
146
|
-
### Self-registering imports
|
|
147
|
-
|
|
148
|
-
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.
|
|
149
|
-
|
|
150
|
-
### Field transforms
|
|
151
|
-
|
|
152
|
-
Every field has `get[]` and `set[]` arrays of transform functions plus a `define` schema:
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
Set('name', value)
|
|
156
|
-
→ run set[] transforms
|
|
157
|
-
→ validate against define schema
|
|
158
|
-
→ fire lifecycle callbacks
|
|
159
|
-
→ store in item.data
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
Computed fields, type coercion, and normalization are declared at the field level.
|
|
163
|
-
|
|
164
|
-
### Proxy-driven reactivity
|
|
165
|
-
|
|
166
|
-
Render components return a `Proxy`. Setting a property schedules a debounced `Update()`:
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
this.count++
|
|
170
|
-
→ Proxy trap
|
|
171
|
-
→ schedule Update() (16ms debounce)
|
|
172
|
-
→ re-compile template
|
|
173
|
-
→ DOM diff
|
|
174
|
-
→ patch changes
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
Batched updates, no virtual DOM overhead.
|
|
178
|
-
|
|
179
|
-
### Binary transport over gRPC
|
|
180
|
-
|
|
181
|
-
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:
|
|
182
|
-
|
|
183
|
-
```
|
|
184
|
-
Send: { data: { file: <Buffer> } }
|
|
185
|
-
→ extract: { data: { file: "$$bin_0" }, binaries: { "$$bin_0": <Buffer> } }
|
|
186
|
-
→ send JSON + binaries separately
|
|
187
|
-
|
|
188
|
-
Receive:
|
|
189
|
-
→ inject: { data: { file: <Buffer> } }
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
Transparent binary transport over the same stream.
|
|
193
|
-
|
|
194
|
-
### Centralized asset registry
|
|
195
|
-
|
|
196
|
-
All asset paths are registered centrally in `lib/load.js` via `onetype.Assets(id, url, config)`. This decouples asset path knowledge from individual addons — the framework controls what gets bundled, regardless of whether a backend addon is loaded.
|
|
197
|
-
|
|
198
|
-
```js
|
|
199
|
-
// lib/load.js — top-level registrations
|
|
200
|
-
onetype.Assets('framework', import.meta.url, { js: { path: '.', exclude: ['load.js', 'items', 'styles'] } });
|
|
201
|
-
onetype.Assets('styles', import.meta.url, { css: 'styles' });
|
|
202
|
-
onetype.Assets('commands', import.meta.url, { js: { path: '../addons/core/commands', exclude: ['../addons/core/commands/back'] } });
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Shared elements and transforms use `onetype.AddonReady` to register only after their parent addon is loaded. The JS files themselves contain the wrapper:
|
|
206
|
-
|
|
207
|
-
```js
|
|
208
|
-
// lib/items/elements/form/button/button.js
|
|
209
|
-
onetype.AddonReady('elements', (elements) =>
|
|
210
|
-
{
|
|
211
|
-
elements.ItemAdd({ id: 'form-button', ... });
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
// lib/items/transforms/swiper/swiper.js
|
|
215
|
-
onetype.AddonReady('transforms', (transforms) =>
|
|
216
|
-
{
|
|
217
|
-
transforms.ItemAdd({ id: 'swiper', ... });
|
|
218
|
-
});
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
Element IDs are group-prefixed: `form-button`, `global-card`, `sections-navbar`, `status-loading`. HTML tags follow the same pattern: `<e-form-button>`, `<e-global-card>`, `<e-status-loading>`.
|
|
222
|
-
|
|
223
|
-
The import function reads from the registry to resolve paths:
|
|
224
|
-
|
|
225
|
-
```js
|
|
226
|
-
assets.Fn('import', ['framework', 'styles', 'commands', 'elements/form/input', 'transforms/swiper']);
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### Convention-based bundling
|
|
230
|
-
|
|
231
|
-
No webpack, no build configuration. The asset bundler:
|
|
232
|
-
1. Scans directories recursively
|
|
233
|
-
2. Prioritizes `addon.js` files
|
|
234
|
-
3. Strips `import`/`export` statements
|
|
235
|
-
4. Concatenates by priority order
|
|
236
|
-
5. Minifies via terser
|
|
237
|
-
|
|
238
|
-
ES module source files become a browser-loadable bundle.
|
package/docs/commands.md
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
# Commands
|
|
2
|
-
|
|
3
|
-
Every API endpoint is a typed, named operation with validated input and output. Commands work over both HTTP and gRPC.
|
|
4
|
-
|
|
5
|
-
## Defining a command
|
|
6
|
-
|
|
7
|
-
```js
|
|
8
|
-
import onetype from '#framework/load.js';
|
|
9
|
-
import users from './addon.js';
|
|
10
|
-
|
|
11
|
-
onetype.AddonReady('commands', (commands) => {
|
|
12
|
-
commands.Item({
|
|
13
|
-
id: 'users:create',
|
|
14
|
-
method: 'POST',
|
|
15
|
-
endpoint: '/api/users',
|
|
16
|
-
in: {
|
|
17
|
-
name: ['string', null, true],
|
|
18
|
-
email: ['string', null, true],
|
|
19
|
-
password: ['string', null, true]
|
|
20
|
-
},
|
|
21
|
-
out: {
|
|
22
|
-
user: {
|
|
23
|
-
type: 'object',
|
|
24
|
-
config: 'user',
|
|
25
|
-
required: true
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
callback: async function(properties, resolve) {
|
|
29
|
-
const user = users.Item({
|
|
30
|
-
name: properties.name,
|
|
31
|
-
email: properties.email,
|
|
32
|
-
password: properties.password
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
await user.Create();
|
|
36
|
-
|
|
37
|
-
resolve({
|
|
38
|
-
user: user.Get(['id', 'name', 'email', 'created_at'])
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Command properties
|
|
46
|
-
|
|
47
|
-
| Property | Description |
|
|
48
|
-
|---|---|
|
|
49
|
-
| `id` | Unique command identifier |
|
|
50
|
-
| `method` | HTTP method: `GET`, `POST`, `PUT`, `DELETE` |
|
|
51
|
-
| `endpoint` | URL pattern, supports `:params` (e.g., `/api/users/:id`) |
|
|
52
|
-
| `exposed` | If `true`, accessible without authentication |
|
|
53
|
-
| `type` | Response type: `'JSON'` (default) or `'HTML'` |
|
|
54
|
-
| `in` | Input schema — validated before callback runs |
|
|
55
|
-
| `out` | Output schema — validated before response is sent |
|
|
56
|
-
| `callback` | `async function(properties, resolve)` |
|
|
57
|
-
|
|
58
|
-
## Input schema
|
|
59
|
-
|
|
60
|
-
```js
|
|
61
|
-
in: {
|
|
62
|
-
// Simple: [type, default, required]
|
|
63
|
-
name: ['string', null, true],
|
|
64
|
-
limit: ['number', 20],
|
|
65
|
-
|
|
66
|
-
// Complex: object with type + config
|
|
67
|
-
filters: {
|
|
68
|
-
type: 'array',
|
|
69
|
-
each: {
|
|
70
|
-
type: 'object',
|
|
71
|
-
config: 'filter'
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Use `'query'` as shorthand for standard list endpoints:
|
|
78
|
-
|
|
79
|
-
```js
|
|
80
|
-
in: 'query' // accepts filters, sort_field, sort_direction, page, limit
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Output schema
|
|
84
|
-
|
|
85
|
-
```js
|
|
86
|
-
out: {
|
|
87
|
-
// Reference a DataSchema
|
|
88
|
-
user: {
|
|
89
|
-
type: 'object',
|
|
90
|
-
config: 'user',
|
|
91
|
-
required: true
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
// Array of schema objects
|
|
95
|
-
users: {
|
|
96
|
-
type: 'array',
|
|
97
|
-
each: {
|
|
98
|
-
type: 'object',
|
|
99
|
-
config: 'user'
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
|
|
103
|
-
// Simple fields
|
|
104
|
-
total: ['number', null, true],
|
|
105
|
-
page: ['number', null, true]
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Resolve
|
|
110
|
-
|
|
111
|
-
```js
|
|
112
|
-
// Success
|
|
113
|
-
resolve({ user: userData });
|
|
114
|
-
|
|
115
|
-
// Error with status code
|
|
116
|
-
resolve(null, 'Not found', 404);
|
|
117
|
-
|
|
118
|
-
// Streaming (partial response)
|
|
119
|
-
resolve(chunk.data, chunk.message, chunk.code, false);
|
|
120
|
-
// false = don't close the response
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Route params
|
|
124
|
-
|
|
125
|
-
```js
|
|
126
|
-
commands.Item({
|
|
127
|
-
id: 'users:get:one',
|
|
128
|
-
method: 'GET',
|
|
129
|
-
endpoint: '/api/users/:id',
|
|
130
|
-
in: {
|
|
131
|
-
id: ['number', null, true]
|
|
132
|
-
},
|
|
133
|
-
callback: async function(properties, resolve) {
|
|
134
|
-
const user = await users.Find().filter('id', properties.id).one();
|
|
135
|
-
|
|
136
|
-
if (!user) return resolve(null, null, 404);
|
|
137
|
-
|
|
138
|
-
resolve({
|
|
139
|
-
user: user.Get(['id', 'name', 'email', 'created_at'])
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## CRUD pattern
|
|
146
|
-
|
|
147
|
-
A complete CRUD set for an addon:
|
|
148
|
-
|
|
149
|
-
**Create:**
|
|
150
|
-
```js
|
|
151
|
-
commands.Item({
|
|
152
|
-
id: 'tools:create',
|
|
153
|
-
method: 'POST',
|
|
154
|
-
endpoint: '/api/tools',
|
|
155
|
-
in: {
|
|
156
|
-
name: ['string', null, true],
|
|
157
|
-
slug: ['string', null, true],
|
|
158
|
-
description: ['string']
|
|
159
|
-
},
|
|
160
|
-
callback: async function(properties, resolve) {
|
|
161
|
-
const tool = tools.Item({
|
|
162
|
-
name: properties.name,
|
|
163
|
-
slug: properties.slug,
|
|
164
|
-
description: properties.description
|
|
165
|
-
});
|
|
166
|
-
await tool.Create();
|
|
167
|
-
resolve({ tool: tool.Get(['id', 'name', 'slug', 'description', 'created_at']) });
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
**Read many:**
|
|
173
|
-
```js
|
|
174
|
-
commands.Item({
|
|
175
|
-
id: 'tools:get:many',
|
|
176
|
-
method: 'GET',
|
|
177
|
-
endpoint: '/api/tools',
|
|
178
|
-
exposed: true,
|
|
179
|
-
callback: async function(properties, resolve) {
|
|
180
|
-
let query = tools.Find().sort('name', 'asc');
|
|
181
|
-
|
|
182
|
-
if (properties.filters) {
|
|
183
|
-
properties.filters.forEach(f => {
|
|
184
|
-
query = query.filter(f.field, f.value, f.operator || 'EQUALS');
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const total = await query.count();
|
|
189
|
-
const items = await query
|
|
190
|
-
.page(properties.page || 1)
|
|
191
|
-
.limit(properties.limit || 10)
|
|
192
|
-
.many();
|
|
193
|
-
|
|
194
|
-
resolve({
|
|
195
|
-
tools: items.map(item => item.Get(['id', 'name', 'slug', 'description'])),
|
|
196
|
-
total,
|
|
197
|
-
page: properties.page || 1,
|
|
198
|
-
limit: properties.limit || 10
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
**Update:**
|
|
205
|
-
```js
|
|
206
|
-
commands.Item({
|
|
207
|
-
id: 'tools:update',
|
|
208
|
-
method: 'PUT',
|
|
209
|
-
endpoint: '/api/tools/:id',
|
|
210
|
-
in: { id: ['number', null, true], name: ['string'], description: ['string'] },
|
|
211
|
-
callback: async function(properties, resolve) {
|
|
212
|
-
const tool = await tools.Find().filter('id', properties.id).one();
|
|
213
|
-
if (!tool) return resolve(null, null, 404);
|
|
214
|
-
|
|
215
|
-
if (properties.name !== undefined) tool.Set('name', properties.name);
|
|
216
|
-
if (properties.description !== undefined) tool.Set('description', properties.description);
|
|
217
|
-
await tool.Update();
|
|
218
|
-
|
|
219
|
-
resolve({ tool: tool.Get(['id', 'name', 'description', 'updated_at']) });
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**Delete (soft):**
|
|
225
|
-
```js
|
|
226
|
-
commands.Item({
|
|
227
|
-
id: 'tools:delete',
|
|
228
|
-
method: 'DELETE',
|
|
229
|
-
endpoint: '/api/tools/:id',
|
|
230
|
-
in: { id: ['number', null, true] },
|
|
231
|
-
callback: async function(properties, resolve) {
|
|
232
|
-
const tool = await tools.Find().filter('id', properties.id).one();
|
|
233
|
-
if (!tool) return resolve(null, null, 404);
|
|
234
|
-
|
|
235
|
-
tool.Set('deleted_at', new Date().toISOString());
|
|
236
|
-
await tool.Update();
|
|
237
|
-
|
|
238
|
-
resolve({ tool: tool.Get(['id', 'name', 'deleted_at']) });
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Dynamic API registration
|
|
244
|
-
|
|
245
|
-
Register endpoints at runtime when items are added:
|
|
246
|
-
|
|
247
|
-
```js
|
|
248
|
-
tools.ItemOn('add', function(item) {
|
|
249
|
-
commands.Item({
|
|
250
|
-
exposed: true,
|
|
251
|
-
id: 'tool:' + item.Get('slug'),
|
|
252
|
-
method: 'POST',
|
|
253
|
-
endpoint: '/api/run/' + item.Get('slug'),
|
|
254
|
-
in: item.Get('config_in'),
|
|
255
|
-
out: item.Get('config_out'),
|
|
256
|
-
callback: async function(properties, resolve) {
|
|
257
|
-
// Route to a worker node via gRPC
|
|
258
|
-
const connections = Object.values(streams.Items()).filter(s =>
|
|
259
|
-
s.StoreGet('node').Get('tools').includes(item.Get('id'))
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
const stream = connections[Math.floor(Math.random() * connections.length)]
|
|
263
|
-
.StoreGet('stream');
|
|
264
|
-
const response = await stream.request(item.Get('slug'), properties);
|
|
265
|
-
resolve(response.data, response.message, response.code);
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
When a tool is added to the database, an API endpoint appears automatically. Remove the tool, the endpoint disappears.
|
|
272
|
-
|
|
273
|
-
## HTML commands
|
|
274
|
-
|
|
275
|
-
Serve HTML responses (for SSR):
|
|
276
|
-
|
|
277
|
-
```js
|
|
278
|
-
commands.Item({
|
|
279
|
-
id: 'html',
|
|
280
|
-
exposed: true,
|
|
281
|
-
method: 'GET',
|
|
282
|
-
endpoint: '*',
|
|
283
|
-
type: 'HTML',
|
|
284
|
-
callback: async function(properties, resolve) {
|
|
285
|
-
resolve(html.Fn('render', {
|
|
286
|
-
head: () => '<title>My App</title>',
|
|
287
|
-
body: () => '<div id="app"></div>'
|
|
288
|
-
}));
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
## HTTP context
|
|
294
|
-
|
|
295
|
-
Inside a command callback, access the HTTP request:
|
|
296
|
-
|
|
297
|
-
```js
|
|
298
|
-
callback: async function(properties, resolve) {
|
|
299
|
-
const pathname = this.http.url.pathname;
|
|
300
|
-
const ip = this.http?.user?.ip;
|
|
301
|
-
|
|
302
|
-
// Raw response for custom handling
|
|
303
|
-
this.http.raw.writeHead(301, { 'Location': '/new-url' });
|
|
304
|
-
this.http.raw.end();
|
|
305
|
-
this.http.prevent = true;
|
|
306
|
-
resolve({});
|
|
307
|
-
}
|
|
308
|
-
```
|