@adaas/a-server 0.0.28 → 0.0.30

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.
Files changed (89) hide show
  1. package/dist/browser/index.d.mts +123 -69
  2. package/dist/browser/index.mjs +212 -70
  3. package/dist/browser/index.mjs.map +1 -1
  4. package/dist/node/controllers/A-EntityController/A-EntityController.component.d.mts +2 -5
  5. package/dist/node/controllers/A-EntityController/A-EntityController.component.d.ts +2 -5
  6. package/dist/node/controllers/A-EntityController/A-EntityController.component.js +66 -88
  7. package/dist/node/controllers/A-EntityController/A-EntityController.component.js.map +1 -1
  8. package/dist/node/controllers/A-EntityController/A-EntityController.component.mjs +67 -89
  9. package/dist/node/controllers/A-EntityController/A-EntityController.component.mjs.map +1 -1
  10. package/dist/node/controllers/A-ListingController/A-ListingController.component.js +20 -18
  11. package/dist/node/controllers/A-ListingController/A-ListingController.component.js.map +1 -1
  12. package/dist/node/controllers/A-ListingController/A-ListingController.component.mjs +20 -18
  13. package/dist/node/controllers/A-ListingController/A-ListingController.component.mjs.map +1 -1
  14. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.mts +0 -2
  15. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.ts +0 -2
  16. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js +10 -1
  17. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js.map +1 -1
  18. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.mjs +10 -1
  19. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.mjs.map +1 -1
  20. package/dist/node/index.d.mts +3 -1
  21. package/dist/node/index.d.ts +3 -1
  22. package/dist/node/index.js +14 -0
  23. package/dist/node/index.mjs +2 -0
  24. package/dist/node/lib/A-Request/A-Request.helper.js +1 -1
  25. package/dist/node/lib/A-Request/A-Request.helper.js.map +1 -1
  26. package/dist/node/lib/A-Request/A-Request.helper.mjs +1 -1
  27. package/dist/node/lib/A-Request/A-Request.helper.mjs.map +1 -1
  28. package/dist/node/lib/A-Server/A-HttpServer.container.d.mts +4 -6
  29. package/dist/node/lib/A-Server/A-HttpServer.container.d.ts +4 -6
  30. package/dist/node/lib/A-ServerController/A-ServerController.component.js +17 -4
  31. package/dist/node/lib/A-ServerController/A-ServerController.component.js.map +1 -1
  32. package/dist/node/lib/A-ServerController/A-ServerController.component.mjs +17 -4
  33. package/dist/node/lib/A-ServerController/A-ServerController.component.mjs.map +1 -1
  34. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.d.mts +52 -28
  35. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.d.ts +52 -28
  36. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.js +117 -44
  37. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.js.map +1 -1
  38. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.mjs +118 -45
  39. package/dist/node/lib/A-ServerEntityList/A-EntityList.entity.mjs.map +1 -1
  40. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.d.mts +14 -6
  41. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.d.ts +14 -6
  42. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.js.map +1 -1
  43. package/dist/node/lib/A-ServerEntityList/A-EntityList.types.mjs.map +1 -1
  44. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.d.mts +12 -0
  45. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.d.ts +12 -0
  46. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.js +25 -0
  47. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.js.map +1 -0
  48. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.mjs +24 -0
  49. package/dist/node/lib/A-ServerEntityList/A-EntityListCacheState.context.mjs.map +1 -0
  50. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.d.mts +18 -0
  51. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.d.ts +18 -0
  52. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.js +48 -0
  53. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.js.map +1 -0
  54. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.mjs +47 -0
  55. package/dist/node/lib/A-ServerEntityList/A-EntityListPagination.context.mjs.map +1 -0
  56. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.mts +6 -8
  57. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.ts +6 -8
  58. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.js +3 -4
  59. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.js.map +1 -1
  60. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.mjs +4 -5
  61. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.mjs.map +1 -1
  62. package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.mts +0 -2
  63. package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.ts +0 -2
  64. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.js +1 -1
  65. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.js.map +1 -1
  66. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.mjs +1 -1
  67. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.mjs.map +1 -1
  68. package/dist/node/repositories/A-EntityRepository/A-EntityRepository.component.d.mts +1 -0
  69. package/dist/node/repositories/A-EntityRepository/A-EntityRepository.component.d.ts +1 -0
  70. package/examples/simple-server/components/Users.repository.ts +2 -2
  71. package/jest.config.ts +1 -0
  72. package/package.json +1 -1
  73. package/src/controllers/A-EntityController/A-EntityController.component.ts +69 -109
  74. package/src/controllers/A-ListingController/A-ListingController.component.ts +22 -20
  75. package/src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts +11 -1
  76. package/src/index.ts +2 -0
  77. package/src/lib/A-Request/A-Request.helper.ts +1 -1
  78. package/src/lib/A-ServerController/A-ServerController.component.ts +17 -8
  79. package/src/lib/A-ServerEntityList/A-EntityList.entity.ts +159 -55
  80. package/src/lib/A-ServerEntityList/A-EntityList.types.ts +17 -7
  81. package/src/lib/A-ServerEntityList/A-EntityListCacheState.context.ts +27 -0
  82. package/src/lib/A-ServerEntityList/A-EntityListPagination.context.ts +48 -0
  83. package/src/lib/A-ServerLogger/A-ServerLogger.component.ts +3 -4
  84. package/src/middlewares/A-ServerCORS/A_ServerCORS.component.ts +1 -1
  85. package/tests/A-Server-CORS.test.ts +542 -0
  86. package/tests/A-Server-Entity.test.ts +205 -0
  87. package/tests/A-Server-Health.test.ts +89 -0
  88. package/tests/A-Server-Routes.test.ts +113 -0
  89. package/tests/A-ServerEntityList.test.ts +416 -0
@@ -7,6 +7,7 @@ var AResponse_entity = require('@adaas/a-server/response/A-Response.entity');
7
7
  var AServerRouter_component = require('@adaas/a-server/router/A-ServerRouter.component');
8
8
  var AEntityList_entity = require('@adaas/a-server/entity-list/A-EntityList.entity');
9
9
  var AServerListQueryFilter_context = require('@adaas/a-server/list-query/A-ServerListQueryFilter.context');
10
+ var AHttpServer_error = require('../../lib/A-Server/A-HttpServer.error');
10
11
 
11
12
  var __defProp = Object.defineProperty;
12
13
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -21,25 +22,26 @@ var __decorateClass = (decorators, target, key, kind) => {
21
22
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
22
23
  class A_ListingController extends aConcept.A_Component {
23
24
  async list(request, response, scope, config) {
24
- const constructor = scope.resolveConstructor(request.params.type);
25
- if (constructor) {
26
- const entityList = new AEntityList_entity.A_ServerEntityList({
27
- name: request.params.type,
28
- scope: scope.name,
29
- constructor
25
+ const ctor = scope.resolveConstructor(request.params.type);
26
+ if (!ctor)
27
+ throw new AHttpServer_error.A_HttpServerError({
28
+ status: 404,
29
+ description: `Entity type "${request.params.type}" not registered`
30
30
  });
31
- scope.register(entityList);
32
- const queryFilter = new AServerListQueryFilter_context.A_ServerListQueryFilter(request.query, {
33
- itemsPerPage: String(config.get("A_LIST_ITEMS_PER_PAGE") || "10"),
34
- page: String(config.get("A_LIST_PAGE") || "1")
35
- });
36
- const queryScope = new aConcept.A_Scope({
37
- fragments: [queryFilter]
38
- }).inherit(scope);
39
- await entityList.load(queryScope);
40
- response.add("items", entityList.items);
41
- response.add("pagination", entityList.pagination);
42
- }
31
+ const entityList = new AEntityList_entity.A_ServerEntityList({
32
+ entity: ctor
33
+ });
34
+ scope.register(entityList);
35
+ const queryFilter = new AServerListQueryFilter_context.A_ServerListQueryFilter(request.query, {
36
+ itemsPerPage: String(config.get("A_LIST_ITEMS_PER_PAGE") || "10"),
37
+ page: String(config.get("A_LIST_PAGE") || "1")
38
+ });
39
+ const queryScope = new aConcept.A_Scope({
40
+ fragments: [queryFilter]
41
+ }).inherit(scope);
42
+ await entityList.load(queryScope);
43
+ response.add("items", entityList.items);
44
+ response.add("pagination", entityList.pagination);
43
45
  }
44
46
  }
45
47
  __decorateClass([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/controllers/A-ListingController/A-ListingController.component.ts"],"names":["A_Component","A_ServerEntityList","A_ServerListQueryFilter","A_Scope","A_ServerRouter","A_Request","A_Response","A_Config"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAUO,MAAM,4BAA4BA,oBAAA,CAAY;AAAA,EAWjD,MAAM,IAAA,CACmB,OAAA,EACC,QAAA,EACH,OACC,MAAA,EACtB;AAEE,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAEhE,IAAA,IAAI,WAAA,EAAa;AAEb,MAAA,MAAM,UAAA,GAAa,IAAIC,qCAAA,CAAmB;AAAA,QACtC,IAAA,EAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,QACrB,OAAO,KAAA,CAAM,IAAA;AAAA,QACb;AAAA,OACH,CAAA;AAED,MAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AAEzB,MAAA,MAAM,WAAA,GAAc,IAAIC,sDAAA,CAAwB,OAAA,CAAQ,KAAA,EAAO;AAAA,QAC3D,cAAc,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,uBAAuB,KAAK,IAAI,CAAA;AAAA,QAChE,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,aAAa,KAAK,GAAG;AAAA,OAChD,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,IAAIC,gBAAA,CAAQ;AAAA,QAC3B,SAAA,EAAW,CAAC,WAAW;AAAA,OAC1B,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAEhB,MAAA,MAAM,UAAA,CAAW,KAAK,UAAU,CAAA;AAEhC,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA;AACtC,MAAA,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,UAAU,CAAA;AAAA,IACpD;AAAA,EACJ;AACJ;AAlCU,eAAA,CAAA;AAAA,EALLC,uCAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,qCAASC,yBAAS,CAAA,CAAA;AAAA,EAClB,qCAASC,2BAAU,CAAA,CAAA;AAAA,EACnB,qCAASH,gBAAO,CAAA,CAAA;AAAA,EAChB,qCAASI,gBAAQ,CAAA;AAAA,CAAA,EAfb,mBAAA,CAWH,SAAA,EAAA,MAAA,CAAA","file":"A-ListingController.component.js","sourcesContent":["import { A_Component, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\"\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_ServerEntityList } from \"@adaas/a-server/entity-list/A-EntityList.entity\";\nimport { A_ServerListQueryFilter } from \"@adaas/a-server/list-query/A-ServerListQueryFilter.context\";\n\n\n\nexport class A_ListingController extends A_Component {\n\n // @A_Feature.Define({\n // name: 'listEntities',\n // invoke: false\n // })\n @A_ServerRouter.Get({\n path: '/:type',\n version: 'v1',\n prefix: 'a-list'\n })\n async list(\n @A_Inject(A_Request) request: A_Request<any, any, { type: string }>,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Config) config: A_Config<['A_LIST_ITEMS_PER_PAGE', 'A_LIST_PAGE']>\n ) {\n\n const constructor = scope.resolveConstructor(request.params.type);\n\n if (constructor) {\n\n const entityList = new A_ServerEntityList({\n name: request.params.type,\n scope: scope.name,\n constructor\n });\n\n scope.register(entityList);\n\n const queryFilter = new A_ServerListQueryFilter(request.query, {\n itemsPerPage: String(config.get('A_LIST_ITEMS_PER_PAGE') || '10'),\n page: String(config.get('A_LIST_PAGE') || '1')\n });\n\n const queryScope = new A_Scope({\n fragments: [queryFilter]\n }).inherit(scope);\n\n await entityList.load(queryScope);\n\n response.add('items', entityList.items);\n response.add('pagination', entityList.pagination);\n }\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/controllers/A-ListingController/A-ListingController.component.ts"],"names":["A_Component","A_HttpServerError","A_ServerEntityList","A_ServerListQueryFilter","A_Scope","A_ServerRouter","A_Request","A_Response","A_Config"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWO,MAAM,4BAA4BA,oBAAA,CAAY;AAAA,EAWjD,MAAM,IAAA,CACmB,OAAA,EACC,QAAA,EACH,OACC,MAAA,EACtB;AAEE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,IAAA;AACD,MAAA,MAAM,IAAIC,mCAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,aAAA,EAAgB,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,gBAAA;AAAA,OACnD,CAAA;AAEL,IAAA,MAAM,UAAA,GAAa,IAAIC,qCAAA,CAAmB;AAAA,MACtC,MAAA,EAAQ;AAAA,KACX,CAAA;AAED,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AAEzB,IAAA,MAAM,WAAA,GAAc,IAAIC,sDAAA,CAAwB,OAAA,CAAQ,KAAA,EAAO;AAAA,MAC3D,cAAc,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,uBAAuB,KAAK,IAAI,CAAA;AAAA,MAChE,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,aAAa,KAAK,GAAG;AAAA,KAChD,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAIC,gBAAA,CAAQ;AAAA,MAC3B,SAAA,EAAW,CAAC,WAAW;AAAA,KAC1B,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAEhB,IAAA,MAAM,UAAA,CAAW,KAAK,UAAU,CAAA;AAEhC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,UAAU,CAAA;AAAA,EACpD;AACJ;AAnCU,eAAA,CAAA;AAAA,EALLC,uCAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,qCAASC,yBAAS,CAAA,CAAA;AAAA,EAClB,qCAASC,2BAAU,CAAA,CAAA;AAAA,EACnB,qCAASH,gBAAO,CAAA,CAAA;AAAA,EAChB,qCAASI,gBAAQ,CAAA;AAAA,CAAA,EAfb,mBAAA,CAWH,SAAA,EAAA,MAAA,CAAA","file":"A-ListingController.component.js","sourcesContent":["import { A_Component, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\"\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_ServerEntityList } from \"@adaas/a-server/entity-list/A-EntityList.entity\";\nimport { A_ServerListQueryFilter } from \"@adaas/a-server/list-query/A-ServerListQueryFilter.context\";\nimport { A_HttpServerError } from \"../../lib/A-Server/A-HttpServer.error\";\n\n\n\nexport class A_ListingController extends A_Component {\n\n // @A_Feature.Define({\n // name: 'listEntities',\n // invoke: false\n // })\n @A_ServerRouter.Get({\n path: '/:type',\n version: 'v1',\n prefix: 'a-list'\n })\n async list(\n @A_Inject(A_Request) request: A_Request<any, any, { type: string }>,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Config) config: A_Config<['A_LIST_ITEMS_PER_PAGE', 'A_LIST_PAGE']>\n ) {\n\n const ctor = scope.resolveConstructor(request.params.type);\n\n if (!ctor)\n throw new A_HttpServerError({\n status: 404,\n description: `Entity type \"${request.params.type}\" not registered`,\n });\n\n const entityList = new A_ServerEntityList({\n entity: ctor,\n });\n\n scope.register(entityList);\n\n const queryFilter = new A_ServerListQueryFilter(request.query, {\n itemsPerPage: String(config.get('A_LIST_ITEMS_PER_PAGE') || '10'),\n page: String(config.get('A_LIST_PAGE') || '1'),\n });\n\n const queryScope = new A_Scope({\n fragments: [queryFilter],\n }).inherit(scope);\n\n await entityList.load(queryScope);\n\n response.add('items', entityList.items);\n response.add('pagination', entityList.pagination);\n }\n}"]}
@@ -6,28 +6,30 @@ import { A_Response } from '@adaas/a-server/response/A-Response.entity';
6
6
  import { A_ServerRouter } from '@adaas/a-server/router/A-ServerRouter.component';
7
7
  import { A_ServerEntityList } from '@adaas/a-server/entity-list/A-EntityList.entity';
8
8
  import { A_ServerListQueryFilter } from '@adaas/a-server/list-query/A-ServerListQueryFilter.context';
9
+ import { A_HttpServerError } from '../../lib/A-Server/A-HttpServer.error';
9
10
 
10
11
  class A_ListingController extends A_Component {
11
12
  async list(request, response, scope, config) {
12
- const constructor = scope.resolveConstructor(request.params.type);
13
- if (constructor) {
14
- const entityList = new A_ServerEntityList({
15
- name: request.params.type,
16
- scope: scope.name,
17
- constructor
13
+ const ctor = scope.resolveConstructor(request.params.type);
14
+ if (!ctor)
15
+ throw new A_HttpServerError({
16
+ status: 404,
17
+ description: `Entity type "${request.params.type}" not registered`
18
18
  });
19
- scope.register(entityList);
20
- const queryFilter = new A_ServerListQueryFilter(request.query, {
21
- itemsPerPage: String(config.get("A_LIST_ITEMS_PER_PAGE") || "10"),
22
- page: String(config.get("A_LIST_PAGE") || "1")
23
- });
24
- const queryScope = new A_Scope({
25
- fragments: [queryFilter]
26
- }).inherit(scope);
27
- await entityList.load(queryScope);
28
- response.add("items", entityList.items);
29
- response.add("pagination", entityList.pagination);
30
- }
19
+ const entityList = new A_ServerEntityList({
20
+ entity: ctor
21
+ });
22
+ scope.register(entityList);
23
+ const queryFilter = new A_ServerListQueryFilter(request.query, {
24
+ itemsPerPage: String(config.get("A_LIST_ITEMS_PER_PAGE") || "10"),
25
+ page: String(config.get("A_LIST_PAGE") || "1")
26
+ });
27
+ const queryScope = new A_Scope({
28
+ fragments: [queryFilter]
29
+ }).inherit(scope);
30
+ await entityList.load(queryScope);
31
+ response.add("items", entityList.items);
32
+ response.add("pagination", entityList.pagination);
31
33
  }
32
34
  }
33
35
  __decorateClass([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/controllers/A-ListingController/A-ListingController.component.ts"],"names":[],"mappings":";;;;;;;;;AAUO,MAAM,4BAA4B,WAAA,CAAY;AAAA,EAWjD,MAAM,IAAA,CACmB,OAAA,EACC,QAAA,EACH,OACC,MAAA,EACtB;AAEE,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAEhE,IAAA,IAAI,WAAA,EAAa;AAEb,MAAA,MAAM,UAAA,GAAa,IAAI,kBAAA,CAAmB;AAAA,QACtC,IAAA,EAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,QACrB,OAAO,KAAA,CAAM,IAAA;AAAA,QACb;AAAA,OACH,CAAA;AAED,MAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AAEzB,MAAA,MAAM,WAAA,GAAc,IAAI,uBAAA,CAAwB,OAAA,CAAQ,KAAA,EAAO;AAAA,QAC3D,cAAc,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,uBAAuB,KAAK,IAAI,CAAA;AAAA,QAChE,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,aAAa,KAAK,GAAG;AAAA,OAChD,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAQ;AAAA,QAC3B,SAAA,EAAW,CAAC,WAAW;AAAA,OAC1B,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAEhB,MAAA,MAAM,UAAA,CAAW,KAAK,UAAU,CAAA;AAEhC,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA;AACtC,MAAA,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,UAAU,CAAA;AAAA,IACpD;AAAA,EACJ;AACJ;AAlCU,eAAA,CAAA;AAAA,EALL,eAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,UAAU,CAAA,CAAA;AAAA,EACnB,4BAAS,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,QAAQ,CAAA;AAAA,CAAA,EAfb,mBAAA,CAWH,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA","file":"A-ListingController.component.mjs","sourcesContent":["import { A_Component, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\"\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_ServerEntityList } from \"@adaas/a-server/entity-list/A-EntityList.entity\";\nimport { A_ServerListQueryFilter } from \"@adaas/a-server/list-query/A-ServerListQueryFilter.context\";\n\n\n\nexport class A_ListingController extends A_Component {\n\n // @A_Feature.Define({\n // name: 'listEntities',\n // invoke: false\n // })\n @A_ServerRouter.Get({\n path: '/:type',\n version: 'v1',\n prefix: 'a-list'\n })\n async list(\n @A_Inject(A_Request) request: A_Request<any, any, { type: string }>,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Config) config: A_Config<['A_LIST_ITEMS_PER_PAGE', 'A_LIST_PAGE']>\n ) {\n\n const constructor = scope.resolveConstructor(request.params.type);\n\n if (constructor) {\n\n const entityList = new A_ServerEntityList({\n name: request.params.type,\n scope: scope.name,\n constructor\n });\n\n scope.register(entityList);\n\n const queryFilter = new A_ServerListQueryFilter(request.query, {\n itemsPerPage: String(config.get('A_LIST_ITEMS_PER_PAGE') || '10'),\n page: String(config.get('A_LIST_PAGE') || '1')\n });\n\n const queryScope = new A_Scope({\n fragments: [queryFilter]\n }).inherit(scope);\n\n await entityList.load(queryScope);\n\n response.add('items', entityList.items);\n response.add('pagination', entityList.pagination);\n }\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/controllers/A-ListingController/A-ListingController.component.ts"],"names":[],"mappings":";;;;;;;;;;AAWO,MAAM,4BAA4B,WAAA,CAAY;AAAA,EAWjD,MAAM,IAAA,CACmB,OAAA,EACC,QAAA,EACH,OACC,MAAA,EACtB;AAEE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,OAAA,CAAQ,OAAO,IAAI,CAAA;AAEzD,IAAA,IAAI,CAAC,IAAA;AACD,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,aAAA,EAAgB,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,gBAAA;AAAA,OACnD,CAAA;AAEL,IAAA,MAAM,UAAA,GAAa,IAAI,kBAAA,CAAmB;AAAA,MACtC,MAAA,EAAQ;AAAA,KACX,CAAA;AAED,IAAA,KAAA,CAAM,SAAS,UAAU,CAAA;AAEzB,IAAA,MAAM,WAAA,GAAc,IAAI,uBAAA,CAAwB,OAAA,CAAQ,KAAA,EAAO;AAAA,MAC3D,cAAc,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,uBAAuB,KAAK,IAAI,CAAA;AAAA,MAChE,MAAM,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,aAAa,KAAK,GAAG;AAAA,KAChD,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAQ;AAAA,MAC3B,SAAA,EAAW,CAAC,WAAW;AAAA,KAC1B,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAEhB,IAAA,MAAM,UAAA,CAAW,KAAK,UAAU,CAAA;AAEhC,IAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA;AACtC,IAAA,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,UAAA,CAAW,UAAU,CAAA;AAAA,EACpD;AACJ;AAnCU,eAAA,CAAA;AAAA,EALL,eAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,UAAU,CAAA,CAAA;AAAA,EACnB,4BAAS,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,QAAQ,CAAA;AAAA,CAAA,EAfb,mBAAA,CAWH,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA","file":"A-ListingController.component.mjs","sourcesContent":["import { A_Component, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\"\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_ServerEntityList } from \"@adaas/a-server/entity-list/A-EntityList.entity\";\nimport { A_ServerListQueryFilter } from \"@adaas/a-server/list-query/A-ServerListQueryFilter.context\";\nimport { A_HttpServerError } from \"../../lib/A-Server/A-HttpServer.error\";\n\n\n\nexport class A_ListingController extends A_Component {\n\n // @A_Feature.Define({\n // name: 'listEntities',\n // invoke: false\n // })\n @A_ServerRouter.Get({\n path: '/:type',\n version: 'v1',\n prefix: 'a-list'\n })\n async list(\n @A_Inject(A_Request) request: A_Request<any, any, { type: string }>,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Config) config: A_Config<['A_LIST_ITEMS_PER_PAGE', 'A_LIST_PAGE']>\n ) {\n\n const ctor = scope.resolveConstructor(request.params.type);\n\n if (!ctor)\n throw new A_HttpServerError({\n status: 404,\n description: `Entity type \"${request.params.type}\" not registered`,\n });\n\n const entityList = new A_ServerEntityList({\n entity: ctor,\n });\n\n scope.register(entityList);\n\n const queryFilter = new A_ServerListQueryFilter(request.query, {\n itemsPerPage: String(config.get('A_LIST_ITEMS_PER_PAGE') || '10'),\n page: String(config.get('A_LIST_PAGE') || '1'),\n });\n\n const queryScope = new A_Scope({\n fragments: [queryFilter],\n }).inherit(scope);\n\n await entityList.load(queryScope);\n\n response.add('items', entityList.items);\n response.add('pagination', entityList.pagination);\n }\n}"]}
@@ -19,8 +19,6 @@ import '../../lib/A-ServerRoute/A-ServerRoute.types.mjs';
19
19
  import '../../lib/A-ServerRoute/A-ServerRoute.constants.mjs';
20
20
  import 'stream';
21
21
  import '../../lib/A-Response/A-Response.constants.mjs';
22
- import '../../lib/A-Server/A-Server.context.mjs';
23
- import '../../lib/A-Server/A-Server.types.mjs';
24
22
  import '@adaas/a-utils/a-logger';
25
23
 
26
24
  declare class A_ServerHealthMonitor extends A_Component {
@@ -19,8 +19,6 @@ import '../../lib/A-ServerRoute/A-ServerRoute.types.js';
19
19
  import '../../lib/A-ServerRoute/A-ServerRoute.constants.js';
20
20
  import 'stream';
21
21
  import '../../lib/A-Response/A-Response.constants.js';
22
- import '../../lib/A-Server/A-Server.context.js';
23
- import '../../lib/A-Server/A-Server.types.js';
24
22
  import '@adaas/a-utils/a-logger';
25
23
 
26
24
  declare class A_ServerHealthMonitor extends A_Component {
@@ -6,6 +6,7 @@ var ARequest_entity = require('@adaas/a-server/request/A-Request.entity');
6
6
  var AResponse_entity = require('@adaas/a-server/response/A-Response.entity');
7
7
  var aConfig = require('@adaas/a-utils/a-config');
8
8
  var AServerLogger_component = require('@adaas/a-server/logger/A-ServerLogger.component');
9
+ var AHttpServer_error = require('../../lib/A-Server/A-HttpServer.error');
9
10
  var fs = require('fs');
10
11
  var path = require('path');
11
12
 
@@ -29,7 +30,15 @@ class A_ServerHealthMonitor extends aConcept.A_Component {
29
30
  async get(config, request, response, logger) {
30
31
  const rootFolder = config.get("A_CONCEPT_ROOT_FOLDER") || aConcept.A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();
31
32
  const pkgPath = path__default.default.join(rootFolder, "package.json");
32
- const packageJSON = JSON.parse(fs__default.default.readFileSync(pkgPath, "utf-8"));
33
+ let packageJSON;
34
+ try {
35
+ packageJSON = JSON.parse(fs__default.default.readFileSync(pkgPath, "utf-8"));
36
+ } catch {
37
+ throw new AHttpServer_error.A_HttpServerError({
38
+ status: 500,
39
+ description: `Could not read package.json at "${pkgPath}"`
40
+ });
41
+ }
33
42
  const exposedProperties = config.get("EXPOSED_PROPERTIES")?.split(",") || [
34
43
  "name",
35
44
  "version",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":["A_Component","A_CONCEPT_ENV","path","fs","A_ServerRouter","A_Config","A_Request","A_Response","A_ServerLogger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,MAAM,8BAA8BA,oBAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,uBAAuB,KAAKC,sBAAA,CAAc,qBAAA,IAAyB,QAAQ,GAAA,EAAI;AAC7G,IAAA,MAAM,OAAA,GAAUC,qBAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACpD,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAMC,oBAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAGhE,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACJ;AAnBU,eAAA,CAAA;AAAA,EALLC,uCAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,qCAASC,gBAAQ,CAAA,CAAA;AAAA,EACjB,qCAASC,yBAAS,CAAA,CAAA;AAAA,EAClB,qCAASC,2BAAU,CAAA,CAAA;AAAA,EACnB,qCAASC,sCAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,CAAA","file":"A-ServerHealthMonitor.component.js","sourcesContent":["import { A_Component, A_CONCEPT_ENV, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const rootFolder = config.get('A_CONCEPT_ROOT_FOLDER') || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();\n const pkgPath = path.join(rootFolder, 'package.json');\n const packageJSON = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON[prop]));\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":["A_Component","A_CONCEPT_ENV","path","fs","A_HttpServerError","A_ServerRouter","A_Config","A_Request","A_Response","A_ServerLogger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,8BAA8BA,oBAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,uBAAuB,KAAKC,sBAAA,CAAc,qBAAA,IAAyB,QAAQ,GAAA,EAAI;AAC7G,IAAA,MAAM,OAAA,GAAUC,qBAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AAEpD,IAAA,IAAI,WAAA;AAEJ,IAAA,IAAI;AACA,MAAA,WAAA,GAAc,KAAK,KAAA,CAAMC,mBAAA,CAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACJ,MAAA,MAAM,IAAIC,mCAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,mCAAmC,OAAO,CAAA,CAAA;AAAA,OAC1D,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACJ;AA5BU,eAAA,CAAA;AAAA,EALLC,uCAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,qCAASC,gBAAQ,CAAA,CAAA;AAAA,EACjB,qCAASC,yBAAS,CAAA,CAAA;AAAA,EAClB,qCAASC,2BAAU,CAAA,CAAA;AAAA,EACnB,qCAASC,sCAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,CAAA","file":"A-ServerHealthMonitor.component.js","sourcesContent":["import { A_Component, A_CONCEPT_ENV, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport { A_HttpServerError } from \"../../lib/A-Server/A-HttpServer.error\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const rootFolder = config.get('A_CONCEPT_ROOT_FOLDER') || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();\n const pkgPath = path.join(rootFolder, 'package.json');\n\n let packageJSON: Record<string, unknown>;\n\n try {\n packageJSON = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n } catch {\n throw new A_HttpServerError({\n status: 500,\n description: `Could not read package.json at \"${pkgPath}\"`,\n });\n }\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON[prop]));\n }\n}"]}
@@ -5,6 +5,7 @@ import { A_Request } from '@adaas/a-server/request/A-Request.entity';
5
5
  import { A_Response } from '@adaas/a-server/response/A-Response.entity';
6
6
  import { A_Config } from '@adaas/a-utils/a-config';
7
7
  import { A_ServerLogger } from '@adaas/a-server/logger/A-ServerLogger.component';
8
+ import { A_HttpServerError } from '../../lib/A-Server/A-HttpServer.error';
8
9
  import fs from 'fs';
9
10
  import path from 'path';
10
11
 
@@ -12,7 +13,15 @@ class A_ServerHealthMonitor extends A_Component {
12
13
  async get(config, request, response, logger) {
13
14
  const rootFolder = config.get("A_CONCEPT_ROOT_FOLDER") || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();
14
15
  const pkgPath = path.join(rootFolder, "package.json");
15
- const packageJSON = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
16
+ let packageJSON;
17
+ try {
18
+ packageJSON = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
19
+ } catch {
20
+ throw new A_HttpServerError({
21
+ status: 500,
22
+ description: `Could not read package.json at "${pkgPath}"`
23
+ });
24
+ }
16
25
  const exposedProperties = config.get("EXPOSED_PROPERTIES")?.split(",") || [
17
26
  "name",
18
27
  "version",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":[],"mappings":";;;;;;;;;;AAWO,MAAM,8BAA8B,WAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,uBAAuB,KAAK,aAAA,CAAc,qBAAA,IAAyB,QAAQ,GAAA,EAAI;AAC7G,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACpD,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAGhE,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACJ;AAnBU,eAAA,CAAA;AAAA,EALL,eAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,UAAU,CAAA,CAAA;AAAA,EACnB,4BAAS,cAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,EAAA,CAAA,CAAA","file":"A-ServerHealthMonitor.component.mjs","sourcesContent":["import { A_Component, A_CONCEPT_ENV, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const rootFolder = config.get('A_CONCEPT_ROOT_FOLDER') || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();\n const pkgPath = path.join(rootFolder, 'package.json');\n const packageJSON = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON[prop]));\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAYO,MAAM,8BAA8B,WAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,uBAAuB,KAAK,aAAA,CAAc,qBAAA,IAAyB,QAAQ,GAAA,EAAI;AAC7G,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AAEpD,IAAA,IAAI,WAAA;AAEJ,IAAA,IAAI;AACA,MAAA,WAAA,GAAc,KAAK,KAAA,CAAM,EAAA,CAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AACJ,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,mCAAmC,OAAO,CAAA,CAAA;AAAA,OAC1D,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACJ;AA5BU,eAAA,CAAA;AAAA,EALL,eAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,UAAU,CAAA,CAAA;AAAA,EACnB,4BAAS,cAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,EAAA,CAAA,CAAA","file":"A-ServerHealthMonitor.component.mjs","sourcesContent":["import { A_Component, A_CONCEPT_ENV, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport { A_HttpServerError } from \"../../lib/A-Server/A-HttpServer.error\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const rootFolder = config.get('A_CONCEPT_ROOT_FOLDER') || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();\n const pkgPath = path.join(rootFolder, 'package.json');\n\n let packageJSON: Record<string, unknown>;\n\n try {\n packageJSON = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n } catch {\n throw new A_HttpServerError({\n status: 500,\n description: `Could not read package.json at \"${pkgPath}\"`,\n });\n }\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON[prop]));\n }\n}"]}
@@ -17,7 +17,9 @@ export { A_ServerError } from './lib/A-Server/A-Server.error.mjs';
17
17
  export { A_SERVER_TYPES__ServerConstructor, A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized } from './lib/A-Server/A-Server.types.mjs';
18
18
  export { A_ServerController } from './lib/A-ServerController/A-ServerController.component.mjs';
19
19
  export { A_ServerEntityList } from './lib/A-ServerEntityList/A-EntityList.entity.mjs';
20
- export { A_SERVER_TYPES__A_EntityListConstructor, A_SERVER_TYPES__A_EntityListEvent, A_SERVER_TYPES__A_EntityListPagination, A_SERVER_TYPES__A_EntityListSerialized } from './lib/A-ServerEntityList/A-EntityList.types.mjs';
20
+ export { A_SERVER_TYPES__A_EntityListCacheEntry, A_SERVER_TYPES__A_EntityListConstructor, A_SERVER_TYPES__A_EntityListEvent, A_SERVER_TYPES__A_EntityListPagination, A_SERVER_TYPES__A_EntityListSerialized } from './lib/A-ServerEntityList/A-EntityList.types.mjs';
21
+ export { A_SERVER_TYPES__A_EntityListPaginationSerialized, A_ServerEntityListPagination } from './lib/A-ServerEntityList/A-EntityListPagination.context.mjs';
22
+ export { A_ServerEntityListCacheState } from './lib/A-ServerEntityList/A-EntityListCacheState.context.mjs';
21
23
  export { A_ServerListQueryFilter } from './lib/A-ServerListQuery/A-ServerListQueryFilter.context.mjs';
22
24
  export { A_SERVER__A_SERVER_LOGGER_ENV_VARIABLES } from './lib/A-ServerLogger/A-ServerLogger.constants.mjs';
23
25
  export { A_ServerLogger } from './lib/A-ServerLogger/A-ServerLogger.component.mjs';
@@ -17,7 +17,9 @@ export { A_ServerError } from './lib/A-Server/A-Server.error.js';
17
17
  export { A_SERVER_TYPES__ServerConstructor, A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized } from './lib/A-Server/A-Server.types.js';
18
18
  export { A_ServerController } from './lib/A-ServerController/A-ServerController.component.js';
19
19
  export { A_ServerEntityList } from './lib/A-ServerEntityList/A-EntityList.entity.js';
20
- export { A_SERVER_TYPES__A_EntityListConstructor, A_SERVER_TYPES__A_EntityListEvent, A_SERVER_TYPES__A_EntityListPagination, A_SERVER_TYPES__A_EntityListSerialized } from './lib/A-ServerEntityList/A-EntityList.types.js';
20
+ export { A_SERVER_TYPES__A_EntityListCacheEntry, A_SERVER_TYPES__A_EntityListConstructor, A_SERVER_TYPES__A_EntityListEvent, A_SERVER_TYPES__A_EntityListPagination, A_SERVER_TYPES__A_EntityListSerialized } from './lib/A-ServerEntityList/A-EntityList.types.js';
21
+ export { A_SERVER_TYPES__A_EntityListPaginationSerialized, A_ServerEntityListPagination } from './lib/A-ServerEntityList/A-EntityListPagination.context.js';
22
+ export { A_ServerEntityListCacheState } from './lib/A-ServerEntityList/A-EntityListCacheState.context.js';
21
23
  export { A_ServerListQueryFilter } from './lib/A-ServerListQuery/A-ServerListQueryFilter.context.js';
22
24
  export { A_SERVER__A_SERVER_LOGGER_ENV_VARIABLES } from './lib/A-ServerLogger/A-ServerLogger.constants.js';
23
25
  export { A_ServerLogger } from './lib/A-ServerLogger/A-ServerLogger.component.js';
@@ -24,6 +24,8 @@ var AServerController_component = require('./lib/A-ServerController/A-ServerCont
24
24
  var AServerController_types = require('./lib/A-ServerController/A-ServerController.types');
25
25
  var AEntityList_entity = require('./lib/A-ServerEntityList/A-EntityList.entity');
26
26
  var AEntityList_types = require('./lib/A-ServerEntityList/A-EntityList.types');
27
+ var AEntityListPagination_context = require('./lib/A-ServerEntityList/A-EntityListPagination.context');
28
+ var AEntityListCacheState_context = require('./lib/A-ServerEntityList/A-EntityListCacheState.context');
27
29
  var AServerListQueryFilter_context = require('./lib/A-ServerListQuery/A-ServerListQueryFilter.context');
28
30
  var AServerLogger_constants = require('./lib/A-ServerLogger/A-ServerLogger.constants');
29
31
  var AServerLogger_component = require('./lib/A-ServerLogger/A-ServerLogger.component');
@@ -196,6 +198,18 @@ Object.keys(AEntityList_types).forEach(function (k) {
196
198
  get: function () { return AEntityList_types[k]; }
197
199
  });
198
200
  });
201
+ Object.keys(AEntityListPagination_context).forEach(function (k) {
202
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
203
+ enumerable: true,
204
+ get: function () { return AEntityListPagination_context[k]; }
205
+ });
206
+ });
207
+ Object.keys(AEntityListCacheState_context).forEach(function (k) {
208
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
209
+ enumerable: true,
210
+ get: function () { return AEntityListCacheState_context[k]; }
211
+ });
212
+ });
199
213
  Object.keys(AServerListQueryFilter_context).forEach(function (k) {
200
214
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
201
215
  enumerable: true,
@@ -23,6 +23,8 @@ export * from './lib/A-ServerController/A-ServerController.component';
23
23
  export * from './lib/A-ServerController/A-ServerController.types';
24
24
  export * from './lib/A-ServerEntityList/A-EntityList.entity';
25
25
  export * from './lib/A-ServerEntityList/A-EntityList.types';
26
+ export * from './lib/A-ServerEntityList/A-EntityListPagination.context';
27
+ export * from './lib/A-ServerEntityList/A-EntityListCacheState.context';
26
28
  export * from './lib/A-ServerListQuery/A-ServerListQueryFilter.context';
27
29
  export * from './lib/A-ServerLogger/A-ServerLogger.constants';
28
30
  export * from './lib/A-ServerLogger/A-ServerLogger.component';
@@ -73,7 +73,7 @@ class A_RequestHelper {
73
73
  let bodyType;
74
74
  switch (true) {
75
75
  case (!!context.contentType && context.contentType.includes("application/json")):
76
- parsedBody = JSON.parse(context.data);
76
+ parsedBody = JSON.parse(context.data || "{}");
77
77
  bodyType = "json";
78
78
  break;
79
79
  case (!!context.contentType && context.contentType.includes("application/x-www-form-urlencoded")):
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/A-Request/A-Request.helper.ts"],"names":["A_RequestError"],"mappings":"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","file":"A-Request.helper.js","sourcesContent":["import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n /**\n * Extract URL parameters from a URL using a route pattern\n * @param url - The actual URL to extract parameters from\n * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n * @returns Object containing extracted parameters\n */\n static extractParams(url: string, routePattern: string): Record<string, string> {\n // Remove query string (anything after ?)\n const cleanUrl = url.split('?')[0];\n const cleanPattern = routePattern.split('?')[0];\n\n const urlSegments = cleanUrl.split('/').filter(Boolean);\n const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const urlSegment = urlSegments[i];\n\n if (patternSegment.startsWith(':')) {\n const paramName = patternSegment.slice(1); // Remove ':' from pattern\n if (urlSegment) {\n params[paramName] = decodeURIComponent(urlSegment);\n }\n } else if (patternSegment !== urlSegment) {\n // If static segments don't match → fail\n return {};\n }\n }\n\n return params;\n }\n\n\n\n /**\n * Extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Object containing query parameters\n */\n static extractQuery<T = Record<string, string>>(url: string): T {\n const query: Record<string, string> = {};\n\n // Take only the part after \"?\"\n const queryString = url.split('?')[1];\n if (!queryString) return query as T;\n\n // Remove fragment (#...) if present\n const cleanQuery = queryString.split('#')[0];\n\n // Split into key=value pairs\n for (const pair of cleanQuery.split('&')) {\n if (!pair) continue;\n const [key, value = ''] = pair.split('=');\n query[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return query as T;\n }\n\n\n /**\n * Parse cookies from Cookie header\n */\n static parseCookies(\n cookieHeader?: string\n ): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n if (!cookieHeader) return {};\n\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n if (name && value) {\n cookies[name] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n /**\n * Parse request body based on Content-Type\n * \n * \n * @param context - The HTTP server request context\n * @returns Parsed body data and detected body type\n */\n static parseRequestBody<T extends any = any>(\n context: A_HttpServerRequestContext\n ): {\n data: T;\n type: A_Request_BodyType;\n } {\n let parsedBody: any;\n let bodyType: A_Request_BodyType;\n\n switch (true) {\n case !!context.contentType && context.contentType.includes('application/json'):\n parsedBody = JSON.parse(context.data);\n bodyType = 'json';\n break;\n case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n bodyType = 'form';\n break;\n case !!context.contentType && context.contentType.includes('multipart/form-data'):\n const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n // Return the entire multipart result (fields + files) as T\n parsedBody = {\n ...multipartResult.fields,\n _files: multipartResult.files\n } as T;\n bodyType = 'multipart';\n break;\n case !!context.contentType && context.contentType.includes('text/'):\n parsedBody = context.data as T;\n bodyType = 'text';\n break;\n default:\n parsedBody = Buffer.concat(context.buffers) as T;\n bodyType = 'raw';\n break;\n }\n\n\n return {\n data: parsedBody,\n type: bodyType\n };\n }\n\n /**\n * Parse URL-encoded form data (application/x-www-form-urlencoded)\n * @param body - The URL-encoded body string\n * @returns Object containing form data\n */\n static parseFormUrlEncoded(\n /**\n * The URL-encoded body string\n */\n body: string\n ): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n\n if (!body) return result;\n\n const pairs = body.split('&');\n\n for (const pair of pairs) {\n if (!pair) continue;\n\n const [key, value = ''] = pair.split('=');\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle multiple values for the same key (arrays)\n if (decodedKey in result) {\n const existing = result[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n result[decodedKey] = [existing, decodedValue];\n }\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parse multipart form data (for file uploads and form data)\n * @param buffer - The raw buffer containing multipart data\n * @param contentType - The content type header\n * @returns Object containing fields and files\n */\n static parseMultipartData(\n /**\n * The raw buffer containing multipart data\n */\n buffer: Buffer,\n /**\n * The content type header\n */\n contentType: string\n ): {\n fields: Record<string, string>;\n files: A_Request_FileUpload[];\n } {\n // Extract boundary\n const boundaryMatch = contentType.match(/boundary=(.+)/);\n if (!boundaryMatch) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n 'Missing boundary in multipart/form-data content type'\n )\n }\n\n const boundary = '--' + boundaryMatch[1];\n const textData = buffer.toString();\n const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n const fields: Record<string, string> = {};\n const files: A_Request_FileUpload[] = [];\n\n parts.forEach(part => {\n const [headers, content] = part.split('\\r\\n\\r\\n');\n if (!headers || content === undefined) return;\n\n const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (nameMatch) {\n const fieldName = nameMatch[1];\n const cleanContent = content.replace(/\\r\\n$/, '');\n\n if (filenameMatch) {\n // It's a file upload\n const file: A_Request_FileUpload = {\n fieldName,\n filename: filenameMatch[1],\n encoding: 'binary',\n mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n size: Buffer.byteLength(cleanContent),\n buffer: Buffer.from(cleanContent, 'binary')\n };\n files.push(file);\n } else {\n // It's a regular field\n fields[fieldName] = cleanContent;\n }\n }\n });\n\n return { fields, files };\n }\n\n}"]}
1
+ {"version":3,"sources":["../../../../src/lib/A-Request/A-Request.helper.ts"],"names":["A_RequestError"],"mappings":"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","file":"A-Request.helper.js","sourcesContent":["import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n /**\n * Extract URL parameters from a URL using a route pattern\n * @param url - The actual URL to extract parameters from\n * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n * @returns Object containing extracted parameters\n */\n static extractParams(url: string, routePattern: string): Record<string, string> {\n // Remove query string (anything after ?)\n const cleanUrl = url.split('?')[0];\n const cleanPattern = routePattern.split('?')[0];\n\n const urlSegments = cleanUrl.split('/').filter(Boolean);\n const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const urlSegment = urlSegments[i];\n\n if (patternSegment.startsWith(':')) {\n const paramName = patternSegment.slice(1); // Remove ':' from pattern\n if (urlSegment) {\n params[paramName] = decodeURIComponent(urlSegment);\n }\n } else if (patternSegment !== urlSegment) {\n // If static segments don't match → fail\n return {};\n }\n }\n\n return params;\n }\n\n\n\n /**\n * Extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Object containing query parameters\n */\n static extractQuery<T = Record<string, string>>(url: string): T {\n const query: Record<string, string> = {};\n\n // Take only the part after \"?\"\n const queryString = url.split('?')[1];\n if (!queryString) return query as T;\n\n // Remove fragment (#...) if present\n const cleanQuery = queryString.split('#')[0];\n\n // Split into key=value pairs\n for (const pair of cleanQuery.split('&')) {\n if (!pair) continue;\n const [key, value = ''] = pair.split('=');\n query[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return query as T;\n }\n\n\n /**\n * Parse cookies from Cookie header\n */\n static parseCookies(\n cookieHeader?: string\n ): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n if (!cookieHeader) return {};\n\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n if (name && value) {\n cookies[name] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n /**\n * Parse request body based on Content-Type\n * \n * \n * @param context - The HTTP server request context\n * @returns Parsed body data and detected body type\n */\n static parseRequestBody<T extends any = any>(\n context: A_HttpServerRequestContext\n ): {\n data: T;\n type: A_Request_BodyType;\n } {\n let parsedBody: any;\n let bodyType: A_Request_BodyType;\n\n switch (true) {\n case !!context.contentType && context.contentType.includes('application/json'):\n parsedBody = JSON.parse(context.data || '{}');\n bodyType = 'json';\n break;\n case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n bodyType = 'form';\n break;\n case !!context.contentType && context.contentType.includes('multipart/form-data'):\n const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n // Return the entire multipart result (fields + files) as T\n parsedBody = {\n ...multipartResult.fields,\n _files: multipartResult.files\n } as T;\n bodyType = 'multipart';\n break;\n case !!context.contentType && context.contentType.includes('text/'):\n parsedBody = context.data as T;\n bodyType = 'text';\n break;\n default:\n parsedBody = Buffer.concat(context.buffers) as T;\n bodyType = 'raw';\n break;\n }\n\n\n return {\n data: parsedBody,\n type: bodyType\n };\n }\n\n /**\n * Parse URL-encoded form data (application/x-www-form-urlencoded)\n * @param body - The URL-encoded body string\n * @returns Object containing form data\n */\n static parseFormUrlEncoded(\n /**\n * The URL-encoded body string\n */\n body: string\n ): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n\n if (!body) return result;\n\n const pairs = body.split('&');\n\n for (const pair of pairs) {\n if (!pair) continue;\n\n const [key, value = ''] = pair.split('=');\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle multiple values for the same key (arrays)\n if (decodedKey in result) {\n const existing = result[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n result[decodedKey] = [existing, decodedValue];\n }\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parse multipart form data (for file uploads and form data)\n * @param buffer - The raw buffer containing multipart data\n * @param contentType - The content type header\n * @returns Object containing fields and files\n */\n static parseMultipartData(\n /**\n * The raw buffer containing multipart data\n */\n buffer: Buffer,\n /**\n * The content type header\n */\n contentType: string\n ): {\n fields: Record<string, string>;\n files: A_Request_FileUpload[];\n } {\n // Extract boundary\n const boundaryMatch = contentType.match(/boundary=(.+)/);\n if (!boundaryMatch) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n 'Missing boundary in multipart/form-data content type'\n )\n }\n\n const boundary = '--' + boundaryMatch[1];\n const textData = buffer.toString();\n const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n const fields: Record<string, string> = {};\n const files: A_Request_FileUpload[] = [];\n\n parts.forEach(part => {\n const [headers, content] = part.split('\\r\\n\\r\\n');\n if (!headers || content === undefined) return;\n\n const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (nameMatch) {\n const fieldName = nameMatch[1];\n const cleanContent = content.replace(/\\r\\n$/, '');\n\n if (filenameMatch) {\n // It's a file upload\n const file: A_Request_FileUpload = {\n fieldName,\n filename: filenameMatch[1],\n encoding: 'binary',\n mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n size: Buffer.byteLength(cleanContent),\n buffer: Buffer.from(cleanContent, 'binary')\n };\n files.push(file);\n } else {\n // It's a regular field\n fields[fieldName] = cleanContent;\n }\n }\n });\n\n return { fields, files };\n }\n\n}"]}
@@ -72,7 +72,7 @@ class A_RequestHelper {
72
72
  let bodyType;
73
73
  switch (true) {
74
74
  case (!!context.contentType && context.contentType.includes("application/json")):
75
- parsedBody = JSON.parse(context.data);
75
+ parsedBody = JSON.parse(context.data || "{}");
76
76
  bodyType = "json";
77
77
  break;
78
78
  case (!!context.contentType && context.contentType.includes("application/x-www-form-urlencoded")):
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/A-Request/A-Request.helper.ts"],"names":[],"mappings":";;;AA+BO,MAAM,eAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzB,OAAO,aAAA,CAAc,GAAA,EAAa,YAAA,EAA8C;AAE5E,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAE9C,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,IAAA,MAAM,kBAAkB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAE9D,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,cAAA,GAAiB,gBAAgB,CAAC,CAAA;AACxC,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAEhC,MAAA,IAAI,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AAChC,QAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACxC,QAAA,IAAI,UAAA,EAAY;AACZ,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,kBAAA,CAAmB,UAAU,CAAA;AAAA,QACrD;AAAA,MACJ,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AAEtC,QAAA,OAAO,EAAC;AAAA,MACZ;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,aAAyC,GAAA,EAAgB;AAC5D,IAAA,MAAM,QAAgC,EAAC;AAGvC,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAGzB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAG3C,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AACtC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAC,GAAA,EAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,MAAA,KAAA,CAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,aACH,YAAA,EACsB;AACtB,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,IAAI,CAAC,YAAA,EAAc,OAAO,EAAC;AAE3B,IAAA,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAA,MAAA,KAAU;AACtC,MAAA,MAAM,CAAC,MAAM,GAAG,IAAI,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC3B,MAAA,IAAI,QAAQ,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,iBACH,OAAA,EAIF;AACE,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,QAAQ,IAAA;AAAM,MACV,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,kBAAkB,CAAA;AACzE,QAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACpC,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,mCAAmC,CAAA;AAC1F,QAAA,UAAA,GAAa,eAAA,CAAgB,mBAAA,CAAoB,OAAA,CAAQ,IAAI,CAAA;AAC7D,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,qBAAqB,CAAA;AAC5E,QAAA,MAAM,eAAA,GAAkB,gBAAgB,kBAAA,CAAmB,MAAA,CAAO,OAAO,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA;AAE9G,QAAA,UAAA,GAAa;AAAA,UACT,GAAG,eAAA,CAAgB,MAAA;AAAA,UACnB,QAAQ,eAAA,CAAgB;AAAA,SAC5B;AACA,QAAA,QAAA,GAAW,WAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,OAAO,CAAA;AAC9D,QAAA,UAAA,GAAa,OAAA,CAAQ,IAAA;AACrB,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAC1C,QAAA,QAAA,GAAW,KAAA;AACX,QAAA;AAAA;AAIR,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAIH,IAAA,EACiC;AACjC,IAAA,MAAM,SAA4C,EAAC;AAEnD,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,CAAC,GAAA,EAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,MAAA,MAAM,aAAa,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAC7D,MAAA,MAAM,eAAe,kBAAA,CAAmB,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAGjE,MAAA,IAAI,cAAc,MAAA,EAAQ;AACtB,QAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACzB,UAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,QAC9B,CAAA,MAAO;AACH,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,YAAY,CAAA;AAAA,QAChD;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAA,CAAO,UAAU,CAAA,GAAI,YAAA;AAAA,MACzB;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,kBAAA,CAIH,MAAA,EAIA,WAAA,EAIF;AAEE,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,KAAA,CAAM,eAAe,CAAA;AACvD,IAAA,IAAI,CAAC,aAAA,EAAe;AAChB,MAAA,MAAM,IAAI,cAAA;AAAA,QACN,cAAA,CAAe,uBAAA;AAAA,QACf;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,GAAO,aAAA,CAAc,CAAC,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAEzF,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,QAAgC,EAAC;AAEvC,IAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAClB,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,IAAA,CAAK,MAAM,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,MAAA,EAAW;AAEvC,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,oBAAoB,CAAA;AACxD,MAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AAEjE,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAM,SAAA,GAAY,UAAU,CAAC,CAAA;AAC7B,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAEhD,QAAA,IAAI,aAAA,EAAe;AAEf,UAAA,MAAM,IAAA,GAA6B;AAAA,YAC/B,SAAA;AAAA,YACA,QAAA,EAAU,cAAc,CAAC,CAAA;AAAA,YACzB,QAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU,gBAAA,GAAmB,CAAC,CAAA,IAAK,0BAAA;AAAA,YACnC,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAAA,YACpC,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,QAAQ;AAAA,WAC9C;AACA,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACnB,CAAA,MAAO;AAEH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,YAAA;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EAC3B;AAEJ","file":"A-Request.helper.mjs","sourcesContent":["import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n /**\n * Extract URL parameters from a URL using a route pattern\n * @param url - The actual URL to extract parameters from\n * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n * @returns Object containing extracted parameters\n */\n static extractParams(url: string, routePattern: string): Record<string, string> {\n // Remove query string (anything after ?)\n const cleanUrl = url.split('?')[0];\n const cleanPattern = routePattern.split('?')[0];\n\n const urlSegments = cleanUrl.split('/').filter(Boolean);\n const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const urlSegment = urlSegments[i];\n\n if (patternSegment.startsWith(':')) {\n const paramName = patternSegment.slice(1); // Remove ':' from pattern\n if (urlSegment) {\n params[paramName] = decodeURIComponent(urlSegment);\n }\n } else if (patternSegment !== urlSegment) {\n // If static segments don't match → fail\n return {};\n }\n }\n\n return params;\n }\n\n\n\n /**\n * Extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Object containing query parameters\n */\n static extractQuery<T = Record<string, string>>(url: string): T {\n const query: Record<string, string> = {};\n\n // Take only the part after \"?\"\n const queryString = url.split('?')[1];\n if (!queryString) return query as T;\n\n // Remove fragment (#...) if present\n const cleanQuery = queryString.split('#')[0];\n\n // Split into key=value pairs\n for (const pair of cleanQuery.split('&')) {\n if (!pair) continue;\n const [key, value = ''] = pair.split('=');\n query[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return query as T;\n }\n\n\n /**\n * Parse cookies from Cookie header\n */\n static parseCookies(\n cookieHeader?: string\n ): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n if (!cookieHeader) return {};\n\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n if (name && value) {\n cookies[name] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n /**\n * Parse request body based on Content-Type\n * \n * \n * @param context - The HTTP server request context\n * @returns Parsed body data and detected body type\n */\n static parseRequestBody<T extends any = any>(\n context: A_HttpServerRequestContext\n ): {\n data: T;\n type: A_Request_BodyType;\n } {\n let parsedBody: any;\n let bodyType: A_Request_BodyType;\n\n switch (true) {\n case !!context.contentType && context.contentType.includes('application/json'):\n parsedBody = JSON.parse(context.data);\n bodyType = 'json';\n break;\n case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n bodyType = 'form';\n break;\n case !!context.contentType && context.contentType.includes('multipart/form-data'):\n const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n // Return the entire multipart result (fields + files) as T\n parsedBody = {\n ...multipartResult.fields,\n _files: multipartResult.files\n } as T;\n bodyType = 'multipart';\n break;\n case !!context.contentType && context.contentType.includes('text/'):\n parsedBody = context.data as T;\n bodyType = 'text';\n break;\n default:\n parsedBody = Buffer.concat(context.buffers) as T;\n bodyType = 'raw';\n break;\n }\n\n\n return {\n data: parsedBody,\n type: bodyType\n };\n }\n\n /**\n * Parse URL-encoded form data (application/x-www-form-urlencoded)\n * @param body - The URL-encoded body string\n * @returns Object containing form data\n */\n static parseFormUrlEncoded(\n /**\n * The URL-encoded body string\n */\n body: string\n ): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n\n if (!body) return result;\n\n const pairs = body.split('&');\n\n for (const pair of pairs) {\n if (!pair) continue;\n\n const [key, value = ''] = pair.split('=');\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle multiple values for the same key (arrays)\n if (decodedKey in result) {\n const existing = result[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n result[decodedKey] = [existing, decodedValue];\n }\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parse multipart form data (for file uploads and form data)\n * @param buffer - The raw buffer containing multipart data\n * @param contentType - The content type header\n * @returns Object containing fields and files\n */\n static parseMultipartData(\n /**\n * The raw buffer containing multipart data\n */\n buffer: Buffer,\n /**\n * The content type header\n */\n contentType: string\n ): {\n fields: Record<string, string>;\n files: A_Request_FileUpload[];\n } {\n // Extract boundary\n const boundaryMatch = contentType.match(/boundary=(.+)/);\n if (!boundaryMatch) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n 'Missing boundary in multipart/form-data content type'\n )\n }\n\n const boundary = '--' + boundaryMatch[1];\n const textData = buffer.toString();\n const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n const fields: Record<string, string> = {};\n const files: A_Request_FileUpload[] = [];\n\n parts.forEach(part => {\n const [headers, content] = part.split('\\r\\n\\r\\n');\n if (!headers || content === undefined) return;\n\n const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (nameMatch) {\n const fieldName = nameMatch[1];\n const cleanContent = content.replace(/\\r\\n$/, '');\n\n if (filenameMatch) {\n // It's a file upload\n const file: A_Request_FileUpload = {\n fieldName,\n filename: filenameMatch[1],\n encoding: 'binary',\n mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n size: Buffer.byteLength(cleanContent),\n buffer: Buffer.from(cleanContent, 'binary')\n };\n files.push(file);\n } else {\n // It's a regular field\n fields[fieldName] = cleanContent;\n }\n }\n });\n\n return { fields, files };\n }\n\n}"]}
1
+ {"version":3,"sources":["../../../../src/lib/A-Request/A-Request.helper.ts"],"names":[],"mappings":"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","file":"A-Request.helper.mjs","sourcesContent":["import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n /**\n * Extract URL parameters from a URL using a route pattern\n * @param url - The actual URL to extract parameters from\n * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n * @returns Object containing extracted parameters\n */\n static extractParams(url: string, routePattern: string): Record<string, string> {\n // Remove query string (anything after ?)\n const cleanUrl = url.split('?')[0];\n const cleanPattern = routePattern.split('?')[0];\n\n const urlSegments = cleanUrl.split('/').filter(Boolean);\n const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const urlSegment = urlSegments[i];\n\n if (patternSegment.startsWith(':')) {\n const paramName = patternSegment.slice(1); // Remove ':' from pattern\n if (urlSegment) {\n params[paramName] = decodeURIComponent(urlSegment);\n }\n } else if (patternSegment !== urlSegment) {\n // If static segments don't match → fail\n return {};\n }\n }\n\n return params;\n }\n\n\n\n /**\n * Extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Object containing query parameters\n */\n static extractQuery<T = Record<string, string>>(url: string): T {\n const query: Record<string, string> = {};\n\n // Take only the part after \"?\"\n const queryString = url.split('?')[1];\n if (!queryString) return query as T;\n\n // Remove fragment (#...) if present\n const cleanQuery = queryString.split('#')[0];\n\n // Split into key=value pairs\n for (const pair of cleanQuery.split('&')) {\n if (!pair) continue;\n const [key, value = ''] = pair.split('=');\n query[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return query as T;\n }\n\n\n /**\n * Parse cookies from Cookie header\n */\n static parseCookies(\n cookieHeader?: string\n ): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n if (!cookieHeader) return {};\n\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n if (name && value) {\n cookies[name] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n /**\n * Parse request body based on Content-Type\n * \n * \n * @param context - The HTTP server request context\n * @returns Parsed body data and detected body type\n */\n static parseRequestBody<T extends any = any>(\n context: A_HttpServerRequestContext\n ): {\n data: T;\n type: A_Request_BodyType;\n } {\n let parsedBody: any;\n let bodyType: A_Request_BodyType;\n\n switch (true) {\n case !!context.contentType && context.contentType.includes('application/json'):\n parsedBody = JSON.parse(context.data || '{}');\n bodyType = 'json';\n break;\n case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n bodyType = 'form';\n break;\n case !!context.contentType && context.contentType.includes('multipart/form-data'):\n const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n // Return the entire multipart result (fields + files) as T\n parsedBody = {\n ...multipartResult.fields,\n _files: multipartResult.files\n } as T;\n bodyType = 'multipart';\n break;\n case !!context.contentType && context.contentType.includes('text/'):\n parsedBody = context.data as T;\n bodyType = 'text';\n break;\n default:\n parsedBody = Buffer.concat(context.buffers) as T;\n bodyType = 'raw';\n break;\n }\n\n\n return {\n data: parsedBody,\n type: bodyType\n };\n }\n\n /**\n * Parse URL-encoded form data (application/x-www-form-urlencoded)\n * @param body - The URL-encoded body string\n * @returns Object containing form data\n */\n static parseFormUrlEncoded(\n /**\n * The URL-encoded body string\n */\n body: string\n ): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n\n if (!body) return result;\n\n const pairs = body.split('&');\n\n for (const pair of pairs) {\n if (!pair) continue;\n\n const [key, value = ''] = pair.split('=');\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle multiple values for the same key (arrays)\n if (decodedKey in result) {\n const existing = result[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n result[decodedKey] = [existing, decodedValue];\n }\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parse multipart form data (for file uploads and form data)\n * @param buffer - The raw buffer containing multipart data\n * @param contentType - The content type header\n * @returns Object containing fields and files\n */\n static parseMultipartData(\n /**\n * The raw buffer containing multipart data\n */\n buffer: Buffer,\n /**\n * The content type header\n */\n contentType: string\n ): {\n fields: Record<string, string>;\n files: A_Request_FileUpload[];\n } {\n // Extract boundary\n const boundaryMatch = contentType.match(/boundary=(.+)/);\n if (!boundaryMatch) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n 'Missing boundary in multipart/form-data content type'\n )\n }\n\n const boundary = '--' + boundaryMatch[1];\n const textData = buffer.toString();\n const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n const fields: Record<string, string> = {};\n const files: A_Request_FileUpload[] = [];\n\n parts.forEach(part => {\n const [headers, content] = part.split('\\r\\n\\r\\n');\n if (!headers || content === undefined) return;\n\n const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (nameMatch) {\n const fieldName = nameMatch[1];\n const cleanContent = content.replace(/\\r\\n$/, '');\n\n if (filenameMatch) {\n // It's a file upload\n const file: A_Request_FileUpload = {\n fieldName,\n filename: filenameMatch[1],\n encoding: 'binary',\n mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n size: Buffer.byteLength(cleanContent),\n buffer: Buffer.from(cleanContent, 'binary')\n };\n files.push(file);\n } else {\n // It's a regular field\n fields[fieldName] = cleanContent;\n }\n }\n });\n\n return { fields, files };\n }\n\n}"]}
@@ -6,12 +6,6 @@ import { A_Service, A_ServiceFeatures } from '@adaas/a-utils/a-service';
6
6
  import { A_Polyfill } from '@adaas/a-utils/a-polyfill';
7
7
  import { A_Config } from '@adaas/a-utils/a-config';
8
8
  import '@adaas/a-concept';
9
- import './A-Server.context.mjs';
10
- import './A-Server.types.mjs';
11
- import '../A-ServerRoute/A-ServerRoute.entity.mjs';
12
- import '@adaas/a-utils/a-route';
13
- import '../A-ServerRoute/A-ServerRoute.types.mjs';
14
- import '../A-ServerRoute/A-ServerRoute.constants.mjs';
15
9
  import '../../A-Request.entity-r905O60G.mjs';
16
10
  import './A-HttpServer.error.mjs';
17
11
  import './A-HttpServer.types.mjs';
@@ -21,6 +15,10 @@ import '../A-Request/A-HttpServerRequest.context.mjs';
21
15
  import '@adaas/a-utils/a-operation';
22
16
  import '../A-Request/A-HttpRequestData.context.mjs';
23
17
  import '@adaas/a-utils/a-execution';
18
+ import '../A-ServerRoute/A-ServerRoute.entity.mjs';
19
+ import '@adaas/a-utils/a-route';
20
+ import '../A-ServerRoute/A-ServerRoute.types.mjs';
21
+ import '../A-ServerRoute/A-ServerRoute.constants.mjs';
24
22
  import '../../A-Response.entity-6qhiV7BE.mjs';
25
23
  import 'stream';
26
24
  import '../A-Response/A-Response.constants.mjs';
@@ -6,12 +6,6 @@ import { A_Service, A_ServiceFeatures } from '@adaas/a-utils/a-service';
6
6
  import { A_Polyfill } from '@adaas/a-utils/a-polyfill';
7
7
  import { A_Config } from '@adaas/a-utils/a-config';
8
8
  import '@adaas/a-concept';
9
- import './A-Server.context.js';
10
- import './A-Server.types.js';
11
- import '../A-ServerRoute/A-ServerRoute.entity.js';
12
- import '@adaas/a-utils/a-route';
13
- import '../A-ServerRoute/A-ServerRoute.types.js';
14
- import '../A-ServerRoute/A-ServerRoute.constants.js';
15
9
  import '../../A-Request.entity-8_9MCXT2.js';
16
10
  import './A-HttpServer.error.js';
17
11
  import './A-HttpServer.types.js';
@@ -21,6 +15,10 @@ import '../A-Request/A-HttpServerRequest.context.js';
21
15
  import '@adaas/a-utils/a-operation';
22
16
  import '../A-Request/A-HttpRequestData.context.js';
23
17
  import '@adaas/a-utils/a-execution';
18
+ import '../A-ServerRoute/A-ServerRoute.entity.js';
19
+ import '@adaas/a-utils/a-route';
20
+ import '../A-ServerRoute/A-ServerRoute.types.js';
21
+ import '../A-ServerRoute/A-ServerRoute.constants.js';
24
22
  import '../../A-Response.entity-bjh6bofZ.js';
25
23
  import 'stream';
26
24
  import '../A-Response/A-Response.constants.js';
@@ -4,6 +4,7 @@ var aConcept = require('@adaas/a-concept');
4
4
  var AServerRouter_component = require('@adaas/a-server/router/A-ServerRouter.component');
5
5
  var AResponse_entity = require('@adaas/a-server/response/A-Response.entity');
6
6
  var ARequest_entity = require('@adaas/a-server/request/A-Request.entity');
7
+ var AHttpServer_error = require('../A-Server/A-HttpServer.error');
7
8
 
8
9
  var __defProp = Object.defineProperty;
9
10
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -19,17 +20,29 @@ var __decorateParam = (index, decorator) => (target, key) => decorator(target, k
19
20
  class A_ServerController extends aConcept.A_Component {
20
21
  async callEntityMethod(request, response, scope) {
21
22
  if (!scope.has(request.params.component))
22
- return;
23
+ throw new AHttpServer_error.A_HttpServerError({
24
+ status: 404,
25
+ description: `Component "${request.params.component}" not found`
26
+ });
23
27
  if (!request.params.operation || typeof request.params.operation !== "string")
24
- return;
28
+ throw new AHttpServer_error.A_HttpServerError({
29
+ status: 400,
30
+ description: 'Missing or invalid "operation" parameter'
31
+ });
25
32
  const possibleComponent = scope.resolve(request.params.component);
26
33
  if (!possibleComponent || ![aConcept.A_Component, aConcept.A_Container].some((c) => possibleComponent instanceof c))
27
- return;
34
+ throw new AHttpServer_error.A_HttpServerError({
35
+ status: 404,
36
+ description: `"${request.params.component}" is not a valid component`
37
+ });
28
38
  const component = possibleComponent;
29
39
  const meta = aConcept.A_Context.meta(component);
30
40
  const targetFeature = meta.features().find((f) => f.name === `${component.constructor.name}.${request.params.operation}`);
31
41
  if (!targetFeature)
32
- return;
42
+ throw new AHttpServer_error.A_HttpServerError({
43
+ status: 404,
44
+ description: `Operation "${request.params.operation}" not found on component "${request.params.component}"`
45
+ });
33
46
  await component.call(request.params.operation, scope);
34
47
  }
35
48
  }