tftsr-devops_investigation/node_modules/serialize-error/readme.md
Shaun Arman 8839075805 feat: initial implementation of TFTSR IT Triage & RCA application
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>
2026-03-14 22:36:25 -05:00

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
```