@smess/networking 1.0.28 → 1.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 (132) hide show
  1. package/dist/index.d.ts +6 -0
  2. package/dist/index.js +6 -0
  3. package/dist/services/customer.service.js +1 -1
  4. package/dist/services/storefront.cart.service.d.ts +73 -0
  5. package/dist/services/storefront.cart.service.js +167 -0
  6. package/dist/services/storefront.cart.service.test.d.ts +1 -0
  7. package/dist/services/storefront.cart.service.test.js +211 -0
  8. package/dist/services/storefront.checkout.service.d.ts +62 -0
  9. package/dist/services/storefront.checkout.service.js +75 -0
  10. package/dist/services/storefront.checkout.service.test.d.ts +1 -0
  11. package/dist/services/storefront.checkout.service.test.js +158 -0
  12. package/dist/services/storefront.customer.metadata.service.d.ts +91 -0
  13. package/dist/services/storefront.customer.metadata.service.js +225 -0
  14. package/dist/services/storefront.customer.metadata.service.test.d.ts +1 -0
  15. package/dist/services/storefront.customer.metadata.service.test.js +271 -0
  16. package/dist/services/storefront.order.service.d.ts +45 -0
  17. package/dist/services/storefront.order.service.js +99 -0
  18. package/dist/services/storefront.order.service.test.d.ts +1 -0
  19. package/dist/services/storefront.order.service.test.js +158 -0
  20. package/dist/services/storefront.product.service.d.ts +52 -0
  21. package/dist/services/storefront.product.service.js +75 -0
  22. package/dist/services/storefront.product.service.test.d.ts +1 -0
  23. package/dist/services/storefront.product.service.test.js +120 -0
  24. package/dist/services/storefront.store.service.d.ts +52 -0
  25. package/dist/services/storefront.store.service.js +140 -0
  26. package/dist/services/storefront.store.service.test.d.ts +1 -0
  27. package/dist/services/storefront.store.service.test.js +90 -0
  28. package/dist/src/core/axios.d.ts +51 -0
  29. package/dist/src/core/axios.js +65 -0
  30. package/dist/src/core/axios.observable.d.ts +11 -0
  31. package/dist/src/core/axios.observable.js +58 -0
  32. package/dist/src/core/base.provider.advanced.test.d.ts +1 -0
  33. package/dist/src/core/base.provider.advanced.test.js +29 -0
  34. package/dist/src/core/base.provider.d.ts +15 -0
  35. package/dist/src/core/base.provider.js +13 -0
  36. package/dist/src/core/base.provider.test.d.ts +1 -0
  37. package/dist/src/core/base.provider.test.js +36 -0
  38. package/dist/src/core/base.service.wrapper.advanced.test.d.ts +1 -0
  39. package/dist/src/core/base.service.wrapper.advanced.test.js +39 -0
  40. package/dist/src/core/base.service.wrapper.d.ts +7 -0
  41. package/dist/src/core/base.service.wrapper.js +11 -0
  42. package/dist/src/core/base.service.wrapper.test.d.ts +1 -0
  43. package/dist/src/core/base.service.wrapper.test.js +25 -0
  44. package/dist/src/core/rx.http.service.d.ts +51 -0
  45. package/dist/src/core/rx.http.service.js +65 -0
  46. package/dist/src/index.d.ts +25 -0
  47. package/dist/src/index.js +29 -0
  48. package/dist/src/services/auth.service.d.ts +65 -0
  49. package/dist/src/services/auth.service.js +197 -0
  50. package/dist/src/services/auth.service.test.d.ts +1 -0
  51. package/dist/src/services/auth.service.test.js +334 -0
  52. package/dist/src/services/cache.service.d.ts +31 -0
  53. package/dist/src/services/cache.service.js +77 -0
  54. package/dist/src/services/cache.service.test.d.ts +1 -0
  55. package/dist/src/services/cache.service.test.js +88 -0
  56. package/dist/src/services/customer.service.d.ts +199 -0
  57. package/dist/src/services/customer.service.js +114 -0
  58. package/dist/src/services/customer.service.test.d.ts +1 -0
  59. package/dist/src/services/customer.service.test.js +430 -0
  60. package/dist/src/services/employee.service.d.ts +73 -0
  61. package/dist/src/services/employee.service.js +74 -0
  62. package/dist/src/services/employee.service.test.d.ts +1 -0
  63. package/dist/src/services/employee.service.test.js +127 -0
  64. package/dist/src/services/logger.service.d.ts +31 -0
  65. package/dist/src/services/logger.service.js +93 -0
  66. package/dist/src/services/logger.service.test.d.ts +1 -0
  67. package/dist/src/services/logger.service.test.js +31 -0
  68. package/dist/src/services/order.service.d.ts +73 -0
  69. package/dist/src/services/order.service.js +97 -0
  70. package/dist/src/services/order.service.test.d.ts +1 -0
  71. package/dist/src/services/order.service.test.js +163 -0
  72. package/dist/src/services/product.service.d.ts +21 -0
  73. package/dist/src/services/product.service.js +42 -0
  74. package/dist/src/services/product.service.test.d.ts +1 -0
  75. package/dist/src/services/product.service.test.js +61 -0
  76. package/dist/src/services/smess.service.d.ts +36 -0
  77. package/dist/src/services/smess.service.js +128 -0
  78. package/dist/src/services/smess.service.test.d.ts +1 -0
  79. package/dist/src/services/smess.service.test.js +103 -0
  80. package/dist/src/services/store.cart.service.d.ts +158 -0
  81. package/dist/src/services/store.cart.service.js +177 -0
  82. package/dist/src/services/store.cart.service.test.d.ts +1 -0
  83. package/dist/src/services/store.cart.service.test.js +394 -0
  84. package/dist/src/services/store.product.service.d.ts +124 -0
  85. package/dist/src/services/store.product.service.js +102 -0
  86. package/dist/src/services/store.product.service.test.d.ts +1 -0
  87. package/dist/src/services/store.product.service.test.js +319 -0
  88. package/dist/src/services/store.service.d.ts +79 -0
  89. package/dist/src/services/store.service.js +235 -0
  90. package/dist/src/services/store.service.test.d.ts +1 -0
  91. package/dist/src/services/store.service.test.js +274 -0
  92. package/dist/src/services/storefront.cart.service.d.ts +73 -0
  93. package/dist/src/services/storefront.cart.service.js +167 -0
  94. package/dist/src/services/storefront.cart.service.test.d.ts +1 -0
  95. package/dist/src/services/storefront.cart.service.test.js +211 -0
  96. package/dist/src/services/storefront.checkout.service.d.ts +62 -0
  97. package/dist/src/services/storefront.checkout.service.js +75 -0
  98. package/dist/src/services/storefront.checkout.service.test.d.ts +1 -0
  99. package/dist/src/services/storefront.checkout.service.test.js +158 -0
  100. package/dist/src/services/storefront.customer.metadata.service.d.ts +91 -0
  101. package/dist/src/services/storefront.customer.metadata.service.js +225 -0
  102. package/dist/src/services/storefront.customer.metadata.service.test.d.ts +1 -0
  103. package/dist/src/services/storefront.customer.metadata.service.test.js +271 -0
  104. package/dist/src/services/storefront.order.service.d.ts +45 -0
  105. package/dist/src/services/storefront.order.service.js +99 -0
  106. package/dist/src/services/storefront.order.service.test.d.ts +1 -0
  107. package/dist/src/services/storefront.order.service.test.js +158 -0
  108. package/dist/src/services/storefront.product.service.d.ts +52 -0
  109. package/dist/src/services/storefront.product.service.js +75 -0
  110. package/dist/src/services/storefront.product.service.test.d.ts +1 -0
  111. package/dist/src/services/storefront.product.service.test.js +120 -0
  112. package/dist/src/services/storefront.store.service.d.ts +52 -0
  113. package/dist/src/services/storefront.store.service.js +140 -0
  114. package/dist/src/services/storefront.store.service.test.d.ts +1 -0
  115. package/dist/src/services/storefront.store.service.test.js +90 -0
  116. package/dist/src/services/user.service.d.ts +16 -0
  117. package/dist/src/services/user.service.js +37 -0
  118. package/dist/src/services/user.service.test.d.ts +1 -0
  119. package/dist/src/services/user.service.test.js +52 -0
  120. package/dist/src/services/utils/withAuthReset.d.ts +3 -0
  121. package/dist/src/services/utils/withAuthReset.js +8 -0
  122. package/dist/src/types/types.d.ts +93 -0
  123. package/dist/src/types/types.js +82 -0
  124. package/dist/src/types/types.test.d.ts +1 -0
  125. package/dist/src/types/types.test.js +25 -0
  126. package/dist/src/utils/cache-import.d.ts +3 -0
  127. package/dist/src/utils/cache-import.js +2 -0
  128. package/dist/src/utils/networking-import.d.ts +4 -0
  129. package/dist/src/utils/networking-import.js +3 -0
  130. package/dist/src/utils/rxjs-import.d.ts +5 -0
  131. package/dist/src/utils/rxjs-import.js +5 -0
  132. package/package.json +1 -1
@@ -0,0 +1,140 @@
1
+ import { NetworkingUIEventWrapped, } from "../types/types";
2
+ import { Accept, SMESSHeader, SmessService } from "./smess.service";
3
+ import { from, of } from "rxjs";
4
+ import { map, switchMap, catchError } from "rxjs/operators";
5
+ import { GenericIndexedDBService } from "./cache.service";
6
+ export class StorefrontStoreProvider {
7
+ constructor(config, target) {
8
+ this.config = config;
9
+ this.target = target;
10
+ }
11
+ get baseURL() {
12
+ return this.config.version
13
+ ? `${this.config.baseUrl}/${this.config.version}`
14
+ : this.config.baseUrl;
15
+ }
16
+ get path() {
17
+ switch (this.target) {
18
+ case "store-list":
19
+ return "/storefront/stores/list";
20
+ case "store-information":
21
+ return "/storefront/stores/${id}/information";
22
+ default:
23
+ return "/storefront/stores/list";
24
+ }
25
+ }
26
+ get method() {
27
+ return "GET";
28
+ }
29
+ get headers() {
30
+ let headers = SmessService.getHeaders(Accept.V1, null);
31
+ if (this.config.clientId) {
32
+ headers[SMESSHeader.ClientId] = this.config.clientId;
33
+ }
34
+ if (this.config.apiKey) {
35
+ headers[SMESSHeader.ApiKey] = this.config.apiKey;
36
+ }
37
+ return SmessService.filterHeaders(headers);
38
+ }
39
+ getPath(...queryParams) {
40
+ let definedPath = this.path;
41
+ const params = definedPath.match(/\$\{(.+?)\}/g);
42
+ params?.forEach((value, index) => {
43
+ definedPath = definedPath.replace(value, String(queryParams[index]));
44
+ });
45
+ return definedPath;
46
+ }
47
+ }
48
+ export class StorefrontStoreService {
49
+ constructor(config) {
50
+ this.config = config;
51
+ // Initialize cache services for different data types
52
+ this.cacheService = new GenericIndexedDBService("StorefrontStoreCache", "id, timestamp", (data) => data, (data) => data);
53
+ this.storeListCache = new GenericIndexedDBService("StorefrontStoreListCache", "timestamp", (data) => data, (data) => data);
54
+ }
55
+ provider(target) {
56
+ const targetWrapper = new StorefrontStoreProvider(this.config, target);
57
+ return new SmessService(targetWrapper);
58
+ }
59
+ /**
60
+ * List all accessible stores with shipping rules
61
+ * GET /storefront/stores/list
62
+ */
63
+ listStores() {
64
+ return from(this.storeListCache.getAll("storefront-store-list")).pipe(switchMap((cachedData) => {
65
+ if (cachedData &&
66
+ cachedData.length > 0 &&
67
+ this.isCacheValid(cachedData[0].timestamp)) {
68
+ return of(NetworkingUIEventWrapped.succeeded(cachedData[0].data));
69
+ }
70
+ return this.provider("store-list")
71
+ .request()
72
+ .pipe(map((response) => {
73
+ if (response.response) {
74
+ this.storeListCache.saveAll([
75
+ {
76
+ data: response.response,
77
+ timestamp: Date.now(),
78
+ },
79
+ ], "storefront-store-list");
80
+ }
81
+ return response;
82
+ }), catchError((error) => {
83
+ if (cachedData && cachedData.length > 0) {
84
+ return of(NetworkingUIEventWrapped.succeeded(cachedData[0].data));
85
+ }
86
+ throw error;
87
+ }));
88
+ }));
89
+ }
90
+ /**
91
+ * Get detailed store information by ID including shipping rules
92
+ * GET /storefront/stores/{id}/information
93
+ */
94
+ getStoreInformation(id) {
95
+ return from(this.cacheService.getOne(String(id))).pipe(switchMap((cachedData) => {
96
+ if (cachedData && this.isCacheValid(cachedData.timestamp)) {
97
+ return of(NetworkingUIEventWrapped.succeeded(cachedData.data));
98
+ }
99
+ return this.provider("store-information")
100
+ .request(null, undefined, id)
101
+ .pipe(map((response) => {
102
+ if (response.response) {
103
+ this.cacheService.saveOne({
104
+ id,
105
+ data: response.response,
106
+ timestamp: Date.now(),
107
+ });
108
+ }
109
+ return response;
110
+ }), catchError((error) => {
111
+ if (cachedData) {
112
+ return of(NetworkingUIEventWrapped.succeeded(cachedData.data));
113
+ }
114
+ throw error;
115
+ }));
116
+ }));
117
+ }
118
+ /**
119
+ * Clear all cache
120
+ */
121
+ clearCache() {
122
+ return Promise.all([
123
+ this.cacheService.clearAll(),
124
+ this.storeListCache.clearAll(),
125
+ ]).then(() => { });
126
+ }
127
+ /**
128
+ * Clear cache for a specific store
129
+ */
130
+ clearStoreCache(id) {
131
+ return this.cacheService.delete(String(id));
132
+ }
133
+ /**
134
+ * Check if cache is still valid (24 hours)
135
+ */
136
+ isCacheValid(timestamp) {
137
+ const CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours
138
+ return Date.now() - timestamp < CACHE_DURATION;
139
+ }
140
+ }
@@ -0,0 +1,90 @@
1
+ import { StorefrontStoreService, StorefrontStoreProvider, } from "./storefront.store.service";
2
+ import { NetworkingUIEventWrapped, AlertModel, } from "../types/types";
3
+ import { of } from "rxjs";
4
+ describe("StorefrontStoreService", () => {
5
+ const config = {
6
+ baseUrl: "https://api.example.com",
7
+ version: "api/v1",
8
+ isProd: false,
9
+ clientId: "test-client-id",
10
+ apiKey: "test-api-key",
11
+ };
12
+ let service;
13
+ beforeEach(() => {
14
+ service = new StorefrontStoreService(config);
15
+ });
16
+ describe("StorefrontStoreProvider", () => {
17
+ it("should generate correct path for store-list", () => {
18
+ const provider = new StorefrontStoreProvider(config, "store-list");
19
+ expect(provider.path).toBe("/storefront/stores/list");
20
+ expect(provider.method).toBe("GET");
21
+ });
22
+ it("should generate correct path for store-information", () => {
23
+ const provider = new StorefrontStoreProvider(config, "store-information");
24
+ expect(provider.path).toBe("/storefront/stores/${id}/information");
25
+ expect(provider.method).toBe("GET");
26
+ expect(provider.getPath(1)).toBe("/storefront/stores/1/information");
27
+ });
28
+ it("should include correct headers", () => {
29
+ const provider = new StorefrontStoreProvider(config, "store-list");
30
+ const headers = provider.headers;
31
+ expect(headers["X-Client-Id"]).toBe("test-client-id");
32
+ expect(headers["X-Api-Key"]).toBe("test-api-key");
33
+ expect(headers["Accept"]).toBe("application/json");
34
+ });
35
+ it("should generate correct baseURL with version", () => {
36
+ const provider = new StorefrontStoreProvider(config, "store-list");
37
+ expect(provider.baseURL).toBe("https://api.example.com/api/v1");
38
+ });
39
+ });
40
+ describe("listStores", () => {
41
+ it("should list stores successfully", async () => {
42
+ const response = {
43
+ data: { stores: [], total: 0 },
44
+ };
45
+ jest.spyOn(service, "provider").mockReturnValue({
46
+ request: () => of(NetworkingUIEventWrapped.succeeded(response)),
47
+ });
48
+ const result = await service.listStores().toPromise();
49
+ expect(result?.hasSuccess).toBe(true);
50
+ expect(result?.response).toEqual(response);
51
+ });
52
+ it("should handle list stores error", async () => {
53
+ jest.spyOn(service, "provider").mockReturnValue({
54
+ request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
55
+ });
56
+ const result = await service.listStores().toPromise();
57
+ expect(result?.hasFailed).toBe(true);
58
+ expect(result?.alertModel).toBeInstanceOf(AlertModel);
59
+ });
60
+ });
61
+ describe("getStoreInformation", () => {
62
+ it("should get store information successfully", async () => {
63
+ const response = {
64
+ data: { id: 1, name: "Test Store" },
65
+ };
66
+ jest.spyOn(service, "provider").mockReturnValue({
67
+ request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
68
+ });
69
+ const result = await service.getStoreInformation(1).toPromise();
70
+ expect(result?.hasSuccess).toBe(true);
71
+ expect(result?.response).toEqual(response);
72
+ });
73
+ it("should handle get store information error", async () => {
74
+ jest.spyOn(service, "provider").mockReturnValue({
75
+ request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
76
+ });
77
+ const result = await service.getStoreInformation(1).toPromise();
78
+ expect(result?.hasFailed).toBe(true);
79
+ expect(result?.alertModel).toBeInstanceOf(AlertModel);
80
+ });
81
+ });
82
+ describe("cache management", () => {
83
+ it("should clear all cache", async () => {
84
+ await expect(service.clearCache()).resolves.toBeUndefined();
85
+ });
86
+ it("should clear specific store cache", async () => {
87
+ await expect(service.clearStoreCache(1)).resolves.toBeUndefined();
88
+ });
89
+ });
90
+ });
@@ -0,0 +1,16 @@
1
+ import { BaseProvider } from "../core/base.provider";
2
+ import { BaseServiceWrapper } from "../core/base.service.wrapper";
3
+ import { NetworkingConfig } from "../types/types";
4
+ export interface User {
5
+ id: number;
6
+ name: string;
7
+ email: string;
8
+ }
9
+ export declare class UserProvider extends BaseProvider {
10
+ constructor(config: NetworkingConfig, userId?: number);
11
+ }
12
+ export declare class UserService extends BaseServiceWrapper<UserProvider> {
13
+ constructor(config: NetworkingConfig, userId?: number);
14
+ fetchUserById(id: number): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<User>>;
15
+ fetchAllUsers(): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<User[]>>;
16
+ }
@@ -0,0 +1,37 @@
1
+ import { BaseProvider } from "../core/base.provider";
2
+ import { BaseServiceWrapper } from "../core/base.service.wrapper";
3
+ // UserProvider implements ProviderType for user endpoints
4
+ export class UserProvider extends BaseProvider {
5
+ constructor(config, userId) {
6
+ super({
7
+ config,
8
+ path: userId ? `/users/${userId}` : "/users",
9
+ method: "GET",
10
+ headers: {},
11
+ getPath: () => (userId ? `/users/${userId}` : "/users"),
12
+ });
13
+ }
14
+ }
15
+ // UserService provides high-level methods for user API
16
+ export class UserService extends BaseServiceWrapper {
17
+ constructor(config, userId) {
18
+ super(new UserProvider(config, userId));
19
+ }
20
+ // Fetch a user by ID
21
+ fetchUserById(id) {
22
+ this.provider = new UserProvider({ baseUrl: "https://jsonplaceholder.typicode.com", isProd: false }, id);
23
+ return this.request();
24
+ }
25
+ // Fetch all users
26
+ fetchAllUsers() {
27
+ this.provider = new UserProvider({
28
+ baseUrl: "https://jsonplaceholder.typicode.com",
29
+ isProd: false,
30
+ });
31
+ return this.request();
32
+ }
33
+ }
34
+ // Example usage:
35
+ // setNetworkingConfig({ baseUrl: 'https://jsonplaceholder.typicode.com', isProd: false });
36
+ // const userService = new UserService();
37
+ // userService.fetchUserById(1).subscribe(result => console.log(result));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
1
+ import { UserService } from "./user.service";
2
+ import { NetworkingUIEventWrapped } from "../types/types";
3
+ import { of, throwError } from "rxjs";
4
+ import { BaseServiceWrapper } from "../core/base.service.wrapper";
5
+ describe("UserService", () => {
6
+ const config = {
7
+ baseUrl: "https://jsonplaceholder.typicode.com",
8
+ isProd: false,
9
+ clientId: "test-client",
10
+ apiKey: "test-key",
11
+ };
12
+ const user = { id: 1, name: "Test", email: "test@example.com" };
13
+ let requestSpy;
14
+ beforeEach(() => {
15
+ requestSpy = jest
16
+ .spyOn(BaseServiceWrapper.prototype, "request")
17
+ .mockImplementation(() => of(NetworkingUIEventWrapped.succeeded(user)));
18
+ });
19
+ afterEach(() => {
20
+ requestSpy.mockRestore();
21
+ });
22
+ it("fetchUserById should return user (success)", (done) => {
23
+ const service = new UserService(config);
24
+ service
25
+ .fetchUserById(1)
26
+ .subscribe((result) => {
27
+ expect(result.response).toEqual(user);
28
+ done();
29
+ });
30
+ });
31
+ it("fetchAllUsers should return users (success)", (done) => {
32
+ const service = new UserService(config);
33
+ service
34
+ .fetchAllUsers()
35
+ .subscribe((result) => {
36
+ expect(result.response).toEqual(user);
37
+ done();
38
+ });
39
+ });
40
+ it("request should handle error", (done) => {
41
+ requestSpy.mockImplementationOnce(() => throwError(() => new Error("Test error")));
42
+ const service = new UserService(config);
43
+ // Simulate error by calling a method that uses request
44
+ service.fetchUserById(1).subscribe({
45
+ error: (err) => {
46
+ expect(err).toBeInstanceOf(Error);
47
+ expect(err.message).toBe("Test error");
48
+ done();
49
+ },
50
+ });
51
+ });
52
+ });
@@ -0,0 +1,3 @@
1
+ import { BehaviorSubject, Observable } from "rxjs";
2
+ import { NetworkingUIEventWrapped } from "../../types/types";
3
+ export declare const withAuthReset: <T>(source$: Observable<NetworkingUIEventWrapped<T>>, $authToken: BehaviorSubject<string | null>) => Observable<NetworkingUIEventWrapped<T>>;
@@ -0,0 +1,8 @@
1
+ import { tap } from "rxjs/operators";
2
+ export const withAuthReset = (source$, $authToken) => {
3
+ return source$.pipe(tap((event) => {
4
+ if (event.isUnauthenticated) {
5
+ $authToken.next(null);
6
+ }
7
+ }));
8
+ };
@@ -0,0 +1,93 @@
1
+ export type CallbackHandler = () => void;
2
+ interface AlertModelable {
3
+ isUnauthenticated: boolean;
4
+ isNetworkingError: boolean;
5
+ }
6
+ interface AlertButtonModelable {
7
+ title: string;
8
+ handler?: CallbackHandler;
9
+ }
10
+ export declare class AlertButtonModel implements AlertButtonModelable {
11
+ title: string;
12
+ handler?: CallbackHandler | undefined;
13
+ constructor(title: string, handler?: CallbackHandler | undefined);
14
+ static buttonYes(handler?: CallbackHandler): AlertButtonModelable;
15
+ static buttonNo(handler?: CallbackHandler): AlertButtonModelable;
16
+ }
17
+ export declare class AlertModel implements AlertModelable {
18
+ message: string;
19
+ httpErrorCode: number;
20
+ isDisplayable: boolean;
21
+ title?: string | undefined;
22
+ data?: unknown | undefined;
23
+ buttons?: AlertButtonModelable[] | undefined;
24
+ constructor(message: string, httpErrorCode: number, isDisplayable?: boolean, title?: string | undefined, data?: unknown | undefined, buttons?: AlertButtonModelable[] | undefined);
25
+ get isUnauthenticated(): boolean;
26
+ get isNetworkingError(): boolean;
27
+ static default(): AlertModel;
28
+ }
29
+ export declare class ValidationErrorMessage {
30
+ message: string;
31
+ constructor(message: string);
32
+ }
33
+ export type NetworkingFailed = {
34
+ alertModel: AlertModel;
35
+ };
36
+ export type NetworkingSucceeded<ResponseType> = {
37
+ responseBody: ResponseType;
38
+ };
39
+ export declare enum NetworkingUIEvent {
40
+ waiting = "waiting",
41
+ succeeded = "succeeded",
42
+ failed = "failed"
43
+ }
44
+ export declare class NetworkingUIEventWrapped<JSONResponse> {
45
+ private event;
46
+ private succeeded?;
47
+ private failed?;
48
+ constructor(event: NetworkingUIEvent, succeeded?: NetworkingSucceeded<JSONResponse> | undefined, failed?: NetworkingFailed | undefined);
49
+ get response(): JSONResponse | null;
50
+ get alertModel(): AlertModel | null;
51
+ get isWaiting(): boolean;
52
+ get hasSuccess(): boolean;
53
+ get hasFailed(): boolean;
54
+ get isUnauthenticated(): boolean;
55
+ static waiting<JSONResponse>(): NetworkingUIEventWrapped<JSONResponse>;
56
+ static succeeded<JSONResponse>(data: JSONResponse): NetworkingUIEventWrapped<JSONResponse>;
57
+ static failed<JSONResponse>(alertModel: AlertModel): NetworkingUIEventWrapped<JSONResponse>;
58
+ }
59
+ export interface ProviderType {
60
+ baseURL: string;
61
+ path: string;
62
+ method: string;
63
+ headers: Record<string, string | undefined>;
64
+ getPath(...queryParams: unknown[]): string;
65
+ }
66
+ export interface HeaderType {
67
+ shouldAddEncryptionHeader?: boolean;
68
+ shouldAddClientIdHeader?: boolean;
69
+ }
70
+ export interface HttpResponse {
71
+ data: unknown;
72
+ }
73
+ export interface ServerValidationErrorMessage {
74
+ message: string;
75
+ parameters?: {
76
+ error_code?: string;
77
+ field?: string;
78
+ [key: string]: unknown;
79
+ };
80
+ }
81
+ export interface ServerErrorResponse {
82
+ errors?: {
83
+ [field: string]: ServerValidationErrorMessage[];
84
+ };
85
+ }
86
+ export interface NetworkingConfig {
87
+ baseUrl: string;
88
+ version?: string;
89
+ isProd: boolean;
90
+ clientId?: string;
91
+ apiKey?: string;
92
+ }
93
+ export {};
@@ -0,0 +1,82 @@
1
+ export class AlertButtonModel {
2
+ constructor(title, handler) {
3
+ this.title = title;
4
+ this.handler = handler;
5
+ }
6
+ static buttonYes(handler) {
7
+ return new AlertButtonModel("Yes", handler);
8
+ }
9
+ static buttonNo(handler) {
10
+ return new AlertButtonModel("No", handler);
11
+ }
12
+ }
13
+ export class AlertModel {
14
+ constructor(message, httpErrorCode, isDisplayable = false, title, data, buttons) {
15
+ this.message = message;
16
+ this.httpErrorCode = httpErrorCode;
17
+ this.isDisplayable = isDisplayable;
18
+ this.title = title;
19
+ this.data = data;
20
+ this.buttons = buttons;
21
+ }
22
+ get isUnauthenticated() {
23
+ return this.httpErrorCode == 401;
24
+ }
25
+ get isNetworkingError() {
26
+ return this.httpErrorCode == 0;
27
+ }
28
+ static default() {
29
+ return new AlertModel("Generic Error", 0, true, "", null, [
30
+ AlertButtonModel.buttonYes(),
31
+ ]);
32
+ }
33
+ }
34
+ export class ValidationErrorMessage {
35
+ constructor(message) {
36
+ this.message = message;
37
+ }
38
+ }
39
+ export var NetworkingUIEvent;
40
+ (function (NetworkingUIEvent) {
41
+ NetworkingUIEvent["waiting"] = "waiting";
42
+ NetworkingUIEvent["succeeded"] = "succeeded";
43
+ NetworkingUIEvent["failed"] = "failed";
44
+ })(NetworkingUIEvent || (NetworkingUIEvent = {}));
45
+ export class NetworkingUIEventWrapped {
46
+ constructor(event, succeeded, failed) {
47
+ this.event = event;
48
+ this.succeeded = succeeded;
49
+ this.failed = failed;
50
+ }
51
+ get response() {
52
+ return this.succeeded ? this.succeeded.responseBody : null;
53
+ }
54
+ get alertModel() {
55
+ return this.failed ? this.failed.alertModel : null;
56
+ }
57
+ get isWaiting() {
58
+ return this.event == NetworkingUIEvent.waiting;
59
+ }
60
+ get hasSuccess() {
61
+ return this.event == NetworkingUIEvent.succeeded;
62
+ }
63
+ get hasFailed() {
64
+ return this.event == NetworkingUIEvent.failed;
65
+ }
66
+ get isUnauthenticated() {
67
+ return this.alertModel ? this.alertModel.isUnauthenticated : false;
68
+ }
69
+ static waiting() {
70
+ return new NetworkingUIEventWrapped(NetworkingUIEvent.waiting);
71
+ }
72
+ static succeeded(data) {
73
+ return new NetworkingUIEventWrapped(NetworkingUIEvent.succeeded, {
74
+ responseBody: data,
75
+ });
76
+ }
77
+ static failed(alertModel) {
78
+ return new NetworkingUIEventWrapped(NetworkingUIEvent.failed, undefined, {
79
+ alertModel: alertModel,
80
+ });
81
+ }
82
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { NetworkingUIEventWrapped, AlertModel } from "./types";
2
+ describe("NetworkingUIEventWrapped", () => {
3
+ it("should wrap succeeded response", () => {
4
+ const wrap = NetworkingUIEventWrapped.succeeded({ foo: "bar" });
5
+ expect(wrap.response).toEqual({ foo: "bar" });
6
+ expect(wrap.hasSuccess).toBe(true);
7
+ expect(wrap.hasFailed).toBe(false);
8
+ expect(wrap.isWaiting).toBe(false);
9
+ });
10
+ it("should wrap failed response and set alertModel", () => {
11
+ const alert = new AlertModel("err", 500, true, "Error", { detail: "fail" });
12
+ const wrap = NetworkingUIEventWrapped.failed(alert);
13
+ expect(wrap.response).toBeNull();
14
+ expect(wrap.hasSuccess).toBe(false);
15
+ expect(wrap.hasFailed).toBe(true);
16
+ expect(wrap.isWaiting).toBe(false);
17
+ expect(wrap.alertModel).toBe(alert);
18
+ });
19
+ it("should wrap waiting state", () => {
20
+ const wrap = NetworkingUIEventWrapped.waiting();
21
+ expect(wrap.isWaiting).toBe(true);
22
+ expect(wrap.hasSuccess).toBe(false);
23
+ expect(wrap.hasFailed).toBe(false);
24
+ });
25
+ });
@@ -0,0 +1,3 @@
1
+ import Dexie from "dexie";
2
+ export { Dexie };
3
+ export type Table<T> = Dexie.Table<T, string>;
@@ -0,0 +1,2 @@
1
+ import Dexie from "dexie";
2
+ export { Dexie };
@@ -0,0 +1,4 @@
1
+ export * from "axios";
2
+ import axios, { HttpStatusCode } from "axios";
3
+ export { axios, HttpStatusCode };
4
+ export type { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig, AxiosRequestConfig, } from "axios";
@@ -0,0 +1,3 @@
1
+ export * from "axios";
2
+ import axios, { HttpStatusCode } from "axios";
3
+ export { axios, HttpStatusCode };
@@ -0,0 +1,5 @@
1
+ import { BehaviorSubject, Observable, Subject, Subscription, Subscriber, catchError, combineLatest, concatMap, distinctUntilChanged, filter, firstValueFrom, from, fromEvent, merge, NEVER, interval, map, mergeMap, of, pipe, shareReplay, startWith, tap, timeout, retry, throwError, combineLatestWith, debounceTime, delay, takeUntil } from "rxjs";
2
+ export { Observable, Subject, BehaviorSubject, Subscription, Subscriber };
3
+ export { startWith, firstValueFrom, from, fromEvent, tap, pipe, distinctUntilChanged, of, mergeMap, interval, map, concatMap, combineLatest, merge, combineLatestWith, debounceTime, delay, timeout, retry, takeUntil, NEVER, };
4
+ export { shareReplay, filter };
5
+ export { catchError, throwError };
@@ -0,0 +1,5 @@
1
+ import { BehaviorSubject, Observable, Subject, Subscription, Subscriber, catchError, combineLatest, concatMap, distinctUntilChanged, filter, firstValueFrom, from, fromEvent, merge, NEVER, interval, map, mergeMap, of, pipe, shareReplay, startWith, tap, timeout, retry, throwError, combineLatestWith, debounceTime, delay, takeUntil, } from "rxjs";
2
+ export { Observable, Subject, BehaviorSubject, Subscription, Subscriber };
3
+ export { startWith, firstValueFrom, from, fromEvent, tap, pipe, distinctUntilChanged, of, mergeMap, interval, map, concatMap, combineLatest, merge, combineLatestWith, debounceTime, delay, timeout, retry, takeUntil, NEVER, };
4
+ export { shareReplay, filter };
5
+ export { catchError, throwError };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smess/networking",
3
- "version": "1.0.28",
3
+ "version": "1.0.30",
4
4
  "description": "Networking utilities and services for SMESS platform.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",