Error codes
Every error the SignalX runtime throws carries a unique code, SIGX001 through SIGX999. Production builds print that code with a link back to this reference:
SIGX101 "#app" — see https://sigx.dev/errors/SIGX101/
Follow the link for the code you hit, or find it in the table below.
Dev builds vs production builds
The two builds report the same error differently, and each is tuned for where you read it.
Development gives you the full message plus a suggestion naming the fix:
Mount target "#app" not found.
Production gives you the code, the runtime detail, and this URL. The human-readable messages and suggestions are stripped — they sit behind a compile-time __DEV__ branch that folds away during the build, so those strings never reach your production bundle. That is what keeps the runtime small, and it is why this page exists: in production the link is the message.
Handling errors in code
Every runtime error is a SigxError, so you can branch on code rather than matching message text:
import { SigxError } from 'sigx';
try {
app.mount('#app');
} catch (e) {
if (e instanceof SigxError && e.code === 'SIGX101') {
// the mount target isn't in the document yet
}
}
| Property | Type | Notes |
|---|---|---|
code | string | The SIGX### code — stable across dev and production |
message | string | Full text in dev; code + detail + docs link in production |
suggestion | string | undefined | The fix hint. Dev builds only |
cause | Error | undefined | The underlying error, when there is one |
name | string | Always 'SigxError' |
code is the only field worth branching on. Treat message and suggestion as diagnostics for humans, not as a contract.
Two codes that aren't SigxErrors
Most coded failures are thrown SigxErrors. Two are not, because the packages that raise them sit outside that class:
| Code | Shape |
|---|---|
| SIGX500 | A plain Error — @sigx/reactivity sits below SigxError and takes no dependency on it. No error.code. |
| SIGX700 | Not thrown at all — @sigx/cache logs it with console.error and degrades. Nothing to catch. |
Both still print the same SIGX### — see … line in production, so the code is how you find them; you just can't instanceof-narrow to them.
Every code
Codes are grouped into ranges by subsystem, so the number alone tells you roughly where to look.
App lifecycle · 001–099
| Code | Meaning |
|---|---|
| SIGX001 | No mount function provided and no default set |
Rendering & mounting · 100–199
| Code | Meaning |
|---|---|
| SIGX100 | Render target not found |
| SIGX101 | Mount target not found |
| SIGX102 | Async setup is SSR-only |
| SIGX103 | errorScope() called outside setup |
Dependency injection · 200–299
| Code | Meaning |
|---|---|
| SIGX200 | defineProvide called outside setup |
| SIGX201 | defineProvide called with something that isn't an injectable |
| SIGX202 | A required injectable was never provided |
| SIGX203 | defineFactory setup returned a primitive |
Hooks & async · 300–399
| Code | Meaning |
|---|---|
| SIGX300 | A hook was called outside setup |
Messaging · 400–499
| Code | Meaning |
|---|---|
| SIGX400 | Subscribed to a destroyed topic |
| SIGX401 | Created a topic on a destroyed group |
Reactivity · 500–599
| Code | Meaning |
|---|---|
| SIGX500 | toSignal wrote to a read-only property |
Server rendering · 600–699
| Code | Meaning |
|---|---|
| SIGX600 | hydrate() could not find its container |
| SIGX601 | hydrate() found no root component on the app |
| SIGX602 | renderDocument found no outlet marker in the template |
Cache · 700–799
| Code | Meaning |
|---|---|
| SIGX700 | The @sigx/cache revalidation trigger threw while subscribing |
Related
- Error handling —
errorScopeandapp.onError, the value-first error model - App & plugins — providing injectables before mount
