@cryptexlabs/codex-nodejs-common 0.10.13 → 0.10.15

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cryptexlabs/codex-nodejs-common",
3
- "version": "0.10.13",
3
+ "version": "0.10.15",
4
4
  "description": "Common code for Codex framework",
5
5
  "main": "lib/src/index.js",
6
6
  "repository": "git@gitlab.com:cryptexlabs/public/codex-nodejs-common.git",
@@ -33,12 +33,13 @@
33
33
  "@types/joi": "14.3.4",
34
34
  "@types/jsonwebtoken": "8.5.5",
35
35
  "@types/node": "20.11.30",
36
+ "@types/watch": "^1.0.6",
36
37
  "class-transformer": "^0.5.1",
37
38
  "class-validator": "^0.14.1",
38
39
  "dotenv": "8.2.0",
39
40
  "express": "4.17.1",
40
41
  "fastq": "1.13.0",
41
- "glob": "7.2.0",
42
+ "glob": "^11.0.0",
42
43
  "i18n": "0.13.2",
43
44
  "install-peers-cli": "2.2.0",
44
45
  "joi": "17.3.0",
@@ -47,7 +48,8 @@
47
48
  "kafkajs": "2.2.0",
48
49
  "randomstring": "1.2.1",
49
50
  "reflect-metadata": "0.1.13",
50
- "uuid": "8.3.2"
51
+ "uuid": "8.3.2",
52
+ "watch": "^1.0.2"
51
53
  },
52
54
  "devDependencies": {
53
55
  "@nestjs/testing": "8.0.6",
@@ -12,11 +12,24 @@ import { LOG_LEVEL } from "./logging-config.interface";
12
12
  export declare class DefaultConfig implements JsonSerializableInterface<any> {
13
13
  private readonly _clientId;
14
14
  private _appName;
15
+ private _serverConfig;
16
+ private _configUpdateQueue;
17
+ private _monitors;
18
+ private _pathsWatching;
15
19
  private readonly _basePath;
16
20
  private readonly _envName;
17
21
  private _packageVersion;
18
22
  private readonly _appPath;
23
+ private _configChangeLoaderEventHandler;
19
24
  constructor(basePath: string, appPath: string, _clientId: string, fallbackEnvironment?: string);
25
+ setConfigChangeLoaderEventHandler(eventHandler: () => Promise<void>): void;
26
+ private _onConfigUpdateQueueMessage;
27
+ getServerConfig<C = any>(): C;
28
+ private _loadServerConfig;
29
+ private _startConfigPatchWatch;
30
+ private _loadConfigPath;
31
+ private _loadConfigPatterns;
32
+ private get _hotReload();
20
33
  toJSON(): {
21
34
  fallbackLanguage: LanguageCode;
22
35
  fallbackCountry: CountryCode;
@@ -19,6 +19,11 @@ const common_1 = require("@nestjs/common");
19
19
  const elasticsearch_config_1 = require("./elasticsearch-config");
20
20
  const consumer_type_enum_1 = require("./consumer-type.enum");
21
21
  const logging_config_interface_1 = require("./logging-config.interface");
22
+ const path_1 = require("path");
23
+ const yaml = require("js-yaml");
24
+ const glob = require("glob");
25
+ const watch = require("watch");
26
+ const fastq = require("fastq");
22
27
  let DefaultConfig = class DefaultConfig {
23
28
  constructor(basePath, appPath, _clientId, fallbackEnvironment) {
24
29
  this._clientId = _clientId;
@@ -26,6 +31,94 @@ let DefaultConfig = class DefaultConfig {
26
31
  this._appPath = appPath;
27
32
  this._envName = process.env.ENV_NAME || fallbackEnvironment || "";
28
33
  this.setup(basePath, appPath, this._envName);
34
+ this._configUpdateQueue = fastq((path, cb) => {
35
+ this._onConfigUpdateQueueMessage(path).then(() => {
36
+ cb(null);
37
+ });
38
+ }, 1);
39
+ this._monitors = [];
40
+ this._pathsWatching = [];
41
+ }
42
+ setConfigChangeLoaderEventHandler(eventHandler) {
43
+ this._configChangeLoaderEventHandler = eventHandler;
44
+ }
45
+ async _onConfigUpdateQueueMessage(path) {
46
+ this._serverConfig = this._loadServerConfig(false);
47
+ if (this._configChangeLoaderEventHandler) {
48
+ await this._configChangeLoaderEventHandler();
49
+ }
50
+ }
51
+ getServerConfig() {
52
+ if (!this._serverConfig) {
53
+ this._serverConfig = this._loadServerConfig(true);
54
+ }
55
+ return this._serverConfig;
56
+ }
57
+ _loadServerConfig(startWatchers) {
58
+ const serverConfigPath = process.env.SERVER_CONFIG_PATH || `${this._appPath}/config/server.yaml`;
59
+ let serverConfig = {};
60
+ if (fs.existsSync(serverConfigPath)) {
61
+ serverConfig = this._loadConfigPath(serverConfigPath);
62
+ if (startWatchers) {
63
+ this._startConfigPatchWatch(serverConfigPath);
64
+ }
65
+ }
66
+ if (process.env.SERVER_CONFIG_PATTERN) {
67
+ serverConfig = this._loadConfigPatterns(serverConfig, startWatchers);
68
+ }
69
+ console.log(`Server Config`, JSON.stringify(serverConfig, undefined, 2));
70
+ return serverConfig;
71
+ }
72
+ _startConfigPatchWatch(path) {
73
+ if (this._hotReload) {
74
+ console.log(`Starting watch for path ${path}`);
75
+ const parent = (0, path_1.dirname)(path);
76
+ if (!this._monitors.includes(parent)) {
77
+ this._monitors.push(parent);
78
+ console.log(`Creating monitor for directory ${parent}`);
79
+ watch.createMonitor((0, path_1.dirname)(path), {}, (monitor) => {
80
+ monitor.on("changed", (f, curr, prev) => {
81
+ if (typeof f === "string") {
82
+ if (this._pathsWatching.includes(f)) {
83
+ console.log(`Config changed for path ${f}. Queueing update`);
84
+ this._configUpdateQueue.push(f);
85
+ }
86
+ }
87
+ });
88
+ });
89
+ }
90
+ if (!this._pathsWatching.includes(path)) {
91
+ this._pathsWatching.push(path);
92
+ }
93
+ }
94
+ }
95
+ _loadConfigPath(serverConfigPath) {
96
+ const updatedServerConfig = yaml.load(fs.readFileSync(serverConfigPath).toString());
97
+ if (typeof updatedServerConfig !== "object") {
98
+ throw new Error(`Invalid config in file ${serverConfigPath} with env variable SERVER_CONFIG_PATH or default path: ${this._appPath}/config/server.yaml`);
99
+ }
100
+ return updatedServerConfig;
101
+ }
102
+ _loadConfigPatterns(serverConfig, startWatchers) {
103
+ const paths = glob.sync(process.env.SERVER_CONFIG_PATTERN);
104
+ console.log(`paths`, paths);
105
+ const serverConfigUpdated = serverConfig;
106
+ for (const path of paths) {
107
+ if (!path.includes(".yaml")) {
108
+ throw new Error(`Invalid path ${path} found for pattern ${process.env.SERVER_CONFIG_PATTERN} with env variable SERVER_CONFIG_PATTERN`);
109
+ }
110
+ const c = yaml.load(fs.readFileSync(path).toString());
111
+ if (typeof c !== "object") {
112
+ throw new Error(`Invalid config in file ${path}`);
113
+ }
114
+ if (startWatchers) {
115
+ this._startConfigPatchWatch(path);
116
+ }
117
+ }
118
+ return serverConfigUpdated;
119
+ }
120
+ get _hotReload() {
121
+ return process.env.SERVER_CONFIG_HOT_RELOAD !== "false";
29
122
  }
30
123
  toJSON() {
31
124
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../../src/config/default-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../../src/config/default-config.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,8 @@ let FloatValidationPipe = class FloatValidationPipe {
17
17
  this._schema = Joi.number();
18
18
  }
19
19
  transform(value, metadata) {
20
- const { error } = this._schema.validate(value.data);
21
- if (error) {
22
- throw new common_1.BadRequestException(error.message);
20
+ if (parseFloat(value).toString() !== value.toString()) {
21
+ throw new common_1.BadRequestException(`${value} must be a float`);
23
22
  }
24
23
  return value;
25
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"float.validation.pipe.js","sourceRoot":"","sources":["../../../src/pipe/float.validation.pipe.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,2BAA2B;AAGpB,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE9B;QACE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEM,SAAS,CAAC,KAAU,EAAE,QAA0B;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAbY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;;GACA,mBAAmB,CAa/B"}
1
+ {"version":3,"file":"float.validation.pipe.js","sourceRoot":"","sources":["../../../src/pipe/float.validation.pipe.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,2BAA2B;AAGpB,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAE9B;QACE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAEM,SAAS,CAAC,KAAU,EAAE,QAA0B;QACrD,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,4BAAmB,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAZY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;;GACA,mBAAmB,CAY/B"}
@@ -1,6 +1,4 @@
1
1
  import { ArgumentMetadata, PipeTransform } from "@nestjs/common";
2
2
  export declare class IntegerValidationPipe implements PipeTransform {
3
- private _schema;
4
- constructor();
5
3
  transform(value: any, metadata: ArgumentMetadata): any;
6
4
  }
@@ -5,28 +5,19 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
8
  Object.defineProperty(exports, "__esModule", { value: true });
12
9
  exports.IntegerValidationPipe = void 0;
13
10
  const common_1 = require("@nestjs/common");
14
- const Joi = require("joi");
15
11
  let IntegerValidationPipe = class IntegerValidationPipe {
16
- constructor() {
17
- this._schema = Joi.number().integer();
18
- }
19
12
  transform(value, metadata) {
20
- const { error } = this._schema.validate(value.data);
21
- if (error) {
22
- throw new common_1.BadRequestException(error.message);
13
+ if (parseInt(value, 10).toString() !== value.toString()) {
14
+ throw new common_1.BadRequestException(`${value} must be an integer`);
23
15
  }
24
16
  return value;
25
17
  }
26
18
  };
27
19
  exports.IntegerValidationPipe = IntegerValidationPipe;
28
20
  exports.IntegerValidationPipe = IntegerValidationPipe = __decorate([
29
- (0, common_1.Injectable)(),
30
- __metadata("design:paramtypes", [])
21
+ (0, common_1.Injectable)()
31
22
  ], IntegerValidationPipe);
32
23
  //# sourceMappingURL=integer.validation.pipe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integer.validation.pipe.js","sourceRoot":"","sources":["../../../src/pipe/integer.validation.pipe.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,2BAA2B;AAGpB,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAEhC;QACE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAEM,SAAS,CAAC,KAAU,EAAE,QAA0B;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAbY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;;GACA,qBAAqB,CAajC"}
1
+ {"version":3,"file":"integer.validation.pipe.js","sourceRoot":"","sources":["../../../src/pipe/integer.validation.pipe.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AAGjB,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACzB,SAAS,CAAC,KAAU,EAAE,QAA0B;QACrD,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;YACxD,MAAM,IAAI,4BAAmB,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAPY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAOjC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cryptexlabs/codex-nodejs-common",
3
- "version": "0.10.13",
3
+ "version": "0.10.15",
4
4
  "description": "Common code for Codex framework",
5
5
  "main": "lib/src/index.js",
6
6
  "repository": "git@gitlab.com:cryptexlabs/public/codex-nodejs-common.git",
@@ -33,12 +33,13 @@
33
33
  "@types/joi": "14.3.4",
34
34
  "@types/jsonwebtoken": "8.5.5",
35
35
  "@types/node": "20.11.30",
36
+ "@types/watch": "^1.0.6",
36
37
  "class-transformer": "^0.5.1",
37
38
  "class-validator": "^0.14.1",
38
39
  "dotenv": "8.2.0",
39
40
  "express": "4.17.1",
40
41
  "fastq": "1.13.0",
41
- "glob": "7.2.0",
42
+ "glob": "^11.0.0",
42
43
  "i18n": "0.13.2",
43
44
  "install-peers-cli": "2.2.0",
44
45
  "joi": "17.3.0",
@@ -47,7 +48,8 @@
47
48
  "kafkajs": "2.2.0",
48
49
  "randomstring": "1.2.1",
49
50
  "reflect-metadata": "0.1.13",
50
- "uuid": "8.3.2"
51
+ "uuid": "8.3.2",
52
+ "watch": "^1.0.2"
51
53
  },
52
54
  "devDependencies": {
53
55
  "@nestjs/testing": "8.0.6",
@@ -1,3 +1,4 @@
1
+ /* tslint:disable:no-console */
1
2
  import {
2
3
  CodexMetaTypeEnum,
3
4
  CountryCode,
@@ -20,15 +21,26 @@ import { ConsumerTypeEnum } from "./consumer-type.enum";
20
21
  import { JsonSerializableInterface } from "../message";
21
22
  import { TelemetryConfigInterface } from "./telemetry-config.interface";
22
23
  import { LOG_LEVEL, DEFAULT_LOG_LEVELS } from "./logging-config.interface";
24
+ import { dirname } from "path";
25
+ import * as yaml from "js-yaml";
26
+ import * as glob from "glob";
27
+ import * as watch from "watch";
28
+ import * as fastq from "fastq";
23
29
 
24
30
  @Injectable()
25
31
  export class DefaultConfig implements JsonSerializableInterface<any> {
26
32
  private _appName: string;
27
33
 
34
+ private _serverConfig;
35
+ private _configUpdateQueue;
36
+ private _monitors: string[];
37
+ private _pathsWatching: string[];
38
+
28
39
  private readonly _basePath: string;
29
40
  private readonly _envName: string;
30
41
  private _packageVersion: string;
31
42
  private readonly _appPath: string;
43
+ private _configChangeLoaderEventHandler: () => Promise<void>;
32
44
 
33
45
  constructor(
34
46
  basePath: string,
@@ -40,6 +52,117 @@ export class DefaultConfig implements JsonSerializableInterface<any> {
40
52
  this._appPath = appPath;
41
53
  this._envName = process.env.ENV_NAME || fallbackEnvironment || "";
42
54
  this.setup(basePath, appPath, this._envName);
55
+
56
+ this._configUpdateQueue = fastq((path, cb) => {
57
+ this._onConfigUpdateQueueMessage(path).then(() => {
58
+ cb(null);
59
+ });
60
+ }, 1);
61
+ this._monitors = [];
62
+ this._pathsWatching = [];
63
+ }
64
+
65
+ setConfigChangeLoaderEventHandler(eventHandler: () => Promise<void>): void {
66
+ this._configChangeLoaderEventHandler = eventHandler;
67
+ }
68
+
69
+ private async _onConfigUpdateQueueMessage(path) {
70
+ this._serverConfig = this._loadServerConfig(false);
71
+ if (this._configChangeLoaderEventHandler) {
72
+ await this._configChangeLoaderEventHandler();
73
+ }
74
+ }
75
+
76
+ public getServerConfig<C = any>(): C {
77
+ if (!this._serverConfig) {
78
+ this._serverConfig = this._loadServerConfig(true);
79
+ }
80
+ return this._serverConfig;
81
+ }
82
+
83
+ private _loadServerConfig(startWatchers: boolean): any {
84
+ const serverConfigPath =
85
+ process.env.SERVER_CONFIG_PATH || `${this._appPath}/config/server.yaml`;
86
+
87
+ let serverConfig = {} as any;
88
+
89
+ if (fs.existsSync(serverConfigPath)) {
90
+ serverConfig = this._loadConfigPath(serverConfigPath);
91
+ if (startWatchers) {
92
+ this._startConfigPatchWatch(serverConfigPath);
93
+ }
94
+ }
95
+
96
+ if (process.env.SERVER_CONFIG_PATTERN) {
97
+ serverConfig = this._loadConfigPatterns(serverConfig, startWatchers);
98
+ }
99
+
100
+ console.log(`Server Config`, JSON.stringify(serverConfig, undefined, 2));
101
+
102
+ return serverConfig;
103
+ }
104
+
105
+ private _startConfigPatchWatch(path: string) {
106
+ if (this._hotReload) {
107
+ console.log(`Starting watch for path ${path}`);
108
+ const parent = dirname(path);
109
+ if (!this._monitors.includes(parent)) {
110
+ this._monitors.push(parent);
111
+ console.log(`Creating monitor for directory ${parent}`);
112
+ watch.createMonitor(dirname(path), {}, (monitor) => {
113
+ monitor.on("changed", (f, curr, prev) => {
114
+ if (typeof f === "string") {
115
+ if (this._pathsWatching.includes(f)) {
116
+ console.log(`Config changed for path ${f}. Queueing update`);
117
+ this._configUpdateQueue.push(f);
118
+ }
119
+ }
120
+ });
121
+ });
122
+ }
123
+ if (!this._pathsWatching.includes(path)) {
124
+ this._pathsWatching.push(path);
125
+ }
126
+ }
127
+ }
128
+
129
+ private _loadConfigPath(serverConfigPath: string): any {
130
+ const updatedServerConfig = yaml.load(
131
+ fs.readFileSync(serverConfigPath).toString()
132
+ );
133
+ if (typeof updatedServerConfig !== "object") {
134
+ throw new Error(
135
+ `Invalid config in file ${serverConfigPath} with env variable SERVER_CONFIG_PATH or default path: ${this._appPath}/config/server.yaml`
136
+ );
137
+ }
138
+ return updatedServerConfig as any;
139
+ }
140
+
141
+ private _loadConfigPatterns(serverConfig: any, startWatchers: boolean) {
142
+ const paths = glob.sync(process.env.SERVER_CONFIG_PATTERN);
143
+ console.log(`paths`, paths);
144
+ const serverConfigUpdated = serverConfig;
145
+ for (const path of paths) {
146
+ if (!path.includes(".yaml")) {
147
+ throw new Error(
148
+ `Invalid path ${path} found for pattern ${process.env.SERVER_CONFIG_PATTERN} with env variable SERVER_CONFIG_PATTERN`
149
+ );
150
+ }
151
+
152
+ const c = yaml.load(fs.readFileSync(path).toString()) as any;
153
+ if (typeof c !== "object") {
154
+ throw new Error(`Invalid config in file ${path}`);
155
+ }
156
+
157
+ if (startWatchers) {
158
+ this._startConfigPatchWatch(path);
159
+ }
160
+ }
161
+ return serverConfigUpdated;
162
+ }
163
+
164
+ private get _hotReload() {
165
+ return process.env.SERVER_CONFIG_HOT_RELOAD !== "false";
43
166
  }
44
167
 
45
168
  public toJSON() {
@@ -14,9 +14,8 @@ export class FloatValidationPipe implements PipeTransform {
14
14
  }
15
15
 
16
16
  public transform(value: any, metadata: ArgumentMetadata): any {
17
- const { error } = this._schema.validate(value.data);
18
- if (error) {
19
- throw new BadRequestException(error.message);
17
+ if (parseFloat(value).toString() !== value.toString()) {
18
+ throw new BadRequestException(`${value} must be a float`);
20
19
  }
21
20
  return value;
22
21
  }
@@ -4,19 +4,12 @@ import {
4
4
  Injectable,
5
5
  PipeTransform,
6
6
  } from "@nestjs/common";
7
- import * as Joi from "joi";
8
7
 
9
8
  @Injectable()
10
9
  export class IntegerValidationPipe implements PipeTransform {
11
- private _schema: Joi.Schema;
12
- constructor() {
13
- this._schema = Joi.number().integer();
14
- }
15
-
16
10
  public transform(value: any, metadata: ArgumentMetadata): any {
17
- const { error } = this._schema.validate(value.data);
18
- if (error) {
19
- throw new BadRequestException(error.message);
11
+ if (parseInt(value, 10).toString() !== value.toString()) {
12
+ throw new BadRequestException(`${value} must be an integer`);
20
13
  }
21
14
  return value;
22
15
  }
@@ -19,6 +19,10 @@ jest.mock("fs", () => ({
19
19
  existsSync: jest.fn().mockImplementation((file) => file !== "/tmp/healthz"),
20
20
  }));
21
21
 
22
+ jest.mock("glob", () => ({
23
+ sync: jest.fn(),
24
+ }));
25
+
22
26
  describe("HealthzService", () => {
23
27
  let service: HealthzService;
24
28
  let config;
package/tsconfig.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "resolveJsonModule": true
17
17
  },
18
18
  "include": [
19
- "src/**/*"
19
+ "src/**/*", "node_modules/@types/node"
20
20
  ],
21
21
  "exclude": [
22
22
  "node_modules", "**/*.spec.ts"