@fjell/core 4.4.6 → 4.4.12
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/README.md +227 -0
- package/dist/cjs/index.js +5 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/item/IQUtils.js +20 -1
- package/dist/cjs/item/IQUtils.js.map +1 -1
- package/dist/cjs/item/IUtils.js.map +1 -1
- package/dist/cjs/key/KUtils.js +100 -1
- package/dist/cjs/key/KUtils.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/item/IQUtils.js +2 -2
- package/dist/esm/item/IQUtils.js.map +1 -1
- package/dist/esm/item/IUtils.js.map +1 -1
- package/dist/esm/key/KUtils.js +96 -2
- package/dist/esm/key/KUtils.js.map +1 -1
- package/dist/index.cjs +120 -2
- package/dist/index.cjs.map +1 -1
- package/dist/key/KUtils.d.ts +7 -2
- package/dist/keys.d.ts +3 -3
- package/docs/README.md +53 -0
- package/docs/index.html +18 -0
- package/docs/package.json +35 -0
- package/docs/public/README.md +227 -0
- package/docs/public/api.md +230 -0
- package/docs/public/basic-usage.ts +293 -0
- package/docs/public/examples-README.md +147 -0
- package/docs/public/fjell-icon.svg +1 -0
- package/docs/public/package.json +56 -0
- package/docs/public/pano.png +0 -0
- package/docs/src/App.css +1178 -0
- package/docs/src/App.tsx +684 -0
- package/docs/src/index.css +38 -0
- package/docs/src/main.tsx +10 -0
- package/docs/tsconfig.node.json +14 -0
- package/docs/vitest.config.ts +14 -0
- package/examples/README.md +147 -0
- package/examples/basic-usage.ts +293 -0
- package/package.json +10 -9
- package/src/item/IQUtils.ts +3 -3
- package/src/item/IUtils.ts +1 -1
- package/src/key/KUtils.ts +114 -6
- package/src/keys.ts +3 -3
package/README.md
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Fjell Core
|
|
2
|
+
|
|
3
|
+
Core Item and Key Framework for Fjell - The foundational library that provides essential item management, key utilities, and service coordination for the entire Fjell ecosystem.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Type-safe item creation** with IFactory
|
|
8
|
+
- **Hierarchical key management** with KUtils
|
|
9
|
+
- **Abstract service layer** with AItemService
|
|
10
|
+
- **Query building and execution** with IQFactory and IQUtils
|
|
11
|
+
- **Comprehensive error handling** with custom error types
|
|
12
|
+
- **Testing utilities** for robust test suites
|
|
13
|
+
- **TypeScript-first design** for excellent developer experience
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @fjell/core
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { IFactory, KUtils, AItemService } from '@fjell/core'
|
|
25
|
+
|
|
26
|
+
// Create items with the factory
|
|
27
|
+
const user = IFactory.create('user', {
|
|
28
|
+
id: 'user-123',
|
|
29
|
+
name: 'John Doe',
|
|
30
|
+
email: 'john@example.com'
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// Generate hierarchical keys
|
|
34
|
+
const userKey = KUtils.generateKey(['users', user.id])
|
|
35
|
+
|
|
36
|
+
// Build services
|
|
37
|
+
class UserService extends AItemService {
|
|
38
|
+
async createUser(userData: any) {
|
|
39
|
+
const user = IFactory.create('user', userData)
|
|
40
|
+
await this.validate(user)
|
|
41
|
+
return this.save(user)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Core Modules
|
|
47
|
+
|
|
48
|
+
### IFactory
|
|
49
|
+
Factory for creating strongly-typed items with validation and defaults.
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
interface User {
|
|
53
|
+
id: string
|
|
54
|
+
name: string
|
|
55
|
+
email: string
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const user = IFactory.create<User>('user', {
|
|
59
|
+
id: 'user-123',
|
|
60
|
+
name: 'John Doe',
|
|
61
|
+
email: 'john@example.com'
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### KUtils
|
|
66
|
+
Utilities for hierarchical key generation and manipulation.
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// Generate keys
|
|
70
|
+
const userKey = KUtils.generateKey(['users', 'user-123'])
|
|
71
|
+
const profileKey = KUtils.generateKey(['users', 'user-123', 'profile'])
|
|
72
|
+
|
|
73
|
+
// Parse keys
|
|
74
|
+
const components = KUtils.parseKey(userKey) // ['users', 'user-123']
|
|
75
|
+
|
|
76
|
+
// Validate keys
|
|
77
|
+
const isValid = KUtils.isValidKey(userKey) // true
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### AItemService
|
|
81
|
+
Abstract base class for building domain services with lifecycle management.
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
class UserService extends AItemService {
|
|
85
|
+
async create(userData: Partial<User>): Promise<User> {
|
|
86
|
+
const user = IFactory.create<User>('user', userData)
|
|
87
|
+
await this.validate(user)
|
|
88
|
+
return this.save(user)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
protected async validate(user: User): Promise<void> {
|
|
92
|
+
if (!user.email.includes('@')) {
|
|
93
|
+
throw new Error('Invalid email')
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Query System
|
|
100
|
+
Build and execute queries with IQFactory and IQUtils.
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
const query = IQFactory.create('user')
|
|
104
|
+
.where('status', 'active')
|
|
105
|
+
.where('role', 'admin')
|
|
106
|
+
.orderBy('createdAt', 'desc')
|
|
107
|
+
.limit(10)
|
|
108
|
+
|
|
109
|
+
const results = await IQUtils.execute(query)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Architecture Philosophy
|
|
113
|
+
|
|
114
|
+
Fjell Core is designed around **progressive enhancement**:
|
|
115
|
+
|
|
116
|
+
1. **Start Simple**: Basic operations require minimal setup
|
|
117
|
+
2. **Scale Gradually**: Add complexity only when needed
|
|
118
|
+
3. **Maintain Consistency**: Common patterns across all Fjell libraries
|
|
119
|
+
4. **Enable Integration**: Designed to work with the entire ecosystem
|
|
120
|
+
|
|
121
|
+
## Integration with Fjell Ecosystem
|
|
122
|
+
|
|
123
|
+
Fjell Core serves as the foundation for:
|
|
124
|
+
|
|
125
|
+
- **@fjell/registry**: Service location and dependency injection
|
|
126
|
+
- **@fjell/cache**: High-performance caching solutions
|
|
127
|
+
- **@fjell/lib**: Database abstraction layers
|
|
128
|
+
- **@fjell/providers**: React component state management
|
|
129
|
+
- **@fjell/client-api**: HTTP client utilities
|
|
130
|
+
- **@fjell/express-router**: Express.js routing utilities
|
|
131
|
+
|
|
132
|
+
## Type Safety
|
|
133
|
+
|
|
134
|
+
Built with TypeScript-first design for excellent developer experience:
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// Strongly typed factories
|
|
138
|
+
const user = IFactory.create<UserType>('user', userData)
|
|
139
|
+
|
|
140
|
+
// Type-safe key operations
|
|
141
|
+
const key = KUtils.generateKey(['users', user.id])
|
|
142
|
+
const [collection, id] = KUtils.parseKey(key)
|
|
143
|
+
|
|
144
|
+
// Compile-time validation
|
|
145
|
+
class UserService extends AItemService<User> {
|
|
146
|
+
// Methods are typed to work with User objects
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Error Handling
|
|
151
|
+
|
|
152
|
+
Comprehensive error handling with descriptive messages:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
try {
|
|
156
|
+
const user = await userService.create(invalidData)
|
|
157
|
+
} catch (error) {
|
|
158
|
+
if (error instanceof CoreValidationError) {
|
|
159
|
+
console.log('Validation failed:', error.details)
|
|
160
|
+
} else if (error instanceof CoreNotFoundError) {
|
|
161
|
+
console.log('User not found:', error.id)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Testing Support
|
|
167
|
+
|
|
168
|
+
Built-in testing utilities for robust test suites:
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
import { TestUtils } from '@fjell/core/testing'
|
|
172
|
+
|
|
173
|
+
// Mock factories
|
|
174
|
+
const mockFactory = TestUtils.createMockFactory()
|
|
175
|
+
const testUser = mockFactory.create('user', { id: 'test-123' })
|
|
176
|
+
|
|
177
|
+
// Assertion helpers
|
|
178
|
+
expect(TestUtils.isValidKey(key)).toBe(true)
|
|
179
|
+
expect(TestUtils.getKeyComponents(key)).toEqual(['users', '123'])
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Performance
|
|
183
|
+
|
|
184
|
+
Optimized for production use:
|
|
185
|
+
|
|
186
|
+
- **Minimal Runtime Overhead**: Core operations are highly optimized
|
|
187
|
+
- **Memory Efficient**: Smart object pooling and reuse strategies
|
|
188
|
+
- **Lazy Loading**: Components load only when needed
|
|
189
|
+
- **Tree Shaking**: Only bundle what you use
|
|
190
|
+
|
|
191
|
+
## Examples
|
|
192
|
+
|
|
193
|
+
Check out the `/examples` directory for comprehensive usage examples:
|
|
194
|
+
|
|
195
|
+
- Basic item and key operations
|
|
196
|
+
- Service implementation patterns
|
|
197
|
+
- Query building and execution
|
|
198
|
+
- Integration with databases and APIs
|
|
199
|
+
- Testing strategies
|
|
200
|
+
|
|
201
|
+
## Documentation
|
|
202
|
+
|
|
203
|
+
- **Getting Started**: Step-by-step setup guide
|
|
204
|
+
- **API Reference**: Complete API documentation
|
|
205
|
+
- **Examples**: Real-world usage patterns
|
|
206
|
+
- **Migration Guide**: Upgrading from previous versions
|
|
207
|
+
|
|
208
|
+
## Contributing
|
|
209
|
+
|
|
210
|
+
We welcome contributions! Please see our contributing guidelines for details on:
|
|
211
|
+
|
|
212
|
+
- Code style and standards
|
|
213
|
+
- Testing requirements
|
|
214
|
+
- Documentation standards
|
|
215
|
+
- Pull request process
|
|
216
|
+
|
|
217
|
+
## License
|
|
218
|
+
|
|
219
|
+
Licensed under the Apache License 2.0. See LICENSE file for details.
|
|
220
|
+
|
|
221
|
+
## Support
|
|
222
|
+
|
|
223
|
+
- **GitHub Issues**: Report bugs and request features
|
|
224
|
+
- **Discussions**: Community support and questions
|
|
225
|
+
- **Documentation**: Comprehensive guides and API reference
|
|
226
|
+
|
|
227
|
+
Built with love by the Fjell team.
|
package/dist/cjs/index.js
CHANGED
|
@@ -20,16 +20,21 @@ exports.abbrevIK = KUtils.abbrevIK;
|
|
|
20
20
|
exports.abbrevLKA = KUtils.abbrevLKA;
|
|
21
21
|
exports.cPK = KUtils.cPK;
|
|
22
22
|
exports.constructPriKey = KUtils.constructPriKey;
|
|
23
|
+
exports.createNormalizedHashFunction = KUtils.createNormalizedHashFunction;
|
|
23
24
|
exports.generateKeyArray = KUtils.generateKeyArray;
|
|
24
25
|
exports.ikToLKA = KUtils.ikToLKA;
|
|
25
26
|
exports.isComKey = KUtils.isComKey;
|
|
26
27
|
exports.isComKeyEqual = KUtils.isComKeyEqual;
|
|
28
|
+
exports.isComKeyEqualNormalized = KUtils.isComKeyEqualNormalized;
|
|
27
29
|
exports.isItemKey = KUtils.isItemKey;
|
|
28
30
|
exports.isItemKeyEqual = KUtils.isItemKeyEqual;
|
|
31
|
+
exports.isItemKeyEqualNormalized = KUtils.isItemKeyEqualNormalized;
|
|
29
32
|
exports.isLocKey = KUtils.isLocKey;
|
|
30
33
|
exports.isLocKeyEqual = KUtils.isLocKeyEqual;
|
|
34
|
+
exports.isLocKeyEqualNormalized = KUtils.isLocKeyEqualNormalized;
|
|
31
35
|
exports.isPriKey = KUtils.isPriKey;
|
|
32
36
|
exports.isPriKeyEqual = KUtils.isPriKeyEqual;
|
|
37
|
+
exports.isPriKeyEqualNormalized = KUtils.isPriKeyEqualNormalized;
|
|
33
38
|
exports.isValidComKey = KUtils.isValidComKey;
|
|
34
39
|
exports.isValidItemKey = KUtils.isValidItemKey;
|
|
35
40
|
exports.isValidLocKey = KUtils.isValidLocKey;
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/item/IQUtils.js
CHANGED
|
@@ -7,6 +7,25 @@ const logger$1 = require('../logger.js');
|
|
|
7
7
|
const luxon = require('luxon');
|
|
8
8
|
const ItemQuery = require('./ItemQuery.js');
|
|
9
9
|
|
|
10
|
+
function _interopNamespaceDefault(e) {
|
|
11
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
12
|
+
if (e) {
|
|
13
|
+
for (const k in e) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: () => e[k]
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const luxon__namespace = /*#__PURE__*/_interopNamespaceDefault(luxon);
|
|
28
|
+
|
|
10
29
|
const logger = logger$1.default.get('IQUtils');
|
|
11
30
|
/**
|
|
12
31
|
* When we query or search, we're sending a GET request. This converts everything in ItemQuery into a flat
|
|
@@ -50,7 +69,7 @@ const logger = logger$1.default.get('IQUtils');
|
|
|
50
69
|
// This is a dateTimeReviver used for JSON parse - when we convert a param back to a query, we need this.
|
|
51
70
|
const dateTimeReviver = function(key, value) {
|
|
52
71
|
if (typeof value === 'string') {
|
|
53
|
-
const parsedDate =
|
|
72
|
+
const parsedDate = luxon__namespace.DateTime.fromISO(value);
|
|
54
73
|
if (parsedDate.isValid) {
|
|
55
74
|
return parsedDate.toJSDate();
|
|
56
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IQUtils.js","sources":["../../../src/item/IQUtils.ts"],"sourcesContent":["import { Item, ReferenceItem, References } from \"@/items\";\nimport { isItemKeyEqual, isPriKey } from \"@/key/KUtils\";\nimport { ComKey, PriKey } from \"@/keys\";\nimport LibLogger from \"@/logger\";\nimport { DateTime } from \"luxon\";\nimport { CompoundCondition, Condition, EventQuery, isCondition, ItemQuery, QueryParams } from \"./ItemQuery\";\n\nconst logger = LibLogger.get('IQUtils');\n\n/**\n * When we query or search, we're sending a GET request. This converts everything in ItemQuery into a flat\n * object that can be sent over a GET request.\n *\n * Note that there is some discussion about this. Evidently Elastic supports search with POST, but that also\n * feels like a bit of a hack. It's not a RESTful way to do things. So we're sticking with GET for now.\n *\n * For reference, look at RFC 9110 \"HTTP Semantics\", June which clarified on top of and RFC 7231. It's possible\n * but there are so many caveats and conditions in the standard, it's not worth it.\n *\n * Anticipating the next question - \"isn't there a limit to the length of a URL?\" The specification does not\n * specify a limit, and there are limits in various browsers and servers - Apache is 4,000 chars, Chrome is 2M chars.\n * Short answer is that if this query is being used to craft something that complex, it is probably a better idea\n * to provide an action or a custom query endpoint on the server.\n *\n * @param query\n * @returns QueryParams ready to be get over a GET request.\n */\nexport const queryToParams = (query: ItemQuery): QueryParams => {\n const params: QueryParams = {};\n if (query.compoundCondition) {\n params.compoundCondition = JSON.stringify(query.compoundCondition);\n }\n if (query.refs) {\n params.refs = JSON.stringify(query.refs);\n }\n if (query.limit) {\n params.limit = query.limit;\n }\n if (query.offset) {\n params.offset = query.offset;\n }\n if (query.aggs) {\n params.aggs = JSON.stringify(query.aggs);\n }\n if (query.events) {\n params.events = JSON.stringify(query.events);\n }\n return params;\n}\n\n// This is a dateTimeReviver used for JSON parse - when we convert a param back to a query, we need this.\nconst dateTimeReviver = function (key: string, value: string) {\n if (typeof value === 'string') {\n const parsedDate = DateTime.fromISO(value);\n if (parsedDate.isValid) {\n return parsedDate.toJSDate();;\n }\n }\n return value;\n}\n\n/**\n * This method translates from a flat QueryParams object with stringify'd JSON back to a full ItemQuery.\n *\n * @param params Parameters sent over a GET request\n * @returns A fully hydrated ItemQuery object.\n */\nexport const paramsToQuery = (params: QueryParams): ItemQuery => {\n const query: ItemQuery = {};\n if (params.compoundCondition) {\n query.compoundCondition = JSON.parse(params.compoundCondition as string) as CompoundCondition;\n }\n if (params.refs) {\n query.refs = JSON.parse(params.refs as string) as References;\n }\n if (params.limit) {\n query.limit = Number(params.limit);\n }\n if (params.offset) {\n query.offset = Number(params.offset);\n }\n if (params.aggs) {\n query.aggs = JSON.parse(params.aggs as string) as Record<string, ItemQuery>;\n }\n if (params.events) {\n query.events = JSON.parse(params.events as string, dateTimeReviver) as Record<string, { start?: Date, end?: Date }>;\n }\n return query;\n}\n\nconst isRefQueryMatch =\n <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n >(\n refKey: string,\n queryRef: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>,\n references: References,\n ): boolean => {\n logger.trace('doesRefMatch', { queryRef, references });\n logger.debug('Comparing Ref', { refKey, itemRef: references[refKey], queryRef });\n return isItemKeyEqual(queryRef, references[refKey]);\n }\n\nconst isCompoundConditionQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n queryCondition: CompoundCondition,\n item: Item<S, L1, L2, L3, L4, L5>,\n ): boolean => {\n if (queryCondition.compoundType === 'AND') {\n // If this is an AND compound condition, we need to check if all of the conditions match\n return queryCondition.conditions.every(\n (condition: Condition | CompoundCondition) =>\n isCondition(condition) ?\n isConditionQueryMatch(condition, item) :\n isCompoundConditionQueryMatch(condition, item)\n );\n } else {\n // If this is an OR compound condition, we need to check if any of the conditions match\n return queryCondition.conditions.some(\n (condition: Condition | CompoundCondition) =>\n isCondition(condition) ?\n isConditionQueryMatch(condition, item) :\n isCompoundConditionQueryMatch(condition, item)\n );\n }\n}\n\nconst isConditionQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n queryCondition: Condition,\n item: Item<S, L1, L2, L3, L4, L5>,\n ): boolean => {\n const propKey = queryCondition.column;\n logger.trace('doesConditionMatch', { propKey, queryCondition, item });\n // eslint-disable-next-line no-undefined\n if (item[propKey] === undefined) {\n logger.debug('Item does not contain prop under key', { propKey, item });\n return false;\n }\n logger.debug('Comparing Condition', { propKey, itemProp: item[propKey], queryCondition });\n let result = false;\n switch (queryCondition.operator) {\n case '==':\n result = item[propKey] === queryCondition.value;\n break;\n case '!=':\n result = item[propKey] !== queryCondition.value;\n break;\n case '>':\n result = item[propKey] > queryCondition.value;\n break;\n case '>=':\n result = item[propKey] >= queryCondition.value;\n break;\n case '<':\n result = item[propKey] < queryCondition.value;\n break;\n case '<=':\n result = item[propKey] <= queryCondition.value;\n break;\n case 'in':\n result = (queryCondition.value as unknown as string[]).includes(item[propKey] as string);\n break;\n case 'not-in':\n result = !(queryCondition.value as unknown as string[]).includes(item[propKey] as string);\n break;\n case 'array-contains':\n result = (item[propKey] as unknown as string[]).includes(queryCondition.value as string);\n break;\n case 'array-contains-any':\n result = (queryCondition.value as unknown as string[])\n .some(value => (item[propKey] as unknown as string[]).includes(value));\n break;\n }\n return result;\n}\n\nconst isAggQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n aggKey: string,\n aggQuery: ItemQuery,\n agg: ReferenceItem<S, L1, L2, L3, L4, L5>\n ): boolean => {\n const aggItem = agg.item;\n logger.debug('Comparing Agg', { aggKey, aggItem, aggQuery });\n // Fancy, right? This is a recursive call to isQueryMatch\n return isQueryMatch(aggItem, aggQuery);\n}\n\nconst isEventQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n eventKey: string,\n eventQuery: EventQuery,\n item: Item<S, L1, L2, L3, L4, L5>,\n ): boolean => {\n if (!item.events[eventKey]) {\n logger.debug('Item does not contain event under key', { eventKey, events: item.events });\n return false;\n } else {\n const itemEvent = item.events[eventKey];\n if (itemEvent.at !== null) {\n if (eventQuery.start && !(eventQuery.start.getTime() <= itemEvent.at.getTime())) {\n logger.debug('Item date before event start query', { eventQuery, itemEvent });\n return false;\n }\n if (eventQuery.end && !(eventQuery.end.getTime() > itemEvent.at.getTime())) {\n logger.debug('Item date after event end query', { eventQuery, itemEvent });\n return false;\n }\n } else {\n logger.debug('Item event does contains a null at', { itemEvent });\n return false;\n }\n return true;\n }\n}\n\nexport const isQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(item: Item<S, L1, L2, L3, L4, L5>, query: ItemQuery): boolean => {\n\n logger.trace('isMatch', { item, query });\n if (query.refs && item.refs) {\n for (const key in query.refs) {\n const queryRef = query.refs[key];\n if (!isRefQueryMatch(key, queryRef, item.refs)) return false;\n }\n } else if (query.refs && !item.refs) {\n logger.debug('Query contains refs but item does not have refs', { query, item });\n return false;\n }\n\n if (query.compoundCondition && item) {\n if (!isCompoundConditionQueryMatch(query.compoundCondition, item)) return false;\n }\n\n if (query.events && item.events) {\n for (const key in query.events) {\n const queryEvent = query.events[key];\n if (!isEventQueryMatch(key, queryEvent, item)) return false\n }\n return true;\n }\n\n if (query.aggs && item.aggs) {\n for (const key in query.aggs) {\n const aggQuery = query.aggs[key];\n if (item.aggs[key] && !isAggQueryMatch(key, aggQuery, item.aggs[key])) return false;\n }\n } if (query.aggs && !item.aggs) {\n logger.debug('Query contains aggs but item does not have aggs', { query, item });\n return false;\n }\n\n // If it hasn't returned false by now, it must be a match\n return true;\n}\n\nexport const abbrevQuery = (query: ItemQuery | null | undefined): string => {\n const abbrev = ['IQ'];\n if( query ) {\n if (query.refs) {\n for (const key in query.refs) {\n const ref = abbrevRef(key, query.refs[key]);\n abbrev.push(ref);\n }\n }\n if (query.compoundCondition) {\n const props = abbrevCompoundCondition(query.compoundCondition);\n abbrev.push(props);\n }\n if (query.aggs) {\n for (const key in query.aggs) {\n const agg = abbrevAgg(key, query.aggs[key]);\n abbrev.push(agg);\n }\n }\n if (query.events) {\n const events = `(E${Object.keys(query.events).join(',')})`;\n abbrev.push(events);\n }\n if (query.limit) {\n abbrev.push(`L${query.limit}`);\n }\n if (query.offset) {\n abbrev.push(`O${query.offset}`);\n }\n } else {\n abbrev.push('(empty)');\n }\n return abbrev.join(' ');\n}\n\nexport const abbrevRef = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(key: string, ref: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>): string => {\n if (isPriKey(ref)) {\n const priKey = ref as PriKey<S>;\n return `R(${key},${priKey.kt},${priKey.pk})`;\n } else {\n const comKey = ref as ComKey<S, L1, L2, L3, L4, L5>;\n return `R(${key},${JSON.stringify(comKey)})`;\n }\n}\n\nexport const abbrevAgg = (key: string, agg: ItemQuery): string => {\n return `A(${key},${abbrevQuery(agg)})`;\n}\n\nexport const abbrevCompoundCondition = (compoundCondition: CompoundCondition): string => {\n return `CC(${compoundCondition.compoundType},` +\n `${compoundCondition.conditions ? compoundCondition.conditions.map(abbrevCondition).join(',') : 'No Conditions'})`;\n}\n\nexport const abbrevCondition = (condition: Condition | CompoundCondition): string => {\n if (isCondition(condition)) {\n return `(${condition.column},${condition.value},${condition.operator})`;\n } else {\n return abbrevCompoundCondition(condition);\n }\n}"],"names":["logger","LibLogger","get","queryToParams","query","params","compoundCondition","JSON","stringify","refs","limit","offset","aggs","events","dateTimeReviver","key","value","parsedDate","DateTime","fromISO","isValid","toJSDate","paramsToQuery","parse","Number","isRefQueryMatch","refKey","queryRef","references","trace","debug","itemRef","isItemKeyEqual","isCompoundConditionQueryMatch","queryCondition","item","compoundType","conditions","every","condition","isCondition","isConditionQueryMatch","some","propKey","column","undefined","itemProp","result","operator","includes","isAggQueryMatch","aggKey","aggQuery","agg","aggItem","isQueryMatch","isEventQueryMatch","eventKey","eventQuery","itemEvent","at","start","getTime","end","queryEvent","abbrevQuery","abbrev","ref","abbrevRef","push","props","abbrevCompoundCondition","abbrevAgg","Object","keys","join","isPriKey","priKey","kt","pk","comKey","map","abbrevCondition"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IQUtils.js","sources":["../../../src/item/IQUtils.ts"],"sourcesContent":["import { Item, ReferenceItem, References } from \"@/items\";\nimport { isItemKeyEqual, isPriKey } from \"@/key/KUtils\";\nimport { ComKey, PriKey } from \"@/keys\";\nimport LibLogger from \"@/logger\";\nimport * as luxon from 'luxon';\nimport { CompoundCondition, Condition, EventQuery, isCondition, ItemQuery, QueryParams } from \"./ItemQuery\";\n\nconst logger = LibLogger.get('IQUtils');\n\n/**\n * When we query or search, we're sending a GET request. This converts everything in ItemQuery into a flat\n * object that can be sent over a GET request.\n *\n * Note that there is some discussion about this. Evidently Elastic supports search with POST, but that also\n * feels like a bit of a hack. It's not a RESTful way to do things. So we're sticking with GET for now.\n *\n * For reference, look at RFC 9110 \"HTTP Semantics\", June which clarified on top of and RFC 7231. It's possible\n * but there are so many caveats and conditions in the standard, it's not worth it.\n *\n * Anticipating the next question - \"isn't there a limit to the length of a URL?\" The specification does not\n * specify a limit, and there are limits in various browsers and servers - Apache is 4,000 chars, Chrome is 2M chars.\n * Short answer is that if this query is being used to craft something that complex, it is probably a better idea\n * to provide an action or a custom query endpoint on the server.\n *\n * @param query\n * @returns QueryParams ready to be get over a GET request.\n */\nexport const queryToParams = (query: ItemQuery): QueryParams => {\n const params: QueryParams = {};\n if (query.compoundCondition) {\n params.compoundCondition = JSON.stringify(query.compoundCondition);\n }\n if (query.refs) {\n params.refs = JSON.stringify(query.refs);\n }\n if (query.limit) {\n params.limit = query.limit;\n }\n if (query.offset) {\n params.offset = query.offset;\n }\n if (query.aggs) {\n params.aggs = JSON.stringify(query.aggs);\n }\n if (query.events) {\n params.events = JSON.stringify(query.events);\n }\n return params;\n}\n\n// This is a dateTimeReviver used for JSON parse - when we convert a param back to a query, we need this.\nconst dateTimeReviver = function (key: string, value: string) {\n if (typeof value === 'string') {\n const parsedDate = luxon.DateTime.fromISO(value);\n if (parsedDate.isValid) {\n return parsedDate.toJSDate();;\n }\n }\n return value;\n}\n\n/**\n * This method translates from a flat QueryParams object with stringify'd JSON back to a full ItemQuery.\n *\n * @param params Parameters sent over a GET request\n * @returns A fully hydrated ItemQuery object.\n */\nexport const paramsToQuery = (params: QueryParams): ItemQuery => {\n const query: ItemQuery = {};\n if (params.compoundCondition) {\n query.compoundCondition = JSON.parse(params.compoundCondition as string) as CompoundCondition;\n }\n if (params.refs) {\n query.refs = JSON.parse(params.refs as string) as References;\n }\n if (params.limit) {\n query.limit = Number(params.limit);\n }\n if (params.offset) {\n query.offset = Number(params.offset);\n }\n if (params.aggs) {\n query.aggs = JSON.parse(params.aggs as string) as Record<string, ItemQuery>;\n }\n if (params.events) {\n query.events = JSON.parse(params.events as string, dateTimeReviver) as Record<string, { start?: Date, end?: Date }>;\n }\n return query;\n}\n\nconst isRefQueryMatch =\n <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n >(\n refKey: string,\n queryRef: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>,\n references: References,\n ): boolean => {\n logger.trace('doesRefMatch', { queryRef, references });\n logger.debug('Comparing Ref', { refKey, itemRef: references[refKey], queryRef });\n return isItemKeyEqual(queryRef, references[refKey]);\n }\n\nconst isCompoundConditionQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n queryCondition: CompoundCondition,\n item: Item<S, L1, L2, L3, L4, L5>,\n ): boolean => {\n if (queryCondition.compoundType === 'AND') {\n // If this is an AND compound condition, we need to check if all of the conditions match\n return queryCondition.conditions.every(\n (condition: Condition | CompoundCondition) =>\n isCondition(condition) ?\n isConditionQueryMatch(condition, item) :\n isCompoundConditionQueryMatch(condition, item)\n );\n } else {\n // If this is an OR compound condition, we need to check if any of the conditions match\n return queryCondition.conditions.some(\n (condition: Condition | CompoundCondition) =>\n isCondition(condition) ?\n isConditionQueryMatch(condition, item) :\n isCompoundConditionQueryMatch(condition, item)\n );\n }\n}\n\nconst isConditionQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n queryCondition: Condition,\n item: Item<S, L1, L2, L3, L4, L5>,\n ): boolean => {\n const propKey = queryCondition.column;\n logger.trace('doesConditionMatch', { propKey, queryCondition, item });\n // eslint-disable-next-line no-undefined\n if (item[propKey] === undefined) {\n logger.debug('Item does not contain prop under key', { propKey, item });\n return false;\n }\n logger.debug('Comparing Condition', { propKey, itemProp: item[propKey], queryCondition });\n let result = false;\n switch (queryCondition.operator) {\n case '==':\n result = item[propKey] === queryCondition.value;\n break;\n case '!=':\n result = item[propKey] !== queryCondition.value;\n break;\n case '>':\n result = item[propKey] > queryCondition.value;\n break;\n case '>=':\n result = item[propKey] >= queryCondition.value;\n break;\n case '<':\n result = item[propKey] < queryCondition.value;\n break;\n case '<=':\n result = item[propKey] <= queryCondition.value;\n break;\n case 'in':\n result = (queryCondition.value as unknown as string[]).includes(item[propKey] as string);\n break;\n case 'not-in':\n result = !(queryCondition.value as unknown as string[]).includes(item[propKey] as string);\n break;\n case 'array-contains':\n result = (item[propKey] as unknown as string[]).includes(queryCondition.value as string);\n break;\n case 'array-contains-any':\n result = (queryCondition.value as unknown as string[])\n .some(value => (item[propKey] as unknown as string[]).includes(value));\n break;\n }\n return result;\n}\n\nconst isAggQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n aggKey: string,\n aggQuery: ItemQuery,\n agg: ReferenceItem<S, L1, L2, L3, L4, L5>\n ): boolean => {\n const aggItem = agg.item;\n logger.debug('Comparing Agg', { aggKey, aggItem, aggQuery });\n // Fancy, right? This is a recursive call to isQueryMatch\n return isQueryMatch(aggItem, aggQuery);\n}\n\nconst isEventQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(\n eventKey: string,\n eventQuery: EventQuery,\n item: Item<S, L1, L2, L3, L4, L5>,\n ): boolean => {\n if (!item.events[eventKey]) {\n logger.debug('Item does not contain event under key', { eventKey, events: item.events });\n return false;\n } else {\n const itemEvent = item.events[eventKey];\n if (itemEvent.at !== null) {\n if (eventQuery.start && !(eventQuery.start.getTime() <= itemEvent.at.getTime())) {\n logger.debug('Item date before event start query', { eventQuery, itemEvent });\n return false;\n }\n if (eventQuery.end && !(eventQuery.end.getTime() > itemEvent.at.getTime())) {\n logger.debug('Item date after event end query', { eventQuery, itemEvent });\n return false;\n }\n } else {\n logger.debug('Item event does contains a null at', { itemEvent });\n return false;\n }\n return true;\n }\n}\n\nexport const isQueryMatch = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(item: Item<S, L1, L2, L3, L4, L5>, query: ItemQuery): boolean => {\n\n logger.trace('isMatch', { item, query });\n if (query.refs && item.refs) {\n for (const key in query.refs) {\n const queryRef = query.refs[key];\n if (!isRefQueryMatch(key, queryRef, item.refs)) return false;\n }\n } else if (query.refs && !item.refs) {\n logger.debug('Query contains refs but item does not have refs', { query, item });\n return false;\n }\n\n if (query.compoundCondition && item) {\n if (!isCompoundConditionQueryMatch(query.compoundCondition, item)) return false;\n }\n\n if (query.events && item.events) {\n for (const key in query.events) {\n const queryEvent = query.events[key];\n if (!isEventQueryMatch(key, queryEvent, item)) return false\n }\n return true;\n }\n\n if (query.aggs && item.aggs) {\n for (const key in query.aggs) {\n const aggQuery = query.aggs[key];\n if (item.aggs[key] && !isAggQueryMatch(key, aggQuery, item.aggs[key])) return false;\n }\n } if (query.aggs && !item.aggs) {\n logger.debug('Query contains aggs but item does not have aggs', { query, item });\n return false;\n }\n\n // If it hasn't returned false by now, it must be a match\n return true;\n}\n\nexport const abbrevQuery = (query: ItemQuery | null | undefined): string => {\n const abbrev = ['IQ'];\n if( query ) {\n if (query.refs) {\n for (const key in query.refs) {\n const ref = abbrevRef(key, query.refs[key]);\n abbrev.push(ref);\n }\n }\n if (query.compoundCondition) {\n const props = abbrevCompoundCondition(query.compoundCondition);\n abbrev.push(props);\n }\n if (query.aggs) {\n for (const key in query.aggs) {\n const agg = abbrevAgg(key, query.aggs[key]);\n abbrev.push(agg);\n }\n }\n if (query.events) {\n const events = `(E${Object.keys(query.events).join(',')})`;\n abbrev.push(events);\n }\n if (query.limit) {\n abbrev.push(`L${query.limit}`);\n }\n if (query.offset) {\n abbrev.push(`O${query.offset}`);\n }\n } else {\n abbrev.push('(empty)');\n }\n return abbrev.join(' ');\n}\n\nexport const abbrevRef = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(key: string, ref: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>): string => {\n if (isPriKey(ref)) {\n const priKey = ref as PriKey<S>;\n return `R(${key},${priKey.kt},${priKey.pk})`;\n } else {\n const comKey = ref as ComKey<S, L1, L2, L3, L4, L5>;\n return `R(${key},${JSON.stringify(comKey)})`;\n }\n}\n\nexport const abbrevAgg = (key: string, agg: ItemQuery): string => {\n return `A(${key},${abbrevQuery(agg)})`;\n}\n\nexport const abbrevCompoundCondition = (compoundCondition: CompoundCondition): string => {\n return `CC(${compoundCondition.compoundType},` +\n `${compoundCondition.conditions ? compoundCondition.conditions.map(abbrevCondition).join(',') : 'No Conditions'})`;\n}\n\nexport const abbrevCondition = (condition: Condition | CompoundCondition): string => {\n if (isCondition(condition)) {\n return `(${condition.column},${condition.value},${condition.operator})`;\n } else {\n return abbrevCompoundCondition(condition);\n }\n}\n"],"names":["logger","LibLogger","get","queryToParams","query","params","compoundCondition","JSON","stringify","refs","limit","offset","aggs","events","dateTimeReviver","key","value","parsedDate","luxon","DateTime","fromISO","isValid","toJSDate","paramsToQuery","parse","Number","isRefQueryMatch","refKey","queryRef","references","trace","debug","itemRef","isItemKeyEqual","isCompoundConditionQueryMatch","queryCondition","item","compoundType","conditions","every","condition","isCondition","isConditionQueryMatch","some","propKey","column","undefined","itemProp","result","operator","includes","isAggQueryMatch","aggKey","aggQuery","agg","aggItem","isQueryMatch","isEventQueryMatch","eventKey","eventQuery","itemEvent","at","start","getTime","end","queryEvent","abbrevQuery","abbrev","ref","abbrevRef","push","props","abbrevCompoundCondition","abbrevAgg","Object","keys","join","isPriKey","priKey","kt","pk","comKey","map","abbrevCondition"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IUtils.js","sources":["../../../src/item/IUtils.ts"],"sourcesContent":["/* eslint-disable indent */\n
|
|
1
|
+
{"version":3,"file":"IUtils.js","sources":["../../../src/item/IUtils.ts"],"sourcesContent":["/* eslint-disable indent */\n \nimport { Item } from \"@/items\";\nimport { isComKey, isPriKey, toKeyTypeArray } from \"@/key/KUtils\";\nimport { AllItemTypeArrays, ComKey, PriKey } from \"@/keys\";\n\nimport LibLogger from '@/logger';\n\nconst logger = LibLogger.get('IUtils');\n\nconst validatePKForItem = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(item: Item<S, L1, L2, L3, L4, L5>, pkType: S): Item<S, L1, L2, L3, L4, L5> => {\n if (!item) {\n logger.error('Validating PK, Item is undefined', { item });\n throw new Error('Validating PK, Item is undefined');\n }\n if (!item.key) {\n logger.error('Validating PK, Item does not have a key', { item });\n throw new Error('Validating PK, Item does not have a key');\n }\n\n const keyTypeArray = toKeyTypeArray(item.key as ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>);\n if (keyTypeArray[0] !== pkType) {\n logger.error('Key Type Array Mismatch', { keyTypeArray, pkType });\n throw new Error(`Item does not have the correct primary key type. Expected ${pkType}, got ${keyTypeArray[0]}`);\n }\n return item;\n};\n\nexport const validatePK = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n input: Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[],\n pkType: S,\n): Item<S, L1, L2, L3, L4, L5> | Item<S, L1, L2, L3, L4, L5>[] => {\n logger.trace('Checking Return Type', { input });\n\n if (Array.isArray(input)) {\n return input.map((item) => validatePKForItem(item, pkType));\n }\n return validatePKForItem(input, pkType);\n};\n\nexport const validateKeys = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n item: Item<S, L1, L2, L3, L4, L5>,\n keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>,\n): Item<S, L1, L2, L3, L4, L5> => {\n logger.trace('Checking Return Type', { item });\n if (!item) {\n throw new Error('validating keys, item is undefined');\n }\n if (!item.key) {\n throw new Error('validating keys, item does not have a key: ' + JSON.stringify(item));\n }\n\n const keyTypeArray = toKeyTypeArray(item.key as ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>);\n if (keyTypeArray.length !== keyTypes.length) {\n throw new Error(`Item does not have the correct number of keys. Expected ${keyTypes.length}, but got ${keyTypeArray.length}`);\n }\n\n const match: boolean = JSON.stringify(keyTypeArray) === JSON.stringify(keyTypes);\n if (!match) {\n logger.error('Key Type Array Mismatch', { keyTypeArray, thisKeyTypes: keyTypes });\n throw new Error(`Item does not have the correct key types. Expected [${keyTypes.join(', ')}], but got [${keyTypeArray.join(', ')}]`);\n }\n return item;\n};\n\nexport const isPriItem = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n item: Item<S, L1, L2, L3, L4, L5>,\n): item is Item<S> & { key: PriKey<S> } => {\n return !!(item && item.key && isPriKey(item.key));\n};\n\nexport const isComItem = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never,\n>(\n item: Item<S, L1, L2, L3, L4, L5>,\n): item is Item<S, L1, L2, L3, L4, L5> & { key: ComKey<S, L1, L2, L3, L4, L5> } => {\n return !!(item && item.key && isComKey(item.key));\n};"],"names":["logger","LibLogger","get","validatePKForItem","item","pkType","error","Error","key","keyTypeArray","toKeyTypeArray","validatePK","input","trace","Array","isArray","map","validateKeys","keyTypes","JSON","stringify","length","match","thisKeyTypes","join","isPriItem","isPriKey","isComItem","isComKey"],"mappings":";;;;;;;AAQA,MAAMA,MAAAA,GAASC,gBAAAA,CAAUC,GAAG,CAAC,QAAA,CAAA;AAE7B,MAAMC,iBAAAA,GAAoB,CAOxBC,IAAAA,EAAmCC,MAAAA,GAAAA;AACnC,IAAA,IAAI,CAACD,IAAAA,EAAM;QACTJ,MAAAA,CAAOM,KAAK,CAAC,kCAAA,EAAoC;AAAEF,YAAAA;AAAK,SAAA,CAAA;AACxD,QAAA,MAAM,IAAIG,KAAAA,CAAM,kCAAA,CAAA;AAClB,IAAA;IACA,IAAI,CAACH,IAAAA,CAAKI,GAAG,EAAE;QACbR,MAAAA,CAAOM,KAAK,CAAC,yCAAA,EAA2C;AAAEF,YAAAA;AAAK,SAAA,CAAA;AAC/D,QAAA,MAAM,IAAIG,KAAAA,CAAM,yCAAA,CAAA;AAClB,IAAA;IAEA,MAAME,YAAAA,GAAeC,qBAAAA,CAAeN,IAAAA,CAAKI,GAAG,CAAA;AAC5C,IAAA,IAAIC,YAAY,CAAC,CAAA,CAAE,KAAKJ,MAAAA,EAAQ;QAC9BL,MAAAA,CAAOM,KAAK,CAAC,yBAAA,EAA2B;AAAEG,YAAAA,YAAAA;AAAcJ,YAAAA;AAAO,SAAA,CAAA;QAC/D,MAAM,IAAIE,KAAAA,CAAM,CAAC,0DAA0D,EAAEF,MAAAA,CAAO,MAAM,EAAEI,YAAY,CAAC,CAAA,CAAE,CAAA,CAAE,CAAA;AAC/G,IAAA;IACA,OAAOL,IAAAA;AACT,CAAA;AAEO,MAAMO,UAAAA,GAAa,CAQxBC,KAAAA,EACAP,MAAAA,GAAAA;IAEAL,MAAAA,CAAOa,KAAK,CAAC,sBAAA,EAAwB;AAAED,QAAAA;AAAM,KAAA,CAAA;IAE7C,IAAIE,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;AACxB,QAAA,OAAOA,MAAMI,GAAG,CAAC,CAACZ,IAAAA,GAASD,kBAAkBC,IAAAA,EAAMC,MAAAA,CAAAA,CAAAA;AACrD,IAAA;AACA,IAAA,OAAOF,kBAAkBS,KAAAA,EAAOP,MAAAA,CAAAA;AAClC;AAEO,MAAMY,YAAAA,GAAe,CAQ1Bb,IAAAA,EACAc,QAAAA,GAAAA;IAEAlB,MAAAA,CAAOa,KAAK,CAAC,sBAAA,EAAwB;AAAET,QAAAA;AAAK,KAAA,CAAA;AAC5C,IAAA,IAAI,CAACA,IAAAA,EAAM;AACT,QAAA,MAAM,IAAIG,KAAAA,CAAM,oCAAA,CAAA;AAClB,IAAA;IACA,IAAI,CAACH,IAAAA,CAAKI,GAAG,EAAE;AACb,QAAA,MAAM,IAAID,KAAAA,CAAM,6CAAA,GAAgDY,IAAAA,CAAKC,SAAS,CAAChB,IAAAA,CAAAA,CAAAA;AACjF,IAAA;IAEA,MAAMK,YAAAA,GAAeC,qBAAAA,CAAeN,IAAAA,CAAKI,GAAG,CAAA;AAC5C,IAAA,IAAIC,YAAAA,CAAaY,MAAM,KAAKH,QAAAA,CAASG,MAAM,EAAE;AAC3C,QAAA,MAAM,IAAId,KAAAA,CAAM,CAAC,wDAAwD,EAAEW,QAAAA,CAASG,MAAM,CAAC,UAAU,EAAEZ,YAAAA,CAAaY,MAAM,CAAA,CAAE,CAAA;AAC9H,IAAA;AAEA,IAAA,MAAMC,QAAiBH,IAAAA,CAAKC,SAAS,CAACX,YAAAA,CAAAA,KAAkBU,IAAAA,CAAKC,SAAS,CAACF,QAAAA,CAAAA;AACvE,IAAA,IAAI,CAACI,KAAAA,EAAO;QACVtB,MAAAA,CAAOM,KAAK,CAAC,yBAAA,EAA2B;AAAEG,YAAAA,YAAAA;YAAcc,YAAAA,EAAcL;AAAS,SAAA,CAAA;AAC/E,QAAA,MAAM,IAAIX,KAAAA,CAAM,CAAC,oDAAoD,EAAEW,SAASM,IAAI,CAAC,IAAA,CAAA,CAAM,YAAY,EAAEf,YAAAA,CAAae,IAAI,CAAC,IAAA,CAAA,CAAM,CAAC,CAAC,CAAA;AACrI,IAAA;IACA,OAAOpB,IAAAA;AACT;AAEO,MAAMqB,YAAY,CAQvBrB,IAAAA,GAAAA;IAEA,OAAO,CAAC,EAAEA,IAAAA,IAAQA,IAAAA,CAAKI,GAAG,IAAIkB,eAAAA,CAAStB,IAAAA,CAAKI,GAAG,CAAA,CAAA;AACjD;AAEO,MAAMmB,YAAY,CAQvBvB,IAAAA,GAAAA;IAEA,OAAO,CAAC,EAAEA,IAAAA,IAAQA,IAAAA,CAAKI,GAAG,IAAIoB,eAAAA,CAASxB,IAAAA,CAAKI,GAAG,CAAA,CAAA;AACjD;;;;;;;"}
|
package/dist/cjs/key/KUtils.js
CHANGED
|
@@ -5,6 +5,100 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const logger$1 = require('../logger.js');
|
|
6
6
|
|
|
7
7
|
const logger = logger$1.default.get('KUtils');
|
|
8
|
+
// Normalize a key value to string for consistent comparison and hashing
|
|
9
|
+
const normalizeKeyValue = (value)=>{
|
|
10
|
+
return String(value);
|
|
11
|
+
};
|
|
12
|
+
// Normalized hash function for Dictionary that converts pk/lk values to strings
|
|
13
|
+
const createNormalizedHashFunction = ()=>{
|
|
14
|
+
return (key)=>{
|
|
15
|
+
if (typeof key === 'object' && key !== null) {
|
|
16
|
+
// Create a normalized version of the key with string values
|
|
17
|
+
const normalizedKey = JSON.parse(JSON.stringify(key));
|
|
18
|
+
// Normalize pk values
|
|
19
|
+
if ('pk' in normalizedKey && normalizedKey.pk !== undefined && normalizedKey.pk !== null) {
|
|
20
|
+
normalizedKey.pk = normalizeKeyValue(normalizedKey.pk);
|
|
21
|
+
}
|
|
22
|
+
// Normalize lk values
|
|
23
|
+
if ('lk' in normalizedKey && normalizedKey.lk !== undefined && normalizedKey.lk !== null) {
|
|
24
|
+
normalizedKey.lk = normalizeKeyValue(normalizedKey.lk);
|
|
25
|
+
}
|
|
26
|
+
// Normalize loc array lk values
|
|
27
|
+
if ('loc' in normalizedKey && Array.isArray(normalizedKey.loc)) {
|
|
28
|
+
normalizedKey.loc = normalizedKey.loc.map((locItem)=>{
|
|
29
|
+
if (locItem && 'lk' in locItem && locItem.lk !== undefined && locItem.lk !== null) {
|
|
30
|
+
return {
|
|
31
|
+
...locItem,
|
|
32
|
+
lk: normalizeKeyValue(locItem.lk)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return locItem;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return JSON.stringify(normalizedKey);
|
|
39
|
+
}
|
|
40
|
+
return JSON.stringify(key);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
// Normalized comparison functions
|
|
44
|
+
const isPriKeyEqualNormalized = (a, b)=>{
|
|
45
|
+
logger.trace('isPriKeyEqualNormalized', {
|
|
46
|
+
a,
|
|
47
|
+
b
|
|
48
|
+
});
|
|
49
|
+
return a && b && normalizeKeyValue(a.pk) === normalizeKeyValue(b.pk) && a.kt === b.kt;
|
|
50
|
+
};
|
|
51
|
+
const isLocKeyEqualNormalized = (a, b)=>{
|
|
52
|
+
logger.trace('isLocKeyEqualNormalized', {
|
|
53
|
+
a,
|
|
54
|
+
b
|
|
55
|
+
});
|
|
56
|
+
return a && b && normalizeKeyValue(a.lk) === normalizeKeyValue(b.lk) && a.kt === b.kt;
|
|
57
|
+
};
|
|
58
|
+
const isComKeyEqualNormalized = (a, b)=>{
|
|
59
|
+
logger.trace('isComKeyEqualNormalized', {
|
|
60
|
+
a,
|
|
61
|
+
b
|
|
62
|
+
});
|
|
63
|
+
if (a && b && isPriKeyEqualNormalized({
|
|
64
|
+
kt: a.kt,
|
|
65
|
+
pk: a.pk
|
|
66
|
+
}, {
|
|
67
|
+
kt: b.kt,
|
|
68
|
+
pk: b.pk
|
|
69
|
+
})) {
|
|
70
|
+
if (a.loc.length === b.loc.length) {
|
|
71
|
+
for(let i = 0; i < a.loc.length; i++){
|
|
72
|
+
if (!isLocKeyEqualNormalized(a.loc[i], b.loc[i])) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
} else {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const isItemKeyEqualNormalized = (a, b)=>{
|
|
85
|
+
logger.trace('isItemKeyEqualNormalized', {
|
|
86
|
+
a,
|
|
87
|
+
b
|
|
88
|
+
});
|
|
89
|
+
if (isComKey(a) && isComKey(b)) {
|
|
90
|
+
return isComKeyEqualNormalized(a, b);
|
|
91
|
+
} else if (isPriKey(a) && isPriKey(b)) {
|
|
92
|
+
if (isComKey(a) || isComKey(b)) {
|
|
93
|
+
return false;
|
|
94
|
+
} else {
|
|
95
|
+
return isPriKeyEqualNormalized(a, b);
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
// Original comparison functions (kept for backward compatibility)
|
|
8
102
|
const isItemKeyEqual = (a, b)=>{
|
|
9
103
|
logger.trace('isKeyEqual', {
|
|
10
104
|
a,
|
|
@@ -123,7 +217,7 @@ const constructPriKey = (pk, kt)=>{
|
|
|
123
217
|
kt
|
|
124
218
|
});
|
|
125
219
|
let pri;
|
|
126
|
-
if (typeof pk === 'string') {
|
|
220
|
+
if (typeof pk === 'string' || typeof pk === 'number') {
|
|
127
221
|
pri = {
|
|
128
222
|
kt: kt,
|
|
129
223
|
pk: pk
|
|
@@ -275,16 +369,21 @@ exports.abbrevIK = abbrevIK;
|
|
|
275
369
|
exports.abbrevLKA = abbrevLKA;
|
|
276
370
|
exports.cPK = cPK;
|
|
277
371
|
exports.constructPriKey = constructPriKey;
|
|
372
|
+
exports.createNormalizedHashFunction = createNormalizedHashFunction;
|
|
278
373
|
exports.generateKeyArray = generateKeyArray;
|
|
279
374
|
exports.ikToLKA = ikToLKA;
|
|
280
375
|
exports.isComKey = isComKey;
|
|
281
376
|
exports.isComKeyEqual = isComKeyEqual;
|
|
377
|
+
exports.isComKeyEqualNormalized = isComKeyEqualNormalized;
|
|
282
378
|
exports.isItemKey = isItemKey;
|
|
283
379
|
exports.isItemKeyEqual = isItemKeyEqual;
|
|
380
|
+
exports.isItemKeyEqualNormalized = isItemKeyEqualNormalized;
|
|
284
381
|
exports.isLocKey = isLocKey;
|
|
285
382
|
exports.isLocKeyEqual = isLocKeyEqual;
|
|
383
|
+
exports.isLocKeyEqualNormalized = isLocKeyEqualNormalized;
|
|
286
384
|
exports.isPriKey = isPriKey;
|
|
287
385
|
exports.isPriKeyEqual = isPriKeyEqual;
|
|
386
|
+
exports.isPriKeyEqualNormalized = isPriKeyEqualNormalized;
|
|
288
387
|
exports.isValidComKey = isValidComKey;
|
|
289
388
|
exports.isValidItemKey = isValidItemKey;
|
|
290
389
|
exports.isValidLocKey = isValidLocKey;
|