@fjell/core 4.4.41 → 4.4.43
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/dist/index.js +25 -9
- package/dist/item/IQUtils.d.ts +2 -3
- package/dist/items.d.ts +10 -6
- package/package.json +4 -3
- package/src/item/IQFactory.ts +1 -1
- package/src/item/IQUtils.ts +27 -9
- package/src/items.ts +21 -12
package/dist/index.js
CHANGED
|
@@ -477,7 +477,7 @@ var IQFactory = class _IQFactory {
|
|
|
477
477
|
this.query.refs = {};
|
|
478
478
|
}
|
|
479
479
|
const refName = name || kt;
|
|
480
|
-
this.query.refs[refName] = cPK(pk, kt);
|
|
480
|
+
this.query.refs[refName] = { key: cPK(pk, kt) };
|
|
481
481
|
return this;
|
|
482
482
|
}
|
|
483
483
|
condition(column, value, operator = "==") {
|
|
@@ -596,7 +596,10 @@ var paramsToQuery = (params) => {
|
|
|
596
596
|
var isRefQueryMatch = (refKey, queryRef, references) => {
|
|
597
597
|
logger3.trace("doesRefMatch", { queryRef, references });
|
|
598
598
|
logger3.debug("Comparing Ref", { refKey, itemRef: references[refKey], queryRef });
|
|
599
|
-
|
|
599
|
+
if (!references[refKey]) {
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
return isItemKeyEqual(queryRef, references[refKey].key);
|
|
600
603
|
};
|
|
601
604
|
var isCompoundConditionQueryMatch = (queryCondition, item) => {
|
|
602
605
|
if (queryCondition.compoundType === "AND") {
|
|
@@ -655,6 +658,9 @@ var isConditionQueryMatch = (queryCondition, item) => {
|
|
|
655
658
|
var isAggQueryMatch = (aggKey, aggQuery, agg) => {
|
|
656
659
|
const aggItem = agg.item;
|
|
657
660
|
logger3.debug("Comparing Agg", { aggKey, aggItem, aggQuery });
|
|
661
|
+
if (!aggItem) {
|
|
662
|
+
return false;
|
|
663
|
+
}
|
|
658
664
|
return isQueryMatch(aggItem, aggQuery);
|
|
659
665
|
};
|
|
660
666
|
var isEventQueryMatch = (eventKey, eventQuery, item) => {
|
|
@@ -684,7 +690,7 @@ var isQueryMatch = (item, query) => {
|
|
|
684
690
|
if (query.refs && item.refs) {
|
|
685
691
|
for (const key in query.refs) {
|
|
686
692
|
const queryRef = query.refs[key];
|
|
687
|
-
if (!isRefQueryMatch(key, queryRef, item.refs)) return false;
|
|
693
|
+
if (!isRefQueryMatch(key, queryRef.key, item.refs)) return false;
|
|
688
694
|
}
|
|
689
695
|
} else if (query.refs && !item.refs) {
|
|
690
696
|
logger3.debug("Query contains refs but item does not have refs", { query, item });
|
|
@@ -703,10 +709,20 @@ var isQueryMatch = (item, query) => {
|
|
|
703
709
|
if (query.aggs && item.aggs) {
|
|
704
710
|
for (const key in query.aggs) {
|
|
705
711
|
const aggQuery = query.aggs[key];
|
|
706
|
-
if (item.aggs[key]
|
|
712
|
+
if (item.aggs[key]) {
|
|
713
|
+
let hasMatch = false;
|
|
714
|
+
for (const aggRecord of item.aggs[key]) {
|
|
715
|
+
if (isAggQueryMatch(key, aggQuery, aggRecord)) {
|
|
716
|
+
hasMatch = true;
|
|
717
|
+
break;
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
if (!hasMatch) return false;
|
|
721
|
+
} else {
|
|
722
|
+
return false;
|
|
723
|
+
}
|
|
707
724
|
}
|
|
708
|
-
}
|
|
709
|
-
if (query.aggs && !item.aggs) {
|
|
725
|
+
} else if (query.aggs && !item.aggs) {
|
|
710
726
|
logger3.debug("Query contains aggs but item does not have aggs", { query, item });
|
|
711
727
|
return false;
|
|
712
728
|
}
|
|
@@ -747,11 +763,11 @@ var abbrevQuery = (query) => {
|
|
|
747
763
|
return abbrev.join(" ");
|
|
748
764
|
};
|
|
749
765
|
var abbrevRef = (key, ref) => {
|
|
750
|
-
if (isPriKey(ref)) {
|
|
751
|
-
const priKey = ref;
|
|
766
|
+
if (isPriKey(ref.key)) {
|
|
767
|
+
const priKey = ref.key;
|
|
752
768
|
return `R(${key},${priKey.kt},${priKey.pk})`;
|
|
753
769
|
} else {
|
|
754
|
-
const comKey = ref;
|
|
770
|
+
const comKey = ref.key;
|
|
755
771
|
return `R(${key},${JSON.stringify(comKey)})`;
|
|
756
772
|
}
|
|
757
773
|
};
|
package/dist/item/IQUtils.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Item } from "../items";
|
|
2
|
-
import { ComKey, PriKey } from "../keys";
|
|
1
|
+
import { Item, Reference } from "../items";
|
|
3
2
|
import { CompoundCondition, Condition, ItemQuery, QueryParams } from "./ItemQuery";
|
|
4
3
|
/**
|
|
5
4
|
* When we query or search, we're sending a GET request. This converts everything in ItemQuery into a flat
|
|
@@ -29,7 +28,7 @@ export declare const queryToParams: (query: ItemQuery) => QueryParams;
|
|
|
29
28
|
export declare const paramsToQuery: (params: QueryParams) => ItemQuery;
|
|
30
29
|
export declare const isQueryMatch: <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(item: Item<S, L1, L2, L3, L4, L5>, query: ItemQuery) => boolean;
|
|
31
30
|
export declare const abbrevQuery: (query: ItemQuery | null | undefined) => string;
|
|
32
|
-
export declare const abbrevRef: <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(key: string, ref:
|
|
31
|
+
export declare const abbrevRef: <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(key: string, ref: Reference<S, L1, L2, L3, L4, L5>) => string;
|
|
33
32
|
export declare const abbrevAgg: (key: string, agg: ItemQuery) => string;
|
|
34
33
|
export declare const abbrevCompoundCondition: (compoundCondition: CompoundCondition) => string;
|
|
35
34
|
export declare const abbrevCondition: (condition: Condition | CompoundCondition) => string;
|
package/dist/items.d.ts
CHANGED
|
@@ -29,16 +29,20 @@ export interface Deletable extends Partial<Evented> {
|
|
|
29
29
|
deleted: ItemEvent;
|
|
30
30
|
}
|
|
31
31
|
export type ManagedEvents = Timestamped & Deletable;
|
|
32
|
-
export type
|
|
33
|
-
export type ReferenceItem<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = {
|
|
32
|
+
export type Reference<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = {
|
|
34
33
|
key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>;
|
|
35
|
-
item
|
|
34
|
+
item?: Item<S, L1, L2, L3, L4, L5>;
|
|
35
|
+
};
|
|
36
|
+
export type ReferenceItem<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = Reference<S, L1, L2, L3, L4, L5>;
|
|
37
|
+
export type References = Record<string, Reference<any, any, any, any, any, any>>;
|
|
38
|
+
export type Aggregation<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = {
|
|
39
|
+
key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>;
|
|
40
|
+
item?: Item<S, L1, L2, L3, L4, L5>;
|
|
36
41
|
};
|
|
37
|
-
export type ReferenceItems = Record<string, ReferenceItem<string, string | never, string | never, string | never, string | never, string | never>>;
|
|
38
42
|
export interface Item<S extends string = never, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> extends Identified<S, L1, L2, L3, L4, L5> {
|
|
39
43
|
events: ManagedEvents & Evented;
|
|
40
|
-
aggs?:
|
|
41
|
-
refs?:
|
|
44
|
+
aggs?: Record<string, Aggregation<any, any, any, any, any, any>[]>;
|
|
45
|
+
refs?: Record<string, Reference<any, any, any, any, any, any>>;
|
|
42
46
|
[key: string]: any;
|
|
43
47
|
}
|
|
44
48
|
/**
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjell/core",
|
|
3
3
|
"description": "Core Item and Key Framework for Fjell",
|
|
4
|
-
"version": "4.4.
|
|
4
|
+
"version": "4.4.43",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"core",
|
|
7
7
|
"fjell"
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"build": "npm run lint && node build.js",
|
|
29
29
|
"clean": "rm -rf dist",
|
|
30
30
|
"test": "npm run lint && vitest run --coverage",
|
|
31
|
+
"precommit": "npm run clean && npm run lint && npm run build && npm run test",
|
|
31
32
|
"prepublishOnly": "npm run clean && npm run build",
|
|
32
33
|
"docs:dev": "cd docs && npm run dev",
|
|
33
34
|
"docs:build": "cd docs && npm run build",
|
|
@@ -35,14 +36,14 @@
|
|
|
35
36
|
"docs:test": "cd docs && npm run test"
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
38
|
-
"@fjell/logging": "^4.4.
|
|
39
|
+
"@fjell/logging": "^4.4.47",
|
|
39
40
|
"deepmerge": "^4.3.1",
|
|
40
41
|
"luxon": "^3.7.1"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@eslint/eslintrc": "^3.3.1",
|
|
44
45
|
"@eslint/js": "^9.32.0",
|
|
45
|
-
"@fjell/eslint-config": "^1.1.
|
|
46
|
+
"@fjell/eslint-config": "^1.1.25",
|
|
46
47
|
"@swc/core": "^1.13.2",
|
|
47
48
|
"@tsconfig/recommended": "^1.0.10",
|
|
48
49
|
"@types/luxon": "^3.6.2",
|
package/src/item/IQFactory.ts
CHANGED
package/src/item/IQUtils.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Item, ReferenceItem, References } from "../items";
|
|
1
|
+
import { Item, Reference, ReferenceItem, References } from "../items";
|
|
2
2
|
import { isItemKeyEqual, isPriKey } from "../key/KUtils";
|
|
3
3
|
import { ComKey, PriKey } from "../keys";
|
|
4
4
|
import LibLogger from "../logger";
|
|
@@ -103,7 +103,10 @@ const isRefQueryMatch =
|
|
|
103
103
|
): boolean => {
|
|
104
104
|
logger.trace('doesRefMatch', { queryRef, references });
|
|
105
105
|
logger.debug('Comparing Ref', { refKey, itemRef: references[refKey], queryRef });
|
|
106
|
-
|
|
106
|
+
if (!references[refKey]) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return isItemKeyEqual(queryRef, references[refKey].key);
|
|
107
110
|
}
|
|
108
111
|
|
|
109
112
|
const isCompoundConditionQueryMatch = <
|
|
@@ -207,6 +210,9 @@ const isAggQueryMatch = <
|
|
|
207
210
|
const aggItem = agg.item;
|
|
208
211
|
logger.debug('Comparing Agg', { aggKey, aggItem, aggQuery });
|
|
209
212
|
// Fancy, right? This is a recursive call to isQueryMatch
|
|
213
|
+
if (!aggItem) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
210
216
|
return isQueryMatch(aggItem, aggQuery);
|
|
211
217
|
}
|
|
212
218
|
|
|
@@ -257,7 +263,7 @@ export const isQueryMatch = <
|
|
|
257
263
|
if (query.refs && item.refs) {
|
|
258
264
|
for (const key in query.refs) {
|
|
259
265
|
const queryRef = query.refs[key];
|
|
260
|
-
if (!isRefQueryMatch(key, queryRef, item.refs)) return false;
|
|
266
|
+
if (!isRefQueryMatch(key, queryRef.key, item.refs)) return false;
|
|
261
267
|
}
|
|
262
268
|
} else if (query.refs && !item.refs) {
|
|
263
269
|
logger.debug('Query contains refs but item does not have refs', { query, item });
|
|
@@ -279,9 +285,21 @@ export const isQueryMatch = <
|
|
|
279
285
|
if (query.aggs && item.aggs) {
|
|
280
286
|
for (const key in query.aggs) {
|
|
281
287
|
const aggQuery = query.aggs[key];
|
|
282
|
-
|
|
288
|
+
// aggs is a record where each key maps to an array of aggregations
|
|
289
|
+
if (item.aggs[key]) {
|
|
290
|
+
let hasMatch = false;
|
|
291
|
+
for (const aggRecord of item.aggs[key]) {
|
|
292
|
+
if (isAggQueryMatch(key, aggQuery, aggRecord as ReferenceItem<any, any, any, any, any, any>)) {
|
|
293
|
+
hasMatch = true;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (!hasMatch) return false;
|
|
298
|
+
} else {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
283
301
|
}
|
|
284
|
-
} if (query.aggs && !item.aggs) {
|
|
302
|
+
} else if (query.aggs && !item.aggs) {
|
|
285
303
|
logger.debug('Query contains aggs but item does not have aggs', { query, item });
|
|
286
304
|
return false;
|
|
287
305
|
}
|
|
@@ -332,12 +350,12 @@ export const abbrevRef = <
|
|
|
332
350
|
L3 extends string = never,
|
|
333
351
|
L4 extends string = never,
|
|
334
352
|
L5 extends string = never
|
|
335
|
-
>(key: string, ref:
|
|
336
|
-
if (isPriKey(ref)) {
|
|
337
|
-
const priKey = ref as PriKey<S>;
|
|
353
|
+
>(key: string, ref: Reference<S, L1, L2, L3, L4, L5>): string => {
|
|
354
|
+
if (isPriKey(ref.key)) {
|
|
355
|
+
const priKey = ref.key as PriKey<S>;
|
|
338
356
|
return `R(${key},${priKey.kt},${priKey.pk})`;
|
|
339
357
|
} else {
|
|
340
|
-
const comKey = ref as ComKey<S, L1, L2, L3, L4, L5>;
|
|
358
|
+
const comKey = ref.key as ComKey<S, L1, L2, L3, L4, L5>;
|
|
341
359
|
return `R(${key},${JSON.stringify(comKey)})`;
|
|
342
360
|
}
|
|
343
361
|
}
|
package/src/items.ts
CHANGED
|
@@ -46,23 +46,32 @@ export interface Deletable extends Partial<Evented> {
|
|
|
46
46
|
|
|
47
47
|
export type ManagedEvents = Timestamped & Deletable;
|
|
48
48
|
|
|
49
|
-
export type
|
|
50
|
-
string,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
export type Reference<S extends string,
|
|
50
|
+
L1 extends string = never,
|
|
51
|
+
L2 extends string = never,
|
|
52
|
+
L3 extends string = never,
|
|
53
|
+
L4 extends string = never,
|
|
54
|
+
L5 extends string = never
|
|
55
|
+
> = { key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>, item?: Item<S, L1, L2, L3, L4, L5> };
|
|
54
56
|
|
|
55
|
-
export type ReferenceItem<
|
|
56
|
-
S extends string,
|
|
57
|
+
export type ReferenceItem<S extends string,
|
|
57
58
|
L1 extends string = never,
|
|
58
59
|
L2 extends string = never,
|
|
59
60
|
L3 extends string = never,
|
|
60
61
|
L4 extends string = never,
|
|
61
62
|
L5 extends string = never
|
|
62
|
-
> =
|
|
63
|
+
> = Reference<S, L1, L2, L3, L4, L5>;
|
|
64
|
+
|
|
65
|
+
export type References = Record<string, Reference<any, any, any, any, any, any>>;
|
|
63
66
|
|
|
64
|
-
export type
|
|
65
|
-
|
|
67
|
+
export type Aggregation<
|
|
68
|
+
S extends string,
|
|
69
|
+
L1 extends string = never,
|
|
70
|
+
L2 extends string = never,
|
|
71
|
+
L3 extends string = never,
|
|
72
|
+
L4 extends string = never,
|
|
73
|
+
L5 extends string = never
|
|
74
|
+
> = { key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>, item?: Item<S, L1, L2, L3, L4, L5> };
|
|
66
75
|
|
|
67
76
|
export interface Item<S extends string = never,
|
|
68
77
|
L1 extends string = never,
|
|
@@ -72,8 +81,8 @@ export interface Item<S extends string = never,
|
|
|
72
81
|
L5 extends string = never> extends Identified<S, L1, L2, L3, L4, L5> {
|
|
73
82
|
events: ManagedEvents & Evented;
|
|
74
83
|
// TODO: This is a bit of a hack to get around the fact that we don't want to pass all these generics
|
|
75
|
-
aggs?:
|
|
76
|
-
refs?:
|
|
84
|
+
aggs?: Record<string, Aggregation<any, any, any, any, any, any>[]>;
|
|
85
|
+
refs?: Record<string, Reference<any, any, any, any, any, any>>;
|
|
77
86
|
[key: string]: any
|
|
78
87
|
}
|
|
79
88
|
|