core-services-sdk 1.3.62 → 1.3.63
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.
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(npm test:*)",
|
|
5
|
+
"Bash(docker rm:*)",
|
|
6
|
+
"Bash(docker run:*)",
|
|
7
|
+
"Bash(mongosh:*)",
|
|
8
|
+
"Bash(for:*)",
|
|
9
|
+
"Bash(do if mongosh --port 27099 --eval \"db.runCommand({ ping: 1 })\")",
|
|
10
|
+
"Bash(then echo \"Connected after $i attempts\")",
|
|
11
|
+
"Bash(break)",
|
|
12
|
+
"Bash(fi)",
|
|
13
|
+
"Bash(echo:*)",
|
|
14
|
+
"Bash(done)",
|
|
15
|
+
"Bash(docker logs:*)",
|
|
16
|
+
"Bash(docker system:*)",
|
|
17
|
+
"Bash(docker volume prune:*)",
|
|
18
|
+
"Bash(docker image prune:*)",
|
|
19
|
+
"Bash(docker builder prune:*)"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a Knex query with MongoDB-style filter operators.
|
|
3
|
+
* Pure utility function that can be used across repositories.
|
|
4
|
+
*
|
|
5
|
+
* This function converts camelCase filter keys to snake_case and applies
|
|
6
|
+
* various filter operators to build SQL WHERE clauses. All column names
|
|
7
|
+
* are automatically qualified with the provided table name.
|
|
8
|
+
*
|
|
9
|
+
* **Supported Operators:**
|
|
10
|
+
* - `eq` - Equality (default for simple values)
|
|
11
|
+
* - `ne` / `neq` - Not equal
|
|
12
|
+
* - `in` - Array membership (or pass array directly)
|
|
13
|
+
* - `nin` - Not in array
|
|
14
|
+
* - `gt` - Greater than
|
|
15
|
+
* - `gte` - Greater than or equal
|
|
16
|
+
* - `lt` - Less than
|
|
17
|
+
* - `lte` - Less than or equal
|
|
18
|
+
* - `like` - Case-sensitive pattern matching (SQL LIKE)
|
|
19
|
+
* - `ilike` - Case-insensitive pattern matching (PostgreSQL ILIKE)
|
|
20
|
+
* - `isNull` - Check if field is NULL
|
|
21
|
+
* - `isNotNull` - Check if field is NOT NULL
|
|
22
|
+
*
|
|
23
|
+
* **Key Features:**
|
|
24
|
+
* - Automatic camelCase to snake_case conversion for filter keys
|
|
25
|
+
* - Qualified column names (table.column format)
|
|
26
|
+
* - Multiple operators can be applied to the same field
|
|
27
|
+
* - Unknown operators are silently ignored
|
|
28
|
+
* - Arrays are automatically converted to IN clauses
|
|
29
|
+
*
|
|
30
|
+
* @param {Object} params - Function parameters
|
|
31
|
+
* @param {import('knex').Knex.QueryBuilder} params.query - Knex query builder instance to apply filters to
|
|
32
|
+
* @param {Object<string, *>} params.filter - Filter object with camelCase keys (will be converted to snake_case)
|
|
33
|
+
* Filter values can be:
|
|
34
|
+
* - Simple values (string, number, boolean) → treated as equality
|
|
35
|
+
* - Arrays → treated as IN operator
|
|
36
|
+
* - Objects with operator keys → apply specific operators
|
|
37
|
+
* @param {string} params.tableName - Table name used to qualify column names (e.g., "assets" → "assets.column_name")
|
|
38
|
+
* @returns {import('knex').Knex.QueryBuilder} Modified query builder with applied WHERE clauses
|
|
39
|
+
*
|
|
40
|
+
* @throws {TypeError} If query is not a valid Knex QueryBuilder instance
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // Simple equality - converts to WHERE assets.status = 'active'
|
|
44
|
+
* const query = db('assets').select('*')
|
|
45
|
+
* applyFilter({ query, filter: { status: 'active' }, tableName: 'assets' })
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* // Not equal - converts to WHERE assets.status != 'deleted'
|
|
49
|
+
* applyFilter({ query, filter: { status: { ne: 'deleted' } }, tableName: 'assets' })
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* // Array/IN operator - converts to WHERE assets.status IN ('active', 'pending')
|
|
53
|
+
* applyFilter({ query, filter: { status: ['active', 'pending'] }, tableName: 'assets' })
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* // Explicit IN operator
|
|
57
|
+
* applyFilter({ query, filter: { status: { in: ['active', 'pending'] } }, tableName: 'assets' })
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* // Not in array - converts to WHERE assets.status NOT IN ('deleted', 'archived')
|
|
61
|
+
* applyFilter({ query, filter: { status: { nin: ['deleted', 'archived'] } }, tableName: 'assets' })
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Range operators - converts to WHERE assets.price >= 100 AND assets.price <= 200
|
|
65
|
+
* applyFilter({ query, filter: { price: { gte: 100, lte: 200 } }, tableName: 'assets' })
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* // Pattern matching (case-sensitive) - converts to WHERE assets.name LIKE '%invoice%'
|
|
69
|
+
* applyFilter({ query, filter: { name: { like: '%invoice%' } }, tableName: 'assets' })
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* // Pattern matching (case-insensitive) - converts to WHERE assets.name ILIKE '%invoice%'
|
|
73
|
+
* applyFilter({ query, filter: { name: { ilike: '%invoice%' } }, tableName: 'assets' })
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* // Null checks - converts to WHERE assets.deleted_at IS NULL
|
|
77
|
+
* applyFilter({ query, filter: { deletedAt: { isNull: true } }, tableName: 'assets' })
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* // Multiple filters - converts to WHERE assets.status = 'active' AND assets.type = 'invoice' AND assets.price >= 100
|
|
81
|
+
* applyFilter({
|
|
82
|
+
* query,
|
|
83
|
+
* filter: {
|
|
84
|
+
* status: 'active',
|
|
85
|
+
* type: 'invoice',
|
|
86
|
+
* price: { gte: 100 }
|
|
87
|
+
* },
|
|
88
|
+
* tableName: 'assets'
|
|
89
|
+
* })
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* // camelCase conversion - deletedAt converts to deleted_at
|
|
93
|
+
* applyFilter({ query, filter: { deletedAt: { isNull: true } }, tableName: 'assets' })
|
|
94
|
+
* // SQL: WHERE assets.deleted_at IS NULL
|
|
95
|
+
*/
|
|
96
|
+
export function applyFilter({
|
|
97
|
+
query,
|
|
98
|
+
filter,
|
|
99
|
+
tableName,
|
|
100
|
+
}: {
|
|
101
|
+
query: import('knex').Knex.QueryBuilder
|
|
102
|
+
filter: {
|
|
103
|
+
[x: string]: any
|
|
104
|
+
}
|
|
105
|
+
tableName: string
|
|
106
|
+
}): import('knex').Knex.QueryBuilder
|
|
107
|
+
export type OperatorFunction = {
|
|
108
|
+
/**
|
|
109
|
+
* - Knex query builder instance
|
|
110
|
+
*/
|
|
111
|
+
query: import('knex').Knex.QueryBuilder
|
|
112
|
+
/**
|
|
113
|
+
* - Column name (qualified with table name)
|
|
114
|
+
*/
|
|
115
|
+
key: string
|
|
116
|
+
/**
|
|
117
|
+
* - Value to compare against
|
|
118
|
+
*/
|
|
119
|
+
value: any
|
|
120
|
+
}
|