@aifabrix/miso-client 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -0
- package/dist/examples/custom-sensitive-fields.example.d.ts +48 -0
- package/dist/examples/custom-sensitive-fields.example.d.ts.map +1 -0
- package/dist/examples/custom-sensitive-fields.example.js +31 -0
- package/dist/examples/custom-sensitive-fields.example.js.map +1 -0
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +33 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/types/config.types.d.ts +1 -0
- package/dist/src/types/config.types.d.ts.map +1 -1
- package/dist/src/types/config.types.js.map +1 -1
- package/dist/src/types/errors.types.d.ts +30 -0
- package/dist/src/types/errors.types.d.ts.map +1 -0
- package/dist/src/types/errors.types.js +7 -0
- package/dist/src/types/errors.types.js.map +1 -0
- package/dist/src/types/filter.types.d.ts +66 -0
- package/dist/src/types/filter.types.d.ts.map +1 -0
- package/dist/src/types/filter.types.js +57 -0
- package/dist/src/types/filter.types.js.map +1 -0
- package/dist/src/types/pagination.types.d.ts +28 -0
- package/dist/src/types/pagination.types.d.ts.map +1 -0
- package/dist/src/types/pagination.types.js +7 -0
- package/dist/src/types/pagination.types.js.map +1 -0
- package/dist/src/types/sort.types.d.ts +14 -0
- package/dist/src/types/sort.types.d.ts.map +1 -0
- package/dist/src/types/sort.types.js +7 -0
- package/dist/src/types/sort.types.js.map +1 -0
- package/dist/src/utils/config-loader.d.ts.map +1 -1
- package/dist/src/utils/config-loader.js +4 -0
- package/dist/src/utils/config-loader.js.map +1 -1
- package/dist/src/utils/data-masker.d.ts +20 -1
- package/dist/src/utils/data-masker.d.ts.map +1 -1
- package/dist/src/utils/data-masker.js +53 -27
- package/dist/src/utils/data-masker.js.map +1 -1
- package/dist/src/utils/errors.d.ts +26 -0
- package/dist/src/utils/errors.d.ts.map +1 -1
- package/dist/src/utils/errors.js +100 -1
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/filter.utils.d.ts +27 -0
- package/dist/src/utils/filter.utils.d.ts.map +1 -0
- package/dist/src/utils/filter.utils.js +95 -0
- package/dist/src/utils/filter.utils.js.map +1 -0
- package/dist/src/utils/http-client.d.ts +39 -21
- package/dist/src/utils/http-client.d.ts.map +1 -1
- package/dist/src/utils/http-client.js +177 -269
- package/dist/src/utils/http-client.js.map +1 -1
- package/dist/src/utils/internal-http-client.d.ts +49 -0
- package/dist/src/utils/internal-http-client.d.ts.map +1 -0
- package/dist/src/utils/internal-http-client.js +333 -0
- package/dist/src/utils/internal-http-client.js.map +1 -0
- package/dist/src/utils/pagination.utils.d.ts +41 -0
- package/dist/src/utils/pagination.utils.d.ts.map +1 -0
- package/dist/src/utils/pagination.utils.js +57 -0
- package/dist/src/utils/pagination.utils.js.map +1 -0
- package/dist/src/utils/sensitive-fields.config.json +67 -0
- package/dist/src/utils/sensitive-fields.loader.d.ts +29 -0
- package/dist/src/utils/sensitive-fields.loader.d.ts.map +1 -0
- package/dist/src/utils/sensitive-fields.loader.js +246 -0
- package/dist/src/utils/sensitive-fields.loader.js.map +1 -0
- package/dist/src/utils/sort.utils.d.ts +19 -0
- package/dist/src/utils/sort.utils.d.ts.map +1 -0
- package/dist/src/utils/sort.utils.js +34 -0
- package/dist/src/utils/sort.utils.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.types.d.ts","sourceRoot":"","sources":["../../../src/types/sort.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IAEd,2CAA2C;IAC3C,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.types.js","sourceRoot":"","sources":["../../../src/types/sort.types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CAoD7C"}
|
|
@@ -47,6 +47,10 @@ function loadConfig() {
|
|
|
47
47
|
if (process.env.API_KEY) {
|
|
48
48
|
config.apiKey = process.env.API_KEY;
|
|
49
49
|
}
|
|
50
|
+
// Optional sensitive fields configuration file path
|
|
51
|
+
if (process.env.MISO_SENSITIVE_FIELDS_CONFIG) {
|
|
52
|
+
config.sensitiveFieldsConfig = process.env.MISO_SENSITIVE_FIELDS_CONFIG;
|
|
53
|
+
}
|
|
50
54
|
return config;
|
|
51
55
|
}
|
|
52
56
|
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,gCAoDC;AA1DD,yBAAuB;AAGvB;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAqB;QAC/B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gCAAgC;QAClF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACvE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE;QACnF,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,cAAsD,IAAI,OAAO;KACzF,CAAC;IAEF,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;YAChD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACrC,CAAC;QAEF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,WAAW,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjC,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACvD,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpD,CAAC;IAED,gEAAgE;IAChE,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC7C,MAAM,CAAC,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -4,7 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class DataMasker {
|
|
6
6
|
private static readonly MASKED_VALUE;
|
|
7
|
-
private static
|
|
7
|
+
private static cachedFields;
|
|
8
|
+
private static cachedFieldPatterns;
|
|
9
|
+
private static configPath;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize sensitive fields from JSON configuration
|
|
12
|
+
* Loads configuration on first use and caches it
|
|
13
|
+
*/
|
|
14
|
+
private static initializeSensitiveFields;
|
|
15
|
+
/**
|
|
16
|
+
* Get sensitive fields set (lazy loaded from JSON config)
|
|
17
|
+
*/
|
|
18
|
+
private static getSensitiveFields;
|
|
19
|
+
/**
|
|
20
|
+
* Get field patterns (lazy loaded from JSON config)
|
|
21
|
+
*/
|
|
22
|
+
private static getFieldPatterns;
|
|
23
|
+
/**
|
|
24
|
+
* Set custom configuration path (call before first use if needed)
|
|
25
|
+
*/
|
|
26
|
+
static setConfigPath(customPath: string): void;
|
|
8
27
|
/**
|
|
9
28
|
* Check if a field name indicates sensitive data
|
|
10
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-masker.d.ts","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"data-masker.d.ts","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAkB;IACtD,OAAO,CAAC,MAAM,CAAC,YAAY,CAA4B;IACvD,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAyB;IAC3D,OAAO,CAAC,MAAM,CAAC,UAAU,CAAiC;IAE1D;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAoBxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAO/B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAM9C;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAoB7C;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAkChD;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM;IAYpF;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;CAsBrD"}
|
|
@@ -5,19 +5,65 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.DataMasker = void 0;
|
|
8
|
+
const sensitive_fields_loader_1 = require("./sensitive-fields.loader");
|
|
8
9
|
class DataMasker {
|
|
10
|
+
/**
|
|
11
|
+
* Initialize sensitive fields from JSON configuration
|
|
12
|
+
* Loads configuration on first use and caches it
|
|
13
|
+
*/
|
|
14
|
+
static initializeSensitiveFields(customPath) {
|
|
15
|
+
// If config path changed, reload
|
|
16
|
+
if (this.configPath !== customPath) {
|
|
17
|
+
this.cachedFields = null;
|
|
18
|
+
this.cachedFieldPatterns = null;
|
|
19
|
+
this.configPath = customPath;
|
|
20
|
+
}
|
|
21
|
+
// Return cached if available
|
|
22
|
+
if (this.cachedFields) {
|
|
23
|
+
return this.cachedFields;
|
|
24
|
+
}
|
|
25
|
+
// Load from JSON config (with fallback to defaults)
|
|
26
|
+
this.cachedFields = (0, sensitive_fields_loader_1.loadSensitiveFieldsConfig)(customPath);
|
|
27
|
+
this.cachedFieldPatterns = (0, sensitive_fields_loader_1.getFieldPatterns)(customPath);
|
|
28
|
+
return this.cachedFields;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get sensitive fields set (lazy loaded from JSON config)
|
|
32
|
+
*/
|
|
33
|
+
static getSensitiveFields() {
|
|
34
|
+
return this.initializeSensitiveFields(this.configPath);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get field patterns (lazy loaded from JSON config)
|
|
38
|
+
*/
|
|
39
|
+
static getFieldPatterns() {
|
|
40
|
+
if (!this.cachedFieldPatterns) {
|
|
41
|
+
this.cachedFieldPatterns = (0, sensitive_fields_loader_1.getFieldPatterns)(this.configPath);
|
|
42
|
+
}
|
|
43
|
+
return this.cachedFieldPatterns;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set custom configuration path (call before first use if needed)
|
|
47
|
+
*/
|
|
48
|
+
static setConfigPath(customPath) {
|
|
49
|
+
this.configPath = customPath;
|
|
50
|
+
this.cachedFields = null;
|
|
51
|
+
this.cachedFieldPatterns = null;
|
|
52
|
+
}
|
|
9
53
|
/**
|
|
10
54
|
* Check if a field name indicates sensitive data
|
|
11
55
|
*/
|
|
12
56
|
static isSensitiveField(key) {
|
|
57
|
+
const sensitiveFields = this.getSensitiveFields();
|
|
58
|
+
const fieldPatterns = this.getFieldPatterns();
|
|
13
59
|
const lowerKey = key.toLowerCase().replace(/[_-]/g, '');
|
|
14
60
|
// Check exact match
|
|
15
|
-
if (
|
|
61
|
+
if (sensitiveFields.has(lowerKey)) {
|
|
16
62
|
return true;
|
|
17
63
|
}
|
|
18
|
-
// Check if field contains sensitive keywords
|
|
19
|
-
for (const
|
|
20
|
-
if (lowerKey.includes(
|
|
64
|
+
// Check if field contains sensitive keywords (from fieldPatterns)
|
|
65
|
+
for (const pattern of fieldPatterns) {
|
|
66
|
+
if (lowerKey.includes(pattern.toLowerCase())) {
|
|
21
67
|
return true;
|
|
22
68
|
}
|
|
23
69
|
}
|
|
@@ -95,27 +141,7 @@ class DataMasker {
|
|
|
95
141
|
}
|
|
96
142
|
exports.DataMasker = DataMasker;
|
|
97
143
|
DataMasker.MASKED_VALUE = '***MASKED***';
|
|
98
|
-
DataMasker.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
'pwd',
|
|
102
|
-
'secret',
|
|
103
|
-
'token',
|
|
104
|
-
'key',
|
|
105
|
-
'auth',
|
|
106
|
-
'authorization',
|
|
107
|
-
'cookie',
|
|
108
|
-
'session',
|
|
109
|
-
'ssn',
|
|
110
|
-
'creditcard',
|
|
111
|
-
'cc',
|
|
112
|
-
'cvv',
|
|
113
|
-
'pin',
|
|
114
|
-
'otp',
|
|
115
|
-
'apikey',
|
|
116
|
-
'accesstoken',
|
|
117
|
-
'refreshtoken',
|
|
118
|
-
'privatekey',
|
|
119
|
-
'secretkey'
|
|
120
|
-
]);
|
|
144
|
+
DataMasker.cachedFields = null;
|
|
145
|
+
DataMasker.cachedFieldPatterns = null;
|
|
146
|
+
DataMasker.configPath = undefined;
|
|
121
147
|
//# sourceMappingURL=data-masker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-masker.js","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,MAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"data-masker.js","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Supports structured error responses and backward compatibility
|
|
4
4
|
*/
|
|
5
5
|
import { ErrorResponse } from '../types/config.types';
|
|
6
|
+
import { ErrorResponse as ErrorResponseSnakeCase } from '../types/errors.types';
|
|
6
7
|
/**
|
|
7
8
|
* Custom error class that extends Error
|
|
8
9
|
* Supports structured ErrorResponse and backward compatibility with error_body dict
|
|
@@ -13,4 +14,29 @@ export declare class MisoClientError extends Error {
|
|
|
13
14
|
readonly statusCode?: number;
|
|
14
15
|
constructor(message: string, errorResponse?: ErrorResponse, errorBody?: Record<string, unknown>, statusCode?: number);
|
|
15
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Transform arbitrary error into standardized snake_case ErrorResponse.
|
|
19
|
+
* Handles both camelCase and snake_case error formats.
|
|
20
|
+
* @param err - Error object (AxiosError, network error, etc.)
|
|
21
|
+
* @returns Standardized snake_case ErrorResponse
|
|
22
|
+
*/
|
|
23
|
+
export declare function transform_error_to_snake_case(err: unknown): ErrorResponseSnakeCase;
|
|
24
|
+
/**
|
|
25
|
+
* Exception class for snake_case error responses.
|
|
26
|
+
* Used with snake_case ErrorResponse format.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ApiErrorException extends Error {
|
|
29
|
+
status_code: number;
|
|
30
|
+
request_key?: string;
|
|
31
|
+
type?: string;
|
|
32
|
+
instance?: string;
|
|
33
|
+
errors: string[];
|
|
34
|
+
constructor(error: ErrorResponseSnakeCase);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Handle API error and throw snake_case ApiErrorException.
|
|
38
|
+
* @param err - Error object (AxiosError, network error, etc.)
|
|
39
|
+
* @throws ApiErrorException with snake_case error format
|
|
40
|
+
*/
|
|
41
|
+
export declare function handle_api_error_snake_case(err: unknown): never;
|
|
16
42
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,IAAI,sBAAsB,EAAiB,MAAM,uBAAuB,CAAC;AAE/F;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9C,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAGlC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,aAAa,EAC7B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,UAAU,CAAC,EAAE,MAAM;CA0BtB;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAsElF;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;gBAEL,KAAK,EAAE,sBAAsB;CAc1C;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAG/D"}
|
package/dist/src/utils/errors.js
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* Supports structured error responses and backward compatibility
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.MisoClientError = void 0;
|
|
7
|
+
exports.ApiErrorException = exports.MisoClientError = void 0;
|
|
8
|
+
exports.transform_error_to_snake_case = transform_error_to_snake_case;
|
|
9
|
+
exports.handle_api_error_snake_case = handle_api_error_snake_case;
|
|
8
10
|
/**
|
|
9
11
|
* Custom error class that extends Error
|
|
10
12
|
* Supports structured ErrorResponse and backward compatibility with error_body dict
|
|
@@ -35,4 +37,101 @@ class MisoClientError extends Error {
|
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
exports.MisoClientError = MisoClientError;
|
|
40
|
+
/**
|
|
41
|
+
* Transform arbitrary error into standardized snake_case ErrorResponse.
|
|
42
|
+
* Handles both camelCase and snake_case error formats.
|
|
43
|
+
* @param err - Error object (AxiosError, network error, etc.)
|
|
44
|
+
* @returns Standardized snake_case ErrorResponse
|
|
45
|
+
*/
|
|
46
|
+
function transform_error_to_snake_case(err) {
|
|
47
|
+
if (err && typeof err === 'object' && 'response' in err) {
|
|
48
|
+
const axiosError = err;
|
|
49
|
+
if (axiosError.response?.data) {
|
|
50
|
+
const data = axiosError.response.data;
|
|
51
|
+
// Handle error envelope format
|
|
52
|
+
if (typeof data === 'object' && data !== null && 'error' in data) {
|
|
53
|
+
const envelope = data;
|
|
54
|
+
const errorData = envelope.error;
|
|
55
|
+
// Normalize status_code (support both camelCase and snake_case)
|
|
56
|
+
const statusCode = errorData.status_code ?? errorData.statusCode ?? axiosError.response.status ?? 500;
|
|
57
|
+
return {
|
|
58
|
+
errors: errorData.errors ?? ['Unknown error'],
|
|
59
|
+
type: errorData.type ?? 'about:blank',
|
|
60
|
+
title: errorData.title ?? axiosError.message ?? 'Unknown error',
|
|
61
|
+
status_code: statusCode,
|
|
62
|
+
instance: errorData.instance ?? axiosError.config?.url,
|
|
63
|
+
request_key: errorData.request_key
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Handle direct error format (snake_case or camelCase)
|
|
67
|
+
if (typeof data === 'object' && data !== null) {
|
|
68
|
+
const errorData = data;
|
|
69
|
+
const statusCode = (typeof errorData.status_code === 'number' ? errorData.status_code :
|
|
70
|
+
typeof errorData.statusCode === 'number' ? errorData.statusCode :
|
|
71
|
+
typeof axiosError.response?.status === 'number' ? axiosError.response.status :
|
|
72
|
+
500);
|
|
73
|
+
return {
|
|
74
|
+
errors: Array.isArray(errorData.errors) ? errorData.errors : ['Unknown error'],
|
|
75
|
+
type: errorData.type ?? 'about:blank',
|
|
76
|
+
title: errorData.title ?? axiosError.message ?? 'Unknown error',
|
|
77
|
+
status_code: statusCode,
|
|
78
|
+
instance: errorData.instance ?? axiosError.config?.url,
|
|
79
|
+
request_key: errorData.request_key
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Fallback for response without data
|
|
84
|
+
return {
|
|
85
|
+
errors: [axiosError.message ?? 'Network error'],
|
|
86
|
+
type: 'about:blank',
|
|
87
|
+
title: 'Network error',
|
|
88
|
+
status_code: axiosError.response?.status ?? 0
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Handle non-Axios errors
|
|
92
|
+
if (err instanceof Error) {
|
|
93
|
+
return {
|
|
94
|
+
errors: [err.message ?? 'Unknown error'],
|
|
95
|
+
type: 'about:blank',
|
|
96
|
+
title: 'Error',
|
|
97
|
+
status_code: 0
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Last resort
|
|
101
|
+
return {
|
|
102
|
+
errors: ['Unknown error'],
|
|
103
|
+
type: 'about:blank',
|
|
104
|
+
title: 'Unknown error',
|
|
105
|
+
status_code: 0
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Exception class for snake_case error responses.
|
|
110
|
+
* Used with snake_case ErrorResponse format.
|
|
111
|
+
*/
|
|
112
|
+
class ApiErrorException extends Error {
|
|
113
|
+
constructor(error) {
|
|
114
|
+
super(error.title || 'API Error');
|
|
115
|
+
this.name = 'ApiErrorException';
|
|
116
|
+
this.status_code = error.status_code;
|
|
117
|
+
this.request_key = error.request_key;
|
|
118
|
+
this.type = error.type;
|
|
119
|
+
this.instance = error.instance;
|
|
120
|
+
this.errors = error.errors;
|
|
121
|
+
// Maintain proper stack trace for V8
|
|
122
|
+
if (Error.captureStackTrace) {
|
|
123
|
+
Error.captureStackTrace(this, ApiErrorException);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.ApiErrorException = ApiErrorException;
|
|
128
|
+
/**
|
|
129
|
+
* Handle API error and throw snake_case ApiErrorException.
|
|
130
|
+
* @param err - Error object (AxiosError, network error, etc.)
|
|
131
|
+
* @throws ApiErrorException with snake_case error format
|
|
132
|
+
*/
|
|
133
|
+
function handle_api_error_snake_case(err) {
|
|
134
|
+
const error = transform_error_to_snake_case(err);
|
|
135
|
+
throw new ApiErrorException(error);
|
|
136
|
+
}
|
|
38
137
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter utility functions for parsing and building filter queries
|
|
3
|
+
*/
|
|
4
|
+
import type { FilterOption, FilterQuery } from '../types/filter.types';
|
|
5
|
+
import { FilterBuilder } from '../types/filter.types';
|
|
6
|
+
/**
|
|
7
|
+
* Parse filter query parameters into structured FilterOption array.
|
|
8
|
+
* Supports format: `?filter=field:op:value` or `?filter[]=field:op:value&filter[]=...`
|
|
9
|
+
* @param query - Query parameters object (e.g., from URLSearchParams or request query)
|
|
10
|
+
* @returns Array of parsed filter options
|
|
11
|
+
*/
|
|
12
|
+
export declare function parse_filter_params(query: Record<string, unknown>): FilterOption[];
|
|
13
|
+
/**
|
|
14
|
+
* Build query string from FilterQuery object.
|
|
15
|
+
* @param options - FilterQuery object with filters, sort, pagination, and field selection
|
|
16
|
+
* @returns Query string (e.g., `?filter=status:eq:active&sort=-updated_at&page=1&page_size=25`)
|
|
17
|
+
*/
|
|
18
|
+
export declare function build_query_string(options: FilterQuery): string;
|
|
19
|
+
/**
|
|
20
|
+
* Apply filters locally to an array (used for mocks/tests).
|
|
21
|
+
* @param data - Array of items to filter
|
|
22
|
+
* @param filters - Array of filter options to apply
|
|
23
|
+
* @returns Filtered array
|
|
24
|
+
*/
|
|
25
|
+
export declare function apply_filters<T extends Record<string, unknown>>(data: T[], filters: FilterOption[]): T[];
|
|
26
|
+
export { FilterBuilder };
|
|
27
|
+
//# sourceMappingURL=filter.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/filter.utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CAqBlF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAoB/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,CAgCxG;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Filter utility functions for parsing and building filter queries
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FilterBuilder = void 0;
|
|
7
|
+
exports.parse_filter_params = parse_filter_params;
|
|
8
|
+
exports.build_query_string = build_query_string;
|
|
9
|
+
exports.apply_filters = apply_filters;
|
|
10
|
+
const filter_types_1 = require("../types/filter.types");
|
|
11
|
+
Object.defineProperty(exports, "FilterBuilder", { enumerable: true, get: function () { return filter_types_1.FilterBuilder; } });
|
|
12
|
+
const FILTER_PATTERN = /^([\w.]+):(eq|neq|in|nin|gt|lt|gte|lte|contains|like):(.+)$/i;
|
|
13
|
+
/**
|
|
14
|
+
* Parse filter query parameters into structured FilterOption array.
|
|
15
|
+
* Supports format: `?filter=field:op:value` or `?filter[]=field:op:value&filter[]=...`
|
|
16
|
+
* @param query - Query parameters object (e.g., from URLSearchParams or request query)
|
|
17
|
+
* @returns Array of parsed filter options
|
|
18
|
+
*/
|
|
19
|
+
function parse_filter_params(query) {
|
|
20
|
+
const filterParam = query.filter;
|
|
21
|
+
const filters = Array.isArray(filterParam) ? filterParam : filterParam ? [filterParam] : [];
|
|
22
|
+
const result = [];
|
|
23
|
+
filters.forEach((f) => {
|
|
24
|
+
const filterString = String(f);
|
|
25
|
+
const match = filterString.match(FILTER_PATTERN);
|
|
26
|
+
if (!match) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const [, field, op, raw] = match;
|
|
30
|
+
// Parse value: if comma-separated, split into array, otherwise keep as string
|
|
31
|
+
// Note: API expects strings for filter values, numbers are parsed server-side
|
|
32
|
+
const value = raw.includes(',') ? raw.split(',') : raw;
|
|
33
|
+
result.push({ field, op: op, value });
|
|
34
|
+
});
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build query string from FilterQuery object.
|
|
39
|
+
* @param options - FilterQuery object with filters, sort, pagination, and field selection
|
|
40
|
+
* @returns Query string (e.g., `?filter=status:eq:active&sort=-updated_at&page=1&page_size=25`)
|
|
41
|
+
*/
|
|
42
|
+
function build_query_string(options) {
|
|
43
|
+
const params = new URLSearchParams();
|
|
44
|
+
options.filters?.forEach((f) => {
|
|
45
|
+
const val = Array.isArray(f.value) ? f.value.join(',') : String(f.value);
|
|
46
|
+
params.append('filter', `${f.field}:${f.op}:${val}`);
|
|
47
|
+
});
|
|
48
|
+
options.sort?.forEach((s) => params.append('sort', s));
|
|
49
|
+
if (options.page) {
|
|
50
|
+
params.append('page', options.page.toString());
|
|
51
|
+
}
|
|
52
|
+
if (options.page_size) {
|
|
53
|
+
params.append('page_size', options.page_size.toString());
|
|
54
|
+
}
|
|
55
|
+
if (options.fields && options.fields.length > 0) {
|
|
56
|
+
params.append('fields', options.fields.join(','));
|
|
57
|
+
}
|
|
58
|
+
return params.toString();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Apply filters locally to an array (used for mocks/tests).
|
|
62
|
+
* @param data - Array of items to filter
|
|
63
|
+
* @param filters - Array of filter options to apply
|
|
64
|
+
* @returns Filtered array
|
|
65
|
+
*/
|
|
66
|
+
function apply_filters(data, filters) {
|
|
67
|
+
return data.filter((item) => filters.every((f) => {
|
|
68
|
+
const v = item[f.field];
|
|
69
|
+
const value = f.value;
|
|
70
|
+
if (Array.isArray(value)) {
|
|
71
|
+
return f.op === 'in' ? value.includes(v) : !value.includes(v);
|
|
72
|
+
}
|
|
73
|
+
switch (f.op) {
|
|
74
|
+
case 'eq':
|
|
75
|
+
return v === value;
|
|
76
|
+
case 'neq':
|
|
77
|
+
return v !== value;
|
|
78
|
+
case 'gt':
|
|
79
|
+
return v > value;
|
|
80
|
+
case 'lt':
|
|
81
|
+
return v < value;
|
|
82
|
+
case 'gte':
|
|
83
|
+
return v >= value;
|
|
84
|
+
case 'lte':
|
|
85
|
+
return v <= value;
|
|
86
|
+
case 'contains':
|
|
87
|
+
return String(v).includes(String(value));
|
|
88
|
+
case 'like':
|
|
89
|
+
return new RegExp(String(value), 'i').test(String(v));
|
|
90
|
+
default:
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=filter.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.utils.js","sourceRoot":"","sources":["../../../src/utils/filter.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP client
|
|
2
|
+
* Public HTTP client with automatic audit and debug logging
|
|
3
|
+
* Wraps InternalHttpClient and adds ISO 27001 compliant logging
|
|
3
4
|
*/
|
|
4
5
|
import { AxiosRequestConfig } from 'axios';
|
|
5
6
|
import { MisoClientConfig } from '../types/config.types';
|
|
7
|
+
import { LoggerService } from '../services/logger.service';
|
|
6
8
|
export declare class HttpClient {
|
|
7
|
-
private
|
|
9
|
+
private internalClient;
|
|
10
|
+
private logger;
|
|
8
11
|
readonly config: MisoClientConfig;
|
|
9
|
-
|
|
10
|
-
private tokenExpiresAt;
|
|
11
|
-
private tokenRefreshPromise;
|
|
12
|
-
constructor(config: MisoClientConfig);
|
|
12
|
+
constructor(config: MisoClientConfig, logger: LoggerService);
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
* Proactively refreshes if token will expire within 60 seconds
|
|
14
|
+
* Setup audit and debug logging interceptors
|
|
16
15
|
*/
|
|
17
|
-
private
|
|
16
|
+
private setupAuditLogging;
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
18
|
+
* Check if request should be audited
|
|
19
|
+
* Excludes certain endpoints to prevent infinite loops
|
|
20
20
|
*/
|
|
21
|
-
private
|
|
21
|
+
private shouldAuditRequest;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Extract user ID from JWT token
|
|
24
24
|
*/
|
|
25
|
-
private
|
|
25
|
+
private extractUserIdFromToken;
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
27
|
+
* Log HTTP request audit event
|
|
28
|
+
* Masks all sensitive data before logging (ISO 27001 compliance)
|
|
29
29
|
*/
|
|
30
|
-
private
|
|
31
|
-
/**
|
|
32
|
-
* Create MisoClientError from AxiosError
|
|
33
|
-
* Parses structured error response if available, falls back to errorBody
|
|
34
|
-
*/
|
|
35
|
-
private createMisoClientError;
|
|
30
|
+
private logHttpRequestAudit;
|
|
36
31
|
get<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
37
32
|
post<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
38
33
|
put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
@@ -40,5 +35,28 @@ export declare class HttpClient {
|
|
|
40
35
|
request<T>(method: 'GET' | 'POST' | 'PUT' | 'DELETE', url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
41
36
|
authenticatedRequest<T>(method: 'GET' | 'POST' | 'PUT' | 'DELETE', url: string, token: string, // User authentication token (sent as Bearer token)
|
|
42
37
|
data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
38
|
+
/**
|
|
39
|
+
* GET request with filter builder support.
|
|
40
|
+
* Builds query string from FilterBuilder and appends to URL.
|
|
41
|
+
* @param url - Request URL (without query string)
|
|
42
|
+
* @param filterBuilder - FilterBuilder instance with filters
|
|
43
|
+
* @param config - Optional Axios request config
|
|
44
|
+
* @returns Promise with response data
|
|
45
|
+
*/
|
|
46
|
+
getWithFilters<T>(url: string, filterBuilder: {
|
|
47
|
+
toQueryString(): string;
|
|
48
|
+
}, config?: AxiosRequestConfig): Promise<T>;
|
|
49
|
+
/**
|
|
50
|
+
* GET request with pagination support.
|
|
51
|
+
* Appends pagination query parameters (page, page_size) to URL.
|
|
52
|
+
* @param url - Request URL (without query string)
|
|
53
|
+
* @param pagination - Pagination options with page and page_size
|
|
54
|
+
* @param config - Optional Axios request config
|
|
55
|
+
* @returns Promise with response data
|
|
56
|
+
*/
|
|
57
|
+
getPaginated<T>(url: string, pagination: {
|
|
58
|
+
page: number;
|
|
59
|
+
page_size: number;
|
|
60
|
+
}, config?: AxiosRequestConfig): Promise<T>;
|
|
43
61
|
}
|
|
44
62
|
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAInB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAe3D,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,MAAM,CAAgB;IAC9B,SAAgB,MAAM,EAAE,gBAAgB,CAAC;gBAE7B,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa;IAa3D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;;OAGG;YACW,mBAAmB;IAmG3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5D,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5E,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/D,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAQP,oBAAoB,CAAC,CAAC,EAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,mDAAmD;IAClE,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAIb;;;;;;;OAOG;IACG,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE;QAAE,aAAa,IAAI,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAMzH;;;;;;;OAOG;IACG,YAAY,CAAC,CAAC,EAClB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC/C,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;CAOd"}
|