@lokalise/fastify-extras 13.1.1 → 14.1.0
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/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/healthcheckMetricsPlugin.spec.js +0 -3
- package/dist/plugins/healthcheckMetricsPlugin.spec.js.map +1 -1
- package/dist/plugins/publicHealthcheckPlugin.d.ts +8 -1
- package/dist/plugins/publicHealthcheckPlugin.js +27 -10
- package/dist/plugins/publicHealthcheckPlugin.js.map +1 -1
- package/dist/plugins/publicHealthcheckPlugin.spec.js +81 -12
- package/dist/plugins/publicHealthcheckPlugin.spec.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -13,5 +13,5 @@ export type { ErrorObjectResolver, MetricsPluginOptions } from './plugins/metric
|
|
|
13
13
|
export { prismaOtelTracingPlugin } from './plugins/opentelemetry/prismaOtelTracingPlugin';
|
|
14
14
|
export type { PrismaOtelTracingPluginConfig } from './plugins/opentelemetry/prismaOtelTracingPlugin';
|
|
15
15
|
export { publicHealthcheckPlugin } from './plugins/publicHealthcheckPlugin';
|
|
16
|
-
export type { PublicHealthcheckPluginOptions, HealthCheck } from './plugins/publicHealthcheckPlugin';
|
|
16
|
+
export type { PublicHealthcheckPluginOptions, HealthCheck, HealthChecker, } from './plugins/publicHealthcheckPlugin';
|
|
17
17
|
export { amplitudePlugin, Amplitude, type AmplitudeConfig, type CreateApiTrackingEventFn, } from './plugins/amplitudePlugin';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAApE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAG5C,uFAI+C;AAH7C,4IAAA,4BAA4B,OAAA;AAC5B,4IAAA,4BAA4B,OAAA;AAC5B,oIAAA,oBAAoB,OAAA;AAItB,+FAGmD;AAFjD,oJAAA,gCAAgC,OAAA;AAChC,8IAAA,0BAA0B,OAAA;AAI5B,qFAG8C;AAF5C,0IAAA,2BAA2B,OAAA;AAC3B,oIAAA,qBAAqB,OAAA;AAIvB,+EAA6E;AAApE,oIAAA,wBAAwB,OAAA;AAOjC,yDAAuD;AAA9C,8GAAA,aAAa,OAAA;AAGtB,2FAAyF;AAAhF,kIAAA,uBAAuB,OAAA;AAGhC,6EAA2E;AAAlE,kIAAA,uBAAuB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAApE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAG5C,uFAI+C;AAH7C,4IAAA,4BAA4B,OAAA;AAC5B,4IAAA,4BAA4B,OAAA;AAC5B,oIAAA,oBAAoB,OAAA;AAItB,+FAGmD;AAFjD,oJAAA,gCAAgC,OAAA;AAChC,8IAAA,0BAA0B,OAAA;AAI5B,qFAG8C;AAF5C,0IAAA,2BAA2B,OAAA;AAC3B,oIAAA,qBAAqB,OAAA;AAIvB,+EAA6E;AAApE,oIAAA,wBAAwB,OAAA;AAOjC,yDAAuD;AAA9C,8GAAA,aAAa,OAAA;AAGtB,2FAAyF;AAAhF,kIAAA,uBAAuB,OAAA;AAGhC,6EAA2E;AAAlE,kIAAA,uBAAuB,OAAA;AAOhC,6DAKkC;AAJhC,kHAAA,eAAe,OAAA;AACf,4GAAA,SAAS,OAAA"}
|
|
@@ -38,7 +38,6 @@ describe('healthcheckMetricsPlugin', () => {
|
|
|
38
38
|
},
|
|
39
39
|
]);
|
|
40
40
|
const response = await (0, node_core_1.sendGet)((0, node_core_1.buildClient)('http://127.0.0.1:9080'), '/metrics');
|
|
41
|
-
console.log(response.result.body);
|
|
42
41
|
expect(response.result.statusCode).toBe(200);
|
|
43
42
|
expect(response.result.body).toContain('test_healthcheck_availability 1');
|
|
44
43
|
expect(response.result.body).toContain('test_healthcheck_latency_msecs 345');
|
|
@@ -57,7 +56,6 @@ describe('healthcheckMetricsPlugin', () => {
|
|
|
57
56
|
},
|
|
58
57
|
]);
|
|
59
58
|
const response = await (0, node_core_1.sendGet)((0, node_core_1.buildClient)('http://127.0.0.1:9080'), '/metrics');
|
|
60
|
-
console.log(response.result.body);
|
|
61
59
|
expect(response.result.statusCode).toBe(200);
|
|
62
60
|
expect(response.result.body).toContain('test_healthcheck_availability 0');
|
|
63
61
|
expect(response.result.body).toContain('test_healthcheck_latency_msecs 1450');
|
|
@@ -86,7 +84,6 @@ describe('healthcheckMetricsPlugin', () => {
|
|
|
86
84
|
},
|
|
87
85
|
]);
|
|
88
86
|
const response = await (0, node_core_1.sendGet)((0, node_core_1.buildClient)('http://127.0.0.1:9080'), '/metrics');
|
|
89
|
-
console.log(response.result.body);
|
|
90
87
|
expect(response.result.statusCode).toBe(200);
|
|
91
88
|
expect(response.result.body).toContain('test_healthcheck_1_availability 1');
|
|
92
89
|
expect(response.result.body).toContain('test_healthcheck_1_latency_msecs 345');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healthcheckMetricsPlugin.spec.js","sourceRoot":"","sources":["../../lib/plugins/healthcheckMetricsPlugin.spec.ts"],"names":[],"mappings":";;;AAAA,mDAA0D;AAE1D,8DAA6B;AAG7B,yEAAqE;AACrE,mDAA+C;AAE/C,IAAI,GAAoB,CAAA;AAExB,KAAK,UAAU,OAAO,CAAC,YAAqC;IAC1D,MAAM,OAAO,GAAG,IAAA,iBAAO,GAAE,CAAA;IACzB,GAAG,GAAG,OAAO,CAAA;IACb,MAAM,GAAG,CAAC,QAAQ,CAAC,6BAAa,EAAE;QAChC,WAAW,EAAE,SAAS;QACtB,aAAa,EAAE,KAAK;QACpB,mBAAmB,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG;KAC3C,CAAC,CAAA;IACF,MAAM,GAAG,CAAC,QAAQ,CAAC,mDAAwB,EAAE;QAC3C,YAAY;KACb,CAAC,CAAA;IAEF,MAAM,GAAG,CAAC,KAAK,EAAE,CAAA;IACjB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,GAAG,GAAG,MAAM,OAAO,CAAC;YAClB;gBACE,IAAI,EAAE,kBAAkB;gBACxB,4DAA4D;gBAC5D,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,OAAO;wBACL,WAAW,EAAE,IAAI;wBACjB,gBAAgB,EAAE,GAAG;qBACtB,CAAA;gBACH,CAAC;aACF;SACF,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAO,EAAC,IAAA,uBAAW,EAAC,uBAAuB,CAAC,EAAE,UAAU,CAAC,CAAA;QAEhF,
|
|
1
|
+
{"version":3,"file":"healthcheckMetricsPlugin.spec.js","sourceRoot":"","sources":["../../lib/plugins/healthcheckMetricsPlugin.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,16 @@ import type { Either } from '@lokalise/node-core';
|
|
|
2
2
|
import type { FastifyInstance } from 'fastify';
|
|
3
3
|
export interface PublicHealthcheckPluginOptions {
|
|
4
4
|
responsePayload?: Record<string, unknown>;
|
|
5
|
+
url?: string;
|
|
6
|
+
logLevel?: 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'silent';
|
|
5
7
|
healthChecks: readonly HealthCheck[];
|
|
6
8
|
}
|
|
7
|
-
export type
|
|
9
|
+
export type HealthChecker = (app: FastifyInstance) => Promise<Either<Error, true>>;
|
|
10
|
+
export type HealthCheck = {
|
|
11
|
+
name: string;
|
|
12
|
+
isMandatory: boolean;
|
|
13
|
+
checker: HealthChecker;
|
|
14
|
+
};
|
|
8
15
|
declare function plugin(app: FastifyInstance, opts: PublicHealthcheckPluginOptions, done: () => void): void;
|
|
9
16
|
export declare const publicHealthcheckPlugin: typeof plugin;
|
|
10
17
|
export {};
|
|
@@ -6,29 +6,46 @@ const fastify_plugin_1 = tslib_1.__importDefault(require("fastify-plugin"));
|
|
|
6
6
|
function plugin(app, opts, done) {
|
|
7
7
|
const responsePayload = opts.responsePayload ?? {};
|
|
8
8
|
app.route({
|
|
9
|
-
url: '/',
|
|
9
|
+
url: opts.url ?? '/health',
|
|
10
10
|
method: 'GET',
|
|
11
|
-
logLevel: '
|
|
11
|
+
logLevel: opts.logLevel ?? 'info',
|
|
12
12
|
schema: {
|
|
13
13
|
// hide route from swagger plugins
|
|
14
14
|
// @ts-expect-error
|
|
15
15
|
hide: true,
|
|
16
16
|
},
|
|
17
17
|
handler: async (_, reply) => {
|
|
18
|
-
let
|
|
18
|
+
let isFullyHealthy = true;
|
|
19
|
+
let isPartiallyHealthy = false;
|
|
20
|
+
const healthChecks = {};
|
|
19
21
|
if (opts.healthChecks.length) {
|
|
20
22
|
const results = await Promise.all(opts.healthChecks.map((healthcheck) => {
|
|
21
|
-
return healthcheck(app)
|
|
23
|
+
return healthcheck.checker(app).then((result) => {
|
|
24
|
+
return {
|
|
25
|
+
name: healthcheck.name,
|
|
26
|
+
result,
|
|
27
|
+
isMandatory: healthcheck.isMandatory,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
22
30
|
}));
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
for (let i = 0; i < results.length; i++) {
|
|
32
|
+
const entry = results[i];
|
|
33
|
+
healthChecks[entry.name] = entry.result.error ? 'FAIL' : 'HEALTHY';
|
|
34
|
+
if (entry.result.error && opts.healthChecks[i].isMandatory) {
|
|
35
|
+
isFullyHealthy = false;
|
|
36
|
+
isPartiallyHealthy = false;
|
|
37
|
+
}
|
|
38
|
+
// Check if we are only partially healthy (only optional dependencies are failing)
|
|
39
|
+
if (isFullyHealthy && entry.result.error && !opts.healthChecks[i].isMandatory) {
|
|
40
|
+
isFullyHealthy = false;
|
|
41
|
+
isPartiallyHealthy = true;
|
|
42
|
+
}
|
|
27
43
|
}
|
|
28
44
|
}
|
|
29
|
-
return reply.status(
|
|
45
|
+
return reply.status(isFullyHealthy || isPartiallyHealthy ? 200 : 500).send({
|
|
30
46
|
...responsePayload,
|
|
31
|
-
|
|
47
|
+
checks: healthChecks,
|
|
48
|
+
heartbeat: isFullyHealthy ? 'HEALTHY' : isPartiallyHealthy ? 'PARTIALLY_HEALTHY' : 'FAIL',
|
|
32
49
|
});
|
|
33
50
|
},
|
|
34
51
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicHealthcheckPlugin.js","sourceRoot":"","sources":["../../lib/plugins/publicHealthcheckPlugin.ts"],"names":[],"mappings":";;;;AAEA,4EAA+B;
|
|
1
|
+
{"version":3,"file":"publicHealthcheckPlugin.js","sourceRoot":"","sources":["../../lib/plugins/publicHealthcheckPlugin.ts"],"names":[],"mappings":";;;;AAEA,4EAA+B;AAiB/B,SAAS,MAAM,CAAC,GAAoB,EAAE,IAAoC,EAAE,IAAgB;IAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,EAAE,CAAA;IAClD,GAAG,CAAC,KAAK,CAAC;QACR,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,SAAS;QAC1B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;QACjC,MAAM,EAAE;YACN,kCAAkC;YAClC,mBAAmB;YACnB,IAAI,EAAE,IAAI;SACX;QACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;YAC1B,IAAI,cAAc,GAAG,IAAI,CAAA;YACzB,IAAI,kBAAkB,GAAG,KAAK,CAAA;YAC9B,MAAM,YAAY,GAA4B,EAAE,CAAA;YAEhD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;gBAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;oBACpC,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;wBAC9C,OAAO;4BACL,IAAI,EAAE,WAAW,CAAC,IAAI;4BACtB,MAAM;4BACN,WAAW,EAAE,WAAW,CAAC,WAAW;yBACrC,CAAA;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CACH,CAAA;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACvC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;oBACxB,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;oBAClE,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;wBAC1D,cAAc,GAAG,KAAK,CAAA;wBACtB,kBAAkB,GAAG,KAAK,CAAA;qBAC3B;oBAED,kFAAkF;oBAClF,IAAI,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;wBAC7E,cAAc,GAAG,KAAK,CAAA;wBACtB,kBAAkB,GAAG,IAAI,CAAA;qBAC1B;iBACF;aACF;YAED,OAAO,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACzE,GAAG,eAAe;gBAClB,MAAM,EAAE,YAAY;gBACpB,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM;aAC1F,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IACF,IAAI,EAAE,CAAA;AACR,CAAC;AAEY,QAAA,uBAAuB,GAAG,IAAA,wBAAE,EAAC,MAAM,EAAE;IAChD,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,2BAA2B;CAClC,CAAC,CAAA"}
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const fastify_1 = tslib_1.__importDefault(require("fastify"));
|
|
5
5
|
const publicHealthcheckPlugin_1 = require("./publicHealthcheckPlugin");
|
|
6
|
-
const
|
|
6
|
+
const positiveHealthcheckChecker = () => {
|
|
7
7
|
return Promise.resolve({ result: true });
|
|
8
8
|
};
|
|
9
|
-
const
|
|
9
|
+
const negativeHealthcheckChecker = () => {
|
|
10
10
|
return Promise.resolve({ error: new Error('Something exploded') });
|
|
11
11
|
};
|
|
12
12
|
async function initApp(opts) {
|
|
@@ -22,33 +22,102 @@ describe('publicHealthcheckPlugin', () => {
|
|
|
22
22
|
});
|
|
23
23
|
it('returns a heartbeat', async () => {
|
|
24
24
|
app = await initApp({ healthChecks: [] });
|
|
25
|
+
const response = await app.inject().get('/health').end();
|
|
26
|
+
expect(response.statusCode).toBe(200);
|
|
27
|
+
expect(response.json()).toEqual({ heartbeat: 'HEALTHY', checks: {} });
|
|
28
|
+
});
|
|
29
|
+
it('returns a heartbeat on a custom endpoint', async () => {
|
|
30
|
+
app = await initApp({ healthChecks: [], url: '/' });
|
|
25
31
|
const response = await app.inject().get('/').end();
|
|
26
32
|
expect(response.statusCode).toBe(200);
|
|
27
|
-
expect(response.json()).toEqual({ heartbeat: 'HEALTHY' });
|
|
33
|
+
expect(response.json()).toEqual({ heartbeat: 'HEALTHY', checks: {} });
|
|
28
34
|
});
|
|
29
35
|
it('returns custom heartbeat', async () => {
|
|
30
36
|
app = await initApp({ responsePayload: { version: 1 }, healthChecks: [] });
|
|
31
|
-
const response = await app.inject().get('/').end();
|
|
37
|
+
const response = await app.inject().get('/health').end();
|
|
32
38
|
expect(response.statusCode).toBe(200);
|
|
33
|
-
expect(response.json()).toEqual({ heartbeat: 'HEALTHY', version: 1 });
|
|
39
|
+
expect(response.json()).toEqual({ heartbeat: 'HEALTHY', version: 1, checks: {} });
|
|
34
40
|
});
|
|
35
|
-
it('returns false if one healthcheck fails', async () => {
|
|
41
|
+
it('returns false if one mandatory healthcheck fails', async () => {
|
|
36
42
|
app = await initApp({
|
|
37
43
|
responsePayload: { version: 1 },
|
|
38
|
-
healthChecks: [
|
|
44
|
+
healthChecks: [
|
|
45
|
+
{
|
|
46
|
+
name: 'check1',
|
|
47
|
+
isMandatory: true,
|
|
48
|
+
checker: negativeHealthcheckChecker,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'check2',
|
|
52
|
+
isMandatory: true,
|
|
53
|
+
checker: positiveHealthcheckChecker,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
39
56
|
});
|
|
40
|
-
const response = await app.inject().get('/').end();
|
|
57
|
+
const response = await app.inject().get('/health').end();
|
|
41
58
|
expect(response.statusCode).toBe(500);
|
|
42
|
-
expect(response.json()).toEqual({
|
|
59
|
+
expect(response.json()).toEqual({
|
|
60
|
+
heartbeat: 'FAIL',
|
|
61
|
+
version: 1,
|
|
62
|
+
checks: {
|
|
63
|
+
check1: 'FAIL',
|
|
64
|
+
check2: 'HEALTHY',
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it('returns partial if optional healthcheck fails', async () => {
|
|
69
|
+
app = await initApp({
|
|
70
|
+
responsePayload: { version: 1 },
|
|
71
|
+
healthChecks: [
|
|
72
|
+
{
|
|
73
|
+
name: 'check1',
|
|
74
|
+
isMandatory: false,
|
|
75
|
+
checker: negativeHealthcheckChecker,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'check2',
|
|
79
|
+
isMandatory: true,
|
|
80
|
+
checker: positiveHealthcheckChecker,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
const response = await app.inject().get('/health').end();
|
|
85
|
+
expect(response.statusCode).toBe(200);
|
|
86
|
+
expect(response.json()).toEqual({
|
|
87
|
+
heartbeat: 'PARTIALLY_HEALTHY',
|
|
88
|
+
version: 1,
|
|
89
|
+
checks: {
|
|
90
|
+
check1: 'FAIL',
|
|
91
|
+
check2: 'HEALTHY',
|
|
92
|
+
},
|
|
93
|
+
});
|
|
43
94
|
});
|
|
44
95
|
it('returns true if all healthchecks pass', async () => {
|
|
45
96
|
app = await initApp({
|
|
46
97
|
responsePayload: { version: 1 },
|
|
47
|
-
healthChecks: [
|
|
98
|
+
healthChecks: [
|
|
99
|
+
{
|
|
100
|
+
name: 'check1',
|
|
101
|
+
isMandatory: true,
|
|
102
|
+
checker: positiveHealthcheckChecker,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'check2',
|
|
106
|
+
isMandatory: true,
|
|
107
|
+
checker: positiveHealthcheckChecker,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
48
110
|
});
|
|
49
|
-
const response = await app.inject().get('/').end();
|
|
111
|
+
const response = await app.inject().get('/health').end();
|
|
50
112
|
expect(response.statusCode).toBe(200);
|
|
51
|
-
expect(response.json()).toEqual({
|
|
113
|
+
expect(response.json()).toEqual({
|
|
114
|
+
heartbeat: 'HEALTHY',
|
|
115
|
+
version: 1,
|
|
116
|
+
checks: {
|
|
117
|
+
check1: 'HEALTHY',
|
|
118
|
+
check2: 'HEALTHY',
|
|
119
|
+
},
|
|
120
|
+
});
|
|
52
121
|
});
|
|
53
122
|
});
|
|
54
123
|
//# sourceMappingURL=publicHealthcheckPlugin.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicHealthcheckPlugin.spec.js","sourceRoot":"","sources":["../../lib/plugins/publicHealthcheckPlugin.spec.ts"],"names":[],"mappings":";;;AACA,8DAA6B;AAG7B,uEAAmE;AAEnE,MAAM,
|
|
1
|
+
{"version":3,"file":"publicHealthcheckPlugin.spec.js","sourceRoot":"","sources":["../../lib/plugins/publicHealthcheckPlugin.spec.ts"],"names":[],"mappings":"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"}
|