Diagnostics
Every error and warning carries a stable code and a link to its page here. The code and the URL are public API; the message text is not, and production builds omit it.
| Code | Cause |
|---|---|
| binding_in_comment | An expression appears inside an HTML comment. |
| binding_in_raw_text | An expression appears inside an element whose content is raw text. |
| binding_in_tag_position | An expression appears where a tag or attribute name is expected. |
| binding_not_single | A boolean attribute, property, or event binding has more than one expression or extra text. |
| button_without_name | A <button> has no content and no aria-label, so it has no accessible name. |
| computed_cycle | A computed value read itself, directly or through other computed values. |
| css_value_not_allowed | A css literal received a value that is not a number or another css result. |
| each_items_function | each() received a function as its items. It reads a signal or an array, so a function would render no rows. |
| each_key_duplicate | Two items in an each() list produced the same key. |
| each_key_undefined | The key function passed to each() returned undefined for an item. |
| effect_cycle | An effect was triggered synchronously while it was already running. |
| effect_loop | Effects kept re-triggering each other for more than 100 rounds in one batch. |
| event_handler_not_function | An @event binding received something other than a function or an object with handleEvent. |
| frame_without_title | An <iframe> has no title attribute, so what it embeds is not announced. |
| hydration_mismatch | The server-rendered markup did not match the view, and the differing part was rendered again on the client. |
| image_without_alt | An <img> in a template has no alt attribute, so assistive technology has nothing to read for it. |
| jsx_not_lowered | A JSX expression reached the runtime, which means the lowering in @zerolith/vite did not run for this file. |
| lazy_module_not_split | A module meant to load as a chunk of its own, a view declared with lazy() from @zerolith/router or a locale of a message index compiled by zerolith-i18n, is also imported statically, so the bundler put it in the importing chunk. |
| mount_component_uncalled | render(), hydrate(), or renderToString() received a component that takes props, passed instead of called, so it would run without them. |
| mount_target_missing | render or hydrate received a selector that matches no element in the document. |
| on_dispose_outside_scope | onDispose() was called with no enclosing effect or scope to attach to. |
| package_version_mismatch | A package released together with zerolith, such as @zerolith/vite, @zerolith/devtools, or the command line, met a zerolith of another version. They share the zerolith/internal entry, which can change with every version, so each requires the zerolith of its own version. |
| ref_not_assignable | A ref binding received something other than a writable signal or a function. |
| script_in_template | A template contains a script element. |
| signal_written_inside_computed | A signal was written while a computed value was being evaluated. |
| template_frozen_read | A .get() read is bound in a template, so the value was read once when the template was created and never updates; the Vite plugin reports it in development, since the runtime cannot tell a frozen read from a deliberate one. |
| template_not_prepared | A template reached the runtime that the build's prepare pass never saw, in a bundle built without the scanner. |
| template_unclosed_tag | A template ends inside a tag, attribute, or comment. |
| unrenderable_value | A value of a type the renderer cannot display was bound as content. |
| unsafe_attribute_binding | An attribute binding targets an attribute that runs script or parses HTML. |
| unsafe_property_binding | A property binding targets a property that parses its value as HTML. |
| unsafe_url_blocked | A URL attribute or property received a value with a scheme that can run script, and the attribute was removed. |
| when_condition_function | when() received a function as its condition. A function is always truthy, so the first branch would always show. |