@ogcio/fastify-logging-wrapper 5.4.0 → 5.4.1
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/CHANGELOG.md +29 -0
- package/README.md +32 -0
- package/__tests__/field-filter.test.ts +57 -0
- package/__tests__/helpers/build-fastify.ts +6 -2
- package/__tests__/helpers/fastify-test-helpers.ts +5 -2
- package/__tests__/logging-filtering.test.ts +99 -0
- package/coverage/cobertura-coverage.xml +347 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/fastify-logging-wrapper.ts.html +706 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/field-filter.ts.html +223 -0
- package/coverage/lcov-report/index.html +176 -0
- package/coverage/lcov-report/index.ts.html +130 -0
- package/coverage/lcov-report/logging-wrapper-entities.ts.html +484 -0
- package/coverage/lcov-report/logging-wrapper.ts.html +481 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +372 -0
- package/dist/fastify-logging-wrapper.d.ts +2 -1
- package/dist/fastify-logging-wrapper.d.ts.map +1 -1
- package/dist/fastify-logging-wrapper.js +3 -2
- package/dist/fastify-logging-wrapper.js.map +1 -1
- package/dist/field-filter.d.ts +17 -0
- package/dist/field-filter.d.ts.map +1 -0
- package/dist/field-filter.js +22 -0
- package/dist/field-filter.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logging-wrapper-entities.d.ts +2 -2
- package/dist/logging-wrapper-entities.d.ts.map +1 -1
- package/dist/logging-wrapper.d.ts +2 -0
- package/dist/logging-wrapper.d.ts.map +1 -1
- package/dist/logging-wrapper.js +21 -8
- package/dist/logging-wrapper.js.map +1 -1
- package/package.json +12 -10
- package/src/fastify-logging-wrapper.ts +7 -1
- package/src/field-filter.ts +46 -0
- package/src/index.ts +2 -0
- package/src/logging-wrapper-entities.ts +2 -2
- package/src/logging-wrapper.ts +27 -8
- package/tsconfig.prod.tsbuildinfo +1 -0
- package/vitest.config.mts +8 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,35 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [5.4.0](https://github.com/ogcio/shared-node-utils/compare/@ogcio/fastify-logging-wrapper@v5.3.0...@ogcio/fastify-logging-wrapper@v5.4.0) (2026-07-14)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* AB[#36812](https://github.com/ogcio/shared-node-utils/issues/36812) pii-hash fastify logging wrapper ([#188](https://github.com/ogcio/shared-node-utils/issues/188)) ([e58f050](https://github.com/ogcio/shared-node-utils/commit/e58f050cda8931859eef9a2f738727f56534dc8f))
|
|
12
|
+
* AB[#36812](https://github.com/ogcio/shared-node-utils/issues/36812) pii-utils - fastify error handler ([#199](https://github.com/ogcio/shared-node-utils/issues/199)) ([ab0a2ad](https://github.com/ogcio/shared-node-utils/commit/ab0a2ad6e7c3470f4d7fd4e7e98928e56b71e4fb))
|
|
13
|
+
* **fastify-logging-wrapper:** add customConfig for initialize new pino instance ([#8](https://github.com/ogcio/shared-node-utils/issues/8)) ([847f075](https://github.com/ogcio/shared-node-utils/commit/847f075c3c3b873a844e413085ca97c0f6e1f1a7))
|
|
14
|
+
* **fastify-logging-wrapper:** log properties filter AB[#40055](https://github.com/ogcio/shared-node-utils/issues/40055) ([#286](https://github.com/ogcio/shared-node-utils/issues/286)) ([fe2c1dd](https://github.com/ogcio/shared-node-utils/commit/fe2c1dd992ee7fff47497cde7d59b8aba3111ee0))
|
|
15
|
+
* **root:** startup repo ([7422a6c](https://github.com/ogcio/shared-node-utils/commit/7422a6c8a7d51722299e6cd61eebacefe2b80d6d))
|
|
16
|
+
* updated deps across packages ([#129](https://github.com/ogcio/shared-node-utils/issues/129)) ([86d83ca](https://github.com/ogcio/shared-node-utils/commit/86d83ca57c614fd1a2612862b7e946a0a0d23576))
|
|
17
|
+
* **v5:** add api auth package ([#19](https://github.com/ogcio/shared-node-utils/issues/19)) ([cbc4b83](https://github.com/ogcio/shared-node-utils/commit/cbc4b831ceb29e926f0a7dd869039f0a7575fc69))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* log request in pre parsing ([#118](https://github.com/ogcio/shared-node-utils/issues/118)) ([c7f6d42](https://github.com/ogcio/shared-node-utils/commit/c7f6d42fe141b7f9bad4de6ae96d171dbd34284c))
|
|
23
|
+
* prepublish with pnpm ([#255](https://github.com/ogcio/shared-node-utils/issues/255)) ([d0746d4](https://github.com/ogcio/shared-node-utils/commit/d0746d43d7c359e06dee6d33a3898e27d75e896e))
|
|
24
|
+
* publish shared errors for version 5 ([#4](https://github.com/ogcio/shared-node-utils/issues/4)) ([7159dcd](https://github.com/ogcio/shared-node-utils/commit/7159dcdd2564a730bacbf3ff300aa129debbfe3a))
|
|
25
|
+
* skip internal objects serialize if empty AB[#26429](https://github.com/ogcio/shared-node-utils/issues/26429) ([#75](https://github.com/ogcio/shared-node-utils/issues/75)) ([b667b9d](https://github.com/ogcio/shared-node-utils/commit/b667b9ddd5c4f4b0f937ad8e11e171f81af8bba4))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Miscellaneous Chores
|
|
29
|
+
|
|
30
|
+
* bump patch release for fastify loggin wrapper ([#78](https://github.com/ogcio/shared-node-utils/issues/78)) ([8fae0da](https://github.com/ogcio/shared-node-utils/commit/8fae0dab725a9e05581b84945249668580a667e9))
|
|
31
|
+
* dependabot v5 ([#17](https://github.com/ogcio/shared-node-utils/issues/17)) ([89f9630](https://github.com/ogcio/shared-node-utils/commit/89f96309bed5637de99de5f8beeed275e74f2ef7))
|
|
32
|
+
* setup pnpm workspace ([#242](https://github.com/ogcio/shared-node-utils/issues/242)) ([a75f672](https://github.com/ogcio/shared-node-utils/commit/a75f6728bbf2f44a00f033b0ada12058756f06dd))
|
|
33
|
+
* update deps to 5.1.0 ([#14](https://github.com/ogcio/shared-node-utils/issues/14)) ([6b7821b](https://github.com/ogcio/shared-node-utils/commit/6b7821ba037ae00db96c2303b5911563deef029c))
|
|
34
|
+
|
|
6
35
|
## 5.0.2 (2024-10-03)
|
|
7
36
|
|
|
8
37
|
|
package/README.md
CHANGED
|
@@ -60,6 +60,38 @@ If an error is thrown, a log entry is automatically written.
|
|
|
60
60
|
{"level":50,"level_name":"ERROR","hostname":"hostname","request_id":"1kPptKhMSeyZ9OwcSwBxhg-0000000008","timestamp":1713869258238,"request":{"scheme":"http","method":"GET","path":"/this-path-must-not-exist","hostname":"localhost:80","query_params":{"status_code":"404","error_message":"Not Found"}},"error":{"class":"REQUEST_ERROR","message":"Not Found","trace":"FastifyError: Not Found..... The whole trace here","code":"FST_ERR_NOT_FOUND"},"message":"ERROR"}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
+
## Filtering logged fields
|
|
64
|
+
|
|
65
|
+
By default the wrapper logs the full request and response, so headers, query
|
|
66
|
+
params, cookies and similar fields end up in the logs. A built-in list always
|
|
67
|
+
masks the most sensitive headers (`authorization`, `cookie`, `set-cookie`,
|
|
68
|
+
`x-api-key`, `x-amz-security-token`, `proxy-authorization`).
|
|
69
|
+
|
|
70
|
+
To avoid logging additional sensitive or PII fields, pass an optional
|
|
71
|
+
configuration to `initializeLoggingHooks`. Rules are **additive**: they run on
|
|
72
|
+
top of the built-in redaction, they never disable it. Omitting the config keeps
|
|
73
|
+
the current behaviour unchanged.
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
initializeLoggingHooks(server, {
|
|
77
|
+
request: {
|
|
78
|
+
headers: { omit: ["x-internal-trace"], mask: ["x-custom-token"] },
|
|
79
|
+
queryParams: { omit: ["email"], mask: ["ppsn"] },
|
|
80
|
+
clientIp: "omit",
|
|
81
|
+
userAgent: "omit",
|
|
82
|
+
},
|
|
83
|
+
response: {
|
|
84
|
+
headers: { omit: ["x-debug-info"] },
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- `omit` removes the field entirely from the log entry.
|
|
90
|
+
- `mask` keeps the field but replaces its value with `[redacted]`.
|
|
91
|
+
- Header names are matched **case-insensitively**; query-param names are matched
|
|
92
|
+
**exactly**.
|
|
93
|
+
- `clientIp` and `userAgent` are single values, so they only accept `"omit"`.
|
|
94
|
+
|
|
63
95
|
## Additional entries
|
|
64
96
|
|
|
65
97
|
Additional log entries can be added as needed, but they will include, thanks to this package, common info about the request context that will be useful for future troubleshooting.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { assert, describe, it } from "vitest";
|
|
2
|
+
import { applyFieldRules } from "../src/field-filter.js";
|
|
3
|
+
import { REDACTED_VALUE } from "../src/logging-wrapper-entities.js";
|
|
4
|
+
|
|
5
|
+
describe("applyFieldRules", () => {
|
|
6
|
+
it("returns the value untouched when no rules are given", () => {
|
|
7
|
+
const value = { a: 1, b: 2 };
|
|
8
|
+
assert.strictEqual(applyFieldRules(value, undefined), value);
|
|
9
|
+
assert.strictEqual(applyFieldRules(value, {}), value);
|
|
10
|
+
assert.strictEqual(applyFieldRules(value, { omit: [], mask: [] }), value);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("omits the requested keys", () => {
|
|
14
|
+
const result = applyFieldRules({ a: 1, b: 2, c: 3 }, { omit: ["b"] });
|
|
15
|
+
assert.deepStrictEqual(result, { a: 1, c: 3 });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("masks the requested keys", () => {
|
|
19
|
+
const result = applyFieldRules({ a: 1, b: 2 }, { mask: ["b"] });
|
|
20
|
+
assert.deepStrictEqual(result, { a: 1, b: REDACTED_VALUE });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("omit takes precedence over mask for the same key", () => {
|
|
24
|
+
const result = applyFieldRules(
|
|
25
|
+
{ a: 1, b: 2 },
|
|
26
|
+
{
|
|
27
|
+
omit: ["b"],
|
|
28
|
+
mask: ["b"],
|
|
29
|
+
},
|
|
30
|
+
);
|
|
31
|
+
assert.deepStrictEqual(result, { a: 1 });
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("matches keys case-insensitively when requested", () => {
|
|
35
|
+
const result = applyFieldRules(
|
|
36
|
+
{ "x-custom-token": "secret", "content-type": "json" },
|
|
37
|
+
{ mask: ["X-Custom-Token"] },
|
|
38
|
+
true,
|
|
39
|
+
);
|
|
40
|
+
assert.deepStrictEqual(result, {
|
|
41
|
+
"x-custom-token": REDACTED_VALUE,
|
|
42
|
+
"content-type": "json",
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("matches keys case-sensitively by default", () => {
|
|
47
|
+
const result = applyFieldRules({ Email: "a@b.com" }, { omit: ["email"] });
|
|
48
|
+
assert.deepStrictEqual(result, { Email: "a@b.com" });
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("passes through non-object values", () => {
|
|
52
|
+
assert.strictEqual(applyFieldRules("plain", { omit: ["a"] }), "plain");
|
|
53
|
+
assert.strictEqual(applyFieldRules(null, { omit: ["a"] }), null);
|
|
54
|
+
const arr = [1, 2];
|
|
55
|
+
assert.strictEqual(applyFieldRules(arr, { omit: ["a"] }), arr);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -6,15 +6,19 @@ import {
|
|
|
6
6
|
getLoggingConfiguration,
|
|
7
7
|
initializeLoggingHooks,
|
|
8
8
|
} from "../../src/fastify-logging-wrapper.js";
|
|
9
|
+
import type { LoggingOptions } from "../../src/field-filter.js";
|
|
9
10
|
|
|
10
|
-
export const buildFastify = (
|
|
11
|
+
export const buildFastify = (
|
|
12
|
+
loggerDestination?: DestinationStream,
|
|
13
|
+
options?: LoggingOptions,
|
|
14
|
+
) => {
|
|
11
15
|
const server = Fastify({
|
|
12
16
|
...getLoggingConfiguration({
|
|
13
17
|
loggerDestination: loggerDestination,
|
|
14
18
|
}),
|
|
15
19
|
});
|
|
16
20
|
|
|
17
|
-
initializeLoggingHooks(server);
|
|
21
|
+
initializeLoggingHooks(server, options);
|
|
18
22
|
|
|
19
23
|
server.get("/ping", async (_request, _reply) => {
|
|
20
24
|
return { data: "pong\n" };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { FastifyInstance } from "fastify";
|
|
2
2
|
import { assert } from "vitest";
|
|
3
|
+
import type { LoggingOptions } from "../../src/field-filter.js";
|
|
3
4
|
import {
|
|
4
5
|
type LogErrorClasses,
|
|
5
6
|
LogMessages,
|
|
@@ -23,12 +24,14 @@ export const DEFAULT_METHOD = "GET";
|
|
|
23
24
|
export const DEFAULT_SCHEME = "http";
|
|
24
25
|
export const DEFAULT_PATH = "/ping";
|
|
25
26
|
|
|
26
|
-
export const initializeServer = (
|
|
27
|
+
export const initializeServer = (
|
|
28
|
+
options?: LoggingOptions,
|
|
29
|
+
): {
|
|
27
30
|
server: FastifyInstance;
|
|
28
31
|
loggingDestination: TestingLoggerDestination;
|
|
29
32
|
} => {
|
|
30
33
|
const loggingDestination = getTestingDestinationLogger();
|
|
31
|
-
const server = buildFastify(loggingDestination.loggerDestination);
|
|
34
|
+
const server = buildFastify(loggingDestination.loggerDestination, options);
|
|
32
35
|
|
|
33
36
|
return { server, loggingDestination };
|
|
34
37
|
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { afterEach, assert, describe, it } from "vitest";
|
|
2
|
+
import { REDACTED_VALUE } from "../src/logging-wrapper-entities.js";
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_METHOD,
|
|
5
|
+
initializeServer,
|
|
6
|
+
parseLogEntry,
|
|
7
|
+
} from "./helpers/fastify-test-helpers.js";
|
|
8
|
+
|
|
9
|
+
describe("Logging options filter request and response fields", () => {
|
|
10
|
+
it("omits and masks request headers (case-insensitive)", async () => {
|
|
11
|
+
const { server, loggingDestination } = initializeServer({
|
|
12
|
+
request: {
|
|
13
|
+
headers: { omit: ["x-drop-me"], mask: ["X-Secret"] },
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => server.close());
|
|
17
|
+
|
|
18
|
+
await server.inject({
|
|
19
|
+
method: DEFAULT_METHOD,
|
|
20
|
+
url: "/ping",
|
|
21
|
+
headers: { "x-drop-me": "gone", "x-secret": "sensitive", "x-keep": "ok" },
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const request = parseLogEntry(
|
|
25
|
+
loggingDestination.getLoggedRecords()[0],
|
|
26
|
+
).request;
|
|
27
|
+
assert.notProperty(request.headers, "x-drop-me");
|
|
28
|
+
assert.equal(request.headers["x-secret"], REDACTED_VALUE);
|
|
29
|
+
assert.equal(request.headers["x-keep"], "ok");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("omits and masks query params (case-sensitive)", async () => {
|
|
33
|
+
const { server, loggingDestination } = initializeServer({
|
|
34
|
+
request: {
|
|
35
|
+
queryParams: { omit: ["email"], mask: ["ppsn"] },
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
afterEach(() => server.close());
|
|
39
|
+
|
|
40
|
+
await server.inject({
|
|
41
|
+
method: DEFAULT_METHOD,
|
|
42
|
+
url: "/ping?email=a@b.com&ppsn=123&keep=1",
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const request = parseLogEntry(
|
|
46
|
+
loggingDestination.getLoggedRecords()[0],
|
|
47
|
+
).request;
|
|
48
|
+
assert.notProperty(request.query_params, "email");
|
|
49
|
+
assert.equal(request.query_params.ppsn, REDACTED_VALUE);
|
|
50
|
+
assert.equal(request.query_params.keep, "1");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("omits derived client_ip and user_agent fields", async () => {
|
|
54
|
+
const { server, loggingDestination } = initializeServer({
|
|
55
|
+
request: { clientIp: "omit", userAgent: "omit" },
|
|
56
|
+
});
|
|
57
|
+
afterEach(() => server.close());
|
|
58
|
+
|
|
59
|
+
await server.inject({ method: DEFAULT_METHOD, url: "/ping" });
|
|
60
|
+
|
|
61
|
+
const request = parseLogEntry(
|
|
62
|
+
loggingDestination.getLoggedRecords()[0],
|
|
63
|
+
).request;
|
|
64
|
+
assert.notProperty(request, "client_ip");
|
|
65
|
+
assert.notProperty(request, "user_agent");
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("masks response headers", async () => {
|
|
69
|
+
const { server, loggingDestination } = initializeServer({
|
|
70
|
+
response: { headers: { mask: ["content-type"] } },
|
|
71
|
+
});
|
|
72
|
+
afterEach(() => server.close());
|
|
73
|
+
|
|
74
|
+
await server.inject({ method: DEFAULT_METHOD, url: "/ping" });
|
|
75
|
+
|
|
76
|
+
const response = parseLogEntry(
|
|
77
|
+
loggingDestination.getLoggedRecords()[1],
|
|
78
|
+
).response;
|
|
79
|
+
assert.equal(response.headers["content-type"], REDACTED_VALUE);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("keeps the default behaviour when no options are given", async () => {
|
|
83
|
+
const { server, loggingDestination } = initializeServer();
|
|
84
|
+
afterEach(() => server.close());
|
|
85
|
+
|
|
86
|
+
await server.inject({
|
|
87
|
+
method: DEFAULT_METHOD,
|
|
88
|
+
url: "/ping",
|
|
89
|
+
headers: { "x-anything": "kept" },
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const request = parseLogEntry(
|
|
93
|
+
loggingDestination.getLoggedRecords()[0],
|
|
94
|
+
).request;
|
|
95
|
+
assert.equal(request.headers["x-anything"], "kept");
|
|
96
|
+
assert.property(request, "client_ip");
|
|
97
|
+
assert.property(request, "user_agent");
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
<?xml version="1.0" ?>
|
|
2
|
+
<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
|
|
3
|
+
<coverage lines-valid="154" lines-covered="144" line-rate="0.935" branches-valid="113" branches-covered="99" branch-rate="0.8761" timestamp="1783951283253" complexity="0" version="0.1">
|
|
4
|
+
<sources>
|
|
5
|
+
<source>/Users/andreabozzelli/Projects/shared-node-utils/packages/fastify-logging-wrapper</source>
|
|
6
|
+
</sources>
|
|
7
|
+
<packages>
|
|
8
|
+
<package name="main" line-rate="0.935" branch-rate="0.8761">
|
|
9
|
+
<classes>
|
|
10
|
+
<class name="fastify-logging-wrapper.ts" filename="src/fastify-logging-wrapper.ts" line-rate="0.8548" branch-rate="0.8269">
|
|
11
|
+
<methods>
|
|
12
|
+
<method name="(anonymous_0)" hits="40" signature="()V">
|
|
13
|
+
<lines>
|
|
14
|
+
<line number="35" hits="40"/>
|
|
15
|
+
</lines>
|
|
16
|
+
</method>
|
|
17
|
+
<method name="(anonymous_1)" hits="218" signature="()V">
|
|
18
|
+
<lines>
|
|
19
|
+
<line number="42" hits="218"/>
|
|
20
|
+
</lines>
|
|
21
|
+
</method>
|
|
22
|
+
<method name="(anonymous_2)" hits="18" signature="()V">
|
|
23
|
+
<lines>
|
|
24
|
+
<line number="48" hits="18"/>
|
|
25
|
+
</lines>
|
|
26
|
+
</method>
|
|
27
|
+
<method name="(anonymous_3)" hits="20" signature="()V">
|
|
28
|
+
<lines>
|
|
29
|
+
<line number="53" hits="20"/>
|
|
30
|
+
</lines>
|
|
31
|
+
</method>
|
|
32
|
+
<method name="(anonymous_4)" hits="20" signature="()V">
|
|
33
|
+
<lines>
|
|
34
|
+
<line number="67" hits="20"/>
|
|
35
|
+
</lines>
|
|
36
|
+
</method>
|
|
37
|
+
<method name="(anonymous_5)" hits="6" signature="()V">
|
|
38
|
+
<lines>
|
|
39
|
+
<line number="89" hits="6"/>
|
|
40
|
+
</lines>
|
|
41
|
+
</method>
|
|
42
|
+
<method name="(anonymous_6)" hits="18" signature="()V">
|
|
43
|
+
<lines>
|
|
44
|
+
<line number="103" hits="18"/>
|
|
45
|
+
</lines>
|
|
46
|
+
</method>
|
|
47
|
+
<method name="(anonymous_7)" hits="19" signature="()V">
|
|
48
|
+
<lines>
|
|
49
|
+
<line number="127" hits="19"/>
|
|
50
|
+
</lines>
|
|
51
|
+
</method>
|
|
52
|
+
<method name="(anonymous_8)" hits="0" signature="()V">
|
|
53
|
+
<lines>
|
|
54
|
+
<line number="142" hits="0"/>
|
|
55
|
+
</lines>
|
|
56
|
+
</method>
|
|
57
|
+
<method name="(anonymous_9)" hits="26" signature="()V">
|
|
58
|
+
<lines>
|
|
59
|
+
<line number="148" hits="26"/>
|
|
60
|
+
</lines>
|
|
61
|
+
</method>
|
|
62
|
+
<method name="(anonymous_10)" hits="26" signature="()V">
|
|
63
|
+
<lines>
|
|
64
|
+
<line number="182" hits="26"/>
|
|
65
|
+
</lines>
|
|
66
|
+
</method>
|
|
67
|
+
</methods>
|
|
68
|
+
<lines>
|
|
69
|
+
<line number="33" hits="3" branch="false"/>
|
|
70
|
+
<line number="35" hits="3" branch="false"/>
|
|
71
|
+
<line number="36" hits="40" branch="false"/>
|
|
72
|
+
<line number="42" hits="218" branch="false"/>
|
|
73
|
+
<line number="48" hits="3" branch="false"/>
|
|
74
|
+
<line number="52" hits="18" branch="false"/>
|
|
75
|
+
<line number="53" hits="18" branch="false"/>
|
|
76
|
+
<line number="54" hits="20" branch="false"/>
|
|
77
|
+
<line number="56" hits="20" branch="false"/>
|
|
78
|
+
<line number="58" hits="20" branch="true" condition-coverage="50% (1/2)"/>
|
|
79
|
+
<line number="59" hits="20" branch="false"/>
|
|
80
|
+
<line number="61" hits="0" branch="false"/>
|
|
81
|
+
<line number="64" hits="20" branch="false"/>
|
|
82
|
+
<line number="67" hits="18" branch="false"/>
|
|
83
|
+
<line number="68" hits="20" branch="false"/>
|
|
84
|
+
<line number="73" hits="20" branch="false"/>
|
|
85
|
+
<line number="75" hits="20" branch="false"/>
|
|
86
|
+
<line number="78" hits="20" branch="false"/>
|
|
87
|
+
<line number="79" hits="20" branch="true" condition-coverage="100% (2/2)"/>
|
|
88
|
+
<line number="80" hits="6" branch="false"/>
|
|
89
|
+
<line number="82" hits="14" branch="false"/>
|
|
90
|
+
<line number="85" hits="20" branch="false"/>
|
|
91
|
+
<line number="86" hits="20" branch="false"/>
|
|
92
|
+
<line number="89" hits="18" branch="false"/>
|
|
93
|
+
<line number="90" hits="6" branch="false"/>
|
|
94
|
+
<line number="95" hits="6" branch="false"/>
|
|
95
|
+
<line number="97" hits="6" branch="false"/>
|
|
96
|
+
<line number="99" hits="6" branch="false"/>
|
|
97
|
+
<line number="103" hits="3" branch="false"/>
|
|
98
|
+
<line number="117" hits="18" branch="true" condition-coverage="75% (3/4)"/>
|
|
99
|
+
<line number="118" hits="18" branch="false"/>
|
|
100
|
+
<line number="127" hits="19" branch="false"/>
|
|
101
|
+
<line number="132" hits="0" branch="false"/>
|
|
102
|
+
<line number="133" hits="0" branch="true" condition-coverage="0% (0/2)"/>
|
|
103
|
+
<line number="134" hits="0" branch="false"/>
|
|
104
|
+
<line number="139" hits="0" branch="false"/>
|
|
105
|
+
<line number="142" hits="0" branch="false"/>
|
|
106
|
+
<line number="148" hits="3" branch="false"/>
|
|
107
|
+
<line number="152" hits="26" branch="true" condition-coverage="100% (4/4)"/>
|
|
108
|
+
<line number="153" hits="26" branch="true" condition-coverage="100% (4/4)"/>
|
|
109
|
+
<line number="154" hits="23" branch="false"/>
|
|
110
|
+
<line number="158" hits="3" branch="true" condition-coverage="75% (3/4)"/>
|
|
111
|
+
<line number="161" hits="26" branch="true" condition-coverage="75% (3/4)"/>
|
|
112
|
+
<line number="162" hits="0" branch="false"/>
|
|
113
|
+
<line number="165" hits="3" branch="true" condition-coverage="100% (4/4)"/>
|
|
114
|
+
<line number="166" hits="1" branch="false"/>
|
|
115
|
+
<line number="169" hits="2" branch="true" condition-coverage="50% (1/2)"/>
|
|
116
|
+
<line number="173" hits="0" branch="false"/>
|
|
117
|
+
<line number="176" hits="2" branch="false"/>
|
|
118
|
+
<line number="182" hits="3" branch="false"/>
|
|
119
|
+
<line number="188" hits="26" branch="false"/>
|
|
120
|
+
<line number="189" hits="26" branch="true" condition-coverage="75% (3/4)"/>
|
|
121
|
+
<line number="190" hits="0" branch="false"/>
|
|
122
|
+
<line number="192" hits="26" branch="true" condition-coverage="100% (2/2)"/>
|
|
123
|
+
<line number="193" hits="20" branch="false"/>
|
|
124
|
+
<line number="195" hits="26" branch="true" condition-coverage="100% (2/2)"/>
|
|
125
|
+
<line number="196" hits="6" branch="false"/>
|
|
126
|
+
<line number="199" hits="26" branch="true" condition-coverage="50% (1/2)"/>
|
|
127
|
+
<line number="200" hits="26" branch="false"/>
|
|
128
|
+
<line number="201" hits="26" branch="true" condition-coverage="100% (2/2)"/>
|
|
129
|
+
<line number="202" hits="2" branch="false"/>
|
|
130
|
+
<line number="206" hits="26" branch="false"/>
|
|
131
|
+
</lines>
|
|
132
|
+
</class>
|
|
133
|
+
<class name="field-filter.ts" filename="src/field-filter.ts" line-rate="1" branch-rate="1">
|
|
134
|
+
<methods>
|
|
135
|
+
<method name="(anonymous_0)" hits="91" signature="()V">
|
|
136
|
+
<lines>
|
|
137
|
+
<line number="20" hits="91"/>
|
|
138
|
+
</lines>
|
|
139
|
+
</method>
|
|
140
|
+
<method name="(anonymous_1)" hits="36" signature="()V">
|
|
141
|
+
<lines>
|
|
142
|
+
<line number="32" hits="36"/>
|
|
143
|
+
</lines>
|
|
144
|
+
</method>
|
|
145
|
+
</methods>
|
|
146
|
+
<lines>
|
|
147
|
+
<line number="20" hits="5" branch="false"/>
|
|
148
|
+
<line number="25" hits="91" branch="true" condition-coverage="100% (5/5)"/>
|
|
149
|
+
<line number="26" hits="79" branch="false"/>
|
|
150
|
+
<line number="28" hits="12" branch="true" condition-coverage="100% (5/5)"/>
|
|
151
|
+
<line number="29" hits="3" branch="false"/>
|
|
152
|
+
<line number="32" hits="9" branch="false"/>
|
|
153
|
+
<line number="33" hits="36" branch="true" condition-coverage="100% (2/2)"/>
|
|
154
|
+
<line number="34" hits="9" branch="true" condition-coverage="100% (2/2)"/>
|
|
155
|
+
<line number="35" hits="91" branch="true" condition-coverage="100% (2/2)"/>
|
|
156
|
+
<line number="37" hits="91" branch="false"/>
|
|
157
|
+
<line number="38" hits="91" branch="false"/>
|
|
158
|
+
<line number="39" hits="23" branch="false"/>
|
|
159
|
+
<line number="40" hits="23" branch="true" condition-coverage="100% (2/2)"/>
|
|
160
|
+
<line number="41" hits="5" branch="false"/>
|
|
161
|
+
<line number="43" hits="18" branch="true" condition-coverage="100% (2/2)"/>
|
|
162
|
+
<line number="45" hits="9" branch="false"/>
|
|
163
|
+
</lines>
|
|
164
|
+
</class>
|
|
165
|
+
<class name="index.ts" filename="src/index.ts" line-rate="0" branch-rate="0">
|
|
166
|
+
<methods>
|
|
167
|
+
</methods>
|
|
168
|
+
<lines>
|
|
169
|
+
</lines>
|
|
170
|
+
</class>
|
|
171
|
+
<class name="logging-wrapper-entities.ts" filename="src/logging-wrapper-entities.ts" line-rate="0.9722" branch-rate="0.8332999999999999">
|
|
172
|
+
<methods>
|
|
173
|
+
<method name="(anonymous_0)" hits="5" signature="()V">
|
|
174
|
+
<lines>
|
|
175
|
+
<line number="48" hits="5"/>
|
|
176
|
+
</lines>
|
|
177
|
+
</method>
|
|
178
|
+
<method name="(anonymous_1)" hits="5" signature="()V">
|
|
179
|
+
<lines>
|
|
180
|
+
<line number="55" hits="5"/>
|
|
181
|
+
</lines>
|
|
182
|
+
</method>
|
|
183
|
+
<method name="(anonymous_2)" hits="6" signature="()V">
|
|
184
|
+
<lines>
|
|
185
|
+
<line number="80" hits="6"/>
|
|
186
|
+
</lines>
|
|
187
|
+
</method>
|
|
188
|
+
<method name="(anonymous_3)" hits="6" signature="()V">
|
|
189
|
+
<lines>
|
|
190
|
+
<line number="109" hits="6"/>
|
|
191
|
+
</lines>
|
|
192
|
+
</method>
|
|
193
|
+
</methods>
|
|
194
|
+
<lines>
|
|
195
|
+
<line number="48" hits="5" branch="false"/>
|
|
196
|
+
<line number="49" hits="5" branch="false"/>
|
|
197
|
+
<line number="50" hits="5" branch="false"/>
|
|
198
|
+
<line number="51" hits="5" branch="false"/>
|
|
199
|
+
<line number="52" hits="5" branch="false"/>
|
|
200
|
+
<line number="55" hits="5" branch="false"/>
|
|
201
|
+
<line number="56" hits="5" branch="false"/>
|
|
202
|
+
<line number="57" hits="5" branch="false"/>
|
|
203
|
+
<line number="58" hits="5" branch="false"/>
|
|
204
|
+
<line number="59" hits="5" branch="false"/>
|
|
205
|
+
<line number="60" hits="5" branch="false"/>
|
|
206
|
+
<line number="63" hits="5" branch="false"/>
|
|
207
|
+
<line number="65" hits="5" branch="false"/>
|
|
208
|
+
<line number="74" hits="5" branch="false"/>
|
|
209
|
+
<line number="76" hits="5" branch="false"/>
|
|
210
|
+
<line number="78" hits="5" branch="false"/>
|
|
211
|
+
<line number="80" hits="5" branch="false"/>
|
|
212
|
+
<line number="83" hits="6" branch="false"/>
|
|
213
|
+
<line number="89" hits="6" branch="true" condition-coverage="100% (2/2)"/>
|
|
214
|
+
<line number="90" hits="1" branch="true" condition-coverage="50% (1/2)"/>
|
|
215
|
+
<line number="91" hits="1" branch="true" condition-coverage="50% (1/2)"/>
|
|
216
|
+
<line number="95" hits="1" branch="false"/>
|
|
217
|
+
<line number="103" hits="5" branch="false"/>
|
|
218
|
+
<line number="109" hits="5" branch="false"/>
|
|
219
|
+
<line number="110" hits="6" branch="true" condition-coverage="100% (2/2)"/>
|
|
220
|
+
<line number="111" hits="1" branch="false"/>
|
|
221
|
+
<line number="114" hits="5" branch="false"/>
|
|
222
|
+
<line number="116" hits="5" branch="true" condition-coverage="50% (1/2)"/>
|
|
223
|
+
<line number="117" hits="0" branch="false"/>
|
|
224
|
+
<line number="120" hits="5" branch="true" condition-coverage="100% (2/2)"/>
|
|
225
|
+
<line number="121" hits="2" branch="false"/>
|
|
226
|
+
<line number="124" hits="3" branch="true" condition-coverage="100% (2/2)"/>
|
|
227
|
+
<line number="125" hits="1" branch="false"/>
|
|
228
|
+
<line number="128" hits="2" branch="true" condition-coverage="100% (2/2)"/>
|
|
229
|
+
<line number="129" hits="1" branch="false"/>
|
|
230
|
+
<line number="132" hits="1" branch="false"/>
|
|
231
|
+
</lines>
|
|
232
|
+
</class>
|
|
233
|
+
<class name="logging-wrapper.ts" filename="src/logging-wrapper.ts" line-rate="1" branch-rate="0.909">
|
|
234
|
+
<methods>
|
|
235
|
+
<method name="(anonymous_0)" hits="18" signature="()V">
|
|
236
|
+
<lines>
|
|
237
|
+
<line number="23" hits="18"/>
|
|
238
|
+
</lines>
|
|
239
|
+
</method>
|
|
240
|
+
<method name="(anonymous_1)" hits="128" signature="()V">
|
|
241
|
+
<lines>
|
|
242
|
+
<line number="29" hits="128"/>
|
|
243
|
+
</lines>
|
|
244
|
+
</method>
|
|
245
|
+
<method name="(anonymous_2)" hits="46" signature="()V">
|
|
246
|
+
<lines>
|
|
247
|
+
<line number="36" hits="46"/>
|
|
248
|
+
</lines>
|
|
249
|
+
</method>
|
|
250
|
+
<method name="(anonymous_3)" hits="20" signature="()V">
|
|
251
|
+
<lines>
|
|
252
|
+
<line number="56" hits="20"/>
|
|
253
|
+
</lines>
|
|
254
|
+
</method>
|
|
255
|
+
<method name="(anonymous_4)" hits="6" signature="()V">
|
|
256
|
+
<lines>
|
|
257
|
+
<line number="63" hits="6"/>
|
|
258
|
+
</lines>
|
|
259
|
+
</method>
|
|
260
|
+
<method name="(anonymous_5)" hits="20" signature="()V">
|
|
261
|
+
<lines>
|
|
262
|
+
<line number="66" hits="20"/>
|
|
263
|
+
</lines>
|
|
264
|
+
</method>
|
|
265
|
+
<method name="(anonymous_6)" hits="40" signature="()V">
|
|
266
|
+
<lines>
|
|
267
|
+
<line number="73" hits="40"/>
|
|
268
|
+
</lines>
|
|
269
|
+
</method>
|
|
270
|
+
<method name="(anonymous_7)" hits="40" signature="()V">
|
|
271
|
+
<lines>
|
|
272
|
+
<line number="76" hits="40"/>
|
|
273
|
+
</lines>
|
|
274
|
+
</method>
|
|
275
|
+
<method name="(anonymous_8)" hits="20" signature="()V">
|
|
276
|
+
<lines>
|
|
277
|
+
<line number="85" hits="20"/>
|
|
278
|
+
</lines>
|
|
279
|
+
</method>
|
|
280
|
+
<method name="(anonymous_9)" hits="20" signature="()V">
|
|
281
|
+
<lines>
|
|
282
|
+
<line number="102" hits="20"/>
|
|
283
|
+
</lines>
|
|
284
|
+
</method>
|
|
285
|
+
<method name="(anonymous_10)" hits="26" signature="()V">
|
|
286
|
+
<lines>
|
|
287
|
+
<line number="111" hits="26"/>
|
|
288
|
+
</lines>
|
|
289
|
+
</method>
|
|
290
|
+
<method name="(anonymous_11)" hits="76" signature="()V">
|
|
291
|
+
<lines>
|
|
292
|
+
<line number="116" hits="76"/>
|
|
293
|
+
</lines>
|
|
294
|
+
</method>
|
|
295
|
+
<method name="(anonymous_12)" hits="156" signature="()V">
|
|
296
|
+
<lines>
|
|
297
|
+
<line number="126" hits="156"/>
|
|
298
|
+
</lines>
|
|
299
|
+
</method>
|
|
300
|
+
</methods>
|
|
301
|
+
<lines>
|
|
302
|
+
<line number="19" hits="4" branch="false"/>
|
|
303
|
+
<line number="21" hits="4" branch="false"/>
|
|
304
|
+
<line number="23" hits="4" branch="true" condition-coverage="100% (1/1)"/>
|
|
305
|
+
<line number="24" hits="18" branch="false"/>
|
|
306
|
+
<line number="29" hits="4" branch="false"/>
|
|
307
|
+
<line number="32" hits="128" branch="true" condition-coverage="100% (2/2)"/>
|
|
308
|
+
<line number="36" hits="4" branch="false"/>
|
|
309
|
+
<line number="42" hits="46" branch="true" condition-coverage="100% (2/2)"/>
|
|
310
|
+
<line number="43" hits="20" branch="false"/>
|
|
311
|
+
<line number="45" hits="46" branch="true" condition-coverage="100% (2/2)"/>
|
|
312
|
+
<line number="46" hits="20" branch="false"/>
|
|
313
|
+
<line number="48" hits="46" branch="true" condition-coverage="100% (2/2)"/>
|
|
314
|
+
<line number="49" hits="6" branch="false"/>
|
|
315
|
+
<line number="51" hits="46" branch="true" condition-coverage="100% (2/2)"/>
|
|
316
|
+
<line number="52" hits="2" branch="false"/>
|
|
317
|
+
<line number="56" hits="4" branch="false"/>
|
|
318
|
+
<line number="57" hits="20" branch="false"/>
|
|
319
|
+
<line number="58" hits="20" branch="false"/>
|
|
320
|
+
<line number="59" hits="20" branch="false"/>
|
|
321
|
+
<line number="60" hits="20" branch="false"/>
|
|
322
|
+
<line number="63" hits="4" branch="false"/>
|
|
323
|
+
<line number="64" hits="6" branch="false"/>
|
|
324
|
+
<line number="66" hits="4" branch="false"/>
|
|
325
|
+
<line number="68" hits="20" branch="false"/>
|
|
326
|
+
<line number="73" hits="4" branch="false"/>
|
|
327
|
+
<line number="74" hits="40" branch="true" condition-coverage="50% (1/2)"/>
|
|
328
|
+
<line number="76" hits="40" branch="false"/>
|
|
329
|
+
<line number="85" hits="4" branch="false"/>
|
|
330
|
+
<line number="88" hits="20" branch="false"/>
|
|
331
|
+
<line number="89" hits="20" branch="false"/>
|
|
332
|
+
<line number="93" hits="20" branch="true" condition-coverage="100% (2/2)"/>
|
|
333
|
+
<line number="94" hits="19" branch="false"/>
|
|
334
|
+
<line number="96" hits="20" branch="true" condition-coverage="100% (2/2)"/>
|
|
335
|
+
<line number="97" hits="19" branch="true" condition-coverage="50% (1/2)"/>
|
|
336
|
+
<line number="99" hits="20" branch="false"/>
|
|
337
|
+
<line number="102" hits="20" branch="false"/>
|
|
338
|
+
<line number="111" hits="4" branch="false"/>
|
|
339
|
+
<line number="113" hits="26" branch="false"/>
|
|
340
|
+
<line number="116" hits="76" branch="false"/>
|
|
341
|
+
<line number="126" hits="156" branch="false"/>
|
|
342
|
+
</lines>
|
|
343
|
+
</class>
|
|
344
|
+
</classes>
|
|
345
|
+
</package>
|
|
346
|
+
</packages>
|
|
347
|
+
</coverage>
|