Implements Phases 1-8 of the TFTSR implementation plan. Rust backend (Tauri 2.x, src-tauri/): - Multi-provider AI: OpenAI-compatible, Anthropic, Gemini, Mistral, Ollama - PII detection engine: 11 regex patterns with overlap resolution - SQLCipher AES-256 encrypted database with 10 versioned migrations - 28 Tauri IPC commands for triage, analysis, document, and system ops - Ollama: hardware probe, model recommendations, pull/delete with events - RCA and blameless post-mortem Markdown document generators - PDF export via printpdf - Audit log: SHA-256 hash of every external data send - Integration stubs for Confluence, ServiceNow, Azure DevOps (v0.2) Frontend (React 18 + TypeScript + Vite, src/): - 9 pages: full triage workflow NewIssue→LogUpload→Triage→Resolution→RCA→Postmortem→History+Settings - 7 components: ChatWindow, TriageProgress, PiiDiffViewer, DocEditor, HardwareReport, ModelSelector, UI primitives - 3 Zustand stores: session, settings (persisted), history - Type-safe tauriCommands.ts matching Rust backend types exactly - 8 IT domain system prompts (Linux, Windows, Network, K8s, DB, Virt, HW, Obs) DevOps: - .woodpecker/test.yml: rustfmt, clippy, cargo test, tsc, vitest on every push - .woodpecker/release.yml: linux/amd64 + linux/arm64 builds, Gogs release upload Verified: - cargo check: zero errors - tsc --noEmit: zero errors - vitest run: 13/13 unit tests passing Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
199 lines
4.9 KiB
Markdown
199 lines
4.9 KiB
Markdown
# serialize-error
|
|
|
|
> Serialize/deserialize an error into a plain object
|
|
|
|
Useful if you for example need to `JSON.stringify()` or `process.send()` the error.
|
|
|
|
## Install
|
|
|
|
```sh
|
|
npm install serialize-error
|
|
```
|
|
|
|
## Usage
|
|
|
|
```js
|
|
import {serializeError, deserializeError} from 'serialize-error';
|
|
|
|
const error = new Error('🦄');
|
|
|
|
console.log(error);
|
|
//=> [Error: 🦄]
|
|
|
|
const serialized = serializeError(error);
|
|
|
|
console.log(serialized);
|
|
//=> {name: 'Error', message: '🦄', stack: 'Error: 🦄\n at Object.<anonymous> …'}
|
|
|
|
const deserialized = deserializeError(serialized);
|
|
|
|
console.log(deserialized);
|
|
//=> [Error: 🦄]
|
|
```
|
|
|
|
### Error constructors
|
|
|
|
When a serialized error with a known `name` is encountered, it will be deserialized using the corresponding error constructor, while unknown error names will be deserialized as regular errors:
|
|
|
|
```js
|
|
import {deserializeError} from 'serialize-error';
|
|
|
|
const known = deserializeError({
|
|
name: 'TypeError',
|
|
message: '🦄'
|
|
});
|
|
|
|
console.log(known);
|
|
//=> [TypeError: 🦄] <-- Still a TypeError
|
|
|
|
const unknown = deserializeError({
|
|
name: 'TooManyCooksError',
|
|
message: '🦄'
|
|
});
|
|
|
|
console.log(unknown);
|
|
//=> [Error: 🦄] <-- Just a regular Error
|
|
```
|
|
|
|
The [list of known errors](./error-constructors.js) can be extended globally. This also works if `serialize-error` is a sub-dependency that's not used directly.
|
|
|
|
```js
|
|
import {addKnownErrorConstructor} from 'serialize-error';
|
|
import {MyCustomError} from './errors.js'
|
|
|
|
addKnownErrorConstructor(MyCustomError);
|
|
```
|
|
|
|
**Warning:** The constructor must work without any arguments or this function will throw.
|
|
|
|
## API
|
|
|
|
### serializeError(value, options?)
|
|
|
|
Serialize an `Error` object into a plain object.
|
|
|
|
- Non-error values are passed through.
|
|
- Custom properties are preserved.
|
|
- Non-enumerable properties are kept non-enumerable (name, message, stack).
|
|
- Enumerable properties are kept enumerable (all properties besides the non-enumerable ones).
|
|
- Buffer properties are replaced with `[object Buffer]`.
|
|
- Circular references are handled.
|
|
- If the input object has a `.toJSON()` method, then it's called instead of serializing the object's properties.
|
|
- It's up to `.toJSON()` implementation to handle circular references and enumerability of the properties.
|
|
|
|
### value
|
|
|
|
Type: `Error | unknown`
|
|
|
|
### toJSON implementation examples
|
|
|
|
```js
|
|
import {serializeError} from 'serialize-error';
|
|
|
|
class ErrorWithDate extends Error {
|
|
constructor() {
|
|
super();
|
|
this.date = new Date();
|
|
}
|
|
}
|
|
|
|
const error = new ErrorWithDate();
|
|
|
|
serializeError(error);
|
|
// => {date: '1970-01-01T00:00:00.000Z', name, message, stack}
|
|
```
|
|
|
|
```js
|
|
import {serializeError} from 'serialize-error';
|
|
|
|
const error = new Error('Unicorn');
|
|
|
|
error.horn = {
|
|
toJSON() {
|
|
return 'x';
|
|
}
|
|
};
|
|
|
|
serializeError(error);
|
|
// => {horn: 'x', name, message, stack}
|
|
```
|
|
|
|
### deserializeError(value, options?)
|
|
|
|
Deserialize a plain object or any value into an `Error` object.
|
|
|
|
- `Error` objects are passed through.
|
|
- Objects that have at least a `message` property are interpreted as errors.
|
|
- All other values are wrapped in a `NonError` error.
|
|
- Custom properties are preserved.
|
|
- Non-enumerable properties are kept non-enumerable (name, message, stack, cause).
|
|
- Enumerable properties are kept enumerable (all properties besides the non-enumerable ones).
|
|
- Circular references are handled.
|
|
- [Native error constructors](./error-constructors.js) are preserved (TypeError, DOMException, etc) and [more can be added.](#error-constructors)
|
|
|
|
### value
|
|
|
|
Type: `{message: string} | unknown`
|
|
|
|
### options
|
|
|
|
Type: `object`
|
|
|
|
#### maxDepth
|
|
|
|
Type: `number`\
|
|
Default: `Number.POSITIVE_INFINITY`
|
|
|
|
The maximum depth of properties to preserve when serializing/deserializing.
|
|
|
|
```js
|
|
import {serializeError} from 'serialize-error';
|
|
|
|
const error = new Error('🦄');
|
|
error.one = {two: {three: {}}};
|
|
|
|
console.log(serializeError(error, {maxDepth: 1}));
|
|
//=> {name: 'Error', message: '🦄', one: {}}
|
|
|
|
console.log(serializeError(error, {maxDepth: 2}));
|
|
//=> {name: 'Error', message: '🦄', one: { two: {}}}
|
|
```
|
|
|
|
#### useToJSON
|
|
|
|
Type: `boolean`\
|
|
Default: `true`
|
|
|
|
Indicate whether to use a `.toJSON()` method if encountered in the object. This is useful when a custom error implements [its own serialization logic via `.toJSON()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#tojson_behavior) but you prefer to not use it.
|
|
|
|
### isErrorLike(value)
|
|
|
|
Predicate to determine whether a value looks like an error, even if it's not an instance of `Error`. It must have at least the `name`, `message`, and `stack` properties.
|
|
|
|
```js
|
|
import {isErrorLike} from 'serialize-error';
|
|
|
|
const error = new Error('🦄');
|
|
error.one = {two: {three: {}}};
|
|
|
|
isErrorLike({
|
|
name: 'DOMException',
|
|
message: 'It happened',
|
|
stack: 'at foo (index.js:2:9)',
|
|
});
|
|
//=> true
|
|
|
|
isErrorLike(new Error('🦄'));
|
|
//=> true
|
|
|
|
isErrorLike(serializeError(new Error('🦄'));
|
|
//=> true
|
|
|
|
isErrorLike({
|
|
name: 'Bluberricious pancakes',
|
|
stack: 12,
|
|
ingredients: 'Blueberry',
|
|
});
|
|
//=> false
|
|
```
|