@nmxjs/api 1.2.17 → 1.3.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.
@@ -58,7 +58,7 @@ class ApiRouteCoreModule {
58
58
  return item[key]((data === null || data === void 0 ? void 0 : data.request) || {});
59
59
  };
60
60
  const property = (0, ApiService_1.getQueryMutationByName)(key).type;
61
- res[property] = Object.assign(Object.assign({}, res[property]), { [`${apiRouterKey}0${(0, utils_1.firstLetterUpperCase)({ str: key })}`]: fn });
61
+ res[property] = Object.assign(Object.assign({}, res[property]), { [`${apiRouterKey}0${(0, utils_1.firstLetterUpperCase)(key)}`]: fn });
62
62
  });
63
63
  return res;
64
64
  }, {});
@@ -1 +1 @@
1
- {"version":3,"file":"ApiRouteCoreModule.js","sourceRoot":"","sources":["../../src/ApiRouterCore/ApiRouteCoreModule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiRouteCoreModule.js","sourceRoot":"","sources":["../../src/ApiRouterCore/ApiRouteCoreModule.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ let TrySetupWebApiService = class TrySetupWebApiService {
19
19
  return;
20
20
  }
21
21
  (0, utils_1.getQueryMutationByName)(methodName).decorator(() => schema[methodName].response, {
22
- name: `${(0, utils_2.toCamelCase)({ str: subService || service })}0${(0, utils_2.firstLetterUpperCase)({ str: methodName })}`,
22
+ name: `${(0, utils_2.toCamelCase)({ str: subService || service })}0${(0, utils_2.firstLetterUpperCase)(methodName)}`,
23
23
  })(target, methodName, undefined);
24
24
  if (typeof schema[methodName].request === 'function') {
25
25
  Reflect.defineMetadata('design:paramtypes', [schema[methodName].request], target, methodName);
@@ -1 +1 @@
1
- {"version":3,"file":"TrySetupWebApiService.js","sourceRoot":"","sources":["../../../src/ApiService/services/TrySetupWebApiService.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,oCAAkD;AAClD,wCAAiE;AAGjE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAGrC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAA4B;QACnE,MAAM,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IAAA,8BAAsB,EAAC,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;gBAC9E,IAAI,EAAE,GAAG,IAAA,mBAAW,EAAC,EAAE,GAAG,EAAE,UAAU,IAAI,OAAO,EAAE,CAAC,IAAI,IAAA,4BAAoB,EAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;aACpG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAElC,IAAI,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACrD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC9F,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;CACF,CAAA;AAnBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAmBjC"}
1
+ {"version":3,"file":"TrySetupWebApiService.js","sourceRoot":"","sources":["../../../src/ApiService/services/TrySetupWebApiService.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,oCAAkD;AAClD,wCAAiE;AAGjE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAGrC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAA4B;QACnE,MAAM,MAAM,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAExB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACvC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IAAA,8BAAsB,EAAC,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;gBAC9E,IAAI,EAAE,GAAG,IAAA,mBAAW,EAAC,EAAE,GAAG,EAAE,UAAU,IAAI,OAAO,EAAE,CAAC,IAAI,IAAA,4BAAoB,EAAC,UAAU,CAAC,EAAE;aAC3F,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAElC,IAAI,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACrD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC9F,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;CACF,CAAA;AAnBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAmBjC"}
@@ -3,13 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transformParseJson = void 0;
4
4
  const getJsonFieldsKeys_1 = require("./getJsonFieldsKeys");
5
5
  function transformParseJson(key, data) {
6
+ if (!data) {
7
+ return data;
8
+ }
6
9
  const jsonFieldsKeys = (0, getJsonFieldsKeys_1.getJsonFieldsKeys)(key);
7
10
  if (!jsonFieldsKeys || jsonFieldsKeys.length === 0) {
8
11
  return data;
9
12
  }
10
13
  for (const path of jsonFieldsKeys) {
11
14
  const [firstKey, secondKey] = path.split('.');
12
- if (firstKey && !secondKey && typeof data[firstKey] === 'undefined') {
15
+ if (typeof data[firstKey] === 'undefined') {
13
16
  continue;
14
17
  }
15
18
  if (firstKey && !secondKey) {
@@ -1 +1 @@
1
- {"version":3,"file":"transformParseJson.js","sourceRoot":"","sources":["../../../src/ApiService/utils/transformParseJson.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAExD,SAAgB,kBAAkB,CAAI,GAAW,EAAE,IAAO;IACxD,MAAM,cAAc,GAAG,IAAA,qCAAiB,EAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,QAAQ,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA1BD,gDA0BC"}
1
+ {"version":3,"file":"transformParseJson.js","sourceRoot":"","sources":["../../../src/ApiService/utils/transformParseJson.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAExD,SAAgB,kBAAkB,CAAI,GAAW,EAAE,IAAO;IACxD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,qCAAiB,EAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA9BD,gDA8BC"}
@@ -3,13 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transformStringifyJson = void 0;
4
4
  const getJsonFieldsKeys_1 = require("./getJsonFieldsKeys");
5
5
  function transformStringifyJson(key, data) {
6
+ if (!data) {
7
+ return data;
8
+ }
6
9
  const jsonFieldsKeys = (0, getJsonFieldsKeys_1.getJsonFieldsKeys)(key);
7
10
  if (!jsonFieldsKeys || jsonFieldsKeys.length === 0) {
8
11
  return data;
9
12
  }
10
13
  for (const path of jsonFieldsKeys) {
11
14
  const [firstKey, secondKey] = path.split('.');
12
- if (firstKey && !secondKey && typeof data[firstKey] === 'undefined') {
15
+ if (typeof data[firstKey] === 'undefined') {
13
16
  continue;
14
17
  }
15
18
  if (firstKey && !secondKey) {
@@ -1 +1 @@
1
- {"version":3,"file":"transformStringifyJson.js","sourceRoot":"","sources":["../../../src/ApiService/utils/transformStringifyJson.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAExD,SAAgB,sBAAsB,CAAI,GAAW,EAAE,IAAO;IAC5D,MAAM,cAAc,GAAG,IAAA,qCAAiB,EAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,QAAQ,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA1BD,wDA0BC"}
1
+ {"version":3,"file":"transformStringifyJson.js","sourceRoot":"","sources":["../../../src/ApiService/utils/transformStringifyJson.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAExD,SAAgB,sBAAsB,CAAI,GAAW,EAAE,IAAO;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,qCAAiB,EAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA9BD,wDA8BC"}
@@ -24,7 +24,7 @@ let GenerateProtoService = class GenerateProtoService {
24
24
  }
25
25
  call({ schema, service }) {
26
26
  const packageName = this.getPackageNameService.call(service);
27
- const upperName = (0, utils_1.firstLetterUpperCase)({ str: packageName });
27
+ const upperName = (0, utils_1.firstLetterUpperCase)(packageName);
28
28
  const tempDir = path.join(process.cwd(), 'temp');
29
29
  if (!fs.existsSync(tempDir)) {
30
30
  fs.mkdirSync(tempDir);
@@ -40,7 +40,7 @@ let GenerateProtoService = class GenerateProtoService {
40
40
  const protoMessages = [];
41
41
  const existMessageNames = [];
42
42
  for (const methodName of Object.keys(schema)) {
43
- const upperMethodName = (0, utils_1.firstLetterUpperCase)({ str: methodName });
43
+ const upperMethodName = (0, utils_1.firstLetterUpperCase)(methodName);
44
44
  const requestMethodName = `${upperMethodName}Request`;
45
45
  const responseMethodName = `${upperMethodName}Response`;
46
46
  protoFileData.push(` rpc ${methodName} (${requestMethodName}) returns (${responseMethodName}) {}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"GenerateProtoService.js","sourceRoot":"","sources":["../../../src/GrpcTransport/services/GenerateProtoService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GenerateProtoService.js","sourceRoot":"","sources":["../../../src/GrpcTransport/services/GenerateProtoService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nmxjs/api",
3
- "version": "1.2.17",
3
+ "version": "1.3.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -23,13 +23,16 @@
23
23
  "homepage": "https://github.com/n1ghtm6r9/nm-api#readme",
24
24
  "devDependencies": {
25
25
  "@types/deepmerge": "^2.1.0",
26
+ "@types/jest": "^30.0.0",
26
27
  "@types/node": "^22.13.0",
28
+ "jest": "^30.2.0",
29
+ "ts-jest": "^29.4.6",
27
30
  "typescript": "^5.1.6"
28
31
  },
29
32
  "dependencies": {
30
- "@nmxjs/errors": "^1.0.13",
31
- "@nmxjs/utils": "^1.0.22",
32
33
  "@nmxjs/constants": "^1.0.6",
34
+ "@nmxjs/errors": "^1.0.13",
35
+ "@nmxjs/utils": "^1.1.4",
33
36
  "deepmerge": "^4.3.1",
34
37
  "express": "^4.21.2",
35
38
  "node-cache": "^5.1.2",
@@ -38,9 +41,9 @@
38
41
  "rxjs": "^7.8.1"
39
42
  },
40
43
  "peerDependencies": {
44
+ "@nestjs/common": "^11.0.7",
41
45
  "@nestjs/graphql": "^13.0.2",
42
46
  "@nmxjs/config": "^1.0.15",
43
- "@nestjs/common": "^11.0.7",
44
47
  "@nmxjs/notifications": "^1.0.7"
45
48
  }
46
49
  }
@@ -0,0 +1,178 @@
1
+ import { of, throwError } from 'rxjs';
2
+
3
+ jest.mock('@nmxjs/utils', () => ({
4
+ uuid: () => 'test-uuid-123',
5
+ readableJson: (data: any) => JSON.stringify(data),
6
+ }));
7
+
8
+ import { RpcExceptionInterceptor } from '../../../src/ApiRouterCore/utils/RpcExceptionInterceptor';
9
+ import { Logger } from '@nestjs/common';
10
+ import { endErrorText } from '../../../src/ApiRouterCore/constants/endErrorText';
11
+
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ });
15
+
16
+ const createContext = (data: any, pathOrEvent?: { path?: string; event?: string }) => ({
17
+ getArgByIndex: (index: number) => {
18
+ if (index === 0) return data;
19
+ if (index === 1) return { args: [pathOrEvent?.event || 'test.event'] };
20
+ if (index === 2) return pathOrEvent?.path ? { path: pathOrEvent.path } : undefined;
21
+ return undefined;
22
+ },
23
+ });
24
+
25
+ const createNext = (returnValue: any) => ({
26
+ handle: () => of(returnValue),
27
+ });
28
+
29
+ const createErrorNext = (error: Error) => ({
30
+ handle: () => throwError(() => error),
31
+ });
32
+
33
+ describe('RpcExceptionInterceptor', () => {
34
+ it('should pass through successful responses', done => {
35
+ const interceptor = new RpcExceptionInterceptor('test-service');
36
+ const ctx = createContext({ id: 1 });
37
+ const next = createNext({ result: 'ok' });
38
+
39
+ interceptor.intercept(ctx as any, next as any).subscribe(result => {
40
+ expect(result).toEqual({ result: 'ok' });
41
+ done();
42
+ });
43
+ });
44
+
45
+ it('should log debug on request when debug=true', done => {
46
+ const interceptor = new RpcExceptionInterceptor('test-service', true);
47
+ const ctx = createContext({ id: 1 }, { event: 'test.get' });
48
+ const next = createNext({ ok: true });
49
+
50
+ interceptor.intercept(ctx as any, next as any).subscribe(() => {
51
+ expect(Logger.debug).toHaveBeenCalled();
52
+ done();
53
+ });
54
+ });
55
+
56
+ it('should not log debug when debug=false', done => {
57
+ const interceptor = new RpcExceptionInterceptor('test-service', false);
58
+ const ctx = createContext({ id: 1 });
59
+ const next = createNext({ ok: true });
60
+
61
+ interceptor.intercept(ctx as any, next as any).subscribe(() => {
62
+ expect(Logger.debug).not.toHaveBeenCalled();
63
+ done();
64
+ });
65
+ });
66
+
67
+ it('should throw RpcException on error', done => {
68
+ const interceptor = new RpcExceptionInterceptor('test-service');
69
+ const ctx = createContext({ id: 1 });
70
+ const error = new Error('Something went wrong');
71
+ const next = createErrorNext(error);
72
+
73
+ interceptor.intercept(ctx as any, next as any).subscribe({
74
+ error: err => {
75
+ expect(err.message).toContain('Something went wrong');
76
+ expect(err.message).toContain(endErrorText);
77
+ done();
78
+ },
79
+ });
80
+ });
81
+
82
+ it('should log error message', done => {
83
+ const interceptor = new RpcExceptionInterceptor('test-service');
84
+ const ctx = createContext({ id: 1 });
85
+ const error = new Error('Test error');
86
+ const next = createErrorNext(error);
87
+
88
+ interceptor.intercept(ctx as any, next as any).subscribe({
89
+ error: () => {
90
+ expect(Logger.error).toHaveBeenCalled();
91
+ done();
92
+ },
93
+ });
94
+ });
95
+
96
+ it('should handle error with endErrorText split', done => {
97
+ const interceptor = new RpcExceptionInterceptor('test-service');
98
+ const ctx = createContext({});
99
+ const error = new Error(`Original error${endErrorText}extra`);
100
+ const next = createErrorNext(error);
101
+
102
+ interceptor.intercept(ctx as any, next as any).subscribe({
103
+ error: err => {
104
+ expect(err.message).toContain('Original error');
105
+ done();
106
+ },
107
+ });
108
+ });
109
+
110
+ it('should call notifier.sendError when notifier is provided and error is not silent', done => {
111
+ const notifier = { sendError: jest.fn() };
112
+ const interceptor = new RpcExceptionInterceptor('test-service', false, notifier as any);
113
+ const ctx = createContext({ id: 1 }, { path: '/test/path' });
114
+ const error: any = new Error('Notify error');
115
+ error.code = 'ERR_CODE';
116
+ const next = createErrorNext(error);
117
+
118
+ interceptor.intercept(ctx as any, next as any).subscribe({
119
+ error: () => {
120
+ expect(notifier.sendError).toHaveBeenCalledWith(
121
+ expect.objectContaining({
122
+ serviceName: 'test-service',
123
+ path: '/test/path',
124
+ code: 'ERR_CODE',
125
+ }),
126
+ );
127
+ done();
128
+ },
129
+ });
130
+ });
131
+
132
+ it('should not call notifier when error is silent', done => {
133
+ const notifier = { sendError: jest.fn() };
134
+ const interceptor = new RpcExceptionInterceptor('test-service', false, notifier as any);
135
+ const ctx = createContext({});
136
+ const error: any = new Error('Silent error');
137
+ error.silent = true;
138
+ const next = createErrorNext(error);
139
+
140
+ interceptor.intercept(ctx as any, next as any).subscribe({
141
+ error: () => {
142
+ expect(notifier.sendError).not.toHaveBeenCalled();
143
+ done();
144
+ },
145
+ });
146
+ });
147
+
148
+ it('should use UNKNOWN RPC code when error has no code', done => {
149
+ const notifier = { sendError: jest.fn() };
150
+ const interceptor = new RpcExceptionInterceptor('test-service', false, notifier as any);
151
+ const ctx = createContext({}, { path: '/test' });
152
+ const error = new Error('No code error');
153
+ const next = createErrorNext(error);
154
+
155
+ interceptor.intercept(ctx as any, next as any).subscribe({
156
+ error: () => {
157
+ expect(notifier.sendError).toHaveBeenCalledWith(
158
+ expect.objectContaining({
159
+ code: 'UNKNOWN RPC',
160
+ }),
161
+ );
162
+ done();
163
+ },
164
+ });
165
+ });
166
+
167
+ it('should log debug response when debug=true and path is provided', done => {
168
+ const interceptor = new RpcExceptionInterceptor('test-service', true);
169
+ const ctx = createContext({ id: 1 }, { path: '/grpc/method' });
170
+ const next = createNext({ data: 'response' });
171
+
172
+ interceptor.intercept(ctx as any, next as any).subscribe(() => {
173
+ const debugCalls = (Logger.debug as jest.Mock).mock.calls;
174
+ expect(debugCalls.length).toBeGreaterThanOrEqual(2);
175
+ done();
176
+ });
177
+ });
178
+ });
@@ -0,0 +1,107 @@
1
+ import 'reflect-metadata';
2
+ import { setJsonFieldsKey, getJsonFieldsKeys } from '../../../src/ApiService/utils/getJsonFieldsKeys';
3
+
4
+ describe('getJsonFieldsKeys', () => {
5
+ it('should return undefined for unknown key', () => {
6
+ expect(getJsonFieldsKeys('unknown-key')).toBeUndefined();
7
+ });
8
+
9
+ it('should return empty array when objSchema is null', () => {
10
+ setJsonFieldsKey('null-schema', null);
11
+ expect(getJsonFieldsKeys('null-schema')).toBeUndefined();
12
+ });
13
+
14
+ it('should return empty array when objSchema has no field metadata', () => {
15
+ const schema = {};
16
+ setJsonFieldsKey('empty-schema', schema);
17
+ expect(getJsonFieldsKeys('empty-schema')).toEqual([]);
18
+ });
19
+
20
+ it('should register JSON type field as json field key', () => {
21
+ const schema = {};
22
+ Reflect.defineMetadata('field:value', { type: JSON }, schema);
23
+ setJsonFieldsKey('json-field', schema);
24
+ expect(getJsonFieldsKeys('json-field')).toEqual(['value']);
25
+ });
26
+
27
+ it('should register Object type field as json field key', () => {
28
+ const schema = {};
29
+ Reflect.defineMetadata('field:data', { type: Object }, schema);
30
+ setJsonFieldsKey('object-field', schema);
31
+ expect(getJsonFieldsKeys('object-field')).toEqual(['data']);
32
+ });
33
+
34
+ it('should skip String type fields', () => {
35
+ const schema = {};
36
+ Reflect.defineMetadata('field:name', { type: String }, schema);
37
+ setJsonFieldsKey('string-field', schema);
38
+ expect(getJsonFieldsKeys('string-field')).toEqual([]);
39
+ });
40
+
41
+ it('should skip Number type fields', () => {
42
+ const schema = {};
43
+ Reflect.defineMetadata('field:count', { type: Number }, schema);
44
+ setJsonFieldsKey('number-field', schema);
45
+ expect(getJsonFieldsKeys('number-field')).toEqual([]);
46
+ });
47
+
48
+ it('should skip Boolean type fields', () => {
49
+ const schema = {};
50
+ Reflect.defineMetadata('field:active', { type: Boolean }, schema);
51
+ setJsonFieldsKey('bool-field', schema);
52
+ expect(getJsonFieldsKeys('bool-field')).toEqual([]);
53
+ });
54
+
55
+ it('should skip enum fields', () => {
56
+ const schema = {};
57
+ Reflect.defineMetadata('field:status', { type: String, enum: true }, schema);
58
+ setJsonFieldsKey('enum-field', schema);
59
+ expect(getJsonFieldsKeys('enum-field')).toEqual([]);
60
+ });
61
+
62
+ it('should recurse into nested types and collect with prefix', () => {
63
+ const nestedSchema = {};
64
+ Reflect.defineMetadata('field:value', { type: JSON }, nestedSchema);
65
+
66
+ const schema = {};
67
+ Reflect.defineMetadata('field:filters', { type: nestedSchema }, schema);
68
+
69
+ setJsonFieldsKey('nested-field', schema);
70
+ expect(getJsonFieldsKeys('nested-field')).toEqual(['filters.value']);
71
+ });
72
+
73
+ it('should handle multiple fields', () => {
74
+ const schema = {};
75
+ Reflect.defineMetadata('field:name', { type: String }, schema);
76
+ Reflect.defineMetadata('field:data', { type: JSON }, schema);
77
+ Reflect.defineMetadata('field:count', { type: Number }, schema);
78
+
79
+ setJsonFieldsKey('multi-field', schema);
80
+ expect(getJsonFieldsKeys('multi-field')).toEqual(['data']);
81
+ });
82
+
83
+ it('should not recurse deeper than 2 levels', () => {
84
+ const deepSchema = {};
85
+ Reflect.defineMetadata('field:deep', { type: JSON }, deepSchema);
86
+
87
+ const midSchema = {};
88
+ Reflect.defineMetadata('field:mid', { type: deepSchema }, midSchema);
89
+
90
+ const schema = {};
91
+ Reflect.defineMetadata('field:top', { type: midSchema }, schema);
92
+
93
+ setJsonFieldsKey('deep-nested', schema);
94
+ const result = getJsonFieldsKeys('deep-nested');
95
+ expect(result).toContain('mid.deep');
96
+ expect(result.length).toBe(1);
97
+ });
98
+
99
+ it('should ignore non-field metadata keys', () => {
100
+ const schema = {};
101
+ Reflect.defineMetadata('other:key', { type: JSON }, schema);
102
+ Reflect.defineMetadata('field:value', { type: JSON }, schema);
103
+
104
+ setJsonFieldsKey('filter-meta', schema);
105
+ expect(getJsonFieldsKeys('filter-meta')).toEqual(['value']);
106
+ });
107
+ });
@@ -0,0 +1,41 @@
1
+ import { getQueryMutationByName } from '../../../src/ApiService/utils/getQueryMutationByName';
2
+
3
+ describe('getQueryMutationByName', () => {
4
+ it('should return Query for method containing "get"', () => {
5
+ const result = getQueryMutationByName('getUsers');
6
+ expect(result.type).toBe('Query');
7
+ });
8
+
9
+ it('should return Mutation for method not containing "get"', () => {
10
+ const result = getQueryMutationByName('createUser');
11
+ expect(result.type).toBe('Mutation');
12
+ });
13
+
14
+ it('should return Query for "getSomething"', () => {
15
+ const result = getQueryMutationByName('getSomething');
16
+ expect(result.type).toBe('Query');
17
+ });
18
+
19
+ it('should return Mutation for "deleteItem"', () => {
20
+ const result = getQueryMutationByName('deleteItem');
21
+ expect(result.type).toBe('Mutation');
22
+ });
23
+
24
+ it('should return Mutation for "updateUser"', () => {
25
+ const result = getQueryMutationByName('updateUser');
26
+ expect(result.type).toBe('Mutation');
27
+ });
28
+
29
+ it('should return Query for method with "get" in middle', () => {
30
+ const result = getQueryMutationByName('forgetPassword');
31
+ expect(result.type).toBe('Query');
32
+ });
33
+
34
+ it('should have decorator property', () => {
35
+ const queryResult = getQueryMutationByName('getUsers');
36
+ expect(queryResult.decorator).toBeDefined();
37
+
38
+ const mutationResult = getQueryMutationByName('createUser');
39
+ expect(mutationResult.decorator).toBeDefined();
40
+ });
41
+ });
@@ -0,0 +1,76 @@
1
+ import { transformParseJson } from '../../../src/ApiService/utils/transformParseJson';
2
+ import * as jsonFieldsKeysModule from '../../../src/ApiService/utils/getJsonFieldsKeys';
3
+
4
+ jest.spyOn(jsonFieldsKeysModule, 'getJsonFieldsKeys');
5
+
6
+ const mockGetJsonFieldsKeys = jsonFieldsKeysModule.getJsonFieldsKeys as jest.Mock;
7
+
8
+ beforeEach(() => {
9
+ mockGetJsonFieldsKeys.mockReset();
10
+ });
11
+
12
+ describe('transformParseJson', () => {
13
+ it('should return data as-is when no jsonFieldsKeys', () => {
14
+ mockGetJsonFieldsKeys.mockReturnValue(undefined);
15
+ const data = { name: 'test' };
16
+ expect(transformParseJson('key', data)).toEqual({ name: 'test' });
17
+ });
18
+
19
+ it('should not crash when data={} and jsonFieldsKeys=["filters.value"]', () => {
20
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
21
+ const result = transformParseJson('key', {});
22
+ expect(result).toEqual({});
23
+ });
24
+
25
+ it('should not crash when data={ filters: undefined } and jsonFieldsKeys=["filters.value"]', () => {
26
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
27
+ const result = transformParseJson('key', { filters: undefined });
28
+ expect(result).toEqual({ filters: undefined });
29
+ });
30
+
31
+ it('should parse nested array values for "filters.value"', () => {
32
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
33
+ const data = { filters: [{ value: '["a","b"]' }] };
34
+ const result = transformParseJson('key', data);
35
+ expect(result.filters[0].value).toEqual(['a', 'b']);
36
+ });
37
+
38
+ it('should parse nested string values for "filters.value"', () => {
39
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
40
+ const data = { filters: [{ value: '"test"' }] };
41
+ const result = transformParseJson('key', data);
42
+ expect(result.filters[0].value).toBe('test');
43
+ });
44
+
45
+ it('should parse top-level key for "name"', () => {
46
+ mockGetJsonFieldsKeys.mockReturnValue(['name']);
47
+ const data = { name: '"test"' };
48
+ const result = transformParseJson('key', data);
49
+ expect(result.name).toBe('test');
50
+ });
51
+
52
+ it('should not crash when data={} and jsonFieldsKeys=["name"]', () => {
53
+ mockGetJsonFieldsKeys.mockReturnValue(['name']);
54
+ const result = transformParseJson('key', {});
55
+ expect(result).toEqual({});
56
+ });
57
+
58
+ it('should not crash when data is undefined', () => {
59
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
60
+ const result = transformParseJson('key', undefined);
61
+ expect(result).toBeUndefined();
62
+ });
63
+
64
+ it('should not crash when data is null', () => {
65
+ mockGetJsonFieldsKeys.mockReturnValue(['name']);
66
+ const result = transformParseJson('key', null);
67
+ expect(result).toBeNull();
68
+ });
69
+
70
+ it('should parse non-array object value with secondKey', () => {
71
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
72
+ const data = { filters: { value: '{"nested":true}' } };
73
+ const result = transformParseJson('key', data);
74
+ expect(result.filters.value).toEqual({ nested: true });
75
+ });
76
+ });
@@ -0,0 +1,76 @@
1
+ import { transformStringifyJson } from '../../../src/ApiService/utils/transformStringifyJson';
2
+ import * as jsonFieldsKeysModule from '../../../src/ApiService/utils/getJsonFieldsKeys';
3
+
4
+ jest.spyOn(jsonFieldsKeysModule, 'getJsonFieldsKeys');
5
+
6
+ const mockGetJsonFieldsKeys = jsonFieldsKeysModule.getJsonFieldsKeys as jest.Mock;
7
+
8
+ beforeEach(() => {
9
+ mockGetJsonFieldsKeys.mockReset();
10
+ });
11
+
12
+ describe('transformStringifyJson', () => {
13
+ it('should return data as-is when no jsonFieldsKeys', () => {
14
+ mockGetJsonFieldsKeys.mockReturnValue(undefined);
15
+ const data = { name: 'test' };
16
+ expect(transformStringifyJson('key', data)).toEqual({ name: 'test' });
17
+ });
18
+
19
+ it('should not crash when data={} and jsonFieldsKeys=["filters.value"]', () => {
20
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
21
+ const result = transformStringifyJson('key', {});
22
+ expect(result).toEqual({});
23
+ });
24
+
25
+ it('should not crash when data={ filters: undefined } and jsonFieldsKeys=["filters.value"]', () => {
26
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
27
+ const result = transformStringifyJson('key', { filters: undefined });
28
+ expect(result).toEqual({ filters: undefined });
29
+ });
30
+
31
+ it('should stringify nested array values for "filters.value"', () => {
32
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
33
+ const data = { filters: [{ value: ['a', 'b'] }] };
34
+ const result = transformStringifyJson('key', data);
35
+ expect(result.filters[0].value).toBe('["a","b"]');
36
+ });
37
+
38
+ it('should stringify nested string values for "filters.value"', () => {
39
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
40
+ const data = { filters: [{ value: 'test' }] };
41
+ const result = transformStringifyJson('key', data);
42
+ expect(result.filters[0].value).toBe('"test"');
43
+ });
44
+
45
+ it('should stringify top-level key for "name"', () => {
46
+ mockGetJsonFieldsKeys.mockReturnValue(['name']);
47
+ const data = { name: 'test' };
48
+ const result = transformStringifyJson('key', data);
49
+ expect(result.name).toBe('"test"');
50
+ });
51
+
52
+ it('should not crash when data={} and jsonFieldsKeys=["name"]', () => {
53
+ mockGetJsonFieldsKeys.mockReturnValue(['name']);
54
+ const result = transformStringifyJson('key', {});
55
+ expect(result).toEqual({});
56
+ });
57
+
58
+ it('should not crash when data is undefined', () => {
59
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
60
+ const result = transformStringifyJson('key', undefined);
61
+ expect(result).toBeUndefined();
62
+ });
63
+
64
+ it('should not crash when data is null', () => {
65
+ mockGetJsonFieldsKeys.mockReturnValue(['name']);
66
+ const result = transformStringifyJson('key', null);
67
+ expect(result).toBeNull();
68
+ });
69
+
70
+ it('should stringify non-array object value with secondKey', () => {
71
+ mockGetJsonFieldsKeys.mockReturnValue(['filters.value']);
72
+ const data = { filters: { value: { nested: true } } };
73
+ const result = transformStringifyJson('key', data);
74
+ expect(result.filters.value).toBe('{"nested":true}');
75
+ });
76
+ });
@@ -0,0 +1,82 @@
1
+ import { of } from 'rxjs';
2
+
3
+ jest.mock('../../../src/ApiService/utils/transformParseJson', () => ({
4
+ transformParseJson: jest.fn((key: string, data: any) => data),
5
+ }));
6
+
7
+ jest.mock('../../../src/ApiService/utils/transformStringifyJson', () => ({
8
+ transformStringifyJson: jest.fn((key: string, data: any) => data),
9
+ }));
10
+
11
+ import { GrpcInterceptor } from '../../../src/GrpcTransport/interceptors/GrpcInterceptor';
12
+ import { transformParseJson } from '../../../src/ApiService/utils/transformParseJson';
13
+ import { transformStringifyJson } from '../../../src/ApiService/utils/transformStringifyJson';
14
+
15
+ const mockTransformParseJson = transformParseJson as jest.Mock;
16
+ const mockTransformStringifyJson = transformStringifyJson as jest.Mock;
17
+
18
+ beforeEach(() => {
19
+ mockTransformParseJson.mockClear();
20
+ mockTransformStringifyJson.mockClear();
21
+ });
22
+
23
+ describe('GrpcInterceptor', () => {
24
+ const key = 'service.method';
25
+ const interceptor = new GrpcInterceptor(key);
26
+
27
+ const createContext = (data: any) => ({
28
+ switchToRpc: () => ({
29
+ getData: () => data,
30
+ }),
31
+ });
32
+
33
+ const createNext = (returnValue: any) => ({
34
+ handle: () => of(returnValue),
35
+ });
36
+
37
+ it('should call transformParseJson with request key and data', done => {
38
+ const requestData = { name: 'test' };
39
+ const ctx = createContext(requestData);
40
+ const next = createNext({ result: 'ok' });
41
+
42
+ interceptor.intercept(ctx as any, next as any).subscribe(() => {
43
+ expect(mockTransformParseJson).toHaveBeenCalledWith(`${key}.request`, requestData);
44
+ done();
45
+ });
46
+ });
47
+
48
+ it('should call transformStringifyJson on response', done => {
49
+ const responseData = { result: 'ok' };
50
+ const ctx = createContext({});
51
+ const next = createNext(responseData);
52
+
53
+ interceptor.intercept(ctx as any, next as any).subscribe(() => {
54
+ expect(mockTransformStringifyJson).toHaveBeenCalledWith(`${key}.response`, responseData);
55
+ done();
56
+ });
57
+ });
58
+
59
+ it('should return transformed response', done => {
60
+ mockTransformStringifyJson.mockImplementation((_, data) => ({ ...data, transformed: true }));
61
+
62
+ const ctx = createContext({});
63
+ const next = createNext({ value: 42 });
64
+
65
+ interceptor.intercept(ctx as any, next as any).subscribe(result => {
66
+ expect(result).toEqual({ value: 42, transformed: true });
67
+ done();
68
+ });
69
+ });
70
+
71
+ it('should use correct key prefix', done => {
72
+ const customInterceptor = new GrpcInterceptor('myService.myMethod');
73
+ const ctx = createContext({ id: 1 });
74
+ const next = createNext({ ok: true });
75
+
76
+ customInterceptor.intercept(ctx as any, next as any).subscribe(() => {
77
+ expect(mockTransformParseJson).toHaveBeenCalledWith('myService.myMethod.request', { id: 1 });
78
+ expect(mockTransformStringifyJson).toHaveBeenCalledWith('myService.myMethod.response', { ok: true });
79
+ done();
80
+ });
81
+ });
82
+ });
@@ -0,0 +1,181 @@
1
+ import 'reflect-metadata';
2
+ import { GenerateProtoMessagesService } from '../../../src/GrpcTransport/services/GenerateProtoMessagesService';
3
+
4
+ describe('GenerateProtoMessagesService', () => {
5
+ const service = new GenerateProtoMessagesService();
6
+
7
+ it('should generate empty message when objSchema is null', () => {
8
+ const result = service.call({
9
+ messageName: 'EmptyRequest',
10
+ objSchema: null,
11
+ existMessageNames: [],
12
+ });
13
+ expect(result.data).toEqual(['message EmptyRequest {}\n\n']);
14
+ expect(result.messageNames).toEqual(['EmptyRequest']);
15
+ });
16
+
17
+ it('should skip already existing message names', () => {
18
+ const result = service.call({
19
+ messageName: 'ExistingMessage',
20
+ objSchema: null,
21
+ existMessageNames: ['ExistingMessage'],
22
+ });
23
+ expect(result.data).toEqual([]);
24
+ expect(result.messageNames).toEqual([]);
25
+ });
26
+
27
+ it('should generate message with string field', () => {
28
+ const schema = {};
29
+ Reflect.defineMetadata('field:name', { type: String }, schema);
30
+
31
+ const result = service.call({
32
+ messageName: 'TestMessage',
33
+ objSchema: schema,
34
+ existMessageNames: [],
35
+ });
36
+
37
+ const output = result.data.join('');
38
+ expect(output).toContain('message TestMessage {');
39
+ expect(output).toContain('string name = 1;');
40
+ expect(result.messageNames).toEqual(['TestMessage']);
41
+ });
42
+
43
+ it('should generate message with number field as double', () => {
44
+ const schema = {};
45
+ Reflect.defineMetadata('field:count', { type: Number }, schema);
46
+
47
+ const result = service.call({
48
+ messageName: 'NumberMessage',
49
+ objSchema: schema,
50
+ existMessageNames: [],
51
+ });
52
+
53
+ const output = result.data.join('');
54
+ expect(output).toContain('double count = 1;');
55
+ });
56
+
57
+ it('should generate message with boolean field', () => {
58
+ const schema = {};
59
+ Reflect.defineMetadata('field:active', { type: Boolean }, schema);
60
+
61
+ const result = service.call({
62
+ messageName: 'BoolMessage',
63
+ objSchema: schema,
64
+ existMessageNames: [],
65
+ });
66
+
67
+ const output = result.data.join('');
68
+ expect(output).toContain('bool active = 1;');
69
+ });
70
+
71
+ it('should generate message with repeated field', () => {
72
+ const schema = {};
73
+ Reflect.defineMetadata('field:items', { type: String, array: true }, schema);
74
+
75
+ const result = service.call({
76
+ messageName: 'ArrayMessage',
77
+ objSchema: schema,
78
+ existMessageNames: [],
79
+ });
80
+
81
+ const output = result.data.join('');
82
+ expect(output).toContain('repeated string items = 1;');
83
+ });
84
+
85
+ it('should generate message with enum field as string', () => {
86
+ const schema = {};
87
+ Reflect.defineMetadata('field:status', { type: String, enum: true }, schema);
88
+
89
+ const result = service.call({
90
+ messageName: 'EnumMessage',
91
+ objSchema: schema,
92
+ existMessageNames: [],
93
+ });
94
+
95
+ const output = result.data.join('');
96
+ expect(output).toContain('string status = 1;');
97
+ });
98
+
99
+ it('should generate message with Object type as string', () => {
100
+ const schema = {};
101
+ Reflect.defineMetadata('field:data', { type: Object }, schema);
102
+
103
+ const result = service.call({
104
+ messageName: 'ObjectMessage',
105
+ objSchema: schema,
106
+ existMessageNames: [],
107
+ });
108
+
109
+ const output = result.data.join('');
110
+ expect(output).toContain('string data = 1;');
111
+ });
112
+
113
+ it('should generate message with JSON type as string', () => {
114
+ const schema = {};
115
+ Reflect.defineMetadata('field:payload', { type: JSON }, schema);
116
+
117
+ const result = service.call({
118
+ messageName: 'JsonMessage',
119
+ objSchema: schema,
120
+ existMessageNames: [],
121
+ });
122
+
123
+ const output = result.data.join('');
124
+ expect(output).toContain('string payload = 1;');
125
+ });
126
+
127
+ it('should generate nested message for custom type', () => {
128
+ const nestedSchema: any = { name: 'NestedType' };
129
+ Reflect.defineMetadata('field:inner', { type: String }, nestedSchema);
130
+
131
+ const schema = {};
132
+ Reflect.defineMetadata('field:nested', { type: nestedSchema }, schema);
133
+
134
+ const result = service.call({
135
+ messageName: 'ParentMessage',
136
+ objSchema: schema,
137
+ existMessageNames: [],
138
+ });
139
+
140
+ const output = result.data.join('');
141
+ expect(output).toContain('message ParentMessage {');
142
+ expect(output).toContain('NestedType nested = 1;');
143
+ expect(output).toContain('message NestedType {');
144
+ expect(output).toContain('string inner = 1;');
145
+ });
146
+
147
+ it('should handle multiple fields with correct indices', () => {
148
+ const schema = {};
149
+ Reflect.defineMetadata('field:name', { type: String }, schema);
150
+ Reflect.defineMetadata('field:age', { type: Number }, schema);
151
+ Reflect.defineMetadata('field:active', { type: Boolean }, schema);
152
+
153
+ const result = service.call({
154
+ messageName: 'MultiFieldMessage',
155
+ objSchema: schema,
156
+ existMessageNames: [],
157
+ });
158
+
159
+ const output = result.data.join('');
160
+ expect(output).toContain('= 1;');
161
+ expect(output).toContain('= 2;');
162
+ expect(output).toContain('= 3;');
163
+ });
164
+
165
+ it('should replace $ and _ in type names', () => {
166
+ const nestedSchema: any = { name: 'My$Type_Name' };
167
+ Reflect.defineMetadata('field:val', { type: String }, nestedSchema);
168
+
169
+ const schema = {};
170
+ Reflect.defineMetadata('field:item', { type: nestedSchema }, schema);
171
+
172
+ const result = service.call({
173
+ messageName: 'SpecialCharsMessage',
174
+ objSchema: schema,
175
+ existMessageNames: [],
176
+ });
177
+
178
+ const output = result.data.join('');
179
+ expect(output).toContain('MySSTypeTTName item = 1;');
180
+ });
181
+ });
@@ -0,0 +1,25 @@
1
+ import { GetPackageNameService } from '../../../src/GrpcTransport/services/GetPackageNameService';
2
+
3
+ describe('GetPackageNameService', () => {
4
+ const service = new GetPackageNameService();
5
+
6
+ it('should return single word as-is', () => {
7
+ expect(service.call('users')).toBe('users');
8
+ });
9
+
10
+ it('should camelCase hyphenated service name', () => {
11
+ expect(service.call('user-service')).toBe('userService');
12
+ });
13
+
14
+ it('should handle multiple hyphens', () => {
15
+ expect(service.call('my-long-service')).toBe('myLongService');
16
+ });
17
+
18
+ it('should capitalize first letter of each part except first', () => {
19
+ expect(service.call('api-gateway-service')).toBe('apiGatewayService');
20
+ });
21
+
22
+ it('should handle two-letter parts', () => {
23
+ expect(service.call('a-b')).toBe('aB');
24
+ });
25
+ });
@@ -0,0 +1,21 @@
1
+ export const Injectable = () => (target: any) => target;
2
+ export const Inject = () => () => {};
3
+ export const Module = () => (target: any) => target;
4
+ export const Global = () => (target: any) => target;
5
+ export const Controller = () => (target: any) => target;
6
+ export const UseInterceptors = () => () => {};
7
+
8
+ export const Logger = {
9
+ debug: jest.fn(),
10
+ error: jest.fn(),
11
+ };
12
+
13
+ export interface OnApplicationBootstrap {}
14
+ export interface OnApplicationShutdown {}
15
+ export type CallHandler = any;
16
+ export type ExecutionContext = any;
17
+ export interface NestInterceptor {}
18
+ export interface ModuleMetadata {
19
+ imports: any[];
20
+ }
21
+ export type DynamicModule = any;
@@ -0,0 +1,2 @@
1
+ export const Query = jest.fn(() => () => {});
2
+ export const Mutation = jest.fn(() => () => {});
@@ -0,0 +1,32 @@
1
+ export class RpcException extends Error {
2
+ constructor(msg: string) {
3
+ super(msg);
4
+ }
5
+ }
6
+
7
+ export class ClientProxyFactory {
8
+ static create(data: any) {
9
+ return {};
10
+ }
11
+ }
12
+
13
+ export enum Transport {
14
+ TCP = 0,
15
+ NATS = 1,
16
+ GRPC = 2,
17
+ }
18
+
19
+ export type ClientNats = any;
20
+ export type ClientGrpc = any;
21
+ export type GrpcOptions = any;
22
+ export type TcpClientOptions = any;
23
+ export type NatsOptions = any;
24
+ export type MicroserviceOptions = any;
25
+ export interface CustomStrategy {}
26
+
27
+ export const GrpcMethod =
28
+ (...args: any[]) =>
29
+ (...params: any[]) => {};
30
+ export const MessagePattern =
31
+ (data: any) =>
32
+ (...params: any[]) => {};