@smess/networking 1.0.1

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 (96) hide show
  1. package/README.md +104 -0
  2. package/dist/core/axios.d.ts +51 -0
  3. package/dist/core/axios.js +67 -0
  4. package/dist/core/axios.observable.d.ts +11 -0
  5. package/dist/core/axios.observable.js +60 -0
  6. package/dist/core/base.provider.advanced.test.d.ts +1 -0
  7. package/dist/core/base.provider.advanced.test.js +25 -0
  8. package/dist/core/base.provider.d.ts +15 -0
  9. package/dist/core/base.provider.js +13 -0
  10. package/dist/core/base.provider.test.d.ts +1 -0
  11. package/dist/core/base.provider.test.js +28 -0
  12. package/dist/core/base.service.wrapper.advanced.test.d.ts +1 -0
  13. package/dist/core/base.service.wrapper.advanced.test.js +44 -0
  14. package/dist/core/base.service.wrapper.d.ts +7 -0
  15. package/dist/core/base.service.wrapper.js +14 -0
  16. package/dist/core/base.service.wrapper.test.d.ts +1 -0
  17. package/dist/core/base.service.wrapper.test.js +27 -0
  18. package/dist/core/product.service.d.ts +19 -0
  19. package/dist/core/product.service.js +46 -0
  20. package/dist/core/product.service.test.d.ts +1 -0
  21. package/dist/core/product.service.test.js +63 -0
  22. package/dist/core/rx.http.service.d.ts +51 -0
  23. package/dist/core/rx.http.service.js +67 -0
  24. package/dist/core/user.service.d.ts +15 -0
  25. package/dist/core/user.service.js +39 -0
  26. package/dist/core/user.service.test.d.ts +1 -0
  27. package/dist/core/user.service.test.js +45 -0
  28. package/dist/scripts/real-test.d.ts +1 -0
  29. package/dist/scripts/real-test.js +74 -0
  30. package/dist/services/logger.service.d.ts +31 -0
  31. package/dist/services/logger.service.js +97 -0
  32. package/dist/services/logger.service.test.d.ts +1 -0
  33. package/dist/services/logger.service.test.js +33 -0
  34. package/dist/services/smess.service.d.ts +29 -0
  35. package/dist/services/smess.service.js +136 -0
  36. package/dist/services/smess.service.test.d.ts +1 -0
  37. package/dist/services/smess.service.test.js +80 -0
  38. package/dist/src/core/axios.d.ts +51 -0
  39. package/dist/src/core/axios.js +68 -0
  40. package/dist/src/core/axios.observable.d.ts +11 -0
  41. package/dist/src/core/axios.observable.js +61 -0
  42. package/dist/src/core/base.provider.advanced.test.d.ts +1 -0
  43. package/dist/src/core/base.provider.advanced.test.js +31 -0
  44. package/dist/src/core/base.provider.d.ts +15 -0
  45. package/dist/src/core/base.provider.js +13 -0
  46. package/dist/src/core/base.provider.test.d.ts +1 -0
  47. package/dist/src/core/base.provider.test.js +34 -0
  48. package/dist/src/core/base.service.wrapper.advanced.test.d.ts +1 -0
  49. package/dist/src/core/base.service.wrapper.advanced.test.js +38 -0
  50. package/dist/src/core/base.service.wrapper.d.ts +7 -0
  51. package/dist/src/core/base.service.wrapper.js +15 -0
  52. package/dist/src/core/base.service.wrapper.test.d.ts +1 -0
  53. package/dist/src/core/base.service.wrapper.test.js +27 -0
  54. package/dist/src/core/rx.http.service.d.ts +51 -0
  55. package/dist/src/core/rx.http.service.js +68 -0
  56. package/dist/src/domain/auth.provider.d.ts +12 -0
  57. package/dist/src/domain/auth.provider.js +67 -0
  58. package/dist/src/domain/product.service.d.ts +21 -0
  59. package/dist/src/domain/product.service.js +47 -0
  60. package/dist/src/domain/smess.service.d.ts +35 -0
  61. package/dist/src/domain/smess.service.js +137 -0
  62. package/dist/src/domain/tests/auth.service.test.d.ts +1 -0
  63. package/dist/src/domain/tests/auth.service.test.js +80 -0
  64. package/dist/src/domain/tests/product.service.test.d.ts +1 -0
  65. package/dist/src/domain/tests/product.service.test.js +47 -0
  66. package/dist/src/domain/tests/smess.service.test.d.ts +1 -0
  67. package/dist/src/domain/tests/smess.service.test.js +106 -0
  68. package/dist/src/domain/tests/user.service.test.d.ts +1 -0
  69. package/dist/src/domain/tests/user.service.test.js +51 -0
  70. package/dist/src/domain/user.service.d.ts +16 -0
  71. package/dist/src/domain/user.service.js +39 -0
  72. package/dist/src/services/logger.service.d.ts +31 -0
  73. package/dist/src/services/logger.service.js +97 -0
  74. package/dist/src/services/logger.service.test.d.ts +1 -0
  75. package/dist/src/services/logger.service.test.js +33 -0
  76. package/dist/src/types/types.d.ts +95 -0
  77. package/dist/src/types/types.js +89 -0
  78. package/dist/src/types/types.test.d.ts +1 -0
  79. package/dist/src/types/types.test.js +27 -0
  80. package/dist/src/utils/networking-import.d.ts +4 -0
  81. package/dist/src/utils/networking-import.js +43 -0
  82. package/dist/src/utils/rxjs-import.d.ts +5 -0
  83. package/dist/src/utils/rxjs-import.js +34 -0
  84. package/dist/types/types.d.ts +89 -0
  85. package/dist/types/types.js +89 -0
  86. package/dist/types/types.test.d.ts +1 -0
  87. package/dist/types/types.test.js +27 -0
  88. package/dist/utils/networking-import.d.ts +4 -0
  89. package/dist/utils/networking-import.js +43 -0
  90. package/dist/utils/networking-settings.d.ts +6 -0
  91. package/dist/utils/networking-settings.js +19 -0
  92. package/dist/utils/networking-settings.test.d.ts +1 -0
  93. package/dist/utils/networking-settings.test.js +21 -0
  94. package/dist/utils/rxjs-import.d.ts +5 -0
  95. package/dist/utils/rxjs-import.js +34 -0
  96. package/package.json +33 -0
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # SMESS Networking Package
2
+
3
+ ## Features
4
+ - Per-instance configuration (no global config)
5
+ - RxJS-based HTTP services
6
+ - Extensible provider/service architecture
7
+ - TypeScript-first
8
+
9
+ ## Usage
10
+
11
+ ### 1. Define your config
12
+ ```typescript
13
+ const configA = {
14
+ baseUrl: 'https://api-a',
15
+ isProd: false,
16
+ clientId: 'A',
17
+ apiKey: 'keyA',
18
+ };
19
+ const configB = {
20
+ baseUrl: 'https://api-b',
21
+ isProd: true,
22
+ clientId: 'B',
23
+ apiKey: 'keyB',
24
+ };
25
+ ```
26
+
27
+ ### 2. Create providers/services with config
28
+ ```typescript
29
+ import { ProductService } from './core/product.service';
30
+ import { UserService } from './core/user.service';
31
+
32
+ const productServiceA = new ProductService(configA);
33
+ const productServiceB = new ProductService(configB);
34
+ const userServiceA = new UserService(configA);
35
+ ```
36
+
37
+ ### 3. Use services independently
38
+ ```typescript
39
+ productServiceA.fetchAllProducts().subscribe(...);
40
+ productServiceB.createProduct({ name: 'X', price: 10 }).subscribe(...);
41
+ userServiceA.fetchUserById(1).subscribe(...);
42
+ ```
43
+
44
+ ### 4. Example: Custom Provider
45
+ ```typescript
46
+ import { BaseProvider } from './core/base.provider';
47
+ import { SmessService } from './services/smess.service';
48
+
49
+ const config = {
50
+ baseUrl: 'https://custom-api',
51
+ isProd: false,
52
+ clientId: 'custom-client',
53
+ apiKey: 'custom-key',
54
+ };
55
+
56
+ class ExampleProvider extends BaseProvider {
57
+ constructor(config, resourceId: string) {
58
+ super({
59
+ config,
60
+ path: `/resource/${resourceId}`,
61
+ method: 'GET',
62
+ headers: { 'Custom-Header': 'value' },
63
+ getPath: () => `/resource/${resourceId}`,
64
+ });
65
+ }
66
+ }
67
+
68
+ const provider = new ExampleProvider(config, '123');
69
+ const service = new SmessService(provider);
70
+ service.request().subscribe(result => {
71
+ // handle result
72
+ });
73
+ ```
74
+
75
+ ### 4. Example: Custom CustomerProvider
76
+
77
+ ```typescript
78
+ import { CustomerProvider, CustomerTarget } from './core/customer.provider';
79
+ import { SmessService } from './services/smess.service';
80
+
81
+ const config = {
82
+ baseUrl: 'https://api.example.com',
83
+ isProd: false,
84
+ clientId: 'customer-client',
85
+ apiKey: 'customer-key',
86
+ };
87
+
88
+ const provider = new CustomerProvider(config, 'get-profile');
89
+ const service = new SmessService(provider);
90
+
91
+ service.request().subscribe(result => {
92
+ // handle result
93
+ });
94
+ ```
95
+
96
+ ---
97
+
98
+ ## Private Package Usage
99
+
100
+ See [SETUP.md](./SETUP.md) for instructions on using this package as a private dependency (GitHub repo, GitHub Packages, npm private registry) with the correct package name: `@smess/networking`.
101
+
102
+ ---
103
+
104
+ MIT License
@@ -0,0 +1,51 @@
1
+ import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from '../utils/networking-import';
2
+ import type { AxiosInterceptorManager } from 'axios';
3
+ import { AxiosObservable } from './axios.observable';
4
+ export interface Axiosable {
5
+ request<T = unknown>(config: AxiosRequestConfig): AxiosObservable<T>;
6
+ get<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
7
+ head<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
8
+ post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
9
+ put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
10
+ patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
11
+ delete<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
12
+ }
13
+ declare class Axios implements Axiosable {
14
+ private axiosInstance;
15
+ static defaults: Omit<import("axios").AxiosDefaults<any>, "headers"> & {
16
+ headers: import("axios").HeadersDefaults & {
17
+ [key: string]: import("axios").AxiosHeaderValue;
18
+ };
19
+ };
20
+ static interceptors: {
21
+ request: AxiosInterceptorManager<import("axios").InternalAxiosRequestConfig>;
22
+ response: AxiosInterceptorManager<AxiosResponse>;
23
+ };
24
+ constructor(axiosInstance: AxiosInstance);
25
+ get defaults(): Omit<import("axios").AxiosDefaults<any>, "headers"> & {
26
+ headers: import("axios").HeadersDefaults & {
27
+ [key: string]: import("axios").AxiosHeaderValue;
28
+ };
29
+ };
30
+ get interceptors(): {
31
+ request: AxiosInterceptorManager<import("axios").InternalAxiosRequestConfig>;
32
+ response: AxiosInterceptorManager<AxiosResponse>;
33
+ };
34
+ static request<T = any>(config: AxiosRequestConfig): AxiosObservable<T>;
35
+ static get<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
36
+ static post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
37
+ static put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
38
+ static patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
39
+ static delete<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
40
+ static head<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
41
+ static create(config: AxiosRequestConfig): Axios;
42
+ request<T = any>(config: AxiosRequestConfig): AxiosObservable<T>;
43
+ get<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
44
+ head<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
45
+ post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
46
+ put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
47
+ patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): AxiosObservable<T>;
48
+ delete<T = any>(url: string, config?: AxiosRequestConfig): AxiosObservable<T>;
49
+ }
50
+ export default Axios;
51
+ export { Axios };
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Axios = void 0;
4
+ const networking_import_1 = require("../utils/networking-import");
5
+ const axios_observable_1 = require("./axios.observable");
6
+ class Axios {
7
+ constructor(axiosInstance) {
8
+ this.axiosInstance = axiosInstance;
9
+ }
10
+ get defaults() {
11
+ return this.axiosInstance.defaults;
12
+ }
13
+ get interceptors() {
14
+ return this.axiosInstance.interceptors;
15
+ }
16
+ // ----- Static Methods -----
17
+ static request(config) {
18
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.request, [config]);
19
+ }
20
+ static get(url, config) {
21
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.get, [url, config]);
22
+ }
23
+ static post(url, data, config) {
24
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.post, [url, data, config]);
25
+ }
26
+ static put(url, data, config) {
27
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.put, [url, data, config]);
28
+ }
29
+ static patch(url, data, config) {
30
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.patch, [url, data, config]);
31
+ }
32
+ static delete(url, config) {
33
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.delete, [url, config]);
34
+ }
35
+ static head(url, config) {
36
+ return (0, axios_observable_1.createObservable)(networking_import_1.axios.head, [url, config]);
37
+ }
38
+ static create(config) {
39
+ return new Axios(networking_import_1.axios.create(config));
40
+ }
41
+ // ----- Instance Methods -----
42
+ request(config) {
43
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.request, [config]);
44
+ }
45
+ get(url, config) {
46
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.get, [url, config]);
47
+ }
48
+ head(url, config) {
49
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.head, [url, config]);
50
+ }
51
+ post(url, data, config) {
52
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.post, [url, data, config]);
53
+ }
54
+ put(url, data, config) {
55
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.put, [url, data, config]);
56
+ }
57
+ patch(url, data, config) {
58
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.patch, [url, data, config]);
59
+ }
60
+ delete(url, config) {
61
+ return (0, axios_observable_1.createObservable)(this.axiosInstance.delete, [url, config]);
62
+ }
63
+ }
64
+ exports.Axios = Axios;
65
+ Axios.defaults = networking_import_1.axios.defaults;
66
+ Axios.interceptors = networking_import_1.axios.interceptors;
67
+ exports.default = Axios;
@@ -0,0 +1,11 @@
1
+ import { AxiosResponse } from '../utils/networking-import';
2
+ import type { AxiosPromise } from 'axios';
3
+ import { Observable } from '../utils/rxjs-import';
4
+ export type AxiosObservable<T> = Observable<AxiosResponse<T>>;
5
+ interface ObservableOptions {
6
+ retry?: number;
7
+ timeoutMs?: number;
8
+ cache?: boolean;
9
+ }
10
+ export declare function createObservable<T>(promiseFactory: (...args: any[]) => AxiosPromise<T>, args: any[], options?: ObservableOptions): AxiosObservable<T>;
11
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createObservable = createObservable;
4
+ const networking_import_1 = require("../utils/networking-import");
5
+ const rxjs_import_1 = require("../utils/rxjs-import");
6
+ const logger_service_1 = require("../services/logger.service");
7
+ function createObservable(promiseFactory, args, options = {}) {
8
+ let config = args[args.length - 1];
9
+ if (config && typeof config === 'object' && !Array.isArray(config)) {
10
+ config = Object.assign({}, config);
11
+ }
12
+ else {
13
+ config = {};
14
+ args.push(config);
15
+ }
16
+ let cancelSource = null;
17
+ const hasCancelToken = !!config.cancelToken;
18
+ if (!hasCancelToken) {
19
+ logger_service_1.$logger.warn('[Networking] You can omit cancelToken — unsubscribing cancels the request automatically.', undefined, 'axios.observable');
20
+ }
21
+ let source$ = new rxjs_import_1.Observable((subscriber) => {
22
+ if (!hasCancelToken) {
23
+ cancelSource = networking_import_1.axios.CancelToken.source();
24
+ config.cancelToken = cancelSource.token;
25
+ }
26
+ promiseFactory(...args)
27
+ .then((response) => {
28
+ subscriber.next(response);
29
+ subscriber.complete();
30
+ })
31
+ .catch((error) => {
32
+ if (!subscriber.closed) {
33
+ subscriber.error(error);
34
+ }
35
+ });
36
+ return () => {
37
+ if (cancelSource) {
38
+ cancelSource.cancel('Request canceled via unsubscribe.');
39
+ }
40
+ };
41
+ });
42
+ // Add timeout if specified
43
+ if (options.timeoutMs) {
44
+ source$ = source$.pipe((0, rxjs_import_1.timeout)(options.timeoutMs));
45
+ }
46
+ // Add retry logic
47
+ if (options.retry) {
48
+ source$ = source$.pipe((0, rxjs_import_1.retry)(options.retry));
49
+ }
50
+ // Cache the response if needed
51
+ if (options.cache) {
52
+ source$ = source$.pipe((0, rxjs_import_1.shareReplay)({ bufferSize: 1, refCount: false }));
53
+ }
54
+ // Optional: Log or catch errors globally
55
+ source$ = source$.pipe((0, rxjs_import_1.catchError)((err) => {
56
+ logger_service_1.$logger.error('[createObservable error]:', err, 'axios.observable');
57
+ return (0, rxjs_import_1.throwError)(() => err);
58
+ }));
59
+ return source$;
60
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_provider_1 = require("./base.provider");
4
+ describe('BaseProvider Advanced', () => {
5
+ it('should support dynamic getPath for multiple params', () => {
6
+ const provider = new base_provider_1.BaseProvider({
7
+ baseURL: 'https://api.example.com',
8
+ path: '/resource/:id/:action',
9
+ method: 'GET',
10
+ headers: {},
11
+ getPath: (id, action) => `/resource/${id}/${action}`,
12
+ });
13
+ expect(provider.getPath('42', 'edit')).toBe('/resource/42/edit');
14
+ });
15
+ it('should allow dynamic headers and method', () => {
16
+ const provider = new base_provider_1.BaseProvider({
17
+ baseURL: 'https://api.example.com',
18
+ path: '/resource',
19
+ method: 'PATCH',
20
+ headers: { Authorization: 'Bearer token' },
21
+ });
22
+ expect(provider.method).toBe('PATCH');
23
+ expect(provider.headers.Authorization).toBe('Bearer token');
24
+ });
25
+ });
@@ -0,0 +1,15 @@
1
+ import { ProviderType } from '../types/types';
2
+ export declare class BaseProvider implements ProviderType {
3
+ baseURL: string;
4
+ path: string;
5
+ method: string;
6
+ headers: any;
7
+ getPath: (...queryParams: any[]) => string;
8
+ constructor({ baseURL, path, method, headers, getPath, }: {
9
+ baseURL: string;
10
+ path: string;
11
+ method: string;
12
+ headers: any;
13
+ getPath?: (...queryParams: any[]) => string;
14
+ });
15
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseProvider = void 0;
4
+ class BaseProvider {
5
+ constructor({ baseURL, path, method, headers, getPath, }) {
6
+ this.baseURL = baseURL;
7
+ this.path = path;
8
+ this.method = method;
9
+ this.headers = headers;
10
+ this.getPath = getPath || (() => path);
11
+ }
12
+ }
13
+ exports.BaseProvider = BaseProvider;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_provider_1 = require("./base.provider");
4
+ describe('BaseProvider', () => {
5
+ it('should construct with required fields', () => {
6
+ const provider = new base_provider_1.BaseProvider({
7
+ baseURL: 'https://api.example.com',
8
+ path: '/resource',
9
+ method: 'GET',
10
+ headers: { foo: 'bar' },
11
+ });
12
+ expect(provider.baseURL).toBe('https://api.example.com');
13
+ expect(provider.path).toBe('/resource');
14
+ expect(provider.method).toBe('GET');
15
+ expect(provider.headers).toEqual({ foo: 'bar' });
16
+ expect(provider.getPath()).toBe('/resource');
17
+ });
18
+ it('should use custom getPath if provided', () => {
19
+ const provider = new base_provider_1.BaseProvider({
20
+ baseURL: 'https://api.example.com',
21
+ path: '/resource/:id',
22
+ method: 'GET',
23
+ headers: {},
24
+ getPath: (id) => `/resource/${id}`,
25
+ });
26
+ expect(provider.getPath('123')).toBe('/resource/123');
27
+ });
28
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_service_wrapper_1 = require("./base.service.wrapper");
4
+ const types_1 = require("../types/types");
5
+ const rxjs_1 = require("rxjs");
6
+ const operators_1 = require("rxjs/operators");
7
+ describe('BaseServiceWrapper Advanced', () => {
8
+ const mockProvider = {
9
+ baseURL: 'https://api.example.com',
10
+ path: '/resource',
11
+ method: 'GET',
12
+ headers: {},
13
+ getPath: () => '/resource',
14
+ };
15
+ it('should allow use of RxJS operators', done => {
16
+ const wrapper = new base_service_wrapper_1.BaseServiceWrapper(mockProvider);
17
+ wrapper.request = (() => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded({ foo: 1 })));
18
+ wrapper.request().pipe((0, operators_1.map)(r => r.response)).subscribe(val => {
19
+ expect(val).toEqual({ foo: 1 });
20
+ done();
21
+ });
22
+ });
23
+ it('should handle multiple concurrent requests', done => {
24
+ const wrapper = new base_service_wrapper_1.BaseServiceWrapper(mockProvider);
25
+ wrapper.request = ((payload) => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded({ foo: payload })));
26
+ const results = [];
27
+ wrapper.request(1).subscribe(r => {
28
+ results.push(r.response);
29
+ if (results.length === 2) {
30
+ expect(results).toContainEqual({ foo: 1 });
31
+ expect(results).toContainEqual({ foo: 2 });
32
+ done();
33
+ }
34
+ });
35
+ wrapper.request(2).subscribe(r => {
36
+ results.push(r.response);
37
+ if (results.length === 2) {
38
+ expect(results).toContainEqual({ foo: 1 });
39
+ expect(results).toContainEqual({ foo: 2 });
40
+ done();
41
+ }
42
+ });
43
+ });
44
+ });
@@ -0,0 +1,7 @@
1
+ import { ProviderType, NetworkingUIEventWrapped } from '../types/types';
2
+ import { Observable } from 'rxjs';
3
+ export declare class BaseServiceWrapper<T extends ProviderType> {
4
+ protected provider: T;
5
+ constructor(provider: T);
6
+ request<R = any>(payload?: any): Observable<NetworkingUIEventWrapped<R>>;
7
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseServiceWrapper = void 0;
4
+ const smess_service_1 = require("../services/smess.service");
5
+ class BaseServiceWrapper {
6
+ constructor(provider) {
7
+ this.provider = provider;
8
+ }
9
+ request(payload) {
10
+ const service = new smess_service_1.SmessService(this.provider);
11
+ return service.request(payload);
12
+ }
13
+ }
14
+ exports.BaseServiceWrapper = BaseServiceWrapper;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_service_wrapper_1 = require("./base.service.wrapper");
4
+ const types_1 = require("../types/types");
5
+ const rxjs_1 = require("rxjs");
6
+ // Mock SmessService for testing
7
+ jest.mock('../services/smess.service', () => ({
8
+ SmessService: jest.fn().mockImplementation(() => ({
9
+ request: jest.fn(() => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded({ foo: 'bar' })))
10
+ }))
11
+ }));
12
+ describe('BaseServiceWrapper', () => {
13
+ const mockProvider = {
14
+ baseURL: 'https://api.example.com',
15
+ path: '/resource',
16
+ method: 'GET',
17
+ headers: {},
18
+ getPath: () => '/resource',
19
+ };
20
+ it('should delegate request to SmessService', done => {
21
+ const wrapper = new base_service_wrapper_1.BaseServiceWrapper(mockProvider);
22
+ wrapper.request().subscribe(result => {
23
+ expect(result.response).toEqual({ foo: 'bar' });
24
+ done();
25
+ });
26
+ });
27
+ });
@@ -0,0 +1,19 @@
1
+ import { BaseProvider } from './base.provider';
2
+ import { BaseServiceWrapper } from './base.service.wrapper';
3
+ export interface Product {
4
+ id: number;
5
+ name: string;
6
+ price: number;
7
+ }
8
+ export declare class ProductProvider extends BaseProvider {
9
+ constructor({ productId, method }?: {
10
+ productId?: number;
11
+ method?: string;
12
+ });
13
+ }
14
+ export declare class ProductService extends BaseServiceWrapper<ProductProvider> {
15
+ constructor(productId?: number, method?: string);
16
+ fetchProductById(id: number): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product>>;
17
+ fetchAllProducts(): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product[]>>;
18
+ createProduct(product: Omit<Product, 'id'>): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product>>;
19
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProductService = exports.ProductProvider = void 0;
4
+ const base_provider_1 = require("./base.provider");
5
+ const base_service_wrapper_1 = require("./base.service.wrapper");
6
+ // ProductProvider implements ProviderType for product endpoints
7
+ class ProductProvider extends base_provider_1.BaseProvider {
8
+ constructor({ productId, method } = {}) {
9
+ super({
10
+ baseURL: 'https://fakestoreapi.com',
11
+ path: productId ? `/products/${productId}` : '/products',
12
+ method: method || 'GET',
13
+ headers: { 'Content-Type': 'application/json' },
14
+ getPath: () => (productId ? `/products/${productId}` : '/products'),
15
+ });
16
+ }
17
+ }
18
+ exports.ProductProvider = ProductProvider;
19
+ // ProductService provides high-level methods for product API
20
+ class ProductService extends base_service_wrapper_1.BaseServiceWrapper {
21
+ constructor(productId, method) {
22
+ super(new ProductProvider({ productId, method }));
23
+ }
24
+ // Fetch a product by ID
25
+ fetchProductById(id) {
26
+ this.provider = new ProductProvider({ productId: id });
27
+ return this.request();
28
+ }
29
+ // Fetch all products
30
+ fetchAllProducts() {
31
+ this.provider = new ProductProvider();
32
+ return this.request();
33
+ }
34
+ // Create a new product (POST)
35
+ createProduct(product) {
36
+ this.provider = new ProductProvider({ method: 'POST' });
37
+ return this.request(product);
38
+ }
39
+ }
40
+ exports.ProductService = ProductService;
41
+ // Example usage:
42
+ // setNetworkingConfig({ baseUrl: 'https://fakestoreapi.com', isProd: false });
43
+ // const productService = new ProductService();
44
+ // productService.fetchProductById(1).subscribe(result => console.log(result));
45
+ // productService.fetchAllProducts().subscribe(result => console.log(result));
46
+ // productService.createProduct({ name: 'New Product', price: 99.99 }).subscribe(result => console.log(result));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const product_service_1 = require("./product.service");
4
+ const types_1 = require("../types/types");
5
+ const rxjs_1 = require("rxjs");
6
+ jest.mock('./base.service.wrapper', () => {
7
+ const actual = jest.requireActual('./base.service.wrapper');
8
+ return Object.assign(Object.assign({}, actual), { BaseServiceWrapper: class {
9
+ constructor() {
10
+ this.request = jest.fn((payload) => {
11
+ if (payload === 'error') {
12
+ return (0, rxjs_1.throwError)(() => new Error('Test error'));
13
+ }
14
+ return (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded({ id: 1, name: 'Product', price: 10 }));
15
+ });
16
+ }
17
+ } });
18
+ });
19
+ describe('ProductService', () => {
20
+ it('fetchProductById should return product (success)', done => {
21
+ const service = new product_service_1.ProductService();
22
+ service.fetchProductById(1).subscribe(result => {
23
+ expect(result.response).toEqual({ id: 1, name: 'Product', price: 10 });
24
+ done();
25
+ });
26
+ });
27
+ it('fetchAllProducts should return products (success)', done => {
28
+ const service = new product_service_1.ProductService();
29
+ service.fetchAllProducts().subscribe(result => {
30
+ expect(result.response).toEqual({ id: 1, name: 'Product', price: 10 });
31
+ done();
32
+ });
33
+ });
34
+ it('createProduct should return product (success)', done => {
35
+ const service = new product_service_1.ProductService();
36
+ service.createProduct({ name: 'New', price: 99 }).subscribe(result => {
37
+ expect(result.response).toEqual({ id: 1, name: 'Product', price: 10 });
38
+ done();
39
+ });
40
+ });
41
+ it('request should handle error (fetchProductById)', done => {
42
+ const service = new product_service_1.ProductService();
43
+ service.request = jest.fn(() => (0, rxjs_1.throwError)(() => new Error('Test error')));
44
+ service.request('error').subscribe({
45
+ error: err => {
46
+ expect(err).toBeInstanceOf(Error);
47
+ expect(err.message).toBe('Test error');
48
+ done();
49
+ },
50
+ });
51
+ });
52
+ it('request should handle error (createProduct)', done => {
53
+ const service = new product_service_1.ProductService();
54
+ service.request = jest.fn(() => (0, rxjs_1.throwError)(() => new Error('Test error')));
55
+ service.request('error').subscribe({
56
+ error: err => {
57
+ expect(err).toBeInstanceOf(Error);
58
+ expect(err.message).toBe('Test error');
59
+ done();
60
+ },
61
+ });
62
+ });
63
+ });