sygnal 5.3.7 → 6.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/CHANGELOG.md +646 -0
- package/README.md +77 -47
- package/dist/astro/client.cjs.js +33 -8114
- package/dist/astro/client.cjs.js.map +1 -0
- package/dist/astro/client.mjs +33 -8114
- package/dist/astro/client.mjs.map +1 -0
- package/dist/astro/index.cjs.js +1039 -9
- package/dist/astro/index.cjs.js.map +1 -0
- package/dist/astro/index.mjs +1038 -9
- package/dist/astro/index.mjs.map +1 -0
- package/dist/astro/server.cjs.js +3400 -166
- package/dist/astro/server.cjs.js.map +1 -0
- package/dist/astro/server.mjs +3400 -166
- package/dist/astro/server.mjs.map +1 -0
- package/dist/devtools.cjs.js +1431 -0
- package/dist/devtools.cjs.js.map +1 -0
- package/dist/devtools.esm.js +1419 -0
- package/dist/devtools.esm.js.map +1 -0
- package/dist/diagnostics.cjs.js +4033 -0
- package/dist/diagnostics.cjs.js.map +1 -0
- package/dist/diagnostics.esm.js +4003 -0
- package/dist/diagnostics.esm.js.map +1 -0
- package/dist/element.cjs.js +230 -0
- package/dist/element.cjs.js.map +1 -0
- package/dist/element.esm.js +228 -0
- package/dist/element.esm.js.map +1 -0
- package/dist/guide/accessibility.md +257 -0
- package/dist/guide/adapters.md +221 -0
- package/dist/guide/behaviors.md +312 -0
- package/dist/guide/browser-sources.md +203 -0
- package/dist/guide/drag-and-drop.md +342 -0
- package/dist/guide/element-commands.md +306 -0
- package/dist/guide/error-boundaries.md +169 -0
- package/dist/guide/forms-reference.md +381 -0
- package/dist/guide/forms.md +250 -0
- package/dist/guide/http.md +299 -0
- package/dist/guide/inputs.md +173 -0
- package/dist/guide/persistence.md +245 -0
- package/dist/guide/recipes/carousel.md +155 -0
- package/dist/guide/recipes/charts.md +177 -0
- package/dist/guide/recipes/code-editor.md +135 -0
- package/dist/guide/recipes/data-grid.md +155 -0
- package/dist/guide/recipes/data-table.md +196 -0
- package/dist/guide/recipes/i18n.md +222 -0
- package/dist/guide/recipes/icons.md +115 -0
- package/dist/guide/recipes/overview.md +33 -0
- package/dist/guide/recipes/rich-text.md +154 -0
- package/dist/guide/resources.md +471 -0
- package/dist/guide/ssr.md +255 -0
- package/dist/guide/timers.md +178 -0
- package/dist/guide/ui/accordion.md +93 -0
- package/dist/guide/ui/combobox.md +144 -0
- package/dist/guide/ui/dialog.md +124 -0
- package/dist/guide/ui/disclosure.md +60 -0
- package/dist/guide/ui/menu.md +125 -0
- package/dist/guide/ui/overview.md +166 -0
- package/dist/guide/ui/popover.md +101 -0
- package/dist/guide/ui/select.md +114 -0
- package/dist/guide/ui/tabs.md +161 -0
- package/dist/guide/ui/toaster.md +152 -0
- package/dist/guide/ui/tooltip.md +103 -0
- package/dist/guide/undo.md +178 -0
- package/dist/guide/virtual-collections.md +183 -0
- package/dist/guide/web-components.md +179 -0
- package/dist/guide/widgets.md +217 -0
- package/dist/index.cjs.js +15283 -6279
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +3739 -370
- package/dist/index.esm.js +15230 -6274
- package/dist/index.esm.js.map +1 -0
- package/dist/jsx-dev-runtime.cjs.js +27 -329
- package/dist/jsx-dev-runtime.cjs.js.map +1 -0
- package/dist/jsx-dev-runtime.esm.js +20 -322
- package/dist/jsx-dev-runtime.esm.js.map +1 -0
- package/dist/jsx-runtime.cjs.js +27 -329
- package/dist/jsx-runtime.cjs.js.map +1 -0
- package/dist/jsx-runtime.esm.js +20 -322
- package/dist/jsx-runtime.esm.js.map +1 -0
- package/dist/jsx.cjs.js +11 -309
- package/dist/jsx.cjs.js.map +1 -0
- package/dist/jsx.esm.js +9 -310
- package/dist/jsx.esm.js.map +1 -0
- package/dist/react.cjs.js +117 -0
- package/dist/react.cjs.js.map +1 -0
- package/dist/react.esm.js +115 -0
- package/dist/react.esm.js.map +1 -0
- package/dist/shims/globalthis.cjs +20 -0
- package/dist/sygnal.min.js +2 -1
- package/dist/sygnal.min.js.map +1 -0
- package/dist/ui-combobox.cjs.js +169 -0
- package/dist/ui-combobox.cjs.js.map +1 -0
- package/dist/ui-combobox.esm.js +148 -0
- package/dist/ui-combobox.esm.js.map +1 -0
- package/dist/ui-menu.cjs.js +87 -0
- package/dist/ui-menu.cjs.js.map +1 -0
- package/dist/ui-menu.esm.js +66 -0
- package/dist/ui-menu.esm.js.map +1 -0
- package/dist/ui-select.cjs.js +104 -0
- package/dist/ui-select.cjs.js.map +1 -0
- package/dist/ui-select.esm.js +83 -0
- package/dist/ui-select.esm.js.map +1 -0
- package/dist/ui.cjs.js +738 -0
- package/dist/ui.cjs.js.map +1 -0
- package/dist/ui.esm.js +727 -0
- package/dist/ui.esm.js.map +1 -0
- package/dist/vike/ClientOnly.cjs.js +5 -14
- package/dist/vike/ClientOnly.cjs.js.map +1 -0
- package/dist/vike/ClientOnly.mjs +5 -14
- package/dist/vike/ClientOnly.mjs.map +1 -0
- package/dist/vike/{+config.js → config/+config.js} +10 -1
- package/dist/vike/config/+config.js.map +1 -0
- package/dist/vike/config/package.json +6 -0
- package/dist/vike/onRenderClient.cjs.js +166 -95
- package/dist/vike/onRenderClient.cjs.js.map +1 -0
- package/dist/vike/onRenderClient.mjs +166 -95
- package/dist/vike/onRenderClient.mjs.map +1 -0
- package/dist/vike/onRenderHtml.cjs.js +60 -24
- package/dist/vike/onRenderHtml.cjs.js.map +1 -0
- package/dist/vike/onRenderHtml.mjs +61 -25
- package/dist/vike/onRenderHtml.mjs.map +1 -0
- package/dist/vite/plugin.cjs.js +926 -65
- package/dist/vite/plugin.cjs.js.map +1 -0
- package/dist/vite/plugin.mjs +925 -65
- package/dist/vite/plugin.mjs.map +1 -0
- package/dist/zag.cjs.js +408 -0
- package/dist/zag.cjs.js.map +1 -0
- package/dist/zag.esm.js +405 -0
- package/dist/zag.esm.js.map +1 -0
- package/llms.txt +313 -0
- package/package.json +109 -16
- package/src/astro/client.ts +40 -18
- package/src/astro/index.d.ts +48 -1
- package/src/astro/index.ts +106 -9
- package/src/astro/server.ts +11 -3
- package/src/collection.ts +6 -90
- package/src/core/actions.ts +134 -0
- package/src/core/cell.ts +202 -0
- package/src/core/debug.ts +23 -0
- package/src/core/define.ts +242 -0
- package/src/core/hooks.ts +314 -0
- package/src/core/hosts/collection.ts +325 -0
- package/src/core/hosts/switchable.ts +146 -0
- package/src/core/instance.ts +592 -0
- package/src/core/markers/clientonly.ts +13 -0
- package/src/core/markers/lazy.ts +40 -0
- package/src/core/markers/portal.ts +96 -0
- package/src/core/markers/suspense.ts +41 -0
- package/src/core/markers/transition.ts +70 -0
- package/src/core/registry.ts +25 -0
- package/src/core/runtime.ts +573 -0
- package/src/core/statics.ts +104 -0
- package/src/core/teardown.ts +60 -0
- package/src/core/view.ts +37 -0
- package/src/cycle/dom/DocumentDOMSource.ts +13 -8
- package/src/cycle/dom/ElementFinder.ts +7 -9
- package/src/cycle/dom/EventDelegator.ts +174 -223
- package/src/cycle/dom/IsolateModule.ts +65 -35
- package/src/cycle/dom/MainDOMSource.ts +13 -2
- package/src/cycle/dom/PriorityQueue.ts +4 -2
- package/src/cycle/dom/SymbolTree.ts +18 -47
- package/src/cycle/dom/classNameModule.ts +76 -0
- package/src/cycle/dom/controlledInputModule.ts +50 -0
- package/src/cycle/dom/enrichEventStream.ts +29 -45
- package/src/cycle/dom/fragment.ts +7 -0
- package/src/cycle/dom/isolate.ts +30 -27
- package/src/cycle/dom/makeDOMDriver.ts +115 -57
- package/src/cycle/dom/mockDOMSource.ts +83 -9
- package/src/cycle/dom/modules.ts +21 -4
- package/src/cycle/dom/propsModule.ts +65 -0
- package/src/cycle/dom/selectModule.ts +22 -17
- package/src/cycle/dom/snabbdom.ts +1 -6
- package/src/cycle/dom/thunk.ts +3 -0
- package/src/cycle/dom/utils.ts +98 -0
- package/src/cycle/dom/viewTransition.ts +43 -0
- package/src/cycle/state/StateSource.ts +20 -4
- package/src/cycle/state/objIsEqual.ts +50 -0
- package/src/cycle/state/types.ts +0 -10
- package/src/defineComponent.ts +34 -0
- package/src/devtools.d.ts +151 -0
- package/src/devtools.ts +34 -0
- package/src/element.d.ts +59 -0
- package/src/element.ts +235 -0
- package/src/extra/backoff.ts +9 -0
- package/src/extra/behaviors.ts +169 -0
- package/src/extra/browserSignals.ts +23 -0
- package/src/extra/browserSources.ts +326 -0
- package/src/extra/command.ts +3 -3
- package/src/extra/controls.ts +47 -0
- package/src/extra/copyAsTest.ts +286 -0
- package/src/extra/devtools.ts +109 -31
- package/src/extra/devtoolsActions.ts +379 -0
- package/src/extra/devtoolsHook.ts +9 -0
- package/src/extra/devtoolsNext.ts +83 -0
- package/src/extra/diagnostics/checks/actionLog.ts +108 -0
- package/src/extra/diagnostics/checks/behaviors.ts +49 -0
- package/src/extra/diagnostics/checks/browserSources.ts +96 -0
- package/src/extra/diagnostics/checks/collections.ts +67 -0
- package/src/extra/diagnostics/checks/controls.ts +148 -0
- package/src/extra/diagnostics/checks/dataset.ts +57 -0
- package/src/extra/diagnostics/checks/dom.ts +250 -0
- package/src/extra/diagnostics/checks/elementCommands.ts +175 -0
- package/src/extra/diagnostics/checks/events.ts +83 -0
- package/src/extra/diagnostics/checks/fetch.ts +135 -0
- package/src/extra/diagnostics/checks/forms.ts +163 -0
- package/src/extra/diagnostics/checks/index.ts +202 -0
- package/src/extra/diagnostics/checks/inspect.ts +427 -0
- package/src/extra/diagnostics/checks/next.ts +417 -0
- package/src/extra/diagnostics/checks/persist.ts +54 -0
- package/src/extra/diagnostics/checks/props.ts +56 -0
- package/src/extra/diagnostics/checks/public.d.ts +302 -0
- package/src/extra/diagnostics/checks/replies.ts +128 -0
- package/src/extra/diagnostics/checks/router.ts +100 -0
- package/src/extra/diagnostics/checks/rxjsHints.ts +88 -0
- package/src/extra/diagnostics/checks/shared.ts +203 -0
- package/src/extra/diagnostics/checks/shorthand.ts +115 -0
- package/src/extra/diagnostics/checks/sortable.ts +129 -0
- package/src/extra/diagnostics/checks/state.ts +148 -0
- package/src/extra/diagnostics/checks/statics.ts +48 -0
- package/src/extra/diagnostics/checks/strict.ts +55 -0
- package/src/extra/diagnostics/checks/timers.ts +80 -0
- package/src/extra/diagnostics/checks/viewTransitions.ts +47 -0
- package/src/extra/diagnostics/checks/virtual.ts +73 -0
- package/src/extra/diagnostics/checks/widgets.ts +109 -0
- package/src/extra/diagnostics/checks/wiring.ts +121 -0
- package/src/extra/diagnostics/codes.ts +477 -0
- package/src/extra/diagnostics/index.ts +353 -0
- package/src/extra/diagnostics/legacy.ts +76 -0
- package/src/extra/driverFactories.ts +172 -60
- package/src/extra/elementCommands.ts +53 -0
- package/src/extra/eventDriver.ts +4 -0
- package/src/extra/fetchDriver.ts +519 -0
- package/src/extra/flatten.ts +75 -0
- package/src/extra/focusWithin.ts +27 -0
- package/src/extra/form.ts +268 -0
- package/src/extra/formHelpers.ts +139 -0
- package/src/extra/head.ts +106 -0
- package/src/extra/hmr.ts +2 -3
- package/src/extra/owned.ts +24 -0
- package/src/extra/pager.ts +50 -0
- package/src/extra/persist.ts +133 -0
- package/src/extra/pwa.ts +1 -1
- package/src/extra/queryCache.ts +107 -0
- package/src/extra/reducers.ts +13 -6
- package/src/extra/reduxDevtools.ts +92 -0
- package/src/extra/replies.ts +54 -0
- package/src/extra/router.ts +323 -0
- package/src/extra/run.ts +94 -210
- package/src/extra/selection.ts +76 -0
- package/src/extra/socketDriver.ts +265 -0
- package/src/extra/sortable.ts +377 -0
- package/src/extra/ssr.ts +427 -160
- package/src/extra/standardSchema.ts +27 -0
- package/src/extra/testing.ts +3158 -190
- package/src/extra/timers.ts +95 -0
- package/src/extra/undo.ts +261 -0
- package/src/extra/viewTransitions.ts +38 -0
- package/src/extra/virtual.ts +513 -0
- package/src/extra/widget.ts +201 -0
- package/src/extra/xstreamExtras.ts +269 -0
- package/src/index.d.ts +3012 -87
- package/src/index.ts +32 -10
- package/src/jsx-runtime.ts +15 -1
- package/src/jsx.ts +2 -1
- package/src/lazy.ts +50 -7
- package/src/portal.ts +3 -1
- package/src/pragma/index.ts +262 -134
- package/src/react-peers.d.ts +5 -0
- package/src/react.d.ts +43 -0
- package/src/react.ts +110 -0
- package/src/shared.ts +48 -0
- package/src/slot.ts +1 -1
- package/src/suspense.ts +3 -1
- package/src/switchable.ts +6 -119
- package/src/transition.ts +3 -1
- package/src/ui/accordion.ts +64 -0
- package/src/ui/dialog.ts +129 -0
- package/src/ui/disclosure.ts +35 -0
- package/src/ui/popover.ts +45 -0
- package/src/ui/shared.ts +94 -0
- package/src/ui/tabs.ts +82 -0
- package/src/ui/toaster.ts +198 -0
- package/src/ui/tooltip.ts +70 -0
- package/src/ui/zag/combobox.ts +115 -0
- package/src/ui/zag/menu.ts +40 -0
- package/src/ui/zag/select.ts +54 -0
- package/src/ui/zag/shared.ts +43 -0
- package/src/ui-combobox.d.ts +20 -0
- package/src/ui-combobox.ts +6 -0
- package/src/ui-menu.d.ts +30 -0
- package/src/ui-menu.ts +6 -0
- package/src/ui-select.d.ts +17 -0
- package/src/ui-select.ts +6 -0
- package/src/ui-zag-types.d.ts +42 -0
- package/src/ui.d.ts +208 -0
- package/src/ui.ts +15 -0
- package/src/vike/+config.ts +9 -1
- package/src/vike/ClientOnly.ts +1 -1
- package/src/vike/onRenderClient.ts +144 -96
- package/src/vike/onRenderHtml.ts +69 -26
- package/src/vike/types.ts +27 -4
- package/src/vite/globalthis-shim.ts +18 -0
- package/src/vite/globalthis.ts +56 -0
- package/src/vite/plugin.d.ts +114 -2
- package/src/vite/plugin.ts +920 -56
- package/src/zag.d.ts +64 -0
- package/src/zag.ts +238 -0
- package/dist/astro/astro/client.d.ts +0 -5
- package/dist/astro/astro/index.d.ts +0 -16
- package/dist/astro/astro/server.d.ts +0 -12
- package/dist/astro/client.d.ts +0 -5
- package/dist/astro/client.esm.js +0 -4665
- package/dist/astro/collection.d.ts +0 -12
- package/dist/astro/component.d.ts +0 -22
- package/dist/astro/cycle/dom/BodyDOMSource.d.ts +0 -10
- package/dist/astro/cycle/dom/DOMSource.d.ts +0 -11
- package/dist/astro/cycle/dom/DocumentDOMSource.d.ts +0 -12
- package/dist/astro/cycle/dom/ElementFinder.d.ts +0 -8
- package/dist/astro/cycle/dom/EventDelegator.d.ts +0 -34
- package/dist/astro/cycle/dom/IsolateModule.d.ts +0 -23
- package/dist/astro/cycle/dom/MainDOMSource.d.ts +0 -32
- package/dist/astro/cycle/dom/PriorityQueue.d.ts +0 -7
- package/dist/astro/cycle/dom/ScopeChecker.d.ts +0 -9
- package/dist/astro/cycle/dom/SymbolTree.d.ts +0 -9
- package/dist/astro/cycle/dom/VNodeWrapper.d.ts +0 -8
- package/dist/astro/cycle/dom/enrichEventStream.d.ts +0 -24
- package/dist/astro/cycle/dom/fromEvent.d.ts +0 -6
- package/dist/astro/cycle/dom/index.d.ts +0 -8
- package/dist/astro/cycle/dom/isolate.d.ts +0 -9
- package/dist/astro/cycle/dom/makeDOMDriver.d.ts +0 -11
- package/dist/astro/cycle/dom/mockDOMSource.d.ts +0 -17
- package/dist/astro/cycle/dom/modules.d.ts +0 -5
- package/dist/astro/cycle/dom/snabbdom.d.ts +0 -22
- package/dist/astro/cycle/dom/styleModule.d.ts +0 -13
- package/dist/astro/cycle/dom/thunk.d.ts +0 -11
- package/dist/astro/cycle/dom/utils.d.ts +0 -8
- package/dist/astro/cycle/isolate/index.d.ts +0 -42
- package/dist/astro/cycle/run/adapt.d.ts +0 -6
- package/dist/astro/cycle/run/index.d.ts +0 -36
- package/dist/astro/cycle/run/internals.d.ts +0 -8
- package/dist/astro/cycle/run/types.d.ts +0 -49
- package/dist/astro/cycle/state/Collection.d.ts +0 -29
- package/dist/astro/cycle/state/StateSource.d.ts +0 -20
- package/dist/astro/cycle/state/index.d.ts +0 -5
- package/dist/astro/cycle/state/pickCombine.d.ts +0 -3
- package/dist/astro/cycle/state/pickMerge.d.ts +0 -3
- package/dist/astro/cycle/state/types.d.ts +0 -18
- package/dist/astro/cycle/state/withState.d.ts +0 -17
- package/dist/astro/extra/classes.d.ts +0 -7
- package/dist/astro/extra/devtools.d.ts +0 -78
- package/dist/astro/extra/dragDriver.d.ts +0 -20
- package/dist/astro/extra/driverFactories.d.ts +0 -12
- package/dist/astro/extra/eventDriver.d.ts +0 -9
- package/dist/astro/extra/exactState.d.ts +0 -1
- package/dist/astro/extra/hmr.d.ts +0 -17
- package/dist/astro/extra/logDriver.d.ts +0 -2
- package/dist/astro/extra/processDrag.d.ts +0 -19
- package/dist/astro/extra/processForm.d.ts +0 -15
- package/dist/astro/extra/run.d.ts +0 -13
- package/dist/astro/extra/xstreamCompat.d.ts +0 -5
- package/dist/astro/index.d.ts +0 -19
- package/dist/astro/index.esm.js +0 -27
- package/dist/astro/jsx-dev-runtime.d.ts +0 -1
- package/dist/astro/jsx-runtime.d.ts +0 -4
- package/dist/astro/jsx.d.ts +0 -2
- package/dist/astro/pragma/fn.d.ts +0 -7
- package/dist/astro/pragma/index.d.ts +0 -7
- package/dist/astro/pragma/is.d.ts +0 -10
- package/dist/astro/server.d.ts +0 -12
- package/dist/astro/server.esm.js +0 -25
- package/dist/astro/switchable.d.ts +0 -7
- package/dist/collection.d.ts +0 -12
- package/dist/component.d.ts +0 -22
- package/dist/cycle/dom/BodyDOMSource.d.ts +0 -10
- package/dist/cycle/dom/DOMSource.d.ts +0 -11
- package/dist/cycle/dom/DocumentDOMSource.d.ts +0 -12
- package/dist/cycle/dom/ElementFinder.d.ts +0 -8
- package/dist/cycle/dom/EventDelegator.d.ts +0 -34
- package/dist/cycle/dom/IsolateModule.d.ts +0 -23
- package/dist/cycle/dom/MainDOMSource.d.ts +0 -32
- package/dist/cycle/dom/PriorityQueue.d.ts +0 -7
- package/dist/cycle/dom/ScopeChecker.d.ts +0 -9
- package/dist/cycle/dom/SymbolTree.d.ts +0 -9
- package/dist/cycle/dom/VNodeWrapper.d.ts +0 -8
- package/dist/cycle/dom/enrichEventStream.d.ts +0 -24
- package/dist/cycle/dom/fromEvent.d.ts +0 -6
- package/dist/cycle/dom/index.d.ts +0 -8
- package/dist/cycle/dom/isolate.d.ts +0 -9
- package/dist/cycle/dom/makeDOMDriver.d.ts +0 -11
- package/dist/cycle/dom/mockDOMSource.d.ts +0 -17
- package/dist/cycle/dom/modules.d.ts +0 -5
- package/dist/cycle/dom/snabbdom.d.ts +0 -22
- package/dist/cycle/dom/styleModule.d.ts +0 -13
- package/dist/cycle/dom/thunk.d.ts +0 -11
- package/dist/cycle/dom/utils.d.ts +0 -8
- package/dist/cycle/isolate/index.d.ts +0 -42
- package/dist/cycle/run/adapt.d.ts +0 -6
- package/dist/cycle/run/index.d.ts +0 -36
- package/dist/cycle/run/internals.d.ts +0 -8
- package/dist/cycle/run/types.d.ts +0 -49
- package/dist/cycle/state/Collection.d.ts +0 -29
- package/dist/cycle/state/StateSource.d.ts +0 -20
- package/dist/cycle/state/index.d.ts +0 -5
- package/dist/cycle/state/pickCombine.d.ts +0 -3
- package/dist/cycle/state/pickMerge.d.ts +0 -3
- package/dist/cycle/state/types.d.ts +0 -18
- package/dist/cycle/state/withState.d.ts +0 -17
- package/dist/extra/classes.d.ts +0 -7
- package/dist/extra/devtools.d.ts +0 -78
- package/dist/extra/dragDriver.d.ts +0 -20
- package/dist/extra/driverFactories.d.ts +0 -12
- package/dist/extra/eventDriver.d.ts +0 -9
- package/dist/extra/exactState.d.ts +0 -1
- package/dist/extra/hmr.d.ts +0 -17
- package/dist/extra/logDriver.d.ts +0 -2
- package/dist/extra/processDrag.d.ts +0 -19
- package/dist/extra/processForm.d.ts +0 -15
- package/dist/extra/run.d.ts +0 -13
- package/dist/extra/xstreamCompat.d.ts +0 -5
- package/dist/jsx-dev-runtime.d.ts +0 -1
- package/dist/jsx-dev-runtime.js +0 -224
- package/dist/jsx-runtime.d.ts +0 -4
- package/dist/jsx-runtime.js +0 -224
- package/dist/jsx.d.ts +0 -2
- package/dist/pragma/fn.d.ts +0 -7
- package/dist/pragma/index.d.ts +0 -7
- package/dist/pragma/is.d.ts +0 -10
- package/dist/switchable.d.ts +0 -7
- package/dist/vike/+config.cjs.js +0 -65
- package/src/component.ts +0 -2256
- package/src/cycle/isolate/index.ts +0 -196
- package/src/cycle/run/index.ts +0 -151
- package/src/cycle/run/internals.ts +0 -143
- package/src/cycle/state/Collection.ts +0 -174
- package/src/cycle/state/index.ts +0 -5
- package/src/cycle/state/pickCombine.ts +0 -167
- package/src/cycle/state/pickMerge.ts +0 -122
- package/src/cycle/state/withState.ts +0 -47
- package/src/pragma/fn.ts +0 -55
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sygnal diagnostics core.
|
|
3
|
+
*
|
|
4
|
+
* ===========================================================================
|
|
5
|
+
* FROZEN INTERFACE (PLAN-1 workstream 0B). Changes after the 0B merge go
|
|
6
|
+
* through the coordinator. Later workstreams add checks (registerCheck) and
|
|
7
|
+
* codes (./codes.ts, inside their reserved range) — they do not change these
|
|
8
|
+
* signatures.
|
|
9
|
+
* ===========================================================================
|
|
10
|
+
*
|
|
11
|
+
* --- Reporting ------------------------------------------------------------
|
|
12
|
+
*
|
|
13
|
+
* report(code: string, details: {
|
|
14
|
+
* component?: string | { name?: string } // component name or instance
|
|
15
|
+
* message: string // what is wrong
|
|
16
|
+
* fix?: string // how to fix it
|
|
17
|
+
* data?: any // structured payload
|
|
18
|
+
* severity?: 'error' | 'warn' | 'info' // override the code's default
|
|
19
|
+
* }): Diagnostic | undefined
|
|
20
|
+
*
|
|
21
|
+
* - mode 'off' → no-op, returns undefined (nothing collected/printed)
|
|
22
|
+
* - code in ignore list → no-op, returns undefined
|
|
23
|
+
* - mode 'collect' → collected, no console output
|
|
24
|
+
* - mode 'warn' → collected; 'warn' → console.warn, 'error' → console.error,
|
|
25
|
+
* 'info' → collected only
|
|
26
|
+
* - mode 'error' → collected; 'warn'/'error' severities throw a
|
|
27
|
+
* DiagnosticError (err.diagnostic holds the Diagnostic);
|
|
28
|
+
* 'info' collected only. Called directly this throws
|
|
29
|
+
* synchronously; raised during a hook (i.e. from a
|
|
30
|
+
* check) it is rethrown asynchronously — see Hooks.
|
|
31
|
+
*
|
|
32
|
+
* `diagnostic.text` is formatted lazily (getter) on first read.
|
|
33
|
+
*
|
|
34
|
+
* formatDiagnostic(code, details): string
|
|
35
|
+
* → `[Sygnal SYG123] <Component>: <message>. <fix> <docsUrl>`
|
|
36
|
+
* (works in every mode; for call sites that must keep printing in 'off')
|
|
37
|
+
*
|
|
38
|
+
* getDiagnostics(): Diagnostic[] // copy of the collected list
|
|
39
|
+
* clearDiagnostics(): void
|
|
40
|
+
* onDiagnostic(cb: (d: Diagnostic) => void): () => void // returns unsubscribe
|
|
41
|
+
*
|
|
42
|
+
* --- Configuration --------------------------------------------------------
|
|
43
|
+
*
|
|
44
|
+
* configureDiagnostics({ mode?: DiagnosticsMode | undefined, ignore?: string[] }): void
|
|
45
|
+
* getDiagnosticsMode(): 'off' | 'collect' | 'warn' | 'error'
|
|
46
|
+
* isDiagnosticsEnabled(): boolean
|
|
47
|
+
*
|
|
48
|
+
* Mode resolution — first defined wins:
|
|
49
|
+
* 1. explicit mode: run(App, drivers, { diagnostics }) or configureDiagnostics({ mode })
|
|
50
|
+
* 2. globalThis.__SYGNAL_DEV__ (=== true → 'warn'; injected by the Vite plugin in serve)
|
|
51
|
+
* 3. 'off'
|
|
52
|
+
* The mode is resolved at module load, on every run() call and on every
|
|
53
|
+
* configureDiagnostics() call. `configureDiagnostics({ mode: undefined })`
|
|
54
|
+
* clears the explicit mode and falls back to steps 2-3.
|
|
55
|
+
* A run() call with the `diagnostics` option sets both the explicit mode and
|
|
56
|
+
* the ignore list from it. run() WITHOUT the option resets them to the
|
|
57
|
+
* defaults (no explicit mode, empty ignore list), so a setting from an earlier
|
|
58
|
+
* run()/configureDiagnostics() does not leak in, unless another app is still
|
|
59
|
+
* running (G-212: a second app or a custom element keeps the host's mode).
|
|
60
|
+
*
|
|
61
|
+
* --- Checks ---------------------------------------------------------------
|
|
62
|
+
*
|
|
63
|
+
* registerCheck(check: DiagnosticCheck): () => void // returns unregister
|
|
64
|
+
*
|
|
65
|
+
* interface DiagnosticCheck {
|
|
66
|
+
* id: string
|
|
67
|
+
* onIntent?(component, actionNames: string[], selectorsUsed: string[] | undefined): void
|
|
68
|
+
* onModel?(component, modelMap: Record<string, string[]>): void
|
|
69
|
+
* onRender?(component, rootVnode: any): void
|
|
70
|
+
* onReducer?(component, action: string, prevState: any, nextState: any, sinkName: string): void
|
|
71
|
+
* onDispose?(component): void
|
|
72
|
+
* }
|
|
73
|
+
*
|
|
74
|
+
* A check that throws (other than a DiagnosticError from 'error' mode) is
|
|
75
|
+
* isolated: the exception is reported as SYG900 and other checks still run.
|
|
76
|
+
*
|
|
77
|
+
* --- Hooks (dispatched by checks/next.ts from the core's hook layer) ----
|
|
78
|
+
*
|
|
79
|
+
* onIntent(component, actionNames, selectorsUsed?)
|
|
80
|
+
* after intent is built. actionNames = keys of the intent object ([] for a
|
|
81
|
+
* single-stream intent). selectorsUsed is currently always undefined —
|
|
82
|
+
* TODO(1A): collect via MainDOMSource.select instrumentation in src/cycle/dom.
|
|
83
|
+
* onModel(component, modelMap)
|
|
84
|
+
* after the model is normalized; modelMap = action → sink names, shorthand
|
|
85
|
+
* ('A | SINK') expanded, plain functions mapped to the state sink,
|
|
86
|
+
* includes built-ins such as INITIALIZE.
|
|
87
|
+
* onRender(component, rootVnode)
|
|
88
|
+
* after each render of the component (fully injected vnode, before the DOM
|
|
89
|
+
* driver patches it; `rootVnode.elm` is populated after the patch, so DOM
|
|
90
|
+
* checks should defer, e.g. with a microtask/timeout).
|
|
91
|
+
* onReducer(component, action, prevState, nextState, sinkName)
|
|
92
|
+
* after each STATE reducer returns (not for ABORT, not when the reducer
|
|
93
|
+
* throws). nextState is the raw reducer return value (before calculated
|
|
94
|
+
* field cleanup). Currently only fired for the state sink; sinkName is the
|
|
95
|
+
* component's state source name.
|
|
96
|
+
* onDispose(component)
|
|
97
|
+
* at the start of component disposal.
|
|
98
|
+
*
|
|
99
|
+
* onSelector(domSource, selector) (additive, 1A)
|
|
100
|
+
* from MainDOMSource.select() in src/cycle/dom, for every CSS selector
|
|
101
|
+
* (not 'document' / 'body' / ':root'). domSource is the source select()
|
|
102
|
+
* was called on (its `.namespace` holds the isolation scopes and any
|
|
103
|
+
* earlier selectors; `._isolateModule` the DOM driver's isolate module).
|
|
104
|
+
* onBusEmit(type, emitterName?) (additive, 1A)
|
|
105
|
+
* from the EVENTS driver (src/extra/eventDriver.ts) for every bus event.
|
|
106
|
+
* onBusSelect(type) (additive, 1A)
|
|
107
|
+
* from EVENTS.select(type); type is the raw argument (string, string[]
|
|
108
|
+
* or undefined for "all events").
|
|
109
|
+
*
|
|
110
|
+
* Checks live in the separate 'sygnal/diagnostics' entry
|
|
111
|
+
* (src/extra/diagnostics/checks). That bundle reaches THIS module instance
|
|
112
|
+
* through globalThis.__SYGNAL_DIAGNOSTICS__ = { registerCheck, report }
|
|
113
|
+
* (set below), so it never carries a second copy of the core state.
|
|
114
|
+
*
|
|
115
|
+
* onIntent and onModel are each called exactly once per component instance,
|
|
116
|
+
* in that order, during construction (also when the component has no
|
|
117
|
+
* intent → actionNames [], or no model → modelMap {}).
|
|
118
|
+
*
|
|
119
|
+
* `component` is the internal Component instance (stable identity per
|
|
120
|
+
* instance; `.name` is the component name).
|
|
121
|
+
*
|
|
122
|
+
* In mode 'off' a hook only runs the checks registered with `always: true`
|
|
123
|
+
* (internal: renderComponent's own bookkeeping, R2-3); none are registered
|
|
124
|
+
* in an app, so the hooks do nothing.
|
|
125
|
+
*
|
|
126
|
+
* Hooks NEVER throw synchronously into Sygnal's stream pipeline (a throw
|
|
127
|
+
* there would kill the state/view stream for good). Every exception from a
|
|
128
|
+
* check is caught. In 'error' mode a DiagnosticError raised during a hook —
|
|
129
|
+
* by a check's report() call, or by the SYG900 report for a check that
|
|
130
|
+
* threw a plain Error — is rethrown ASYNCHRONOUSLY (queueMicrotask, falling
|
|
131
|
+
* back to setTimeout), so test runners still see an uncaught error while
|
|
132
|
+
* the app's streams keep running. The remaining checks still run.
|
|
133
|
+
* `_setAsyncThrow(fn?)` replaces the async rethrow (test seam; no argument
|
|
134
|
+
* restores the default; `_resetDiagnostics()` also restores it).
|
|
135
|
+
*
|
|
136
|
+
* (This comment is attached to the type-only import below so the TypeScript
|
|
137
|
+
* emit drops it — keeps it out of the published bundle and the size gate.)
|
|
138
|
+
*/
|
|
139
|
+
import type { DiagnosticSeverity } from './codes'
|
|
140
|
+
import { CODE_SEVERITY, docsUrlFor } from './codes'
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
export type DiagnosticsMode = 'off' | 'collect' | 'warn' | 'error'
|
|
144
|
+
|
|
145
|
+
export interface DiagnosticDetails {
|
|
146
|
+
component?: string | { name?: string }
|
|
147
|
+
message: string
|
|
148
|
+
fix?: string
|
|
149
|
+
data?: any
|
|
150
|
+
severity?: DiagnosticSeverity
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface Diagnostic {
|
|
154
|
+
code: string
|
|
155
|
+
severity: DiagnosticSeverity
|
|
156
|
+
component?: string
|
|
157
|
+
message: string
|
|
158
|
+
fix?: string
|
|
159
|
+
data?: any
|
|
160
|
+
docsUrl: string
|
|
161
|
+
text: string
|
|
162
|
+
timestamp: number
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface DiagnosticsOptions {
|
|
166
|
+
mode?: DiagnosticsMode
|
|
167
|
+
ignore?: string[]
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export interface DiagnosticCheck {
|
|
171
|
+
id: string
|
|
172
|
+
/** internal: also runs when diagnostics are 'off' (renderComponent's harness hooks) */
|
|
173
|
+
always?: boolean
|
|
174
|
+
onIntent?: (component: any, actionNames: string[], selectorsUsed: string[] | undefined) => void
|
|
175
|
+
onModel?: (component: any, modelMap: Record<string, string[]>) => void
|
|
176
|
+
onRender?: (component: any, rootVnode: any) => void
|
|
177
|
+
onReducer?: (component: any, action: string, prevState: any, nextState: any, sinkName: string) => void
|
|
178
|
+
onDispose?: (component: any) => void
|
|
179
|
+
onSelector?: (domSource: any, selector: string) => void
|
|
180
|
+
onBusEmit?: (type: string, emitterName?: string) => void
|
|
181
|
+
onBusSelect?: (type: string | string[] | undefined) => void
|
|
182
|
+
/**
|
|
183
|
+
* (additive, PLAN-2 E2) Called before a component's intent runs. May return a replacement
|
|
184
|
+
* for `sources` (e.g. a Proxy that reports or fakes a source with no driver); the intent
|
|
185
|
+
* gets the last one returned. See sourcesFor().
|
|
186
|
+
*/
|
|
187
|
+
sources?: (component: any, sources: any) => any
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export class DiagnosticError extends Error {
|
|
191
|
+
diagnostic: Diagnostic
|
|
192
|
+
constructor(diagnostic: Diagnostic) {
|
|
193
|
+
super(diagnostic.text)
|
|
194
|
+
this.diagnostic = diagnostic
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
let explicitMode: DiagnosticsMode | undefined
|
|
199
|
+
let mode: DiagnosticsMode = 'off'
|
|
200
|
+
let enabled = false
|
|
201
|
+
let ignored = new Set<string>()
|
|
202
|
+
let collected: Diagnostic[] = []
|
|
203
|
+
let listeners: Array<(d: Diagnostic) => void> = []
|
|
204
|
+
let checks: DiagnosticCheck[] = []
|
|
205
|
+
|
|
206
|
+
export function resolveDiagnosticsMode(): DiagnosticsMode {
|
|
207
|
+
mode = explicitMode || ((globalThis as any).__SYGNAL_DEV__ === true ? 'warn' : 'off')
|
|
208
|
+
enabled = mode !== 'off'
|
|
209
|
+
return mode
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function configureDiagnostics(options: DiagnosticsOptions = {}): void {
|
|
213
|
+
if ('mode' in options) explicitMode = options.mode
|
|
214
|
+
if (options.ignore) ignored = new Set(options.ignore)
|
|
215
|
+
resolveDiagnosticsMode()
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** Internal: the explicit configuration (not the resolved mode), so it can be restored exactly. */
|
|
219
|
+
export function _getDiagnosticsConfig(): { mode: DiagnosticsMode | undefined, ignore: string[] } {
|
|
220
|
+
return { mode: explicitMode, ignore: [...ignored] }
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function getDiagnosticsMode(): DiagnosticsMode {
|
|
224
|
+
return mode
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export function isDiagnosticsEnabled(): boolean {
|
|
228
|
+
return enabled
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const nameOf = (c: DiagnosticDetails['component']) => (c && typeof c === 'object' ? c.name : c) || undefined
|
|
232
|
+
const sentence = (s: string) => /[.!?]$/.test(s) ? s : s + '.'
|
|
233
|
+
|
|
234
|
+
export function formatDiagnostic(code: string, details: DiagnosticDetails): string {
|
|
235
|
+
const name = nameOf(details.component)
|
|
236
|
+
return `[Sygnal ${code}] ${name ? name + ': ' : ''}${sentence(details.message)}` +
|
|
237
|
+
(details.fix ? ' ' + sentence(details.fix) : '') + ' ' + docsUrlFor(code)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function report(code: string, details: DiagnosticDetails): Diagnostic | undefined {
|
|
241
|
+
if (!enabled || ignored.has(code)) return
|
|
242
|
+
const severity = details.severity || CODE_SEVERITY[code] || 'warn'
|
|
243
|
+
const d: Diagnostic = {
|
|
244
|
+
code,
|
|
245
|
+
severity,
|
|
246
|
+
component: nameOf(details.component),
|
|
247
|
+
message: details.message,
|
|
248
|
+
fix: details.fix,
|
|
249
|
+
data: details.data,
|
|
250
|
+
docsUrl: docsUrlFor(code),
|
|
251
|
+
get text() { return formatDiagnostic(code, this) },
|
|
252
|
+
timestamp: Date.now(),
|
|
253
|
+
}
|
|
254
|
+
if (collected.push(d) > 500) collected.shift()
|
|
255
|
+
listeners.forEach(cb => { try { cb(d) } catch (_) {} })
|
|
256
|
+
if (severity !== 'info') {
|
|
257
|
+
if (mode === 'error') throw new DiagnosticError(d)
|
|
258
|
+
if (mode === 'warn') console[severity](d.text)
|
|
259
|
+
}
|
|
260
|
+
return d
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function getDiagnostics(): Diagnostic[] {
|
|
264
|
+
return collected.slice()
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export function clearDiagnostics(): void {
|
|
268
|
+
collected = []
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function onDiagnostic(cb: (d: Diagnostic) => void): () => void {
|
|
272
|
+
listeners = [...listeners, cb]
|
|
273
|
+
return () => { listeners = listeners.filter(l => l !== cb) }
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function registerCheck(check: DiagnosticCheck): () => void {
|
|
277
|
+
checks = [...checks, check]
|
|
278
|
+
return () => { checks = checks.filter(c => c !== check) }
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
type HookName = Exclude<keyof DiagnosticCheck, 'id'>
|
|
282
|
+
|
|
283
|
+
const defaultAsyncThrow = (err: any): void => {
|
|
284
|
+
const raise = () => { throw err }
|
|
285
|
+
typeof queueMicrotask === 'function' ? queueMicrotask(raise) : setTimeout(raise)
|
|
286
|
+
}
|
|
287
|
+
let asyncThrow = defaultAsyncThrow
|
|
288
|
+
|
|
289
|
+
/** Test seam: replace the async rethrow used for 'error'-mode diagnostics raised in hooks. */
|
|
290
|
+
export function _setAsyncThrow(fn?: (err: any) => void): void {
|
|
291
|
+
asyncThrow = fn || defaultAsyncThrow
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const hook = (name: HookName) => (component: any, ...args: any[]): void => {
|
|
295
|
+
for (const check of checks) {
|
|
296
|
+
if (!enabled && !check.always) continue
|
|
297
|
+
try {
|
|
298
|
+
(check[name] as any)?.(component, ...args)
|
|
299
|
+
} catch (err: any) {
|
|
300
|
+
// Never throw into the stream pipeline: 'error'-mode diagnostics (also a
|
|
301
|
+
// SYG900 escalated by 'error' mode) are rethrown asynchronously.
|
|
302
|
+
try {
|
|
303
|
+
if (err instanceof DiagnosticError) throw err
|
|
304
|
+
report('SYG900', {
|
|
305
|
+
component,
|
|
306
|
+
message: `Diagnostics check '${check.id}' threw in ${name}: ${err?.message}`,
|
|
307
|
+
data: { check: check.id, hook: name, error: err },
|
|
308
|
+
})
|
|
309
|
+
} catch (e) {
|
|
310
|
+
asyncThrow(e)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export const onIntent: (component: any, actionNames: string[], selectorsUsed?: string[]) => void = hook('onIntent')
|
|
317
|
+
export const onModel: (component: any, modelMap: Record<string, string[]>) => void = hook('onModel')
|
|
318
|
+
export const onRender: (component: any, rootVnode: any) => void = hook('onRender')
|
|
319
|
+
export const onReducer: (component: any, action: string, prevState: any, nextState: any, sinkName: string) => void = hook('onReducer')
|
|
320
|
+
export const onDispose: (component: any) => void = hook('onDispose')
|
|
321
|
+
export const onSelector: (domSource: any, selector: string) => void = hook('onSelector')
|
|
322
|
+
export const onBusEmit: (type: string, emitterName?: string) => void = hook('onBusEmit')
|
|
323
|
+
export const onBusSelect: (type: string | string[] | undefined) => void = hook('onBusSelect')
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* (PLAN-2 E2) The sources object a component's intent is called with: `component.sources`,
|
|
327
|
+
* wrapped by every active check with a `sources` hook (the dev entry's SYG609 check,
|
|
328
|
+
* renderComponent's fake sources). Without such a check it is `component.sources` itself.
|
|
329
|
+
*/
|
|
330
|
+
export function sourcesFor(component: any): any {
|
|
331
|
+
let s = component.sources
|
|
332
|
+
for (const check of checks) {
|
|
333
|
+
if (!check.sources || (!enabled && !check.always)) continue
|
|
334
|
+
try { s = check.sources(component, s) || s } catch (_) {}
|
|
335
|
+
}
|
|
336
|
+
return s
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Bridge for the separately bundled 'sygnal/diagnostics' checks entry.
|
|
340
|
+
// PLAN-4.6 R4: the hook dispatchers too, for the dev entry's core adapter (checks/next.ts)
|
|
341
|
+
;(globalThis as any).__SYGNAL_DIAGNOSTICS__ = { registerCheck, report, hooks: { onIntent, onModel, onRender, onReducer, onDispose, sourcesFor, on: isDiagnosticsEnabled } }
|
|
342
|
+
|
|
343
|
+
export function _resetDiagnostics(): void {
|
|
344
|
+
explicitMode = undefined
|
|
345
|
+
ignored = new Set()
|
|
346
|
+
collected = []
|
|
347
|
+
listeners = []
|
|
348
|
+
checks = []
|
|
349
|
+
asyncThrow = defaultAsyncThrow
|
|
350
|
+
resolveDiagnosticsMode()
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
resolveDiagnosticsMode()
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coded console output for Sygnal's pre-existing warnings and errors
|
|
3
|
+
* (PLAN-1 workstream 1E).
|
|
4
|
+
*
|
|
5
|
+
* warn(code, component, message, fix?, extra?)
|
|
6
|
+
* error(code, component, message, fix?, extra?)
|
|
7
|
+
* fail(code, component, message, fix?): never
|
|
8
|
+
*
|
|
9
|
+
* `component` is a component instance (anything with `.name`), a name string,
|
|
10
|
+
* or undefined. `extra` (an Error, the offending value, ...) is passed to the
|
|
11
|
+
* console after the formatted text, as the old messages did.
|
|
12
|
+
*
|
|
13
|
+
* Unlike report(), warn()/error() keep printing when diagnostics are 'off',
|
|
14
|
+
* so production apps see the same messages as before (now with a code):
|
|
15
|
+
* - 'off' → console.warn/error(formatDiagnostic(...), extra?)
|
|
16
|
+
* - 'collect' → report(): collected; error severity is also printed with
|
|
17
|
+
* console.error (so exceptions stay visible in tests), warn isn't
|
|
18
|
+
* - 'warn' → report(): collected and printed once by report(); `extra`
|
|
19
|
+
* (e.g. the caught Error with its stack) printed after it
|
|
20
|
+
* - 'error' → report() throws a DiagnosticError; it is rethrown
|
|
21
|
+
* asynchronously so the stream pipeline that hit the problem
|
|
22
|
+
* keeps running (same contract as the hooks in ./index)
|
|
23
|
+
* - code in the ignore list → nothing printed
|
|
24
|
+
*
|
|
25
|
+
* fail() always throws an Error whose message is the formatted text and whose
|
|
26
|
+
* `.code` is the diagnostic code. It does not go through report(): the throw
|
|
27
|
+
* itself is the signal, in every mode.
|
|
28
|
+
*
|
|
29
|
+
* A call site that catches an exception and keeps running reports it with the
|
|
30
|
+
* core's caught() (src/core/runtime.ts: an error thrown by fail() under ITS code,
|
|
31
|
+
* G-027 / G-044), then the app's onError hook (callHook, PLAN-4 GS-11).
|
|
32
|
+
*
|
|
33
|
+
* `error` is also published on the core bridge
|
|
34
|
+
* (globalThis.__SYGNAL_DIAGNOSTICS__.error) for the separately bundled JSX
|
|
35
|
+
* runtime (SYG420).
|
|
36
|
+
*
|
|
37
|
+
* (This comment is attached to the type-only import below so the TypeScript
|
|
38
|
+
* emit drops it.)
|
|
39
|
+
*/
|
|
40
|
+
import type { DiagnosticSeverity } from './codes'
|
|
41
|
+
import { report, formatDiagnostic, getDiagnosticsMode } from './index'
|
|
42
|
+
|
|
43
|
+
const emit = (severity: Extract<DiagnosticSeverity, 'warn' | 'error'>) =>
|
|
44
|
+
(code: string, component: any, message: string, fix?: string, ...extra: any[]): void => {
|
|
45
|
+
const details = { component, message, fix, severity, data: extra[0] }
|
|
46
|
+
const mode = getDiagnosticsMode()
|
|
47
|
+
if (mode === 'off') {
|
|
48
|
+
console[severity](formatDiagnostic(code, details), ...extra)
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const d = report(code, details)
|
|
53
|
+
if (d && mode === 'collect' && severity === 'error') console.error(d.text, ...extra)
|
|
54
|
+
else if (d && mode === 'warn' && extra.length) console[severity](...extra)
|
|
55
|
+
} catch (err) {
|
|
56
|
+
setTimeout(() => { throw err })
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const warn = emit('warn')
|
|
61
|
+
export const error = emit('error')
|
|
62
|
+
|
|
63
|
+
export function fail(code: string, component: any, message: string, fix?: string): never {
|
|
64
|
+
const err: any = new Error(formatDiagnostic(code, { component, message, fix }))
|
|
65
|
+
err.code = code
|
|
66
|
+
err.sygnal = [component, message, fix]
|
|
67
|
+
throw err
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// PLAN-4 GS-11: the app's error hook (run(App, drivers, { onError })), reporting only (each app
|
|
71
|
+
// has its own). A throwing hook is logged once and swallowed
|
|
72
|
+
export const callHook = (hook: any, err: any, info: any): void => {
|
|
73
|
+
try { hook && hook(err, info) } catch (e) { console.error(e) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
;(globalThis as any).__SYGNAL_DIAGNOSTICS__.error = error
|