backend-test-tools 1.2.2 → 1.2.4

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.
@@ -18,13 +18,13 @@ jobs:
18
18
 
19
19
  steps:
20
20
  - name: Checkout
21
- uses: actions/checkout@v4
21
+ uses: actions/checkout@v5
22
22
  with:
23
23
  fetch-depth: 0
24
24
  token: ${{ secrets.GITHUB_TOKEN }}
25
25
 
26
26
  - name: Setup Node.js
27
- uses: actions/setup-node@v4
27
+ uses: actions/setup-node@v5
28
28
  with:
29
29
  node-version: '22'
30
30
  registry-url: 'https://registry.npmjs.org'
package/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## [1.2.4](https://github.com/prakashmahendran/backend-test-tools/compare/v1.2.3...v1.2.4) (2026-11-12)
2
+
3
+ ### 🐛 Bug Fixes
4
+
5
+ * **ci:** use changelog preset compatible with semantic-release ([ac916dd](https://github.com/prakashmahendran/backend-test-tools/commit/ac916ddc071ab83e90c619f7b842b27ca7e5f45d))
6
+ * **deps:** patch vulnerable dependencies and make engine peer optional ([91f4d5b](https://github.com/prakashmahendran/backend-test-tools/commit/91f4d5bfad66dc343e0e2b200e05e895d6b83c85))
7
+
8
+ ### 📚 Documentation
9
+
10
+ * add CLAUDE.md with package overview and conventions ([e75a233](https://github.com/prakashmahendran/backend-test-tools/commit/e75a233c5cac6aa6d8290c85fe04f0f5f9d60fa8))
11
+
12
+ ## [1.2.3](https://github.com/prakashmahendran/backend-test-tools/compare/v1.2.2...v1.2.3) (2025-12-10)
13
+
14
+ ### 🐛 Bug Fixes
15
+
16
+ * es-lint ([d5b4d93](https://github.com/prakashmahendran/backend-test-tools/commit/d5b4d9357139d55672d0a16b636e6b07cd8703b2))
17
+
1
18
  ## [1.2.2](https://github.com/prakashmahendran/backend-test-tools/compare/v1.2.1...v1.2.2) (2025-12-10)
2
19
 
3
20
  ### 🐛 Bug Fixes
package/CLAUDE.md ADDED
@@ -0,0 +1,40 @@
1
+ # backend-test-tools
2
+
3
+ Test helpers (published to npm) for backend services generated from `node-server-template`. Services
4
+ install it as a **devDependency**.
5
+
6
+ - `node-server-engine` is an *optional* peer dependency: the stubs in `src/stubs/server-engine` wrap engine
7
+ classes, so consuming services already have it installed.
8
+ - `node-server-engine` must not depend on this package. The engine keeps its own test helpers to avoid a
9
+ circular dependency.
10
+
11
+ ## Commands
12
+
13
+ Node.js >= 22.
14
+
15
+ | Task | Command |
16
+ | --- | --- |
17
+ | Install | `npm ci` |
18
+ | Build to `dist/` (tsc for types + babel for JS) | `npm run build` |
19
+ | Lint | `npm run lint` |
20
+ | Tests | `npm test` (there are currently no test files; verify changes with `npm run build`) |
21
+
22
+ ## Layout (`src/`)
23
+
24
+ - `generators/`: `generateAccessToken` (HS256 JWT signed with `JWT_SECRET`, matching the engine's test
25
+ mode), `generateEcdsaKeyPair`, `generateRsaKeyPair`, `generateUserCrypto`, `generateImageBuffer`
26
+ (uses `sharp`), `generateLocale`.
27
+ - `utils/`: `getBearer`, `jwtRequest`/`staticRequest`/`tlsRequest` (supertest wrappers), `mockRequest`
28
+ (Express request/response/next mocks), `generateCerts` (`generatePkiEnvironment`, which uses `node-forge`
29
+ to write a CA plus client/server certificates to `./certs`).
30
+ - `factory/`: `factory.build('user')` / `buildMany` for plain test objects.
31
+ - `stubs/server-engine/`: sinon stubs for engine features (`PubSub`, `PushNotification`, `sendPush`,
32
+ `Localizator`).
33
+ - `index.ts`: public exports.
34
+
35
+ ## Conventions
36
+
37
+ - Runtime `dependencies` are what consumers need at test time (`jsonwebtoken`, `node-forge`, `sharp`,
38
+ `sinon`, `supertest`). Build-only tooling goes in `devDependencies`.
39
+ - Never commit generated keys or certificates. `certs/` is created at test time.
40
+ - Conventional commits. Pushing to `main` triggers semantic-release, which publishes to npm.
@@ -1,6 +1,6 @@
1
1
  import { Request, Response, NextFunction } from 'express';
2
2
  interface MockResponse extends Response {
3
- body?: any;
3
+ body?: unknown;
4
4
  headers?: Record<string, string>;
5
5
  }
6
6
  /**
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.stubSendPush = stubSendPush;
7
7
  var sendPush = _interopRequireWildcard(require("node-server-engine/dist/utils/sendPush/sendPush"));
8
8
  var _sinon = require("sinon");
9
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
9
+ var cache;
10
+ function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var r, c, a = Object.defineProperty, n = { __proto__: null, default: e }; if (Object(e) !== e) return n; if (cache || "function" != typeof WeakMap || (cache = new WeakMap()), cache) { if (cache.has(e)) return cache.get(e); cache.set(e, n); } for (c in e) "default" !== c && {}.hasOwnProperty.call(e, c) && ((r = a && Object.getOwnPropertyDescriptor(e, c)) && (r.get || r.set) ? a(n, c, r) : n[c] = e[c]); return n; }
10
11
  /** Stub the sendPush function */
11
12
  function stubSendPush() {
12
13
  return (0, _sinon.stub)(sendPush, 'sendPush').resolves();
@@ -1 +1 @@
1
- {"version":3,"file":"sendPush.js","names":["sendPush","_interopRequireWildcard","require","_sinon","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","stubSendPush","stub","resolves"],"sources":["../../../src/stubs/server-engine/sendPush.ts"],"sourcesContent":["import * as sendPush from 'node-server-engine/dist/utils/sendPush/sendPush';\nimport {SinonStub, stub} from 'sinon';\n\n/** Stub the sendPush function */\nexport function stubSendPush(): SinonStub {\n return stub(sendPush, 'sendPush').resolves();\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsC,SAAAD,wBAAAG,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAL,uBAAA,YAAAA,CAAAG,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAEtC;AACO,SAASkB,YAAYA,CAAA,EAAc;EACxC,OAAO,IAAAC,WAAI,EAACxB,QAAQ,EAAE,UAAU,CAAC,CAACyB,QAAQ,CAAC,CAAC;AAC9C","ignoreList":[]}
1
+ {"version":3,"file":"sendPush.js","names":["sendPush","_interopRequireWildcard","require","_sinon","cache","e","t","__esModule","r","c","a","Object","defineProperty","n","__proto__","default","WeakMap","has","get","set","hasOwnProperty","call","getOwnPropertyDescriptor","stubSendPush","stub","resolves"],"sources":["../../../src/stubs/server-engine/sendPush.ts"],"sourcesContent":["import * as sendPush from 'node-server-engine/dist/utils/sendPush/sendPush';\nimport {SinonStub, stub} from 'sinon';\n\n/** Stub the sendPush function */\nexport function stubSendPush(): SinonStub {\n return stub(sendPush, 'sendPush').resolves();\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAsC,IAAAE,KAAA;AAAA,SAAAH,wBAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAE,UAAA,SAAAF,CAAA,MAAAG,CAAA,EAAAC,CAAA,EAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,QAAAM,MAAA,CAAAN,CAAA,MAAAA,CAAA,SAAAQ,CAAA,MAAAT,KAAA,yBAAAY,OAAA,KAAAZ,KAAA,OAAAY,OAAA,KAAAZ,KAAA,QAAAA,KAAA,CAAAa,GAAA,CAAAZ,CAAA,UAAAD,KAAA,CAAAc,GAAA,CAAAb,CAAA,GAAAD,KAAA,CAAAe,GAAA,CAAAd,CAAA,EAAAQ,CAAA,UAAAJ,CAAA,IAAAJ,CAAA,gBAAAI,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAI,CAAA,OAAAD,CAAA,GAAAE,CAAA,IAAAC,MAAA,CAAAW,wBAAA,CAAAjB,CAAA,EAAAI,CAAA,OAAAD,CAAA,CAAAU,GAAA,IAAAV,CAAA,CAAAW,GAAA,IAAAT,CAAA,CAAAG,CAAA,EAAAJ,CAAA,EAAAD,CAAA,IAAAK,CAAA,CAAAJ,CAAA,IAAAJ,CAAA,CAAAI,CAAA,WAAAI,CAAA;AAEtC;AACO,SAASU,YAAYA,CAAA,EAAc;EACxC,OAAO,IAAAC,WAAI,EAACxB,QAAQ,EAAE,UAAU,CAAC,CAACyB,QAAQ,CAAC,CAAC;AAC9C","ignoreList":[]}
@@ -18,8 +18,9 @@ function createMockRequest(overrides = {}) {
18
18
  method: 'GET',
19
19
  url: '/',
20
20
  path: '/',
21
- get: function (name) {
22
- return req.headers[name.toLowerCase()];
21
+ get: name => {
22
+ const header = req.headers?.[name.toLowerCase()];
23
+ return header;
23
24
  },
24
25
  ...overrides
25
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mockRequest.js","names":["createMockRequest","overrides","req","body","query","params","headers","method","url","path","get","name","toLowerCase","createMockResponse","res","status","code","statusCode","json","data","send","setHeader","value","end","createMockNext","next","error","called"],"sources":["../../src/utils/mockRequest.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\n\ninterface MockResponse extends Response {\n body?: any;\n headers?: Record<string, string>;\n}\n\n/**\n * Creates a mock Express Request object for testing\n */\nexport function createMockRequest(overrides: Partial<Request> = {}): Request {\n const req: any = {\n body: {},\n query: {},\n params: {},\n headers: {},\n method: 'GET',\n url: '/',\n path: '/',\n get: function (name: string) {\n return req.headers[name.toLowerCase()];\n },\n ...overrides\n };\n\n return req as Request;\n}\n\n/**\n * Creates a mock Express Response object for testing\n */\nexport function createMockResponse(): MockResponse {\n const res: any = {};\n res.status = function (code: number) {\n res.statusCode = code;\n return res;\n };\n res.json = function (data: unknown) {\n res.body = data;\n return res;\n };\n res.send = function (data: unknown) {\n res.body = data;\n return res;\n };\n res.setHeader = function (name: string, value: string) {\n if (!res.headers) res.headers = {};\n res.headers[name] = value;\n return res;\n };\n res.end = function () {\n return res;\n };\n return res as MockResponse;\n}\n\n/**\n * Creates a mock Express NextFunction for testing\n */\nexport function createMockNext(): NextFunction {\n const next = function (error?: unknown) {\n next.called = true;\n next.error = error;\n } as NextFunction & { called?: boolean; error?: unknown };\n next.called = false;\n return next;\n}\n"],"mappings":";;;;;;;;AAOA;AACA;AACA;AACO,SAASA,iBAAiBA,CAACC,SAA2B,GAAG,CAAC,CAAC,EAAW;EAC3E,MAAMC,GAAQ,GAAG;IACfC,IAAI,EAAE,CAAC,CAAC;IACRC,KAAK,EAAE,CAAC,CAAC;IACTC,MAAM,EAAE,CAAC,CAAC;IACVC,OAAO,EAAE,CAAC,CAAC;IACXC,MAAM,EAAE,KAAK;IACbC,GAAG,EAAE,GAAG;IACRC,IAAI,EAAE,GAAG;IACTC,GAAG,EAAE,SAAAA,CAAUC,IAAY,EAAE;MAC3B,OAAOT,GAAG,CAACI,OAAO,CAACK,IAAI,CAACC,WAAW,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,GAAGX;EACL,CAAC;EAED,OAAOC,GAAG;AACZ;;AAEA;AACA;AACA;AACO,SAASW,kBAAkBA,CAAA,EAAiB;EACjD,MAAMC,GAAQ,GAAG,CAAC,CAAC;EACnBA,GAAG,CAACC,MAAM,GAAG,UAAUC,IAAY,EAAE;IACnCF,GAAG,CAACG,UAAU,GAAGD,IAAI;IACrB,OAAOF,GAAG;EACZ,CAAC;EACDA,GAAG,CAACI,IAAI,GAAG,UAAUC,IAAa,EAAE;IAClCL,GAAG,CAACX,IAAI,GAAGgB,IAAI;IACf,OAAOL,GAAG;EACZ,CAAC;EACDA,GAAG,CAACM,IAAI,GAAG,UAAUD,IAAa,EAAE;IAClCL,GAAG,CAACX,IAAI,GAAGgB,IAAI;IACf,OAAOL,GAAG;EACZ,CAAC;EACDA,GAAG,CAACO,SAAS,GAAG,UAAUV,IAAY,EAAEW,KAAa,EAAE;IACrD,IAAI,CAACR,GAAG,CAACR,OAAO,EAAEQ,GAAG,CAACR,OAAO,GAAG,CAAC,CAAC;IAClCQ,GAAG,CAACR,OAAO,CAACK,IAAI,CAAC,GAAGW,KAAK;IACzB,OAAOR,GAAG;EACZ,CAAC;EACDA,GAAG,CAACS,GAAG,GAAG,YAAY;IACpB,OAAOT,GAAG;EACZ,CAAC;EACD,OAAOA,GAAG;AACZ;;AAEA;AACA;AACA;AACO,SAASU,cAAcA,CAAA,EAAiB;EAC7C,MAAMC,IAAI,GAAG,SAAAA,CAAUC,KAAe,EAAE;IACtCD,IAAI,CAACE,MAAM,GAAG,IAAI;IAClBF,IAAI,CAACC,KAAK,GAAGA,KAAK;EACpB,CAAyD;EACzDD,IAAI,CAACE,MAAM,GAAG,KAAK;EACnB,OAAOF,IAAI;AACb","ignoreList":[]}
1
+ {"version":3,"file":"mockRequest.js","names":["createMockRequest","overrides","req","body","query","params","headers","method","url","path","get","name","header","toLowerCase","createMockResponse","res","status","code","statusCode","json","data","send","setHeader","value","end","createMockNext","next","error","called"],"sources":["../../src/utils/mockRequest.ts"],"sourcesContent":["import { Request, Response, NextFunction } from 'express';\n\ninterface MockResponse extends Response {\n body?: unknown;\n headers?: Record<string, string>;\n}\n\n/**\n * Creates a mock Express Request object for testing\n */\nexport function createMockRequest(overrides: Partial<Request> = {}): Request {\n const req: Partial<Request> = {\n body: {},\n query: {},\n params: {},\n headers: {},\n method: 'GET',\n url: '/',\n path: '/',\n get: ((name: string) => {\n const header = (req.headers as Record<string, string | string[]>)?.[name.toLowerCase()];\n return header;\n }) as Request['get'],\n ...overrides\n };\n\n return req as Request;\n}\n\n/**\n * Creates a mock Express Response object for testing\n */\nexport function createMockResponse(): MockResponse {\n const res: Partial<MockResponse> = {};\n res.status = function (code: number) {\n (res as MockResponse).statusCode = code;\n return res as MockResponse;\n };\n res.json = function (data: unknown) {\n (res as MockResponse).body = data;\n return res as MockResponse;\n };\n res.send = function (data: unknown) {\n (res as MockResponse).body = data;\n return res as MockResponse;\n };\n res.setHeader = function (name: string, value: string) {\n if (!(res as MockResponse).headers) (res as MockResponse).headers = {};\n (res as MockResponse).headers![name] = value;\n return res as MockResponse;\n };\n res.end = function () {\n return res as MockResponse;\n };\n return res as MockResponse;\n}\n\n/**\n * Creates a mock Express NextFunction for testing\n */\nexport function createMockNext(): NextFunction {\n const next = function (error?: unknown) {\n next.called = true;\n next.error = error;\n } as NextFunction & { called?: boolean; error?: unknown };\n next.called = false;\n return next;\n}\n"],"mappings":";;;;;;;;AAOA;AACA;AACA;AACO,SAASA,iBAAiBA,CAACC,SAA2B,GAAG,CAAC,CAAC,EAAW;EAC3E,MAAMC,GAAqB,GAAG;IAC5BC,IAAI,EAAE,CAAC,CAAC;IACRC,KAAK,EAAE,CAAC,CAAC;IACTC,MAAM,EAAE,CAAC,CAAC;IACVC,OAAO,EAAE,CAAC,CAAC;IACXC,MAAM,EAAE,KAAK;IACbC,GAAG,EAAE,GAAG;IACRC,IAAI,EAAE,GAAG;IACTC,GAAG,EAAIC,IAAY,IAAK;MACtB,MAAMC,MAAM,GAAIV,GAAG,CAACI,OAAO,GAAyCK,IAAI,CAACE,WAAW,CAAC,CAAC,CAAC;MACvF,OAAOD,MAAM;IACf,CAAoB;IACpB,GAAGX;EACL,CAAC;EAED,OAAOC,GAAG;AACZ;;AAEA;AACA;AACA;AACO,SAASY,kBAAkBA,CAAA,EAAiB;EACjD,MAAMC,GAA0B,GAAG,CAAC,CAAC;EACrCA,GAAG,CAACC,MAAM,GAAG,UAAUC,IAAY,EAAE;IAClCF,GAAG,CAAkBG,UAAU,GAAGD,IAAI;IACvC,OAAOF,GAAG;EACZ,CAAC;EACDA,GAAG,CAACI,IAAI,GAAG,UAAUC,IAAa,EAAE;IACjCL,GAAG,CAAkBZ,IAAI,GAAGiB,IAAI;IACjC,OAAOL,GAAG;EACZ,CAAC;EACDA,GAAG,CAACM,IAAI,GAAG,UAAUD,IAAa,EAAE;IACjCL,GAAG,CAAkBZ,IAAI,GAAGiB,IAAI;IACjC,OAAOL,GAAG;EACZ,CAAC;EACDA,GAAG,CAACO,SAAS,GAAG,UAAUX,IAAY,EAAEY,KAAa,EAAE;IACrD,IAAI,CAAER,GAAG,CAAkBT,OAAO,EAAGS,GAAG,CAAkBT,OAAO,GAAG,CAAC,CAAC;IACrES,GAAG,CAAkBT,OAAO,CAAEK,IAAI,CAAC,GAAGY,KAAK;IAC5C,OAAOR,GAAG;EACZ,CAAC;EACDA,GAAG,CAACS,GAAG,GAAG,YAAY;IACpB,OAAOT,GAAG;EACZ,CAAC;EACD,OAAOA,GAAG;AACZ;;AAEA;AACA;AACA;AACO,SAASU,cAAcA,CAAA,EAAiB;EAC7C,MAAMC,IAAI,GAAG,SAAAA,CAAUC,KAAe,EAAE;IACtCD,IAAI,CAACE,MAAM,GAAG,IAAI;IAClBF,IAAI,CAACC,KAAK,GAAGA,KAAK;EACpB,CAAyD;EACzDD,IAAI,CAACE,MAAM,GAAG,KAAK;EACnB,OAAOF,IAAI;AACb","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backend-test-tools",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "Backend Node test tools",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -29,33 +29,35 @@
29
29
  "@babel/preset-env": "^7.26.0",
30
30
  "@babel/preset-typescript": "^7.26.0",
31
31
  "@babel/register": "^7.25.9",
32
- "@commitlint/cli": "^19.8.1",
33
- "@commitlint/config-conventional": "^19.8.1",
32
+ "@commitlint/cli": "^21.2.4",
33
+ "@commitlint/config-conventional": "^21.2.4",
34
34
  "@eslint/js": "^9.17.0",
35
- "@faker-js/faker": "^9.3.0",
36
- "@semantic-release/changelog": "^6.0.3",
37
- "@semantic-release/git": "^10.0.1",
35
+ "@faker-js/faker": "^10.6.0",
36
+ "@semantic-release/changelog": "^7.0.0",
37
+ "@semantic-release/git": "^11.0.1",
38
38
  "@types/chai": "^5.0.1",
39
+ "@types/express": "^5.0.6",
39
40
  "@types/jsonwebtoken": "^9.0.7",
40
41
  "@types/mocha": "^10.0.10",
41
42
  "@types/node": "^22.10.2",
42
43
  "@types/node-forge": "^1.3.11",
43
- "@types/sinon": "^17.0.3",
44
+ "@types/sinon": "^22.0.2",
44
45
  "@types/superagent": "^8.1.9",
45
- "@types/supertest": "^6.0.2",
46
+ "@types/supertest": "^7.2.1",
46
47
  "@types/validator": "^13.12.2",
47
48
  "@typescript-eslint/eslint-plugin": "^8.18.1",
48
49
  "babel-plugin-istanbul": "^7.0.0",
49
50
  "babel-plugin-module-resolver": "^5.0.2",
50
51
  "babel-plugin-tsconfig-paths": "^1.0.3",
51
- "conventional-changelog-conventionalcommits": "^8.0.0",
52
+ "conventional-changelog-conventionalcommits": "^9.3.1",
52
53
  "core-js": "^3.39.0",
53
54
  "eslint": "^9.17.0",
54
- "globals": "^15.14.0",
55
+ "globals": "^17.14.0",
55
56
  "husky": "^9.1.7",
56
- "lint-staged": "^15.2.11",
57
- "mocha": "^11.0.1",
58
- "nyc": "^17.1.0",
57
+ "lint-staged": "^17.6.0",
58
+ "mocha": "^12.0.3",
59
+ "node-server-engine": "^1.14.0",
60
+ "nyc": "^18.0.0",
59
61
  "prettier": "^3.4.2",
60
62
  "rimraf": "^6.0.1",
61
63
  "semantic-release": "^25.0.2",
@@ -78,11 +80,16 @@
78
80
  "node-server-engine": "^1.2.6"
79
81
  },
80
82
  "dependencies": {
81
- "@babel/runtime": "^7.26.0",
82
- "jsonwebtoken": "^9.0.2",
83
- "node-forge": "^1.3.1",
84
- "sharp": "^0.34.5",
85
- "sinon": "^19.0.2",
86
- "supertest": "^7.0.0"
83
+ "@babel/runtime": "^7.29.14",
84
+ "jsonwebtoken": "^9.0.3",
85
+ "node-forge": "^1.4.3",
86
+ "sharp": "^0.35.5",
87
+ "sinon": "^22.1.0",
88
+ "supertest": "^7.3.2"
89
+ },
90
+ "peerDependenciesMeta": {
91
+ "node-server-engine": {
92
+ "optional": true
93
+ }
87
94
  }
88
95
  }
@@ -1,7 +1,7 @@
1
1
  import { Request, Response, NextFunction } from 'express';
2
2
 
3
3
  interface MockResponse extends Response {
4
- body?: any;
4
+ body?: unknown;
5
5
  headers?: Record<string, string>;
6
6
  }
7
7
 
@@ -9,7 +9,7 @@ interface MockResponse extends Response {
9
9
  * Creates a mock Express Request object for testing
10
10
  */
11
11
  export function createMockRequest(overrides: Partial<Request> = {}): Request {
12
- const req: any = {
12
+ const req: Partial<Request> = {
13
13
  body: {},
14
14
  query: {},
15
15
  params: {},
@@ -17,9 +17,10 @@ export function createMockRequest(overrides: Partial<Request> = {}): Request {
17
17
  method: 'GET',
18
18
  url: '/',
19
19
  path: '/',
20
- get: function (name: string) {
21
- return req.headers[name.toLowerCase()];
22
- },
20
+ get: ((name: string) => {
21
+ const header = (req.headers as Record<string, string | string[]>)?.[name.toLowerCase()];
22
+ return header;
23
+ }) as Request['get'],
23
24
  ...overrides
24
25
  };
25
26
 
@@ -30,26 +31,26 @@ export function createMockRequest(overrides: Partial<Request> = {}): Request {
30
31
  * Creates a mock Express Response object for testing
31
32
  */
32
33
  export function createMockResponse(): MockResponse {
33
- const res: any = {};
34
+ const res: Partial<MockResponse> = {};
34
35
  res.status = function (code: number) {
35
- res.statusCode = code;
36
- return res;
36
+ (res as MockResponse).statusCode = code;
37
+ return res as MockResponse;
37
38
  };
38
39
  res.json = function (data: unknown) {
39
- res.body = data;
40
- return res;
40
+ (res as MockResponse).body = data;
41
+ return res as MockResponse;
41
42
  };
42
43
  res.send = function (data: unknown) {
43
- res.body = data;
44
- return res;
44
+ (res as MockResponse).body = data;
45
+ return res as MockResponse;
45
46
  };
46
47
  res.setHeader = function (name: string, value: string) {
47
- if (!res.headers) res.headers = {};
48
- res.headers[name] = value;
49
- return res;
48
+ if (!(res as MockResponse).headers) (res as MockResponse).headers = {};
49
+ (res as MockResponse).headers![name] = value;
50
+ return res as MockResponse;
50
51
  };
51
52
  res.end = function () {
52
- return res;
53
+ return res as MockResponse;
53
54
  };
54
55
  return res as MockResponse;
55
56
  }