@aifabrix/miso-client 2.0.0 → 2.1.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.
Files changed (131) hide show
  1. package/README.md +231 -2
  2. package/dist/express/async-handler.d.ts +41 -0
  3. package/dist/express/async-handler.d.ts.map +1 -0
  4. package/dist/express/async-handler.js +58 -0
  5. package/dist/express/async-handler.js.map +1 -0
  6. package/dist/express/encryption.d.ts +29 -0
  7. package/dist/express/encryption.d.ts.map +1 -0
  8. package/dist/express/encryption.js +95 -0
  9. package/dist/express/encryption.js.map +1 -0
  10. package/dist/express/error-handler.d.ts +23 -0
  11. package/dist/express/error-handler.d.ts.map +1 -0
  12. package/dist/express/error-handler.js +140 -0
  13. package/dist/express/error-handler.js.map +1 -0
  14. package/dist/express/error-response.d.ts +55 -0
  15. package/dist/express/error-response.d.ts.map +1 -0
  16. package/dist/express/error-response.js +95 -0
  17. package/dist/express/error-response.js.map +1 -0
  18. package/dist/express/error-types.d.ts +46 -0
  19. package/dist/express/error-types.d.ts.map +1 -0
  20. package/dist/express/error-types.js +93 -0
  21. package/dist/express/error-types.js.map +1 -0
  22. package/dist/express/index.d.ts +14 -0
  23. package/dist/express/index.d.ts.map +1 -0
  24. package/dist/express/index.js +39 -0
  25. package/dist/express/index.js.map +1 -0
  26. package/dist/express/response-helper.d.ts +67 -0
  27. package/dist/express/response-helper.d.ts.map +1 -0
  28. package/dist/express/response-helper.js +83 -0
  29. package/dist/express/response-helper.js.map +1 -0
  30. package/dist/express/response-middleware.d.ts +18 -0
  31. package/dist/express/response-middleware.d.ts.map +1 -0
  32. package/dist/express/response-middleware.js +29 -0
  33. package/dist/express/response-middleware.js.map +1 -0
  34. package/dist/express/validation-helper.d.ts +66 -0
  35. package/dist/express/validation-helper.d.ts.map +1 -0
  36. package/dist/express/validation-helper.js +102 -0
  37. package/dist/express/validation-helper.js.map +1 -0
  38. package/dist/index.d.ts +23 -29
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +22 -23
  41. package/dist/index.js.map +1 -1
  42. package/dist/services/auth.service.d.ts +3 -3
  43. package/dist/services/auth.service.d.ts.map +1 -1
  44. package/dist/services/auth.service.js +24 -18
  45. package/dist/services/auth.service.js.map +1 -1
  46. package/dist/services/cache.service.d.ts +1 -1
  47. package/dist/services/cache.service.d.ts.map +1 -1
  48. package/dist/services/cache.service.js +1 -1
  49. package/dist/services/cache.service.js.map +1 -1
  50. package/dist/services/logger.service.d.ts +3 -3
  51. package/dist/services/logger.service.d.ts.map +1 -1
  52. package/dist/services/logger.service.js +32 -25
  53. package/dist/services/logger.service.js.map +1 -1
  54. package/dist/services/permission.service.d.ts +3 -3
  55. package/dist/services/permission.service.d.ts.map +1 -1
  56. package/dist/services/permission.service.js +9 -6
  57. package/dist/services/permission.service.js.map +1 -1
  58. package/dist/services/redis.service.d.ts +1 -1
  59. package/dist/services/redis.service.js +10 -10
  60. package/dist/services/role.service.d.ts +3 -3
  61. package/dist/services/role.service.d.ts.map +1 -1
  62. package/dist/services/role.service.js +8 -5
  63. package/dist/services/role.service.js.map +1 -1
  64. package/dist/types/config.types.d.ts +4 -4
  65. package/dist/types/config.types.d.ts.map +1 -1
  66. package/dist/types/config.types.js +6 -5
  67. package/dist/types/config.types.js.map +1 -1
  68. package/dist/types/filter.types.d.ts +1 -1
  69. package/dist/types/filter.types.d.ts.map +1 -1
  70. package/dist/types/filter.types.js +2 -2
  71. package/dist/types/filter.types.js.map +1 -1
  72. package/dist/types/sort.types.d.ts +1 -1
  73. package/dist/utils/audit-log-queue.d.ts +4 -4
  74. package/dist/utils/audit-log-queue.d.ts.map +1 -1
  75. package/dist/utils/audit-log-queue.js +11 -11
  76. package/dist/utils/audit-log-queue.js.map +1 -1
  77. package/dist/utils/auth-strategy.d.ts +1 -1
  78. package/dist/utils/auth-strategy.d.ts.map +1 -1
  79. package/dist/utils/auth-strategy.js +19 -17
  80. package/dist/utils/auth-strategy.js.map +1 -1
  81. package/dist/utils/config-loader.d.ts +2 -2
  82. package/dist/utils/config-loader.d.ts.map +1 -1
  83. package/dist/utils/config-loader.js +11 -10
  84. package/dist/utils/config-loader.js.map +1 -1
  85. package/dist/utils/data-masker.d.ts.map +1 -1
  86. package/dist/utils/data-masker.js +7 -7
  87. package/dist/utils/data-masker.js.map +1 -1
  88. package/dist/utils/errors.d.ts +2 -2
  89. package/dist/utils/errors.d.ts.map +1 -1
  90. package/dist/utils/errors.js +37 -30
  91. package/dist/utils/errors.js.map +1 -1
  92. package/dist/utils/filter.utils.d.ts +2 -2
  93. package/dist/utils/filter.utils.d.ts.map +1 -1
  94. package/dist/utils/filter.utils.js +24 -18
  95. package/dist/utils/filter.utils.js.map +1 -1
  96. package/dist/utils/http-client-audit.d.ts +4 -4
  97. package/dist/utils/http-client-audit.d.ts.map +1 -1
  98. package/dist/utils/http-client-audit.js +30 -22
  99. package/dist/utils/http-client-audit.js.map +1 -1
  100. package/dist/utils/http-client-masking.d.ts +1 -1
  101. package/dist/utils/http-client-masking.d.ts.map +1 -1
  102. package/dist/utils/http-client-masking.js +31 -21
  103. package/dist/utils/http-client-masking.js.map +1 -1
  104. package/dist/utils/http-client-metadata.d.ts +2 -2
  105. package/dist/utils/http-client-metadata.d.ts.map +1 -1
  106. package/dist/utils/http-client-metadata.js +7 -7
  107. package/dist/utils/http-client-metadata.js.map +1 -1
  108. package/dist/utils/http-client.d.ts +6 -6
  109. package/dist/utils/http-client.d.ts.map +1 -1
  110. package/dist/utils/http-client.js +8 -9
  111. package/dist/utils/http-client.js.map +1 -1
  112. package/dist/utils/internal-http-client.d.ts +5 -5
  113. package/dist/utils/internal-http-client.d.ts.map +1 -1
  114. package/dist/utils/internal-http-client.js +48 -42
  115. package/dist/utils/internal-http-client.js.map +1 -1
  116. package/dist/utils/pagination.utils.d.ts +1 -1
  117. package/dist/utils/pagination.utils.d.ts.map +1 -1
  118. package/dist/utils/pagination.utils.js +3 -3
  119. package/dist/utils/pagination.utils.js.map +1 -1
  120. package/dist/utils/sensitive-fields.loader.d.ts.map +1 -1
  121. package/dist/utils/sensitive-fields.loader.js +77 -60
  122. package/dist/utils/sensitive-fields.loader.js.map +1 -1
  123. package/dist/utils/sort.utils.d.ts +14 -3
  124. package/dist/utils/sort.utils.d.ts.map +1 -1
  125. package/dist/utils/sort.utils.js +73 -9
  126. package/dist/utils/sort.utils.js.map +1 -1
  127. package/package.json +11 -2
  128. package/dist/services/encryption.service.d.ts +0 -32
  129. package/dist/services/encryption.service.d.ts.map +0 -1
  130. package/dist/services/encryption.service.js +0 -135
  131. package/dist/services/encryption.service.js.map +0 -1
@@ -5,23 +5,58 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.parseSortParams = parseSortParams;
7
7
  exports.buildSortString = buildSortString;
8
+ exports.applySorting = applySorting;
8
9
  /**
9
10
  * Parse sort query parameters into structured SortOption array.
10
- * Supports format: `?sort=-field` (descending) or `?sort=field` (ascending)
11
- * or `?sort[]=-updated_at&sort[]=name` for multiple sorts.
11
+ * Supports formats:
12
+ * - `?sort=-field` (descending) or `?sort=field` (ascending)
13
+ * - `?sort=field:asc` or `?sort=field:desc` (colon-separated)
14
+ * - `?sort[]=-updated_at&sort[]=name` for multiple sorts
12
15
  * @param query - Query parameters object (e.g., from URLSearchParams or request query)
13
16
  * @returns Array of parsed sort options
14
17
  */
15
18
  function parseSortParams(query) {
16
19
  const sortParam = query.sort;
17
- const sorts = Array.isArray(sortParam) ? sortParam : sortParam ? [sortParam] : [];
18
- return sorts.map((s) => {
19
- const sortString = String(s);
20
+ const sorts = Array.isArray(sortParam)
21
+ ? sortParam
22
+ : sortParam
23
+ ? [sortParam]
24
+ : [];
25
+ return sorts
26
+ .map((s) => {
27
+ const sortString = String(s).trim();
28
+ // Filter out empty strings and invalid values
29
+ if (!sortString || sortString === "-" || sortString === ":") {
30
+ return null;
31
+ }
32
+ // Check for colon-separated format (field:asc or field:desc)
33
+ if (sortString.includes(":")) {
34
+ const [field, order] = sortString.split(":");
35
+ const trimmedField = field.trim();
36
+ if (!trimmedField)
37
+ return null;
38
+ return {
39
+ field: trimmedField,
40
+ order: (order?.trim().toLowerCase() === "desc" ? "desc" : "asc"),
41
+ };
42
+ }
43
+ // Handle minus prefix format (-field)
44
+ if (sortString.startsWith("-")) {
45
+ const field = sortString.substring(1).trim();
46
+ if (!field)
47
+ return null;
48
+ return {
49
+ field,
50
+ order: "desc",
51
+ };
52
+ }
53
+ // Default ascending
20
54
  return {
21
- field: sortString.startsWith('-') ? sortString.substring(1) : sortString,
22
- order: sortString.startsWith('-') ? 'desc' : 'asc'
55
+ field: sortString,
56
+ order: "asc",
23
57
  };
24
- });
58
+ })
59
+ .filter((option) => option !== null);
25
60
  }
26
61
  /**
27
62
  * Convert SortOption array to query string format.
@@ -29,6 +64,35 @@ function parseSortParams(query) {
29
64
  * @returns Array of sort strings (e.g., `['-updated_at', 'name']`)
30
65
  */
31
66
  function buildSortString(sortOptions) {
32
- return sortOptions.map((so) => (so.order === 'desc' ? `-${so.field}` : so.field));
67
+ return sortOptions.map((so) => so.order === "desc" ? `-${so.field}` : so.field);
68
+ }
69
+ /**
70
+ * Apply sorting to data array based on sort options.
71
+ * Useful for client-side sorting of in-memory data.
72
+ * @param data - Array of data to sort
73
+ * @param sortOptions - Array of sort options (field and order)
74
+ * @returns Sorted array (new array, does not mutate original)
75
+ */
76
+ function applySorting(data, sortOptions) {
77
+ if (!sortOptions || sortOptions.length === 0) {
78
+ return data;
79
+ }
80
+ return [...data].sort((a, b) => {
81
+ for (const sort of sortOptions) {
82
+ const aVal = a[sort.field];
83
+ const bVal = b[sort.field];
84
+ // Handle null/undefined
85
+ if (aVal === null || aVal === undefined)
86
+ return 1;
87
+ if (bVal === null || bVal === undefined)
88
+ return -1;
89
+ // Compare values
90
+ if (aVal < bVal)
91
+ return sort.order === "asc" ? -1 : 1;
92
+ if (aVal > bVal)
93
+ return sort.order === "asc" ? 1 : -1;
94
+ }
95
+ return 0;
96
+ });
33
97
  }
34
98
  //# sourceMappingURL=sort.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort.utils.js","sourceRoot":"","sources":["../../src/utils/sort.utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAWH,0CAWC;AAOD,0CAEC;AA3BD;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,KAA8B;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;YACxE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;SACnD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,WAAyB;IACvD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"sort.utils.js","sourceRoot":"","sources":["../../src/utils/sort.utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aifabrix/miso-client",
3
- "version": "2.0.0",
4
- "description": "AI Fabrix Client SDK for authentication, authorization, and logging",
3
+ "version": "2.1.0",
4
+ "description": "AI Fabrix Client SDK - Authentication, authorization, logging, and Express.js utilities",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
@@ -27,6 +27,14 @@
27
27
  ],
28
28
  "author": "AI Fabrix Team",
29
29
  "license": "MIT",
30
+ "peerDependencies": {
31
+ "express": "^4.18.0 || ^5.0.0"
32
+ },
33
+ "peerDependenciesMeta": {
34
+ "express": {
35
+ "optional": true
36
+ }
37
+ },
30
38
  "dependencies": {
31
39
  "@types/jsonwebtoken": "^9.0.10",
32
40
  "axios": "^1.6.2",
@@ -35,6 +43,7 @@
35
43
  "jsonwebtoken": "^9.0.2"
36
44
  },
37
45
  "devDependencies": {
46
+ "@types/express": "^4.17.21",
38
47
  "@types/jest": "^29.5.8",
39
48
  "@types/node": "^20.10.4",
40
49
  "@typescript-eslint/eslint-plugin": "^6.21.0",
@@ -1,32 +0,0 @@
1
- /**
2
- * Encryption service for symmetric encryption using AES-256-GCM
3
- */
4
- export declare class EncryptionService {
5
- private key;
6
- private algorithm;
7
- /**
8
- * Create an EncryptionService instance
9
- * @param encryptionKey - Optional encryption key. If not provided, reads from ENCRYPTION_KEY env var.
10
- * Supports hex, base64, or raw string format.
11
- * If string length is not 32 bytes, derives a 32-byte key using SHA-256.
12
- */
13
- constructor(encryptionKey?: string);
14
- /**
15
- * Derive a 32-byte key from the provided key string
16
- * Supports hex, base64, or raw string format
17
- */
18
- private deriveKey;
19
- /**
20
- * Encrypt plaintext and return base64-encoded string
21
- * @param plaintext - The plaintext string to encrypt
22
- * @returns Base64-encoded encrypted string (format: iv:authTag:ciphertext)
23
- */
24
- encrypt(plaintext: string): string;
25
- /**
26
- * Decrypt base64-encoded encrypted string
27
- * @param encryptedText - Base64-encoded encrypted string (format: iv:authTag:ciphertext)
28
- * @returns Decrypted plaintext string
29
- */
30
- decrypt(encryptedText: string): string;
31
- }
32
- //# sourceMappingURL=encryption.service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.service.d.ts","sourceRoot":"","sources":["../../src/services/encryption.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAiB;IAElC;;;;;OAKG;gBACS,aAAa,CAAC,EAAE,MAAM;IAalC;;;OAGG;IACH,OAAO,CAAC,SAAS;IAoBjB;;;;OAIG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA0BlC;;;;OAIG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CA+BvC"}
@@ -1,135 +0,0 @@
1
- "use strict";
2
- /**
3
- * Encryption service for symmetric encryption using AES-256-GCM
4
- */
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.EncryptionService = void 0;
40
- const crypto = __importStar(require("crypto"));
41
- class EncryptionService {
42
- /**
43
- * Create an EncryptionService instance
44
- * @param encryptionKey - Optional encryption key. If not provided, reads from ENCRYPTION_KEY env var.
45
- * Supports hex, base64, or raw string format.
46
- * If string length is not 32 bytes, derives a 32-byte key using SHA-256.
47
- */
48
- constructor(encryptionKey) {
49
- this.algorithm = 'aes-256-gcm';
50
- const keyString = encryptionKey || process.env.ENCRYPTION_KEY;
51
- if (!keyString) {
52
- throw new Error('Encryption key is required. Provide via constructor parameter or set ENCRYPTION_KEY environment variable.');
53
- }
54
- // Derive a 32-byte key from the provided key
55
- this.key = this.deriveKey(keyString);
56
- }
57
- /**
58
- * Derive a 32-byte key from the provided key string
59
- * Supports hex, base64, or raw string format
60
- */
61
- deriveKey(keyString) {
62
- // Try to parse as hex (64 hex chars = 32 bytes)
63
- if (/^[0-9a-fA-F]{64}$/.test(keyString)) {
64
- return Buffer.from(keyString, 'hex');
65
- }
66
- // Try to parse as base64
67
- try {
68
- const base64Decoded = Buffer.from(keyString, 'base64');
69
- if (base64Decoded.length === 32) {
70
- return base64Decoded;
71
- }
72
- }
73
- catch {
74
- // Not valid base64, continue
75
- }
76
- // Use SHA-256 to derive a 32-byte key from the string
77
- return crypto.createHash('sha256').update(keyString, 'utf8').digest();
78
- }
79
- /**
80
- * Encrypt plaintext and return base64-encoded string
81
- * @param plaintext - The plaintext string to encrypt
82
- * @returns Base64-encoded encrypted string (format: iv:authTag:ciphertext)
83
- */
84
- encrypt(plaintext) {
85
- if (plaintext === '') {
86
- return '';
87
- }
88
- try {
89
- // Generate random IV (12 bytes for GCM)
90
- const iv = crypto.randomBytes(12);
91
- const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);
92
- let encrypted = cipher.update(plaintext, 'utf8');
93
- encrypted = Buffer.concat([encrypted, cipher.final()]);
94
- // Get authentication tag
95
- const authTag = cipher.getAuthTag();
96
- // Combine IV, authTag, and ciphertext, then base64 encode
97
- const combined = Buffer.concat([iv, authTag, encrypted]);
98
- return combined.toString('base64');
99
- }
100
- catch (error) {
101
- throw new Error(`Encryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
102
- }
103
- }
104
- /**
105
- * Decrypt base64-encoded encrypted string
106
- * @param encryptedText - Base64-encoded encrypted string (format: iv:authTag:ciphertext)
107
- * @returns Decrypted plaintext string
108
- */
109
- decrypt(encryptedText) {
110
- if (encryptedText === '') {
111
- return '';
112
- }
113
- try {
114
- // Decode from base64
115
- const combined = Buffer.from(encryptedText, 'base64');
116
- // Extract IV (12 bytes), authTag (16 bytes), and ciphertext
117
- if (combined.length < 28) {
118
- throw new Error('Invalid encrypted data: too short');
119
- }
120
- const iv = combined.subarray(0, 12);
121
- const authTag = combined.subarray(12, 28);
122
- const ciphertext = combined.subarray(28);
123
- const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv);
124
- decipher.setAuthTag(authTag);
125
- let decrypted = decipher.update(ciphertext, undefined, 'utf8');
126
- decrypted += decipher.final('utf8');
127
- return decrypted;
128
- }
129
- catch (error) {
130
- throw new Error(`Decryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
131
- }
132
- }
133
- }
134
- exports.EncryptionService = EncryptionService;
135
- //# sourceMappingURL=encryption.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.service.js","sourceRoot":"","sources":["../../src/services/encryption.service.ts"],"names":[],"mappings":"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"}