@wireio/shared 1.0.70 → 1.0.72
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/lib/cjs/errors/NestedError.d.ts +110 -6
- package/lib/cjs/errors/NestedError.d.ts.map +1 -1
- package/lib/cjs/errors/NestedError.js +139 -9
- package/lib/cjs/logging/appenders/aws-firehose/AWSFirehoseAppender.d.ts.map +1 -1
- package/lib/cjs/logging/appenders/aws-firehose/AWSFirehoseAppender.js +1 -1
- package/lib/cjs/logging/appenders/push/PushLogRecordsAppender.d.ts.map +1 -1
- package/lib/cjs/logging/appenders/push/PushLogRecordsAppender.js +1 -2
- package/lib/esm/errors/NestedError.d.ts +110 -6
- package/lib/esm/errors/NestedError.d.ts.map +1 -1
- package/lib/esm/errors/NestedError.js +139 -9
- package/lib/esm/logging/appenders/aws-firehose/AWSFirehoseAppender.d.ts.map +1 -1
- package/lib/esm/logging/appenders/aws-firehose/AWSFirehoseAppender.js +1 -1
- package/lib/esm/logging/appenders/push/PushLogRecordsAppender.d.ts.map +1 -1
- package/lib/esm/logging/appenders/push/PushLogRecordsAppender.js +1 -2
- package/lib/test-cjs/errors/NestedError.test.js +81 -34
- package/lib/test-cjs/errors/NestedError.test.js.map +1 -1
- package/lib/tsconfig.cjs.jest.tsbuildinfo +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -2,51 +2,98 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const NestedError_1 = require("@wireio/shared/errors/NestedError");
|
|
4
4
|
describe("NestedError", () => {
|
|
5
|
-
it("
|
|
6
|
-
const cause = new Error("root
|
|
7
|
-
const error = new NestedError_1.NestedError("wrapper", cause);
|
|
8
|
-
expect(error
|
|
5
|
+
it("keeps the new message and preserves the caught error as cause", () => {
|
|
6
|
+
const cause = new Error("root boom");
|
|
7
|
+
const error = new NestedError_1.NestedError("wrapper failed", { cause });
|
|
8
|
+
expect(error).toBeInstanceOf(Error);
|
|
9
9
|
expect(error.name).toBe("NestedError");
|
|
10
|
+
expect(error.message).toBe("wrapper failed");
|
|
11
|
+
// The real Error object is retained — native `.cause` AND `.causes` — so its
|
|
12
|
+
// stack trace and message survive intact.
|
|
13
|
+
expect(error.cause).toBe(cause);
|
|
10
14
|
expect(error.causes).toEqual([cause]);
|
|
15
|
+
expect(error.causes[0].message).toBe("root boom");
|
|
16
|
+
expect(error.causes[0].stack).toBe(cause.stack);
|
|
11
17
|
});
|
|
12
|
-
it("
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
expect(error).
|
|
18
|
+
it("makes each cause's stack + message visible in .stack (nested-exception style)", () => {
|
|
19
|
+
const inner = new Error("inner detail");
|
|
20
|
+
const error = new NestedError_1.NestedError("outer failed", { cause: inner });
|
|
21
|
+
expect(error.stack).toContain("outer failed");
|
|
22
|
+
expect(error.stack).toContain(NestedError_1.NestedError.CausedByPrefix);
|
|
23
|
+
// The cause's stack begins with `Error: inner detail`, so its message is kept too.
|
|
24
|
+
expect(error.stack).toContain("inner detail");
|
|
25
|
+
expect(error.stack).toContain(inner.stack);
|
|
16
26
|
});
|
|
17
|
-
it("
|
|
27
|
+
it("retains every cause when given an array of causes", () => {
|
|
18
28
|
const first = new Error("first");
|
|
19
29
|
const second = new Error("second");
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
30
|
+
const error = new NestedError_1.NestedError("multi", { cause: [first, second] });
|
|
31
|
+
expect(error.causes).toEqual([first, second]);
|
|
32
|
+
// The first is the native `.cause`; both show in the composed stack.
|
|
33
|
+
expect(error.cause).toBe(first);
|
|
34
|
+
expect(error.stack).toContain("first");
|
|
35
|
+
expect(error.stack).toContain("second");
|
|
36
|
+
});
|
|
37
|
+
it("coerces a non-Error thrown value into a retained Error cause", () => {
|
|
38
|
+
const error = new NestedError_1.NestedError("boom", { cause: "a plain string throw" });
|
|
39
|
+
expect(error.causes).toHaveLength(1);
|
|
40
|
+
expect(error.causes[0]).toBeInstanceOf(Error);
|
|
41
|
+
expect(error.causes[0].message).toBe("a plain string throw");
|
|
42
|
+
expect(error.cause).toBe(error.causes[0]);
|
|
43
|
+
});
|
|
44
|
+
it("captures structured context AND folds a summary into the message", () => {
|
|
45
|
+
const error = new NestedError_1.NestedError("invalid JSON", {
|
|
46
|
+
context: { text: "{bad", schemaName: "ClusterConfig" }
|
|
47
|
+
});
|
|
48
|
+
expect(error.context).toEqual({ text: "{bad", schemaName: "ClusterConfig" });
|
|
49
|
+
expect(error.message).toContain("text={bad");
|
|
50
|
+
expect(error.message).toContain("schemaName=ClusterConfig");
|
|
23
51
|
});
|
|
24
|
-
it("
|
|
25
|
-
const
|
|
52
|
+
it("truncates a long folded context value", () => {
|
|
53
|
+
const long = "x".repeat(NestedError_1.NestedError.ContextPreviewMaxChars + 50);
|
|
54
|
+
const error = new NestedError_1.NestedError("big", { context: { text: long } });
|
|
55
|
+
expect(error.message).toContain(NestedError_1.NestedError.TruncationSuffix);
|
|
56
|
+
// The folded preview is bounded regardless of the source length.
|
|
57
|
+
expect(error.message.length).toBeLessThan(long.length + NestedError_1.NestedError.ContextPreviewMaxChars);
|
|
58
|
+
// The full untruncated value is still on the structured property.
|
|
59
|
+
expect(error.context.text).toBe(long);
|
|
60
|
+
});
|
|
61
|
+
it("renders a bigint context value without throwing (JSON.stringify would)", () => {
|
|
62
|
+
const error = new NestedError_1.NestedError("amount", { context: { amount: 5n } });
|
|
63
|
+
expect(error.message).toContain("amount=5");
|
|
64
|
+
});
|
|
65
|
+
it("has no cause chain and an empty context when none are supplied", () => {
|
|
66
|
+
const error = new NestedError_1.NestedError("standalone");
|
|
26
67
|
expect(error.causes).toEqual([]);
|
|
68
|
+
expect(error.cause).toBeUndefined();
|
|
69
|
+
expect(error.context).toEqual({});
|
|
70
|
+
expect(error.message).toBe("standalone");
|
|
27
71
|
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
72
|
+
it("create returns an instance; throwError throws one", () => {
|
|
73
|
+
const cause = new Error("x");
|
|
74
|
+
expect(NestedError_1.NestedError.create("made", { cause })).toBeInstanceOf(NestedError_1.NestedError);
|
|
75
|
+
expect(() => NestedError_1.NestedError.throwError("thrown", { cause })).toThrow(NestedError_1.NestedError);
|
|
76
|
+
try {
|
|
77
|
+
NestedError_1.NestedError.throwError("thrown", { cause });
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
34
80
|
expect(error.causes).toEqual([cause]);
|
|
35
|
-
}
|
|
81
|
+
}
|
|
36
82
|
});
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
83
|
+
it("toError passes Errors through and wraps non-Errors", () => {
|
|
84
|
+
const real = new Error("real");
|
|
85
|
+
expect(NestedError_1.NestedError.toError(real)).toBe(real);
|
|
86
|
+
expect(NestedError_1.NestedError.toError("str")).toBeInstanceOf(Error);
|
|
87
|
+
expect(NestedError_1.NestedError.toError("str").message).toBe("str");
|
|
88
|
+
});
|
|
89
|
+
it("toErrors flattens and coerces; nullish yields an empty chain", () => {
|
|
90
|
+
const a = new Error("a");
|
|
91
|
+
expect(NestedError_1.NestedError.toErrors([a, "b"]).map(error => error.message)).toEqual([
|
|
92
|
+
"a",
|
|
93
|
+
"b"
|
|
94
|
+
]);
|
|
95
|
+
expect(NestedError_1.NestedError.toErrors(null)).toEqual([]);
|
|
96
|
+
expect(NestedError_1.NestedError.toErrors(a)).toEqual([a]);
|
|
50
97
|
});
|
|
51
98
|
});
|
|
52
99
|
//# sourceMappingURL=NestedError.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NestedError.test.js","sourceRoot":"","sources":["../../../tests/errors/NestedError.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { NestedError } from \"@wireio/shared/errors/NestedError\"\n\ndescribe(\"NestedError\", () => {\n it(\"sets message, name, and causes\", () => {\n const cause = new Error(\"root cause\")\n const error = new NestedError(\"wrapper\", cause)\n\n expect(error.message).toBe(\"wrapper\")\n expect(error.name).toBe(\"NestedError\")\n expect(error.causes).toEqual([cause])\n })\n\n it(\"extends Error\", () => {\n const error = new NestedError(\"wrapper\")\n expect(error).toBeInstanceOf(Error)\n expect(error).toBeInstanceOf(NestedError)\n })\n\n it(\"flattens nested cause arrays\", () => {\n const first = new Error(\"first\")\n const second = new Error(\"second\")\n const third = new Error(\"third\")\n const error = new NestedError(\"wrapper\", [first, second], third)\n\n expect(error.causes).toEqual([first, second, third])\n })\n\n it(\"accepts no causes\", () => {\n const error = new NestedError(\"wrapper\")\n\n expect(error.causes).toEqual([])\n })\n\n describe(\"create\", () => {\n it(\"returns a NestedError with message and causes\", () => {\n const cause = new Error(\"root cause\")\n const error = NestedError.create(\"wrapper\", cause)\n\n expect(error).toBeInstanceOf(NestedError)\n expect(error.message).toBe(\"wrapper\")\n expect(error.causes).toEqual([cause])\n })\n })\n\n describe(\"throwError\", () => {\n it(\"throws a NestedError with message and causes\", () => {\n const cause = new Error(\"root cause\")\n\n expect(() => NestedError.throwError(\"wrapper\", cause)).toThrow(\n NestedError\n )\n expect(() => NestedError.throwError(\"wrapper\", cause)).toThrow(\"wrapper\")\n\n try {\n NestedError.throwError(\"wrapper\", cause)\n } catch (error) {\n expect(error).toBeInstanceOf(NestedError)\n expect((error as NestedError).causes).toEqual([cause])\n }\n })\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"NestedError.test.js","sourceRoot":"","sources":["../../../tests/errors/NestedError.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { NestedError } from \"@wireio/shared/errors/NestedError\"\n\ndescribe(\"NestedError\", () => {\n it(\"keeps the new message and preserves the caught error as cause\", () => {\n const cause = new Error(\"root boom\")\n const error = new NestedError(\"wrapper failed\", { cause })\n\n expect(error).toBeInstanceOf(Error)\n expect(error.name).toBe(\"NestedError\")\n expect(error.message).toBe(\"wrapper failed\")\n // The real Error object is retained — native `.cause` AND `.causes` — so its\n // stack trace and message survive intact.\n expect(error.cause).toBe(cause)\n expect(error.causes).toEqual([cause])\n expect(error.causes[0].message).toBe(\"root boom\")\n expect(error.causes[0].stack).toBe(cause.stack)\n })\n\n it(\"makes each cause's stack + message visible in .stack (nested-exception style)\", () => {\n const inner = new Error(\"inner detail\")\n const error = new NestedError(\"outer failed\", { cause: inner })\n\n expect(error.stack).toContain(\"outer failed\")\n expect(error.stack).toContain(NestedError.CausedByPrefix)\n // The cause's stack begins with `Error: inner detail`, so its message is kept too.\n expect(error.stack).toContain(\"inner detail\")\n expect(error.stack).toContain(inner.stack)\n })\n\n it(\"retains every cause when given an array of causes\", () => {\n const first = new Error(\"first\")\n const second = new Error(\"second\")\n const error = new NestedError(\"multi\", { cause: [first, second] })\n\n expect(error.causes).toEqual([first, second])\n // The first is the native `.cause`; both show in the composed stack.\n expect(error.cause).toBe(first)\n expect(error.stack).toContain(\"first\")\n expect(error.stack).toContain(\"second\")\n })\n\n it(\"coerces a non-Error thrown value into a retained Error cause\", () => {\n const error = new NestedError(\"boom\", { cause: \"a plain string throw\" })\n\n expect(error.causes).toHaveLength(1)\n expect(error.causes[0]).toBeInstanceOf(Error)\n expect(error.causes[0].message).toBe(\"a plain string throw\")\n expect(error.cause).toBe(error.causes[0])\n })\n\n it(\"captures structured context AND folds a summary into the message\", () => {\n const error = new NestedError(\"invalid JSON\", {\n context: { text: \"{bad\", schemaName: \"ClusterConfig\" }\n })\n\n expect(error.context).toEqual({ text: \"{bad\", schemaName: \"ClusterConfig\" })\n expect(error.message).toContain(\"text={bad\")\n expect(error.message).toContain(\"schemaName=ClusterConfig\")\n })\n\n it(\"truncates a long folded context value\", () => {\n const long = \"x\".repeat(NestedError.ContextPreviewMaxChars + 50)\n const error = new NestedError(\"big\", { context: { text: long } })\n\n expect(error.message).toContain(NestedError.TruncationSuffix)\n // The folded preview is bounded regardless of the source length.\n expect(error.message.length).toBeLessThan(\n long.length + NestedError.ContextPreviewMaxChars\n )\n // The full untruncated value is still on the structured property.\n expect(error.context.text).toBe(long)\n })\n\n it(\"renders a bigint context value without throwing (JSON.stringify would)\", () => {\n const error = new NestedError(\"amount\", { context: { amount: 5n } })\n expect(error.message).toContain(\"amount=5\")\n })\n\n it(\"has no cause chain and an empty context when none are supplied\", () => {\n const error = new NestedError(\"standalone\")\n expect(error.causes).toEqual([])\n expect(error.cause).toBeUndefined()\n expect(error.context).toEqual({})\n expect(error.message).toBe(\"standalone\")\n })\n\n it(\"create returns an instance; throwError throws one\", () => {\n const cause = new Error(\"x\")\n expect(NestedError.create(\"made\", { cause })).toBeInstanceOf(NestedError)\n expect(() => NestedError.throwError(\"thrown\", { cause })).toThrow(NestedError)\n try {\n NestedError.throwError(\"thrown\", { cause })\n } catch (error) {\n expect((error as NestedError).causes).toEqual([cause])\n }\n })\n\n it(\"toError passes Errors through and wraps non-Errors\", () => {\n const real = new Error(\"real\")\n expect(NestedError.toError(real)).toBe(real)\n expect(NestedError.toError(\"str\")).toBeInstanceOf(Error)\n expect(NestedError.toError(\"str\").message).toBe(\"str\")\n })\n\n it(\"toErrors flattens and coerces; nullish yields an empty chain\", () => {\n const a = new Error(\"a\")\n expect(NestedError.toErrors([a, \"b\"]).map(error => error.message)).toEqual([\n \"a\",\n \"b\"\n ])\n expect(NestedError.toErrors(null)).toEqual([])\n expect(NestedError.toErrors(a)).toEqual([a])\n })\n})\n"]}
|