@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.
- package/CHANGELOG.md +45 -0
- package/dist/index.d.ts +30 -157
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -163
- package/dist/index.js.map +1 -1
- package/dist/services/auth-error-handler.d.ts +21 -0
- package/dist/services/auth-error-handler.d.ts.map +1 -0
- package/dist/services/auth-error-handler.js +68 -0
- package/dist/services/auth-error-handler.js.map +1 -0
- package/dist/services/auth.service.d.ts +0 -1
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +31 -298
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/logger/logger.service.d.ts +8 -80
- package/dist/services/logger/logger.service.d.ts.map +1 -1
- package/dist/services/logger/logger.service.js +8 -80
- package/dist/services/logger/logger.service.js.map +1 -1
- package/dist/types/filter-schema.types.d.ts +104 -0
- package/dist/types/filter-schema.types.d.ts.map +1 -0
- package/dist/types/filter-schema.types.js +40 -0
- package/dist/types/filter-schema.types.js.map +1 -0
- package/dist/types/filter.types.d.ts +1 -1
- package/dist/types/filter.types.d.ts.map +1 -1
- package/dist/types/filter.types.js.map +1 -1
- package/dist/utils/data-client-auth.d.ts +5 -37
- package/dist/utils/data-client-auth.d.ts.map +1 -1
- package/dist/utils/data-client-auth.js +98 -377
- package/dist/utils/data-client-auth.js.map +1 -1
- package/dist/utils/data-client-init.d.ts +46 -0
- package/dist/utils/data-client-init.d.ts.map +1 -0
- package/dist/utils/data-client-init.js +128 -0
- package/dist/utils/data-client-init.js.map +1 -0
- package/dist/utils/data-client-oauth.d.ts +20 -0
- package/dist/utils/data-client-oauth.d.ts.map +1 -0
- package/dist/utils/data-client-oauth.js +138 -0
- package/dist/utils/data-client-oauth.js.map +1 -0
- package/dist/utils/data-client-permissions.d.ts +63 -0
- package/dist/utils/data-client-permissions.d.ts.map +1 -0
- package/dist/utils/data-client-permissions.js +123 -0
- package/dist/utils/data-client-permissions.js.map +1 -0
- package/dist/utils/data-client-request.d.ts +1 -1
- package/dist/utils/data-client-request.d.ts.map +1 -1
- package/dist/utils/data-client-request.js +27 -235
- package/dist/utils/data-client-request.js.map +1 -1
- package/dist/utils/data-client-response.d.ts +40 -0
- package/dist/utils/data-client-response.d.ts.map +1 -0
- package/dist/utils/data-client-response.js +144 -0
- package/dist/utils/data-client-response.js.map +1 -0
- package/dist/utils/data-client-roles.d.ts +63 -0
- package/dist/utils/data-client-roles.d.ts.map +1 -0
- package/dist/utils/data-client-roles.js +123 -0
- package/dist/utils/data-client-roles.js.map +1 -0
- package/dist/utils/data-client.d.ts +0 -185
- package/dist/utils/data-client.d.ts.map +1 -1
- package/dist/utils/data-client.js +66 -505
- package/dist/utils/data-client.js.map +1 -1
- package/dist/utils/filter-colon.utils.d.ts +26 -0
- package/dist/utils/filter-colon.utils.d.ts.map +1 -0
- package/dist/utils/filter-colon.utils.js +112 -0
- package/dist/utils/filter-colon.utils.js.map +1 -0
- package/dist/utils/filter-schema.utils.d.ts +84 -0
- package/dist/utils/filter-schema.utils.d.ts.map +1 -0
- package/dist/utils/filter-schema.utils.js +381 -0
- package/dist/utils/filter-schema.utils.js.map +1 -0
- package/dist/utils/filter.utils.d.ts +9 -85
- package/dist/utils/filter.utils.d.ts.map +1 -1
- package/dist/utils/filter.utils.js +79 -138
- package/dist/utils/filter.utils.js.map +1 -1
- package/dist/utils/http-error-handler.d.ts +22 -0
- package/dist/utils/http-error-handler.d.ts.map +1 -0
- package/dist/utils/http-error-handler.js +84 -0
- package/dist/utils/http-error-handler.js.map +1 -0
- package/dist/utils/http-response-validator.d.ts +15 -0
- package/dist/utils/http-response-validator.d.ts.map +1 -0
- package/dist/utils/http-response-validator.js +42 -0
- package/dist/utils/http-response-validator.js.map +1 -0
- package/dist/utils/internal-http-client.d.ts +4 -22
- package/dist/utils/internal-http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.js +53 -337
- package/dist/utils/internal-http-client.js.map +1 -1
- package/dist/utils/token-utils.d.ts.map +1 -1
- package/dist/utils/token-utils.js +1 -29
- package/dist/utils/token-utils.js.map +1 -1
- 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
|
|
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
|
-
* //
|
|
19
|
+
* // JSON object format
|
|
17
20
|
* parseFilterParams({ filter: { status: { eq: 'active' } } });
|
|
18
21
|
*
|
|
19
|
-
* //
|
|
20
|
-
* parseFilterParams({ filter: '
|
|
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
|
-
* //
|
|
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;
|
|
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"}
|