http-request-manager 15.0.19 → 15.0.26

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 (224) hide show
  1. package/ng-package.json +8 -0
  2. package/package.json +10 -14
  3. package/src/lib/http-request-manager.module.ts +101 -0
  4. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +3 -0
  5. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  6. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +105 -0
  7. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +64 -0
  8. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  9. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +34 -0
  10. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  11. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  12. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +205 -0
  13. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +59 -0
  14. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  15. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +71 -0
  16. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  17. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  18. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  19. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +99 -0
  20. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  21. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  22. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  23. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +25 -0
  24. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  25. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +336 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +403 -0
  35. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +328 -0
  36. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  37. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +347 -0
  38. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +88 -0
  39. package/src/lib/index.ts +3 -0
  40. package/src/lib/interceptors/credentials.interceptor.ts +18 -0
  41. package/{lib/interceptors/index.d.ts → src/lib/interceptors/index.ts} +2 -0
  42. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  43. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  44. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  45. package/src/lib/interceptors/request-header.interceptor.ts +58 -0
  46. package/src/lib/models/config-http-options.model.ts +42 -0
  47. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  48. package/src/lib/models/config-options.model.ts +27 -0
  49. package/{lib/models/config-token.model.d.ts → src/lib/models/config-token.model.ts} +2 -1
  50. package/src/lib/models/data-type.enum.ts +5 -0
  51. package/src/lib/models/database-storage.model.ts +24 -0
  52. package/src/lib/models/index.ts +9 -0
  53. package/src/lib/models/retry-options.model.ts +22 -0
  54. package/src/lib/services/database-manager-services/database.manager.service.ts +193 -0
  55. package/src/lib/services/database-manager-services/db.storage.service.ts +191 -0
  56. package/src/lib/services/database-manager-services/index.ts +4 -0
  57. package/src/lib/services/database-manager-services/models/table-schema.ts +35 -0
  58. package/{lib/services/index.d.ts → src/lib/services/index.ts} +4 -0
  59. package/src/lib/services/local-storage-manager-service/index.ts +2 -0
  60. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  61. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +421 -0
  62. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  63. package/{lib/services/local-storage-manager-service/models/index.d.ts → src/lib/services/local-storage-manager-service/models/index.ts} +2 -1
  64. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +30 -0
  65. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  66. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +29 -0
  67. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  68. package/src/lib/services/request-manager-services/README.md +268 -0
  69. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +230 -0
  70. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  71. package/{lib/services/request-manager-services/index.d.ts → src/lib/services/request-manager-services/index.ts} +2 -0
  72. package/src/lib/services/request-manager-services/request.service.ts +261 -0
  73. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  74. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  75. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +21 -0
  76. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +32 -0
  77. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +402 -0
  78. package/{lib/services/request-manager-state-service/index.d.ts → src/lib/services/request-manager-state-service/index.ts} +1 -0
  79. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +50 -0
  80. package/{lib/services/request-manager-state-service/models/index.d.ts → src/lib/services/request-manager-state-service/models/index.ts} +1 -0
  81. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  82. package/src/lib/services/utils/app.service.spec.ts +25 -0
  83. package/src/lib/services/utils/app.service.ts +21 -0
  84. package/src/lib/services/utils/encryption/README.md +79 -0
  85. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  86. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  87. package/{lib/services/utils/encryption/index.d.ts → src/lib/services/utils/encryption/index.ts} +2 -0
  88. package/src/lib/services/utils/encryption/random.ts +69 -0
  89. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  90. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  91. package/src/lib/services/utils/headers.service.ts +18 -0
  92. package/{lib/services/utils/index.d.ts → src/lib/services/utils/index.ts} +2 -0
  93. package/src/lib/services/utils/object-merger.service.spec.ts +16 -0
  94. package/src/lib/services/utils/object-merger.service.ts +60 -0
  95. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  96. package/src/lib/services/utils/path-query.service.ts +69 -0
  97. package/src/lib/services/utils/utils.service.spec.ts +164 -0
  98. package/src/lib/services/utils/utils.service.ts +192 -0
  99. package/src/public-api.ts +14 -0
  100. package/tsconfig.lib.json +32 -0
  101. package/tsconfig.lib.prod.json +10 -0
  102. package/tsconfig.spec.json +14 -0
  103. package/esm2022/http-request-manager.mjs +0 -5
  104. package/esm2022/lib/http-request-manager.module.mjs +0 -146
  105. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +0 -41
  106. package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +0 -173
  107. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
  108. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
  109. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -88
  110. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
  111. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +0 -29
  112. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +0 -9
  113. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +0 -12
  114. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +0 -14
  115. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +0 -315
  116. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +0 -270
  117. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +0 -67
  118. package/esm2022/lib/index.mjs +0 -4
  119. package/esm2022/lib/interceptors/credentials.interceptor.mjs +0 -14
  120. package/esm2022/lib/interceptors/index.mjs +0 -5
  121. package/esm2022/lib/interceptors/models/error-settings.model.mjs +0 -10
  122. package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +0 -47
  123. package/esm2022/lib/interceptors/request-error.interceptor.mjs +0 -49
  124. package/esm2022/lib/interceptors/request-header.interceptor.mjs +0 -41
  125. package/esm2022/lib/models/config-http-options.model.mjs +0 -18
  126. package/esm2022/lib/models/config-local-storage-options.model.mjs +0 -12
  127. package/esm2022/lib/models/config-options.model.mjs +0 -12
  128. package/esm2022/lib/models/config-token.model.mjs +0 -8
  129. package/esm2022/lib/models/data-type.enum.mjs +0 -7
  130. package/esm2022/lib/models/database-storage.model.mjs +0 -10
  131. package/esm2022/lib/models/index.mjs +0 -7
  132. package/esm2022/lib/models/retry-options.model.mjs +0 -10
  133. package/esm2022/lib/services/index.mjs +0 -6
  134. package/esm2022/lib/services/local-storage-manager-service/index.mjs +0 -3
  135. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +0 -302
  136. package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +0 -13
  137. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +0 -6
  138. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +0 -13
  139. package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +0 -10
  140. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +0 -12
  141. package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +0 -7
  142. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +0 -207
  143. package/esm2022/lib/services/request-manager-services/index.mjs +0 -5
  144. package/esm2022/lib/services/request-manager-services/request.service.mjs +0 -189
  145. package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +0 -9
  146. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +0 -10
  147. package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +0 -5
  148. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +0 -14
  149. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +0 -19
  150. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +0 -267
  151. package/esm2022/lib/services/request-manager-state-service/index.mjs +0 -3
  152. package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +0 -20
  153. package/esm2022/lib/services/request-manager-state-service/models/index.mjs +0 -3
  154. package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +0 -10
  155. package/esm2022/lib/services/utils/app.service.mjs +0 -26
  156. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +0 -186
  157. package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +0 -35
  158. package/esm2022/lib/services/utils/encryption/index.mjs +0 -4
  159. package/esm2022/lib/services/utils/encryption/random.mjs +0 -52
  160. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +0 -77
  161. package/esm2022/lib/services/utils/headers.service.mjs +0 -21
  162. package/esm2022/lib/services/utils/index.mjs +0 -6
  163. package/esm2022/lib/services/utils/object-merger.service.mjs +0 -50
  164. package/esm2022/lib/services/utils/path-query.service.mjs +0 -54
  165. package/esm2022/lib/services/utils/utils.service.mjs +0 -155
  166. package/esm2022/public-api.mjs +0 -7
  167. package/fesm2022/http-request-manager.mjs +0 -3102
  168. package/fesm2022/http-request-manager.mjs.map +0 -1
  169. package/http-request-manager-15.0.19.tgz +0 -0
  170. package/index.d.ts +0 -5
  171. package/lib/http-request-manager.module.d.ts +0 -33
  172. package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +0 -24
  173. package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +0 -56
  174. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
  175. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
  176. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -27
  177. package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +0 -12
  178. package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +0 -16
  179. package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +0 -8
  180. package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +0 -14
  181. package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +0 -14
  182. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +0 -107
  183. package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -122
  184. package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +0 -15
  185. package/lib/index.d.ts +0 -3
  186. package/lib/interceptors/credentials.interceptor.d.ts +0 -8
  187. package/lib/interceptors/models/error-settings.model.d.ts +0 -10
  188. package/lib/interceptors/proxy-debugger.interceptor.d.ts +0 -12
  189. package/lib/interceptors/request-error.interceptor.d.ts +0 -10
  190. package/lib/interceptors/request-header.interceptor.d.ts +0 -15
  191. package/lib/models/config-http-options.model.d.ts +0 -21
  192. package/lib/models/config-local-storage-options.model.d.ts +0 -13
  193. package/lib/models/config-options.model.d.ts +0 -12
  194. package/lib/models/data-type.enum.d.ts +0 -5
  195. package/lib/models/database-storage.model.d.ts +0 -10
  196. package/lib/models/index.d.ts +0 -6
  197. package/lib/models/retry-options.model.d.ts +0 -10
  198. package/lib/services/local-storage-manager-service/index.d.ts +0 -2
  199. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +0 -86
  200. package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +0 -15
  201. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +0 -15
  202. package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +0 -10
  203. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +0 -13
  204. package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +0 -5
  205. package/lib/services/request-manager-services/http-manager.service.d.ts +0 -41
  206. package/lib/services/request-manager-services/request.service.d.ts +0 -27
  207. package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +0 -2
  208. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +0 -2
  209. package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +0 -7
  210. package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +0 -2
  211. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +0 -51
  212. package/lib/services/request-manager-state-service/models/api-request.model.d.ts +0 -27
  213. package/lib/services/request-manager-state-service/models/request-options.model.d.ts +0 -10
  214. package/lib/services/utils/app.service.d.ts +0 -8
  215. package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +0 -17
  216. package/lib/services/utils/encryption/encryption-test.service.d.ts +0 -10
  217. package/lib/services/utils/encryption/random.d.ts +0 -7
  218. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +0 -14
  219. package/lib/services/utils/headers.service.d.ts +0 -10
  220. package/lib/services/utils/object-merger.service.d.ts +0 -12
  221. package/lib/services/utils/path-query.service.d.ts +0 -11
  222. package/lib/services/utils/utils.service.d.ts +0 -24
  223. package/public-api.d.ts +0 -3
  224. /package/{lib/services/request-manager-services/rxjs-operators/index.d.ts → src/lib/services/request-manager-services/rxjs-operators/index.ts} +0 -0
@@ -0,0 +1,117 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { PathQueryService } from './path-query.service';
3
+
4
+ describe('PathQueryService', () => {
5
+ let service: PathQueryService;
6
+
7
+ beforeEach(() => {
8
+ TestBed.configureTestingModule({
9
+ providers: [PathQueryService]
10
+ });
11
+ service = TestBed.inject(PathQueryService);
12
+ });
13
+
14
+ it('should be created', () => {
15
+ expect(service).toBeTruthy();
16
+ });
17
+
18
+ it('should build API path with only server', () => {
19
+ const result = service.buildAPIPath('http://example.com');
20
+ expect(result).toBe('http://example.com');
21
+ });
22
+
23
+ it('should build API path with server and path params', () => {
24
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource']);
25
+ expect(result).toBe('http://example.com/path/to/resource');
26
+ });
27
+
28
+ it('should build API path with server, path params, and query params', () => {
29
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', { query: 'value' }]);
30
+ expect(result).toBe('http://example.com/path/to/resource?query=value');
31
+ });
32
+
33
+ it('should build API path with server and query params', () => {
34
+ const result = service.buildAPIPath('http://example.com', [{ query: 'value' }]);
35
+ expect(result).toBe('http://example.com?query=value');
36
+ });
37
+
38
+ it('should handle empty query params', () => {
39
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', {}]);
40
+ expect(result).toBe('http://example.com/path/to/resource');
41
+ });
42
+
43
+ it('should remove empty query params', () => {
44
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', { query: '' }]);
45
+ expect(result).toBe('http://example.com/path/to/resource');
46
+ });
47
+
48
+ it('should clean URL path', () => {
49
+ const result = service.buildAPIPath('http://example.com', ['path', '', 'to', 'resource']);
50
+ expect(result).toBe('http://example.com/path/to/resource');
51
+ });
52
+
53
+ it('should handle null query params', () => {
54
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', null]);
55
+ expect(result).toBe('http://example.com/path/to/resource');
56
+ });
57
+
58
+ it('should handle undefined query params', () => {
59
+ const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', undefined]);
60
+ expect(result).toBe('http://example.com/path/to/resource');
61
+ });
62
+
63
+ it('should build API path with server as string array and path params', () => {
64
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource']);
65
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
66
+ });
67
+
68
+ it('should build API path with server as string array, path params, and query params', () => {
69
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: 'value' }]);
70
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value');
71
+ });
72
+
73
+ it('should build API path with server as string array and query params', () => {
74
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], [{ query: 'value' }]);
75
+ expect(result).toBe('http://example.com/api/v1?query=value');
76
+ });
77
+
78
+ it('should handle empty query params with server as string array', () => {
79
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', {}]);
80
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
81
+ });
82
+
83
+ it('should remove empty query params with server as string array', () => {
84
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: '' }]);
85
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
86
+ });
87
+
88
+ it('should clean URL path with server as string array', () => {
89
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', '', 'to', 'resource']);
90
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
91
+ });
92
+
93
+ it('should handle null query params with server as string array', () => {
94
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', null]);
95
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
96
+ });
97
+
98
+ it('should handle undefined query params with server as string array', () => {
99
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', undefined]);
100
+ expect(result).toBe('http://example.com/api/v1/path/to/resource');
101
+ });
102
+
103
+ it('should handle multiple query params with server as string array', () => {
104
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query1: 'value1', query2: 'value2' }]);
105
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query1=value1&query2=value2');
106
+ });
107
+
108
+ it('should handle array query params with server as string array', () => {
109
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: ['value1', 'value2'] }]);
110
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value1%2Cvalue2');
111
+ });
112
+
113
+ it('should handle mixed path and query params with server as string array', () => {
114
+ const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', { query: 'value' }, 'to', 'resource']);
115
+ expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value');
116
+ });
117
+ });
@@ -0,0 +1,69 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root'
5
+ })
6
+ export class PathQueryService {
7
+
8
+ buildAPIPath(server: string|string[], params?: any[]|any) {
9
+
10
+ server = (Array.isArray(server)) ? server.join('/') : server
11
+
12
+ const pathObjects = (params) ? params.filter((path:any) => (!this.isObject(path))) : []
13
+ const queryObjects = (params) ? params.filter((path:any) => (this.isObject(path))) : []
14
+
15
+ const query = this.removeEmptyParams(queryObjects.reduce((r: any, c: any) => {
16
+ Object.entries(c).forEach(([key, value]) => {
17
+ r[key] = Array.isArray(value) ? value.join(',') : value
18
+ })
19
+ return r
20
+ }, {}))
21
+
22
+ let path = this.buildRestPath(server, pathObjects)
23
+
24
+ return(Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path
25
+
26
+ }
27
+
28
+ private buildRestPath(server: string, params: any[]): string {
29
+ server = (server) ? server : ''
30
+ server = (server.charAt(0) === '/') ? server.substring(1) : server
31
+ return this.cleanUrlPath(server +'/'+ params.join('/'))
32
+ }
33
+
34
+ private buildQueryPath(params: any): string {
35
+
36
+ const searchParams = new URLSearchParams()
37
+
38
+ for (const key in params) {
39
+
40
+ if (Array.isArray(params[key])) {
41
+ params[key].forEach((value: any) => searchParams.append(key, value));
42
+ } else {
43
+ searchParams.append(key, params[key]);
44
+ }
45
+
46
+ }
47
+
48
+ return searchParams.toString()
49
+
50
+ }
51
+
52
+ private cleanUrlPath(str: string) {
53
+ return str.replace(/([^:]\/)\/+/g, "$1").replace(/\/$/,'')
54
+ }
55
+
56
+ private isObject(val: any): boolean {
57
+ return (val === null) ? false : ( (typeof val === 'function') || (typeof val === 'object') )
58
+ }
59
+
60
+ private removeEmptyParams = (obj: any): Record<string, any> =>
61
+ Object.fromEntries(
62
+ Object.entries(obj)
63
+ .map(([key, value]) =>
64
+ [key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value]
65
+ )
66
+ .filter(([_, value]) => value !== undefined && value !== "")
67
+ )
68
+
69
+ }
@@ -0,0 +1,164 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
3
+ import { UtilsService } from './utils.service';
4
+
5
+ describe('UtilsService', () => {
6
+ let service: UtilsService;
7
+ let httpMock: HttpTestingController;
8
+
9
+ beforeEach(() => {
10
+ TestBed.configureTestingModule({
11
+ imports: [HttpClientTestingModule],
12
+ providers: [UtilsService]
13
+ });
14
+ service = TestBed.inject(UtilsService);
15
+ httpMock = TestBed.inject(HttpTestingController);
16
+ });
17
+
18
+ afterEach(() => {
19
+ httpMock.verify();
20
+ });
21
+
22
+ it('should be created', () => {
23
+ expect(service).toBeTruthy();
24
+ });
25
+
26
+ describe('Type Checks and JSON Conversions', () => {
27
+ it('should check string and object types', () => {
28
+ expect(service.isString('test')).toBeTrue();
29
+ expect(service.isString(123)).toBeFalse();
30
+ expect(service.isObject({})).toBeTrue();
31
+ expect(service.isObject('test')).toBeFalse();
32
+ });
33
+
34
+ it('should convert between JSON and string', () => {
35
+ const obj = { key: 'value' };
36
+ const jsonString = '{"key":"value"}';
37
+ expect(service.JSONToString(obj)).toBe(JSON.stringify(obj));
38
+ expect(service.JSONToString('test')).toBe('test');
39
+ expect(service.stringToJSON(jsonString)).toEqual(JSON.parse(jsonString));
40
+ expect(service.stringToJSON('test')).toBe('test');
41
+ });
42
+
43
+ it('should check if a string is valid JSON', () => {
44
+ expect(service.isJSON('{"key":"value"}')).toBeTrue();
45
+ expect(service.isJSON('not json')).toBeFalse();
46
+ });
47
+ });
48
+
49
+ describe('Object Access and Comparison', () => {
50
+ it('should return property value and compare objects', () => {
51
+ const obj = { key: 'value' };
52
+ expect(service.getValueByProp(obj, 'key')).toBe('value');
53
+ expect(service.getValueByProp(undefined, 'key')).toBeFalse();
54
+
55
+ const obj1 = { key: 'value', nested: { a: 1 } };
56
+ const obj2 = { key: 'value', nested: { a: 1 } };
57
+ const obj3 = { key: 'value', nested: { a: 2 } };
58
+ expect(service.objectsEqual(obj1, obj2)).toBeTrue();
59
+ expect(service.objectsEqual(obj1, obj3)).toBeFalse();
60
+ });
61
+ });
62
+
63
+ describe('HTTP and Getter', () => {
64
+ it('should obtain JSON from file', () => {
65
+ const dummyData = { key: 'value' };
66
+ service.getJSON('test.json').subscribe(data => {
67
+ expect(data).toEqual(dummyData);
68
+ });
69
+ const req = httpMock.expectOne('assets/data/test.json');
70
+ expect(req.request.method).toBe('GET');
71
+ req.flush(dummyData);
72
+ });
73
+
74
+ it('should return current time from today getter', () => {
75
+ const nowInSec = new Date().getMilliseconds() / 1000;
76
+ expect(service.today).toBeCloseTo(nowInSec, 0);
77
+ });
78
+ });
79
+
80
+ describe('Conversion Methods', () => {
81
+ it('should convert base32 to hex (simple case)', () => {
82
+ // For "A", expecting "0".
83
+ expect(service.base32ToHex('A')).toBe('0');
84
+ });
85
+
86
+ it('should convert binary to hex with 32-character padding', () => {
87
+ /* For the binary representation of "Hello":
88
+ H -> 01001000
89
+ e -> 01100101
90
+ l -> 01101100
91
+ l -> 01101100
92
+ o -> 01101111
93
+ -> Hex: "48656c6c6f"
94
+ Padded (22 zeros in front): "00000000000000000000000048656c6c6f"
95
+ */
96
+ const binary = '0100100001100101011011000110110001101111';
97
+ const expected = '000000000000000000000048656c6c6f';
98
+ expect(service.binaryToHex(binary)).toBe(expected);
99
+ });
100
+ });
101
+
102
+ describe('Expiry Calculations', () => {
103
+ // Helper to test expiry() returns a value close to now + (multiplier)
104
+ function expectExpiryClose(input: string, multiplier: number) {
105
+ const now = Math.floor(new Date().getTime() / 1000);
106
+ const expiry = service.expires(input);
107
+ expect(expiry).toBeGreaterThanOrEqual(now + multiplier - 1);
108
+ expect(expiry).toBeLessThanOrEqual(now + multiplier + 1);
109
+ }
110
+
111
+ it('should calculate expiry for various time units', () => {
112
+ expectExpiryClose("1y", 31556926);
113
+ expectExpiryClose("1m", 2629743);
114
+ expectExpiryClose("1w", 604800);
115
+ expectExpiryClose("1d", 86400);
116
+ expectExpiryClose("1hr", 3600);
117
+ expectExpiryClose("1mn", 60);
118
+ expectExpiryClose("1s", 1);
119
+ });
120
+
121
+ it('should return undefined for missing expiry string', () => {
122
+ expect(service.expires()).toBeUndefined();
123
+ });
124
+
125
+ it('should indicate if expired', () => {
126
+ const now = Math.floor(new Date().getTime() / 1000);
127
+ expect(service.hasExpired(now - 10)).toBeTrue();
128
+ expect(service.hasExpired(now + 10)).toBeFalse();
129
+ expect(service.hasExpired(0)).toBeFalse();
130
+ });
131
+
132
+ it('should check setting for expiry', () => {
133
+ const settingWithExpiry = { expires: 1234567890 };
134
+ const settingWithoutExpiry = { key: 'value' };
135
+ expect(service.hasExpiry(settingWithExpiry)).toBeTrue();
136
+ expect(service.hasExpiry(settingWithoutExpiry)).toBeFalse();
137
+ });
138
+
139
+ it('should return a formatted string for future expiry dates', () => {
140
+ const now = Math.floor(new Date().getTime() / 1000);
141
+ const future = now + 10000;
142
+ const result = service.expiresIn(future);
143
+ expect(typeof result).toBe('string');
144
+ expect(result).toBeDefined();
145
+ expect(result!.length).toBeGreaterThan(0);
146
+ // Expect one of the time unit labels in the formatted result.
147
+ expect(result).toMatch(/(y|m|w|d|h|min|s)/);
148
+ });
149
+
150
+ it('should return "Expired" for past or current expiry dates', () => {
151
+ const now = Math.floor(new Date().getTime() / 1000);
152
+ expect(service.expiresIn(now - 1)).toBe("Expired");
153
+ expect(service.expiresIn(now)).toBe("Expired");
154
+ });
155
+ });
156
+
157
+ describe('String Conversion', () => {
158
+ it('should convert string to lowercase with underscores', () => {
159
+ const input = 'Hello, World!';
160
+ // Expected conversion: remove punctuation, convert to lowercase, replace spaces with underscores.
161
+ expect(service.lc(input)).toBe('hello_world');
162
+ });
163
+ });
164
+ });
@@ -0,0 +1,192 @@
1
+
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { Injectable, inject } from '@angular/core';
4
+
5
+ @Injectable({
6
+ providedIn: 'root'
7
+ })
8
+ export class UtilsService {
9
+
10
+ http = inject(HttpClient)
11
+
12
+ constructor() { }
13
+
14
+ isString(x: string | number) {
15
+ return Object.prototype.toString.call(x) === '[object String]'
16
+ }
17
+
18
+ isObject(obj: any) {
19
+ return Object.prototype.toString.call(obj) === '[object Object]'
20
+ }
21
+
22
+ JSONToString(value: any) {
23
+ return (this.isObject(value)) ? JSON.stringify(value) : value
24
+ }
25
+
26
+ stringToJSON(value: string) {
27
+ return (this.isJSON(value)) ? JSON.parse(value) : value
28
+ }
29
+
30
+ isJSON(str: any) {
31
+ try {
32
+ JSON.parse(str)
33
+ } catch (e) {
34
+ return false
35
+ }
36
+ return true
37
+ }
38
+
39
+ getValueByProp(obj: any, prop: string) {
40
+ if(typeof obj === 'undefined') return false
41
+ return obj[prop]
42
+ }
43
+
44
+ objectsEqual(x: any, y: any): boolean {
45
+
46
+ const ok = Object.keys, tx = typeof x, ty = typeof y
47
+
48
+ return x && y && tx === 'object' && tx === ty ? (
49
+ ok(x).length === ok(y).length &&
50
+ ok(x).every((key: any) => this.objectsEqual(x[key], y[key]))
51
+ ) : (x === y)
52
+
53
+ }
54
+
55
+ getJSON(file: string) {
56
+ return this.http.get(`assets/data/${file}`)
57
+ }
58
+
59
+ get today() {
60
+ return new Date().getMilliseconds() / 1000
61
+ }
62
+
63
+ base32ToHex(base32: string): string {
64
+
65
+ const base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
66
+
67
+ const charToValue = (char: string) => base32chars.indexOf(char.toUpperCase())
68
+
69
+ let bits = ''
70
+ let hex = ''
71
+
72
+ for (let i = 0; i < base32.length; i++) {
73
+ const val = charToValue(base32.charAt(i))
74
+ bits += val.toString(2).padStart(5, '0')
75
+ }
76
+
77
+ for (let i = 0; i + 4 <= bits.length; i += 4) {
78
+ const chunk = bits.substr(i, 4)
79
+ hex += parseInt(chunk, 2).toString(16)
80
+ }
81
+
82
+ return hex.toUpperCase()
83
+ }
84
+
85
+ binaryToHex(binary: string): string {
86
+ let hex = '';
87
+ for (let i = 0; i < binary.length; i += 8) {
88
+ const byte = binary.substr(i, 8);
89
+ const decimal = parseInt(byte, 2);
90
+ hex += decimal.toString(16).padStart(2, '0');
91
+ }
92
+ return hex.padStart(32, '0').substr(0, 32);
93
+ }
94
+
95
+ // y = years, m = months, w = weeks, d = days, hr = hours, mn = minutes else seconds
96
+ // returns epoch time corresponding to the expiry type
97
+ expires(str?: string) {
98
+
99
+ if(!str) return
100
+
101
+ const match = str.match(/[^0-9]+$/)
102
+
103
+ const type = (match) ? str.slice(-match[0].length) : 0
104
+
105
+ const now = Math.floor(new Date().getTime() / 1000)
106
+
107
+ let value = 0;
108
+
109
+ switch (type) {
110
+ case
111
+ 'y':
112
+ const years = parseInt(str.slice(0, -1))
113
+ value = now + (years * 31556926)
114
+ break;
115
+ case
116
+ 'm':
117
+ const months = parseInt(str.slice(0, -1))
118
+ value = now + (months * 2629743)
119
+ break;
120
+ case
121
+ 'w':
122
+ const weeks = parseInt(str.slice(0, -1))
123
+ value = now + (weeks * 604800)
124
+ break;
125
+ case
126
+ 'd':
127
+ const days = parseInt(str.slice(0, -1))
128
+ value = now + (days * 86400)
129
+ break;
130
+ case
131
+ 'hr':
132
+ const hrs = parseInt(str.slice(0, -2))
133
+ value = now + (hrs * 3600)
134
+ break;
135
+ case
136
+ 'mn':
137
+ const min = parseInt(str.slice(0, -2))
138
+ value = now + (min * 60)
139
+ break;
140
+ default: //seconds
141
+ const sec = parseInt(str.slice(0, -1))
142
+ value = now + (sec)
143
+ break;
144
+ }
145
+ return value;
146
+ }
147
+
148
+ hasExpired(expiryDate: number): boolean {
149
+ if (!expiryDate || expiryDate === 0) return false
150
+ const currentTime = Math.floor(new Date().getTime() / 1000)
151
+ return expiryDate < currentTime
152
+ }
153
+
154
+ hasExpiry(setting: any) {
155
+ return (setting?.expires) ? true : false
156
+ }
157
+
158
+ expiresIn(expiryDate: number) {
159
+
160
+ if (!expiryDate) return;
161
+
162
+ const now = Math.floor(new Date().getTime() / 1000);
163
+ let diff = expiryDate - now;
164
+
165
+ if (diff <= 0) return "Expired";
166
+
167
+ const units = [
168
+ { label: 'y', seconds: 31536000 },
169
+ { label: 'm', seconds: 2592000 },
170
+ { label: 'w', seconds: 604800 },
171
+ { label: 'd', seconds: 86400 },
172
+ { label: 'h', seconds: 3600 },
173
+ { label: 'min', seconds: 60 },
174
+ { label: '', seconds: 1 },
175
+ ];
176
+
177
+ let result = [];
178
+
179
+ for (const unit of units) {
180
+ if (diff >= unit.seconds) {
181
+ const value = Math.floor(diff / unit.seconds);
182
+ diff %= unit.seconds;
183
+ result.push(`${value}${unit.label}${value > 1 ? 's' : ''}`);
184
+ }
185
+ }
186
+
187
+ return result.join(', ');
188
+ }
189
+
190
+ lc = (str: string) => str.toLowerCase().replace(/[^\w\s]/g, '').replace(/\s+/g, '_')
191
+
192
+ }
@@ -0,0 +1,14 @@
1
+ /*
2
+ * Public API Surface of http-request-manager
3
+ */
4
+
5
+ export * from './lib/index';
6
+ export * from './lib/http-request-manager.module';
7
+
8
+ export * from './lib/http-request-services-demo/http-request-services-demo.component';
9
+
10
+ export * from './lib/http-request-services-demo/database-data-demo/database-data-demo.component';
11
+ export * from './lib/http-request-services-demo/local-storage-demo/local-storage-demo.component';
12
+ export * from './lib/http-request-services-demo/request-manager-demo/request-manager-demo.component';
13
+ export * from './lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component';
14
+
@@ -0,0 +1,32 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "../../tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "../../dist/http-request-manager",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "inlineSources": true,
9
+ "types": [],
10
+ "baseUrl": "./",
11
+ "paths": {
12
+ "@angular/*": ["node_modules/@angular/*"],
13
+ "http-request-manager": ["node_modules/http-request-manager"],
14
+ },
15
+ "target": "ES2022",
16
+ "lib": [
17
+ "dom",
18
+ "ES2022"
19
+ ]
20
+ },
21
+ "angularCompilerOptions": {
22
+ "skipTemplateCodegen": true,
23
+ "strictMetadataEmit": true,
24
+ "enableResourceInlining": true,
25
+ "strictInjectionParameters": true,
26
+ "strictTemplates": true
27
+ },
28
+ "exclude": [
29
+ "src/test.ts",
30
+ "**/*.spec.ts"
31
+ ]
32
+ }
@@ -0,0 +1,10 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "./tsconfig.lib.json",
4
+ "compilerOptions": {
5
+ "declarationMap": false
6
+ },
7
+ "angularCompilerOptions": {
8
+ "compilationMode": "partial"
9
+ }
10
+ }
@@ -0,0 +1,14 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "../../tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "../../out-tsc/spec",
6
+ "types": [
7
+ "jasmine"
8
+ ]
9
+ },
10
+ "include": [
11
+ "**/*.spec.ts",
12
+ "**/*.d.ts"
13
+ ]
14
+ }
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==