@aifabrix/miso-client 3.8.2 → 3.9.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 (84) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/index.d.ts +30 -157
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +33 -163
  5. package/dist/index.js.map +1 -1
  6. package/dist/services/auth-error-handler.d.ts +21 -0
  7. package/dist/services/auth-error-handler.d.ts.map +1 -0
  8. package/dist/services/auth-error-handler.js +68 -0
  9. package/dist/services/auth-error-handler.js.map +1 -0
  10. package/dist/services/auth.service.d.ts +0 -1
  11. package/dist/services/auth.service.d.ts.map +1 -1
  12. package/dist/services/auth.service.js +31 -298
  13. package/dist/services/auth.service.js.map +1 -1
  14. package/dist/services/logger/logger.service.d.ts +8 -80
  15. package/dist/services/logger/logger.service.d.ts.map +1 -1
  16. package/dist/services/logger/logger.service.js +8 -80
  17. package/dist/services/logger/logger.service.js.map +1 -1
  18. package/dist/types/filter-schema.types.d.ts +104 -0
  19. package/dist/types/filter-schema.types.d.ts.map +1 -0
  20. package/dist/types/filter-schema.types.js +40 -0
  21. package/dist/types/filter-schema.types.js.map +1 -0
  22. package/dist/types/filter.types.d.ts +1 -1
  23. package/dist/types/filter.types.d.ts.map +1 -1
  24. package/dist/types/filter.types.js.map +1 -1
  25. package/dist/utils/data-client-auth.d.ts +5 -37
  26. package/dist/utils/data-client-auth.d.ts.map +1 -1
  27. package/dist/utils/data-client-auth.js +98 -377
  28. package/dist/utils/data-client-auth.js.map +1 -1
  29. package/dist/utils/data-client-init.d.ts +46 -0
  30. package/dist/utils/data-client-init.d.ts.map +1 -0
  31. package/dist/utils/data-client-init.js +128 -0
  32. package/dist/utils/data-client-init.js.map +1 -0
  33. package/dist/utils/data-client-oauth.d.ts +20 -0
  34. package/dist/utils/data-client-oauth.d.ts.map +1 -0
  35. package/dist/utils/data-client-oauth.js +138 -0
  36. package/dist/utils/data-client-oauth.js.map +1 -0
  37. package/dist/utils/data-client-permissions.d.ts +63 -0
  38. package/dist/utils/data-client-permissions.d.ts.map +1 -0
  39. package/dist/utils/data-client-permissions.js +123 -0
  40. package/dist/utils/data-client-permissions.js.map +1 -0
  41. package/dist/utils/data-client-request.d.ts +1 -1
  42. package/dist/utils/data-client-request.d.ts.map +1 -1
  43. package/dist/utils/data-client-request.js +27 -235
  44. package/dist/utils/data-client-request.js.map +1 -1
  45. package/dist/utils/data-client-response.d.ts +40 -0
  46. package/dist/utils/data-client-response.d.ts.map +1 -0
  47. package/dist/utils/data-client-response.js +144 -0
  48. package/dist/utils/data-client-response.js.map +1 -0
  49. package/dist/utils/data-client-roles.d.ts +63 -0
  50. package/dist/utils/data-client-roles.d.ts.map +1 -0
  51. package/dist/utils/data-client-roles.js +123 -0
  52. package/dist/utils/data-client-roles.js.map +1 -0
  53. package/dist/utils/data-client.d.ts +0 -185
  54. package/dist/utils/data-client.d.ts.map +1 -1
  55. package/dist/utils/data-client.js +66 -505
  56. package/dist/utils/data-client.js.map +1 -1
  57. package/dist/utils/filter-colon.utils.d.ts +26 -0
  58. package/dist/utils/filter-colon.utils.d.ts.map +1 -0
  59. package/dist/utils/filter-colon.utils.js +112 -0
  60. package/dist/utils/filter-colon.utils.js.map +1 -0
  61. package/dist/utils/filter-schema.utils.d.ts +84 -0
  62. package/dist/utils/filter-schema.utils.d.ts.map +1 -0
  63. package/dist/utils/filter-schema.utils.js +381 -0
  64. package/dist/utils/filter-schema.utils.js.map +1 -0
  65. package/dist/utils/filter.utils.d.ts +9 -85
  66. package/dist/utils/filter.utils.d.ts.map +1 -1
  67. package/dist/utils/filter.utils.js +79 -138
  68. package/dist/utils/filter.utils.js.map +1 -1
  69. package/dist/utils/http-error-handler.d.ts +22 -0
  70. package/dist/utils/http-error-handler.d.ts.map +1 -0
  71. package/dist/utils/http-error-handler.js +84 -0
  72. package/dist/utils/http-error-handler.js.map +1 -0
  73. package/dist/utils/http-response-validator.d.ts +15 -0
  74. package/dist/utils/http-response-validator.d.ts.map +1 -0
  75. package/dist/utils/http-response-validator.js +42 -0
  76. package/dist/utils/http-response-validator.js.map +1 -0
  77. package/dist/utils/internal-http-client.d.ts +4 -22
  78. package/dist/utils/internal-http-client.d.ts.map +1 -1
  79. package/dist/utils/internal-http-client.js +53 -337
  80. package/dist/utils/internal-http-client.js.map +1 -1
  81. package/dist/utils/token-utils.d.ts.map +1 -1
  82. package/dist/utils/token-utils.js +1 -29
  83. package/dist/utils/token-utils.js.map +1 -1
  84. package/package.json +1 -1
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ /**
3
+ * Filter schema utilities for validation and SQL compilation.
4
+ * Provides type-safe filter validation against schemas and PostgreSQL-safe SQL generation.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createFilterError = createFilterError;
8
+ exports.coerceValue = coerceValue;
9
+ exports.validateFilter = validateFilter;
10
+ exports.validateFilters = validateFilters;
11
+ exports.compileFilter = compileFilter;
12
+ exports.createFilterSchema = createFilterSchema;
13
+ exports.loadFilterSchema = loadFilterSchema;
14
+ const filter_schema_types_1 = require("../types/filter-schema.types");
15
+ /**
16
+ * Create a structured filter validation error.
17
+ * @param code - Error code from FilterErrorCode
18
+ * @param message - Human-readable error message
19
+ * @param extras - Additional error context (field, operator, value, etc.)
20
+ * @returns FilterValidationError object
21
+ */
22
+ function createFilterError(code, message, extras) {
23
+ return {
24
+ code,
25
+ message,
26
+ ...extras,
27
+ };
28
+ }
29
+ /**
30
+ * Validate UUID format.
31
+ * @param value - Value to validate
32
+ * @returns True if value is a valid UUID
33
+ */
34
+ function isValidUUID(value) {
35
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
36
+ return uuidRegex.test(value);
37
+ }
38
+ /**
39
+ * Validate timestamp format.
40
+ * @param value - Value to validate
41
+ * @returns True if value is a valid timestamp
42
+ */
43
+ function isValidTimestamp(value) {
44
+ const date = new Date(value);
45
+ return !isNaN(date.getTime());
46
+ }
47
+ /**
48
+ * Coerce a value to the appropriate type based on field definition.
49
+ * @param value - Value to coerce
50
+ * @param fieldDef - Field definition with type information
51
+ * @returns Coerced value
52
+ * @throws Error if value cannot be coerced
53
+ */
54
+ function coerceValue(value, fieldDef) {
55
+ if (value === null)
56
+ return null;
57
+ switch (fieldDef.type) {
58
+ case "number": {
59
+ if (Array.isArray(value)) {
60
+ return value.map((v) => {
61
+ const num = Number(v);
62
+ if (isNaN(num)) {
63
+ throw new Error(`Cannot coerce "${v}" to number`);
64
+ }
65
+ return num;
66
+ });
67
+ }
68
+ const num = Number(value);
69
+ if (isNaN(num)) {
70
+ throw new Error(`Cannot coerce "${value}" to number`);
71
+ }
72
+ return num;
73
+ }
74
+ case "boolean": {
75
+ if (typeof value === "boolean") {
76
+ return value;
77
+ }
78
+ if (value === "true" || value === "1") {
79
+ return true;
80
+ }
81
+ if (value === "false" || value === "0") {
82
+ return false;
83
+ }
84
+ throw new Error(`Cannot coerce "${value}" to boolean`);
85
+ }
86
+ case "timestamp": {
87
+ if (typeof value === "string") {
88
+ const date = new Date(value);
89
+ if (isNaN(date.getTime())) {
90
+ throw new Error(`Cannot coerce "${value}" to timestamp`);
91
+ }
92
+ return date.toISOString();
93
+ }
94
+ return value;
95
+ }
96
+ case "uuid":
97
+ case "string":
98
+ case "enum":
99
+ default:
100
+ return value;
101
+ }
102
+ }
103
+ /**
104
+ * Validate a single filter against a schema.
105
+ * @param filter - Filter option to validate
106
+ * @param schema - Filter schema to validate against
107
+ * @returns FilterValidationError if invalid, null if valid
108
+ */
109
+ function validateFilter(filter, schema) {
110
+ const fieldDef = schema.fields[filter.field];
111
+ // Check if field exists in schema
112
+ if (!fieldDef) {
113
+ return createFilterError(filter_schema_types_1.FilterErrorCode.UNKNOWN_FIELD, `Field '${filter.field}' is not allowed for filtering on '${schema.resource}'`, { field: filter.field });
114
+ }
115
+ // Check if operator is allowed for this field
116
+ if (!fieldDef.operators.includes(filter.op)) {
117
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_OPERATOR, `Operator '${filter.op}' is not allowed for field '${filter.field}'`, {
118
+ field: filter.field,
119
+ operator: filter.op,
120
+ allowedOperators: fieldDef.operators,
121
+ });
122
+ }
123
+ // Skip value validation for null operators
124
+ if (filter.op === "isNull" || filter.op === "isNotNull") {
125
+ return null;
126
+ }
127
+ // Validate value based on field type
128
+ const valueError = validateFieldValue(filter.value, fieldDef, filter.field, filter.op);
129
+ if (valueError) {
130
+ return valueError;
131
+ }
132
+ return null;
133
+ }
134
+ /**
135
+ * Validate field value against field definition.
136
+ */
137
+ function validateFieldValue(value, fieldDef, fieldName, op) {
138
+ if (value === null) {
139
+ return null;
140
+ }
141
+ // Validate array for in/nin operators
142
+ if (op === "in" || op === "nin") {
143
+ if (!Array.isArray(value)) {
144
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_IN, `Operator '${op}' requires an array value for field '${fieldName}'`, { field: fieldName, operator: op, value });
145
+ }
146
+ if (value.length === 0) {
147
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_IN, `Operator '${op}' requires a non-empty array for field '${fieldName}'`, { field: fieldName, operator: op, value });
148
+ }
149
+ // Validate each array element
150
+ for (const item of value) {
151
+ const itemError = validateSingleValue(item, fieldDef, fieldName);
152
+ if (itemError) {
153
+ return itemError;
154
+ }
155
+ }
156
+ return null;
157
+ }
158
+ return validateSingleValue(value, fieldDef, fieldName);
159
+ }
160
+ /**
161
+ * Validate a single value against field definition.
162
+ */
163
+ function validateSingleValue(value, fieldDef, fieldName) {
164
+ switch (fieldDef.type) {
165
+ case "uuid":
166
+ if (typeof value !== "string" || !isValidUUID(value)) {
167
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_UUID, `Invalid UUID value for field '${fieldName}': ${value}`, { field: fieldName, value });
168
+ }
169
+ break;
170
+ case "timestamp":
171
+ if (typeof value !== "string" || !isValidTimestamp(value)) {
172
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_DATE, `Invalid timestamp value for field '${fieldName}': ${value}`, { field: fieldName, value });
173
+ }
174
+ break;
175
+ case "number":
176
+ if (typeof value !== "number" && isNaN(Number(value))) {
177
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_TYPE, `Expected number for field '${fieldName}', got ${typeof value}`, { field: fieldName, value });
178
+ }
179
+ break;
180
+ case "boolean":
181
+ if (typeof value !== "boolean" && value !== "true" && value !== "false") {
182
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_TYPE, `Expected boolean for field '${fieldName}', got ${typeof value}`, { field: fieldName, value });
183
+ }
184
+ break;
185
+ case "enum":
186
+ if (fieldDef.enumValues && !fieldDef.enumValues.includes(String(value))) {
187
+ return createFilterError(filter_schema_types_1.FilterErrorCode.INVALID_ENUM, `Invalid value '${value}' for field '${fieldName}'. Allowed: ${fieldDef.enumValues.join(", ")}`, { field: fieldName, value, allowedValues: fieldDef.enumValues });
188
+ }
189
+ break;
190
+ }
191
+ return null;
192
+ }
193
+ /**
194
+ * Validate multiple filters against a schema.
195
+ * @param filters - Array of filter options to validate
196
+ * @param schema - Filter schema to validate against
197
+ * @returns FilterValidationResult with valid flag and any errors
198
+ */
199
+ function validateFilters(filters, schema) {
200
+ const errors = [];
201
+ for (const filter of filters) {
202
+ const error = validateFilter(filter, schema);
203
+ if (error) {
204
+ errors.push(error);
205
+ }
206
+ }
207
+ return {
208
+ valid: errors.length === 0,
209
+ errors,
210
+ };
211
+ }
212
+ /**
213
+ * Map filter operator to SQL operator.
214
+ */
215
+ function operatorToSql(op, column, paramIndex) {
216
+ switch (op) {
217
+ case "eq":
218
+ return { sql: `${column} = $${paramIndex}`, hasParam: true };
219
+ case "neq":
220
+ return { sql: `${column} != $${paramIndex}`, hasParam: true };
221
+ case "gt":
222
+ return { sql: `${column} > $${paramIndex}`, hasParam: true };
223
+ case "gte":
224
+ return { sql: `${column} >= $${paramIndex}`, hasParam: true };
225
+ case "lt":
226
+ return { sql: `${column} < $${paramIndex}`, hasParam: true };
227
+ case "lte":
228
+ return { sql: `${column} <= $${paramIndex}`, hasParam: true };
229
+ case "in":
230
+ return { sql: `${column} = ANY($${paramIndex})`, hasParam: true };
231
+ case "nin":
232
+ return { sql: `${column} != ALL($${paramIndex})`, hasParam: true };
233
+ case "like":
234
+ return { sql: `${column} LIKE $${paramIndex}`, hasParam: true };
235
+ case "ilike":
236
+ return { sql: `${column} ILIKE $${paramIndex}`, hasParam: true };
237
+ case "contains":
238
+ return { sql: `${column} ILIKE $${paramIndex}`, hasParam: true };
239
+ case "isNull":
240
+ return { sql: `${column} IS NULL`, hasParam: false };
241
+ case "isNotNull":
242
+ return { sql: `${column} IS NOT NULL`, hasParam: false };
243
+ default:
244
+ return { sql: `${column} = $${paramIndex}`, hasParam: true };
245
+ }
246
+ }
247
+ /**
248
+ * Compile filters to PostgreSQL-safe parameterized SQL.
249
+ * @param filters - Array of filter options to compile
250
+ * @param schema - Filter schema for column name mapping
251
+ * @param logic - Logic operator to join clauses ("and" or "or"), defaults to "and"
252
+ * @returns CompiledFilter with SQL string and params array
253
+ * @throws Error if a filter references an unknown field
254
+ *
255
+ * @example
256
+ * ```typescript
257
+ * const schema: FilterSchema = {
258
+ * resource: "applications",
259
+ * fields: {
260
+ * name: { column: "name", type: "string", operators: ["eq", "ilike"] },
261
+ * status: { column: "status", type: "enum", operators: ["eq", "in"], enumValues: ["active", "disabled"] }
262
+ * }
263
+ * };
264
+ *
265
+ * const filters = [
266
+ * { field: "status", op: "eq", value: "active" },
267
+ * { field: "name", op: "ilike", value: "%test%" }
268
+ * ];
269
+ *
270
+ * const result = compileFilter(filters, schema);
271
+ * // result.sql = "status = $1 AND name ILIKE $2"
272
+ * // result.params = ["active", "%test%"]
273
+ * ```
274
+ */
275
+ function compileFilter(filters, schema, logic = "and") {
276
+ if (filters.length === 0)
277
+ return { sql: "", params: [] };
278
+ const params = [];
279
+ const clauses = [];
280
+ for (const filter of filters) {
281
+ const fieldDef = schema.fields[filter.field];
282
+ if (!fieldDef) {
283
+ throw new Error(`Unknown field '${filter.field}' in schema '${schema.resource}'`);
284
+ }
285
+ const column = fieldDef.column;
286
+ let value = filter.value;
287
+ // Coerce value based on field type
288
+ try {
289
+ value = coerceValue(value, fieldDef);
290
+ }
291
+ catch {
292
+ // If coercion fails, use original value (validation should catch type errors)
293
+ }
294
+ // Handle contains operator - wrap value with %
295
+ if (filter.op === "contains" && typeof value === "string") {
296
+ value = `%${value}%`;
297
+ }
298
+ const paramIndex = params.length + 1;
299
+ const { sql, hasParam } = operatorToSql(filter.op, column, paramIndex);
300
+ clauses.push(sql);
301
+ if (hasParam) {
302
+ params.push(value);
303
+ }
304
+ }
305
+ const joinOperator = logic === "or" ? " OR " : " AND ";
306
+ return {
307
+ sql: clauses.join(joinOperator),
308
+ params,
309
+ };
310
+ }
311
+ /**
312
+ * Create a filter schema from field definitions.
313
+ * Convenience function for creating schemas with default operators.
314
+ * @param resource - Resource name
315
+ * @param fields - Partial field definitions (operators will be filled from defaults)
316
+ * @param version - Optional schema version
317
+ * @returns Complete FilterSchema
318
+ */
319
+ function createFilterSchema(resource, fields, version) {
320
+ const completeFields = {};
321
+ for (const [fieldName, fieldDef] of Object.entries(fields)) {
322
+ completeFields[fieldName] = {
323
+ ...fieldDef,
324
+ operators: fieldDef.operators || filter_schema_types_1.DefaultOperatorsByType[fieldDef.type],
325
+ };
326
+ }
327
+ return {
328
+ resource,
329
+ version,
330
+ fields: completeFields,
331
+ };
332
+ }
333
+ /**
334
+ * Load a filter schema from a JSON object.
335
+ * @param json - JSON object representing a filter schema
336
+ * @returns Parsed FilterSchema
337
+ * @throws Error if schema format is invalid
338
+ */
339
+ function loadFilterSchema(json) {
340
+ if (typeof json !== "object" || json === null) {
341
+ throw new Error("Invalid filter schema: expected object");
342
+ }
343
+ const obj = json;
344
+ if (typeof obj.resource !== "string") {
345
+ throw new Error("Invalid filter schema: missing 'resource' field");
346
+ }
347
+ if (typeof obj.fields !== "object" || obj.fields === null) {
348
+ throw new Error("Invalid filter schema: missing 'fields' object");
349
+ }
350
+ const fields = obj.fields;
351
+ const parsedFields = {};
352
+ for (const [fieldName, fieldDef] of Object.entries(fields)) {
353
+ if (typeof fieldDef !== "object" || fieldDef === null) {
354
+ throw new Error(`Invalid filter schema: field '${fieldName}' must be an object`);
355
+ }
356
+ const def = fieldDef;
357
+ if (typeof def.column !== "string") {
358
+ throw new Error(`Invalid filter schema: field '${fieldName}' missing 'column'`);
359
+ }
360
+ if (typeof def.type !== "string") {
361
+ throw new Error(`Invalid filter schema: field '${fieldName}' missing 'type'`);
362
+ }
363
+ if (!Array.isArray(def.operators)) {
364
+ throw new Error(`Invalid filter schema: field '${fieldName}' missing 'operators' array`);
365
+ }
366
+ parsedFields[fieldName] = {
367
+ column: def.column,
368
+ type: def.type,
369
+ operators: def.operators,
370
+ enumValues: Array.isArray(def.enumValues) ? def.enumValues : undefined,
371
+ nullable: typeof def.nullable === "boolean" ? def.nullable : undefined,
372
+ description: typeof def.description === "string" ? def.description : undefined,
373
+ };
374
+ }
375
+ return {
376
+ resource: obj.resource,
377
+ version: typeof obj.version === "string" ? obj.version : undefined,
378
+ fields: parsedFields,
379
+ };
380
+ }
381
+ //# sourceMappingURL=filter-schema.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-schema.utils.js","sourceRoot":"","sources":["../../src/utils/filter-schema.utils.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,10 @@ import type { FilterOption, FilterQuery } from "../types/filter.types";
5
5
  import { FilterBuilder } from "../types/filter.types";
6
6
  /**
7
7
  * Parse filter query parameters into structured FilterOption array.
8
- * Supports JSON format: object, JSON string, or URL-encoded JSON string.
8
+ * Supports both JSON format and colon format.
9
+ *
10
+ * **JSON format**: object, JSON string, or URL-encoded JSON string
11
+ * **Colon format**: "field:operator:value" (e.g., "status:eq:active", "region:in:eu,us")
9
12
  *
10
13
  * @param query - Query parameters object (e.g., from URLSearchParams or request query)
11
14
  * @returns Array of parsed filter options
@@ -13,126 +16,47 @@ import { FilterBuilder } from "../types/filter.types";
13
16
  *
14
17
  * @example
15
18
  * ```typescript
16
- * // Direct object format
19
+ * // JSON object format
17
20
  * parseFilterParams({ filter: { status: { eq: 'active' } } });
18
21
  *
19
- * // JSON string format
20
- * parseFilterParams({ filter: '{"status": {"eq": "active"}}' });
21
- *
22
- * // URL-encoded JSON (from query string)
23
- * parseFilterParams({ filter: '%7B%22status%22%3A%7B%22eq%22%3A%22active%22%7D%7D' });
22
+ * // Colon format (single filter)
23
+ * parseFilterParams({ filter: 'status:eq:active' });
24
24
  *
25
- * // Multiple filters with null checks
26
- * parseFilterParams({
27
- * filter: {
28
- * status: { eq: 'active' },
29
- * deletedAt: { isNull: null },
30
- * region: { in: ['eu', 'us'] }
31
- * }
32
- * });
25
+ * // Colon format (multiple filters as array)
26
+ * parseFilterParams({ filter: ['status:eq:active', 'region:in:eu,us'] });
33
27
  * ```
34
28
  */
35
29
  export declare function parseFilterParams(query: Record<string, unknown>): FilterOption[];
36
30
  /**
37
31
  * Build query string from FilterQuery object using JSON format for filters.
38
- *
39
32
  * @param options - FilterQuery object with filters, sort, pagination, and field selection
40
33
  * @returns Query string with URL-encoded JSON filter format
41
- *
42
- * @example
43
- * ```typescript
44
- * buildQueryString({
45
- * filters: [
46
- * { field: 'status', op: 'eq', value: 'active' },
47
- * { field: 'age', op: 'gte', value: 18 }
48
- * ],
49
- * sort: ['-updated_at'],
50
- * page: 1,
51
- * pageSize: 25
52
- * });
53
- * // Returns: "filter=%7B%22status%22%3A%7B%22eq%22%3A%22active%22%7D%2C%22age%22%3A%7B%22gte%22%3A18%7D%7D&sort=-updated_at&page=1&page_size=25"
54
- * ```
55
34
  */
56
35
  export declare function buildQueryString(options: FilterQuery): string;
57
36
  /**
58
37
  * Apply filters locally to an array (used for mocks/tests).
59
38
  * Supports all operators including isNull and isNotNull.
60
- *
61
39
  * @param data - Array of items to filter
62
40
  * @param filters - Array of filter options to apply
63
41
  * @returns Filtered array
64
- *
65
- * @example
66
- * ```typescript
67
- * const items = [
68
- * { id: 1, status: 'active', deletedAt: null },
69
- * { id: 2, status: 'inactive', deletedAt: '2024-01-01' }
70
- * ];
71
- *
72
- * applyFilters(items, [
73
- * { field: 'status', op: 'eq', value: 'active' },
74
- * { field: 'deletedAt', op: 'isNull', value: null }
75
- * ]);
76
- * ```
77
42
  */
78
43
  export declare function applyFilters<T extends Record<string, unknown>>(data: T[], filters: FilterOption[]): T[];
79
44
  /**
80
45
  * Validate JSON filter structure.
81
- *
82
46
  * @param filter - Filter object to validate
83
47
  * @throws Error if filter structure is invalid
84
- *
85
- * @example
86
- * ```typescript
87
- * // Valid filter
88
- * validateJsonFilter({ status: { eq: 'active' } });
89
- *
90
- * // Invalid - throws error
91
- * validateJsonFilter({ status: 'active' }); // Error: must have operator dictionary
92
- * ```
93
48
  */
94
49
  export declare function validateJsonFilter(filter: unknown): void;
95
50
  /**
96
51
  * Convert FilterQuery to JSON filter format.
97
- * Useful for serialization and debugging.
98
- *
99
52
  * @param filterQuery - FilterQuery object to convert
100
53
  * @returns JSON filter object (e.g., {"status": {"eq": "active"}})
101
- *
102
- * @example
103
- * ```typescript
104
- * filterQueryToJson({
105
- * filters: [
106
- * { field: 'status', op: 'eq', value: 'active' },
107
- * { field: 'age', op: 'gte', value: 18 }
108
- * ]
109
- * });
110
- * // Returns: { status: { eq: 'active' }, age: { gte: 18 } }
111
- * ```
112
54
  */
113
55
  export declare function filterQueryToJson(filterQuery: FilterQuery): Record<string, Record<string, unknown>>;
114
56
  /**
115
57
  * Convert JSON filter format to FilterQuery.
116
- * Convenience wrapper around parseFilterParams().
117
- *
118
58
  * @param jsonFilter - JSON filter object (e.g., {"status": {"eq": "active"}})
119
59
  * @returns FilterQuery object
120
- *
121
- * @example
122
- * ```typescript
123
- * jsonToFilterQuery({
124
- * status: { eq: 'active' },
125
- * age: { gte: 18 },
126
- * region: { in: ['eu', 'us'] }
127
- * });
128
- * // Returns: {
129
- * // filters: [
130
- * // { field: 'status', op: 'eq', value: 'active' },
131
- * // { field: 'age', op: 'gte', value: 18 },
132
- * // { field: 'region', op: 'in', value: ['eu', 'us'] }
133
- * // ]
134
- * // }
135
- * ```
136
60
  */
137
61
  export declare function jsonToFilterQuery(jsonFilter: Record<string, Record<string, unknown>>): FilterQuery;
138
62
  export { FilterBuilder };
@@ -1 +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,EAAkB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAqGtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,YAAY,EAAE,CA2DhB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA4B7D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,EAAE,YAAY,EAAE,GACtB,CAAC,EAAE,CA0CL;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2BxD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAanG;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAClD,WAAW,CAGb;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
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,EAAkB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA+DtD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CA8FhF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAwB7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,EAAE,YAAY,EAAE,GACtB,CAAC,EAAE,CAuCL;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwBxD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWnG;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAClD,WAAW,CAGb;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}