@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 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
- return isItemKeyEqual(queryRef, references[refKey]);
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] && !isAggQueryMatch(key, aggQuery, item.aggs[key])) return false;
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
  };
@@ -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: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>) => string;
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 References = Record<string, ComKey<string, string | never, string | never, string | never, string | never, string | never> | PriKey<string>>;
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: Item<S, L1, L2, L3, L4, L5>;
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?: ReferenceItems;
41
- refs?: References;
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.41",
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.46",
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.24",
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",
@@ -82,7 +82,7 @@ export class IQFactory {
82
82
  this.query.refs = {};
83
83
  }
84
84
  const refName = name || kt;
85
- this.query.refs[refName] = cPK<string>(pk, kt);
85
+ this.query.refs[refName] = { key: cPK<string>(pk, kt) };
86
86
  return this;
87
87
  }
88
88
 
@@ -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
- return isItemKeyEqual(queryRef, references[refKey]);
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
- if (item.aggs[key] && !isAggQueryMatch(key, aggQuery, item.aggs[key])) return false;
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: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>): string => {
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 References = Record<
50
- string,
51
- ComKey<string, string | never, string | never, string | never, string | never, string | never> |
52
- PriKey<string>
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
- > = { key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>, item: Item<S, L1, L2, L3, L4, L5> };
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 ReferenceItems = Record<
65
- string, ReferenceItem<string, string | never, string | never, string | never, string | never, string | never>>;
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?: ReferenceItems;
76
- refs?: References;
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