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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "core-services-sdk",
3
- "version": "1.3.62",
3
+ "version": "1.3.63",
4
4
  "main": "src/index.js",
5
5
  "type": "module",
6
6
  "types": "types/index.d.ts",
@@ -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
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './paginate.js'
2
+ export * from './apply-filter.js'
2
3
  export * from './connect-to-pg.js'
3
4
  export * from './validate-schema.js'
4
5
  export * from './start-stop-postgres-docker.js'