@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.
Files changed (41) hide show
  1. package/README.md +227 -0
  2. package/dist/cjs/index.js +5 -0
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/item/IQUtils.js +20 -1
  5. package/dist/cjs/item/IQUtils.js.map +1 -1
  6. package/dist/cjs/item/IUtils.js.map +1 -1
  7. package/dist/cjs/key/KUtils.js +100 -1
  8. package/dist/cjs/key/KUtils.js.map +1 -1
  9. package/dist/esm/index.js +1 -1
  10. package/dist/esm/item/IQUtils.js +2 -2
  11. package/dist/esm/item/IQUtils.js.map +1 -1
  12. package/dist/esm/item/IUtils.js.map +1 -1
  13. package/dist/esm/key/KUtils.js +96 -2
  14. package/dist/esm/key/KUtils.js.map +1 -1
  15. package/dist/index.cjs +120 -2
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/key/KUtils.d.ts +7 -2
  18. package/dist/keys.d.ts +3 -3
  19. package/docs/README.md +53 -0
  20. package/docs/index.html +18 -0
  21. package/docs/package.json +35 -0
  22. package/docs/public/README.md +227 -0
  23. package/docs/public/api.md +230 -0
  24. package/docs/public/basic-usage.ts +293 -0
  25. package/docs/public/examples-README.md +147 -0
  26. package/docs/public/fjell-icon.svg +1 -0
  27. package/docs/public/package.json +56 -0
  28. package/docs/public/pano.png +0 -0
  29. package/docs/src/App.css +1178 -0
  30. package/docs/src/App.tsx +684 -0
  31. package/docs/src/index.css +38 -0
  32. package/docs/src/main.tsx +10 -0
  33. package/docs/tsconfig.node.json +14 -0
  34. package/docs/vitest.config.ts +14 -0
  35. package/examples/README.md +147 -0
  36. package/examples/basic-usage.ts +293 -0
  37. package/package.json +10 -9
  38. package/src/item/IQUtils.ts +3 -3
  39. package/src/item/IUtils.ts +1 -1
  40. package/src/key/KUtils.ts +114 -6
  41. 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;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -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 = luxon.DateTime.fromISO(value);
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/* eslint-disable max-len */\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":"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"}
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":"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"}
@@ -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;