@fjell/lib-sequelize 4.4.45 → 4.4.47

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/Options.d.ts CHANGED
@@ -1,8 +1,46 @@
1
1
  import * as Library from '@fjell/lib';
2
- import { Item } from '@fjell/core';
3
- export type { AggregationDefinition, ReferenceDefinition } from '@fjell/lib';
4
- export interface Options<V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> extends Library.Options<V, S, L1, L2, L3, L4, L5> {
2
+ import { ComKey, Item, LocKeyArray, PriKey } from '@fjell/core';
3
+ import { SequelizeReferenceDefinition } from './processing/ReferenceBuilder';
4
+ export type { AggregationDefinition } from '@fjell/lib';
5
+ export type { SequelizeReferenceDefinition } from './processing/ReferenceBuilder';
6
+ /**
7
+ * Sequelize-specific Options that uses SequelizeReferenceDefinition
8
+ * instead of the generic ReferenceDefinition
9
+ */
10
+ export interface Options<V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> {
11
+ hooks?: {
12
+ preCreate?: (item: Partial<Item<S, L1, L2, L3, L4, L5>>, options?: {
13
+ key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>;
14
+ locations?: never;
15
+ } | {
16
+ key?: never;
17
+ locations: LocKeyArray<L1, L2, L3, L4, L5>;
18
+ }) => Promise<Partial<Item<S, L1, L2, L3, L4, L5>>>;
19
+ postCreate?: (item: V) => Promise<V>;
20
+ preUpdate?: (key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>, item: Partial<Item<S, L1, L2, L3, L4, L5>>) => Promise<Partial<Item<S, L1, L2, L3, L4, L5>>>;
21
+ postUpdate?: (item: V) => Promise<V>;
22
+ preRemove?: (key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>) => Promise<Partial<Item<S, L1, L2, L3, L4, L5>>>;
23
+ postRemove?: (item: V) => Promise<V>;
24
+ };
25
+ validators?: {
26
+ onCreate?: (item: Partial<Item<S, L1, L2, L3, L4, L5>>, options?: {
27
+ key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>;
28
+ locations?: never;
29
+ } | {
30
+ key?: never;
31
+ locations: LocKeyArray<L1, L2, L3, L4, L5>;
32
+ }) => Promise<boolean>;
33
+ onUpdate?: (key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>, item: Partial<Item<S, L1, L2, L3, L4, L5>>) => Promise<boolean>;
34
+ onRemove?: (key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>) => Promise<boolean>;
35
+ };
36
+ finders?: Record<string, Library.FinderMethod<V, S, L1, L2, L3, L4, L5>>;
37
+ actions?: Record<string, Library.ActionMethod<V, S, L1, L2, L3, L4, L5>>;
38
+ facets?: Record<string, Library.FacetMethod<V, S, L1, L2, L3, L4, L5>>;
39
+ allActions?: Record<string, Library.AllActionMethod<V, S, L1, L2, L3, L4, L5>>;
40
+ allFacets?: Record<string, Library.AllFacetMethod<L1, L2, L3, L4, L5>>;
41
+ references?: SequelizeReferenceDefinition[];
42
+ aggregations?: Library.AggregationDefinition[];
5
43
  deleteOnRemove?: boolean;
6
44
  }
7
- export declare const createOptions: <V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(sequelizeOptions?: Partial<Options<V, S, L1, L2, L3, L4, L5>>) => Options<V, S, L1, L2, L3, L4, L5>;
45
+ export declare const createOptions: <V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(sequelizeOptions?: Options<V, S, L1, L2, L3, L4, L5>) => Options<V, S, L1, L2, L3, L4, L5>;
8
46
  //# sourceMappingURL=Options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../src/Options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,OAAO,CACtB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,CACzB,SAAQ,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACjD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa,GACxB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,mBAAmB,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAajG,CAAA"}
1
+ {"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../src/Options.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../src/QueryBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,SAAS,EAKT,SAAS,EAIV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAe,WAAW,EAAM,MAAM,WAAW,CAAC;AAMzD,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CACtB,CAAA;AA+ED,eAAO,MAAM,oBAAoB,GAAI,SAAS,GAAG,EAAE,mBAAmB,iBAAiB,EAAE,OAAO,WAAW,CAAC,GAAG,CAAC,QAoC/G,CAAA;AAmFD,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,SAAS,EAAE,OAAO,WAAW,CAAC,GAAG,CAAC,wBAU1G,CAAA;AAuED,eAAO,MAAM,UAAU,GACrB,WAAW,SAAS,EACpB,OAAO,WAAW,CAAC,GAAG,CAAC,KACtB,GAqDF,CAAA"}
1
+ {"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../src/QueryBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,SAAS,EAKT,SAAS,EAIV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAe,WAAW,EAAM,MAAM,WAAW,CAAC;AAMzD,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;CACtB,CAAA;AAkFD,eAAO,MAAM,oBAAoB,GAAI,SAAS,GAAG,EAAE,mBAAmB,iBAAiB,EAAE,OAAO,WAAW,CAAC,GAAG,CAAC,QAoC/G,CAAA;AAmFD,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,SAAS,EAAE,OAAO,WAAW,CAAC,GAAG,CAAC,wBAU1G,CAAA;AAuED,eAAO,MAAM,UAAU,GACrB,WAAW,SAAS,EACpB,OAAO,WAAW,CAAC,GAAG,CAAC,KACtB,GAqDF,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { AllItemTypeArrays, Item } from "@fjell/core";
2
2
  import { Model } from "sequelize";
3
- import { AggregationDefinition, ReferenceDefinition } from "./Options";
3
+ import { AggregationDefinition, SequelizeReferenceDefinition } from "./Options";
4
4
  import * as Library from "@fjell/lib";
5
5
  import { contextManager, createOperationContext, OperationContext } from "@fjell/lib";
6
6
  export type { OperationContext };
7
7
  export { createOperationContext, contextManager };
8
- export declare const processRow: <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(row: Model<any, any>, keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>, referenceDefinitions: ReferenceDefinition[], aggregationDefinitions: AggregationDefinition[], registry: Library.Registry, context?: OperationContext) => Promise<Item<S, L1, L2, L3, L4, L5>>;
8
+ export declare const processRow: <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(row: Model<any, any>, keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>, referenceDefinitions: SequelizeReferenceDefinition[], aggregationDefinitions: AggregationDefinition[], registry: Library.Registry, context?: OperationContext) => Promise<Item<S, L1, L2, L3, L4, L5>>;
9
9
  //# sourceMappingURL=RowProcessor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RowProcessor.d.ts","sourceRoot":"","sources":["../src/RowProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AACtC,OAAO,EAGL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAOpB,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,CAAC;AAElD,eAAO,MAAM,UAAU,GAAU,CAAC,SAAS,MAAM,EAC/C,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACvB,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EACpB,UAAU,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAClD,sBAAsB,mBAAmB,EAAE,EAC3C,wBAAwB,qBAAqB,EAAE,EAC/C,UAAU,OAAO,CAAC,QAAQ,EAC1B,UAAU,gBAAgB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAyCvC,CAAC"}
1
+ {"version":3,"file":"RowProcessor.d.ts","sourceRoot":"","sources":["../src/RowProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AACtC,OAAO,EAEL,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB,YAAY,EAAE,gBAAgB,EAAE,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,CAAC;AAElD,eAAO,MAAM,UAAU,GAAU,CAAC,SAAS,MAAM,EAC/C,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACvB,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EACpB,UAAU,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAClD,sBAAsB,4BAA4B,EAAE,EACpD,wBAAwB,qBAAqB,EAAE,EAC/C,UAAU,OAAO,CAAC,QAAQ,EAC1B,UAAU,gBAAgB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAyCvC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -8,4 +8,5 @@ export * as Contained from './contained';
8
8
  export * as Primary from './primary';
9
9
  export { createCoordinate, SCOPE_SEQUELIZE } from './Coordinate';
10
10
  export type { Coordinate } from './Coordinate';
11
+ export * from './processing/ReferenceBuilder';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AAGrC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AAGrC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,cAAc,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -7,14 +7,17 @@ var __export = (target, all) => {
7
7
  // src/Options.ts
8
8
  import * as Library from "@fjell/lib";
9
9
  var createOptions2 = (sequelizeOptions) => {
10
- const baseOptions = Library.createOptions(sequelizeOptions);
11
- const result = {
10
+ const { references, deleteOnRemove, ...libCompatibleOptions } = sequelizeOptions || {};
11
+ const baseOptions = Library.createOptions(libCompatibleOptions);
12
+ return {
12
13
  ...baseOptions,
13
- references: baseOptions.references ?? [],
14
+ references: references ?? [],
15
+ // Keep Sequelize-specific references
14
16
  aggregations: baseOptions.aggregations ?? [],
15
- deleteOnRemove: sequelizeOptions?.deleteOnRemove ?? false
17
+ // Ensure aggregations is always present
18
+ deleteOnRemove: deleteOnRemove ?? false
19
+ // Sequelize-specific option
16
20
  };
17
- return result;
18
21
  };
19
22
 
20
23
  // src/logger.ts
@@ -148,8 +151,10 @@ var addReferenceQueries = (options, references, model) => {
148
151
  if (!model.getAttributes()[`${key}Id`]) {
149
152
  throw new Error(`Reference ${key} is not supported on model '${model.name}', column '${key}Id' not found. Available columns: [${Object.keys(model.getAttributes()).join(", ")}]. Reference query: ${stringifyJSON(references[key])}`);
150
153
  }
151
- if (isPriKey(references[key])) {
152
- const priKey = references[key];
154
+ const refValue = references[key];
155
+ const keyValue = refValue.key || refValue;
156
+ if (isPriKey(keyValue)) {
157
+ const priKey = keyValue;
153
158
  if (priKey.pk == null || priKey.pk === "" || typeof priKey.pk === "object" && Object.keys(priKey.pk).length === 0) {
154
159
  logger3.error(`Reference key '${key}' has invalid pk value: ${stringifyJSON(priKey.pk)}`, { priKey, references });
155
160
  throw new Error(`Reference key '${key}' has invalid pk value: ${stringifyJSON(priKey.pk)}. Model: '${model.name}', Key type: '${priKey.kt}', Full reference: ${stringifyJSON(references[key])}`);
@@ -506,7 +511,6 @@ var addKey = (model, item, keyTypes) => {
506
511
  // src/RowProcessor.ts
507
512
  import {
508
513
  buildAggregation,
509
- buildReference,
510
514
  contextManager,
511
515
  createOperationContext
512
516
  } from "@fjell/lib";
@@ -544,6 +548,85 @@ var removeEvents = (item) => {
544
548
  return item;
545
549
  };
546
550
 
551
+ // src/processing/ReferenceBuilder.ts
552
+ var buildSequelizeReference = async (item, referenceDefinition, registry, context) => {
553
+ const libLogger = logger_default.get("processing", "ReferenceBuilder");
554
+ const primaryKeyType = referenceDefinition.kta[0];
555
+ if (referenceDefinition.kta.length > 1) {
556
+ libLogger.debug(
557
+ "Using multikey reference with PriKey assumption",
558
+ {
559
+ kta: referenceDefinition.kta,
560
+ primaryKeyType,
561
+ property: referenceDefinition.property,
562
+ column: referenceDefinition.column
563
+ }
564
+ );
565
+ libLogger.debug(
566
+ 'ASSUMPTION: The primary key for key type "%s" is unique and can be used to retrieve composite items',
567
+ primaryKeyType
568
+ );
569
+ }
570
+ if (!registry) {
571
+ throw new Error(
572
+ `This model definition has a reference definition, but the registry is not present. Reference property: '${referenceDefinition.property}', key types: [${referenceDefinition.kta.join(", ")}], column: '${referenceDefinition.column}'`
573
+ );
574
+ }
575
+ const library = registry.get(referenceDefinition.kta);
576
+ if (!library) {
577
+ throw new Error(
578
+ `This model definition has a reference definition, but the dependency is not present in registry. Reference property: '${referenceDefinition.property}', missing key type: '${primaryKeyType}', column: '${referenceDefinition.column}'`
579
+ );
580
+ }
581
+ const columnValue = item[referenceDefinition.column];
582
+ if (columnValue == null) {
583
+ item[referenceDefinition.property] = null;
584
+ return item;
585
+ }
586
+ const priKey = {
587
+ kt: primaryKeyType,
588
+ pk: columnValue
589
+ };
590
+ let referencedItem;
591
+ if (context) {
592
+ if (context.isCached(priKey)) {
593
+ libLogger.debug("Using cached reference", { priKey, property: referenceDefinition.property });
594
+ referencedItem = context.getCached(priKey);
595
+ } else if (context.isInProgress(priKey)) {
596
+ libLogger.debug("Circular dependency detected, creating reference placeholder", {
597
+ priKey,
598
+ property: referenceDefinition.property
599
+ });
600
+ referencedItem = {
601
+ key: priKey
602
+ // Add any other minimal properties that might be needed
603
+ // This prevents infinite loops while still providing the key for identification
604
+ };
605
+ } else {
606
+ context.markInProgress(priKey);
607
+ try {
608
+ referencedItem = await library.operations.get(priKey);
609
+ context.setCached(priKey, referencedItem);
610
+ } catch (error) {
611
+ throw error;
612
+ } finally {
613
+ context.markComplete(priKey);
614
+ }
615
+ }
616
+ } else {
617
+ referencedItem = await library.operations.get(priKey);
618
+ }
619
+ item[referenceDefinition.property] = referencedItem;
620
+ return item;
621
+ };
622
+ var stripSequelizeReferenceItems = (item, referenceDefinitions) => {
623
+ const result = { ...item };
624
+ for (const refDef of referenceDefinitions) {
625
+ delete result[refDef.property];
626
+ }
627
+ return result;
628
+ };
629
+
547
630
  // src/RowProcessor.ts
548
631
  var logger6 = logger_default.get("sequelize", "RowProcessor");
549
632
  var processRow = async (row, keyTypes, referenceDefinitions, aggregationDefinitions, registry, context) => {
@@ -560,7 +643,7 @@ var processRow = async (row, keyTypes, referenceDefinitions, aggregationDefiniti
560
643
  if (referenceDefinitions && referenceDefinitions.length > 0) {
561
644
  for (const referenceDefinition of referenceDefinitions) {
562
645
  logger6.default("Processing Reference for %s to %s", item.key.kt, stringifyJSON(referenceDefinition.kta));
563
- item = await buildReference(item, referenceDefinition, registry, operationContext);
646
+ item = await buildSequelizeReference(item, referenceDefinition, registry, operationContext);
564
647
  }
565
648
  }
566
649
  if (aggregationDefinitions && aggregationDefinitions.length > 0) {
@@ -674,7 +757,7 @@ var getAllOperation = (models, definition, registry) => {
674
757
  const matchingItems = await model.findAll(options);
675
758
  const currentContext = contextManager.getCurrentContext();
676
759
  const results = await Promise.all(matchingItems.map(async (row) => {
677
- const processedRow = await processRow(row, coordinate.kta, references, aggregations, registry, currentContext);
760
+ const processedRow = await processRow(row, coordinate.kta, references || [], aggregations || [], registry, currentContext);
678
761
  return validateKeys(processedRow, coordinate.kta);
679
762
  }));
680
763
  logger7.debug(`[ALL] Returning ${results.length} ${model.name} records`);
@@ -874,7 +957,7 @@ var getCreateOperation = (models, definition, registry) => {
874
957
  try {
875
958
  logger8.trace(`[CREATE] Executing ${model.name}.create() with data: ${stringifyJSON(itemData)}`);
876
959
  const createdRecord = await model.create(itemData);
877
- const processedRecord = await processRow(createdRecord, kta, references, aggregations, registry);
960
+ const processedRecord = await processRow(createdRecord, kta, references || [], aggregations || [], registry);
878
961
  const result = validateKeys2(processedRecord, kta);
879
962
  logger8.debug(`[CREATE] Created ${model.name} with key: ${result.key ? JSON.stringify(result.key) : `id=${createdRecord.id}`}`);
880
963
  return result;
@@ -903,7 +986,7 @@ var getFindOperation = (models, definition, registry) => {
903
986
  const results = await finderMethod(finderParams, locations);
904
987
  if (results && results.length > 0) {
905
988
  const processedResults = await Promise.all(results.map(async (row) => {
906
- const processedRow = await processRow(row, definition.coordinate.kta, references, aggregations, registry);
989
+ const processedRow = await processRow(row, definition.coordinate.kta, references || [], aggregations || [], registry);
907
990
  return validateKeys3(processedRow, definition.coordinate.kta);
908
991
  }));
909
992
  logger9.debug(`[FIND] Found ${processedResults.length} ${models[0].name} records using finder '${finder}'`);
@@ -987,7 +1070,7 @@ var getGetOperation = (models, definition, registry) => {
987
1070
  throw new NotFoundError("get", coordinate, key);
988
1071
  } else {
989
1072
  const currentContext = contextManager.getCurrentContext();
990
- const result = validateKeys4(await processRow(item, kta, references, aggregations, registry, currentContext), kta);
1073
+ const result = validateKeys4(await processRow(item, kta, references || [], aggregations || [], registry, currentContext), kta);
991
1074
  logger10.debug(`[GET] Retrieved ${model.name} with key: ${result.key ? JSON.stringify(result.key) : `id=${item.id}`}`);
992
1075
  return result;
993
1076
  }
@@ -1180,7 +1263,7 @@ var getUpdateOperation = (models, definition, registry) => {
1180
1263
  logger13.default(`Update properties configured: ${Object.keys(updateProps).join(", ")}`);
1181
1264
  logger13.trace(`[UPDATE] Executing ${model.name}.update() with properties: ${stringifyJSON(updateProps)}`);
1182
1265
  response = await response.update(updateProps);
1183
- const processedItem = await processRow(response, kta, references, aggregations, registry);
1266
+ const processedItem = await processRow(response, kta, references || [], aggregations || [], registry);
1184
1267
  const returnItem = validateKeys5(processedItem, kta);
1185
1268
  logger13.debug(`[UPDATE] Updated ${model.name} with key: ${returnItem.key ? JSON.stringify(returnItem.key) : `id=${response.id}`}`);
1186
1269
  return returnItem;
@@ -1330,12 +1413,14 @@ export {
1330
1413
  contained_exports as Contained,
1331
1414
  primary_exports as Primary,
1332
1415
  SCOPE_SEQUELIZE,
1416
+ buildSequelizeReference,
1333
1417
  createCoordinate,
1334
1418
  createDefinition,
1335
1419
  createOperations,
1336
1420
  createOptions2 as createOptions,
1337
1421
  createSequelizeLibrary,
1338
1422
  createSequelizeLibraryFactory,
1339
- isSequelizeLibrary
1423
+ isSequelizeLibrary,
1424
+ stripSequelizeReferenceItems
1340
1425
  };
1341
1426
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/Options.ts", "../src/logger.ts", "../src/Coordinate.ts", "../src/Definition.ts", "../src/SequelizeLibrary.ts", "../src/ops/all.ts", "../src/QueryBuilder.ts", "../src/util/general.ts", "../src/util/relationshipUtils.ts", "../src/KeyMaster.ts", "../src/RowProcessor.ts", "../src/EventCoordinator.ts", "../src/ops/create.ts", "../src/ops/find.ts", "../src/ops/get.ts", "../src/ops/one.ts", "../src/ops/remove.ts", "../src/ops/update.ts", "../src/ops/upsert.ts", "../src/Operations.ts", "../src/SequelizeLibraryFactory.ts", "../src/contained/index.ts", "../src/contained/SequelizeLibrary.ts", "../src/primary/index.ts", "../src/primary/SequelizeLibrary.ts"],
4
- "sourcesContent": ["import * as Library from '@fjell/lib';\nimport { Item } from '@fjell/core';\n\n// Re-export types from @fjell/lib for backwards compatibility\nexport type {\n AggregationDefinition,\n ReferenceDefinition\n} from '@fjell/lib';\n\nexport interface Options<\n V extends Item<S, L1, L2, L3, L4, L5>,\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> extends Library.Options<V, S, L1, L2, L3, L4, L5> {\n deleteOnRemove?: boolean;\n}\n\nexport const createOptions = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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>(sequelizeOptions?: Partial<Options<V, S, L1, L2, L3, L4, L5>>): Options<V, S, L1, L2, L3, L4, L5> => {\n // Create the base lib options (which handles references and aggregations)\n const baseOptions = Library.createOptions(sequelizeOptions);\n\n // Add Sequelize-specific defaults and ensure arrays for backward compatibility\n const result = {\n ...baseOptions,\n references: baseOptions.references ?? [],\n aggregations: baseOptions.aggregations ?? [],\n deleteOnRemove: sequelizeOptions?.deleteOnRemove ?? false,\n };\n\n return result as Options<V, S, L1, L2, L3, L4, L5>;\n}\n", "import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/lib-sequelize');\n\nexport default LibLogger;\n", "import { ItemTypeArray } from '@fjell/core';\nimport { Coordinate, createCoordinate as createBaseCoordinate } from '@fjell/registry';\nimport LibLogger from './logger';\n\nconst logger = LibLogger.get('Coordinate');\n\nexport const SCOPE_SEQUELIZE = 'sequelize';\n\nexport const createCoordinate = <\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>(kta: ItemTypeArray<S, L1, L2, L3, L4, L5>, scopes?: string[]): Coordinate<S, L1, L2, L3, L4, L5> => {\n logger.debug('createCoordinate', { kta, scopes });\n const coordinate = createBaseCoordinate(kta, [SCOPE_SEQUELIZE, ...(scopes || [])]);\n return coordinate;\n};\n\n// Re-export the Coordinate type\nexport type { Coordinate } from '@fjell/registry';\n", "import { Item, ItemTypeArray } from '@fjell/core';\nimport { createOptions, Options } from './Options';\nimport LibLogger from './logger';\nimport { createCoordinate } from './Coordinate';\n\nconst logger = LibLogger.get('lib-sequelize', 'Definition');\n\nexport interface Definition<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 coordinate: import('@fjell/registry').Coordinate<S, L1, L2, L3, L4, L5>;\n options: Options<V, S, L1, L2, L3, L4, L5>;\n}\n\nexport const createDefinition = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 kta: ItemTypeArray<S, L1, L2, L3, L4, L5>,\n scopes: string[],\n libOptions?: Partial<Options<V, S, L1, L2, L3, L4, L5>>,\n ): Definition<V, S, L1, L2, L3, L4, L5> => {\n logger.debug('createDefinition', { kta, scopes, libOptions });\n const coordinate = createCoordinate(kta, scopes);\n const options = createOptions<V, S, L1, L2, L3, L4, L5>(libOptions);\n\n return {\n coordinate,\n options,\n }\n}\n", "\nimport * as Library from '@fjell/lib';\nimport { Item } from '@fjell/core';\nimport { Coordinate } from '@fjell/registry';\nimport { Registry } from './Registry';\nimport { createOperations } from './Operations';\nimport { ModelStatic } from 'sequelize';\nimport { Options } from './Options';\nimport SequelizeLogger from './logger';\n\nconst logger = SequelizeLogger.get(\"SequelizeLibrary\");\n\n/**\n * The SequelizeLibrary interface extends the fjell-lib Library\n * and adds Sequelize-specific functionality:\n * - models: Array of Sequelize model classes for this library\n *\n * @template V - The type of the data model item, extending Item\n * @template S - The string literal type representing the model's key type\n * @template L1-L5 - Optional string literal types for location hierarchy levels\n */\nexport interface SequelizeLibrary<\n V extends Item<S, L1, L2, L3, L4, L5>,\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> extends Library.Library<V, S, L1, L2, L3, L4, L5> {\n /** Array of Sequelize model classes associated with this library */\n models: ModelStatic<any>[];\n}\n\n/**\n * Creates a new SequelizeLibrary that extends the fjell-lib Library\n * with Sequelize-specific functionality\n */\nexport const createSequelizeLibrary = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 registry: Registry,\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>,\n models: ModelStatic<any>[],\n options: Options<V, S, L1, L2, L3, L4, L5>\n ): SequelizeLibrary<V, S, L1, L2, L3, L4, L5> => {\n logger.debug(\"createSequelizeLibrary\", { coordinate, models, registry, options });\n\n // Create Sequelize-specific operations\n const operations = createOperations<V, S, L1, L2, L3, L4, L5>(models, coordinate, registry, options);\n\n // Wrap operations with validation and hooks from base library\n const wrappedOperations = Library.wrapOperations(operations, options, coordinate, registry);\n\n // Create the base fjell-lib library\n const libLibrary = Library.createLibrary(registry, coordinate, wrappedOperations, options);\n\n return {\n ...libLibrary,\n models,\n };\n}\n\n/**\n * Type guard to check if an object is a SequelizeLibrary\n */\nexport const isSequelizeLibrary = (library: any): library is SequelizeLibrary<any, any, any, any, any, any, any> => {\n return library != null &&\n library.coordinate != null &&\n library.operations != null &&\n library.options != null &&\n library.registry != null &&\n library.models != null &&\n Array.isArray(library.models);\n}\n", "/* eslint-disable no-undefined */\n/* eslint-disable indent */\nimport { validateKeys } from \"@fjell/core\";\n\nimport { buildQuery } from \"../QueryBuilder\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport * as Library from \"@fjell/lib\";\nimport { processRow } from \"../RowProcessor\";\nimport { Item, ItemQuery, LocKeyArray } from \"@fjell/core\";\nimport { ModelStatic, Op } from \"sequelize\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { contextManager } from \"../RowProcessor\";\n\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'all');\n\n// Helper function to merge includes avoiding duplicates\nconst mergeIncludes = (existingIncludes: any[], newIncludes: any[]): any[] => {\n const mergedIncludes = [...existingIncludes];\n\n for (const newInclude of newIncludes) {\n const existingIndex = mergedIncludes.findIndex(\n (existing: any) => existing.as === newInclude.as && existing.model === newInclude.model\n );\n if (existingIndex === -1) {\n mergedIncludes.push(newInclude);\n } else if (newInclude.include && mergedIncludes[existingIndex].include) {\n mergedIncludes[existingIndex].include = [\n ...mergedIncludes[existingIndex].include,\n ...newInclude.include\n ];\n } else if (newInclude.include) {\n mergedIncludes[existingIndex].include = newInclude.include;\n }\n }\n\n return mergedIncludes;\n};\n\nexport const getAllOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n const { coordinate, options: { references, aggregations } } = definition;\n\n //#region Query\n const all = async (\n itemQuery: ItemQuery,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [] | undefined\n ): Promise<V[]> => {\n logger.debug(`ALL operation called on ${models[0].name} with ${locations?.length || 0} location filters: ${locations?.map(loc => `${loc.kt}=${loc.lk}`).join(', ') || 'none'}`);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations || [];\n\n // @ts-ignore\n const model = models[0];\n\n // Build base query from itemQuery\n const options = buildQuery(itemQuery, model);\n\n // Handle location keys if present\n if (loc.length > 0) {\n const { kta } = coordinate;\n const directLocations: Array<{ kt: string; lk: any }> = [];\n const hierarchicalLocations: Array<{ kt: string; lk: any }> = [];\n const additionalIncludes: any[] = [];\n\n // Categorize location keys as direct or hierarchical\n for (const locKey of loc) {\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Location key '${locKey.kt}' cannot be resolved on model '${model.name}' or through its relationships.`;\n logger.error(errorMessage, { locations: loc, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n directLocations.push(locKey);\n } else {\n hierarchicalLocations.push(locKey);\n }\n }\n\n // Handle direct location keys (simple foreign key constraints)\n for (const locKey of directLocations) {\n if (locKey.lk === undefined || locKey.lk == null || locKey.lk === '' || (typeof locKey.lk === 'object' && Object.keys(locKey.lk).length === 0)) {\n logger.error(`Location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`, { locKey, locations: loc });\n throw new Error(`Location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`);\n }\n const foreignKeyField = locKey.kt + 'Id';\n\n // Check if this field already has a condition from the itemQuery\n if (options.where[foreignKeyField]) {\n logger.debug(`[ALL] Field ${foreignKeyField} already constrained by itemQuery, skipping location constraint to avoid conflicts`);\n continue; // Skip this location constraint to avoid conflicts\n }\n\n logger.trace(`[ALL] Setting direct location where clause: ${foreignKeyField} = ${stringifyJSON(locKey.lk)} (type: ${typeof locKey.lk})`);\n options.where[foreignKeyField] = {\n [Op.eq]: locKey.lk\n };\n }\n\n // Handle hierarchical location keys (requires relationship traversal)\n for (const locKey of hierarchicalLocations) {\n if (locKey.lk === undefined || locKey.lk == null || locKey.lk === '' || (typeof locKey.lk === 'object' && Object.keys(locKey.lk).length === 0)) {\n logger.error(`Hierarchical location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`, { locKey, locations: loc });\n throw new Error(`Hierarchical location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`);\n }\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta);\n\n if (relationshipInfo.found && relationshipInfo.path) {\n // Check if this field already has a condition from the itemQuery\n if (options.where[relationshipInfo.path]) {\n logger.debug(`[ALL] Field ${relationshipInfo.path} already constrained by itemQuery, skipping hierarchical location constraint to avoid conflicts`);\n continue; // Skip this location constraint to avoid conflicts\n }\n\n // Add the relationship constraint using the path\n logger.trace(`[ALL] Setting hierarchical location where clause: ${relationshipInfo.path} = ${stringifyJSON(locKey.lk)} (type: ${typeof locKey.lk})`);\n options.where[relationshipInfo.path] = {\n [Op.eq]: locKey.lk\n };\n\n // Add necessary includes for the relationship traversal\n if (relationshipInfo.includes) {\n additionalIncludes.push(...relationshipInfo.includes);\n }\n }\n }\n\n // Merge additional includes with existing includes\n if (additionalIncludes.length > 0) {\n const existingIncludes = options.include || [];\n options.include = mergeIncludes(existingIncludes, additionalIncludes);\n }\n }\n\n logger.default(`All query configured for ${model.name} with where fields: ${options.where ? Object.keys(options.where).join(', ') : 'none'}, includes: ${options.include?.length || 0}`);\n\n try {\n logger.trace(`[ALL] Executing ${model.name}.findAll() with options: ${JSON.stringify(options, null, 2)}`);\n } catch {\n // Fallback for cases where JSON.stringify fails on Sequelize operators\n logger.trace(`[ALL] Executing ${model.name}.findAll() with options containing non-serializable operators (${Object.keys(options.where || {}).length} where conditions)`);\n }\n const matchingItems = await model.findAll(options);\n\n // this.logger.default('Matching Items', { matchingItems });\n\n // Pass null as context to let processRow create a new context for each top-level operation\n // This prevents circular dependency false positives between concurrent operations\n // while still detecting legitimate circular references within the same operation\n\n // TODO: Move this Up!\n const currentContext = contextManager.getCurrentContext();\n const results = (await Promise.all(matchingItems.map(async (row: any) => {\n // Each row in an all() operation should get its own context to prevent interference\n const processedRow = await processRow(row, coordinate.kta, references, aggregations, registry, currentContext);\n return validateKeys(processedRow, coordinate.kta);\n }))) as V[];\n\n logger.debug(`[ALL] Returning ${results.length} ${model.name} records`);\n return results;\n }\n\n return all;\n\n}\n", "/* eslint-disable max-len */\nimport {\n CompoundCondition,\n Condition,\n EventQuery,\n isComKey,\n isCondition,\n isPriKey,\n ItemQuery,\n OrderBy,\n PriKey,\n References\n} from '@fjell/core';\n\nimport { Association, ModelStatic, Op } from 'sequelize';\nimport LibLogger from './logger';\nimport { stringifyJSON } from './util/general';\n\nconst logger = LibLogger.get('sequelize', 'QueryBuilder');\n\nexport type QueryOptions = {\n where: Record<string, any>;\n limit?: number;\n offset?: number;\n order?: Array<[string, string]>;\n include?: Array<any>;\n}\n\nconst addDeleteQuery = (options: QueryOptions, model: ModelStatic<any>): QueryOptions => {\n logger.default(`QueryBuilder adding delete query with options: ${stringifyJSON(options)}`);\n if (model.getAttributes().deletedAt) {\n options.where['deletedAt'] = {\n [Op.eq]: null\n }\n } else if (model.getAttributes().isDeleted) {\n options.where['isDeleted'] = {\n [Op.eq]: false\n }\n }\n\n return options;\n}\n\nconst addEventQueries = (\n options: QueryOptions, events: Record<string, EventQuery>, model: ModelStatic<any>): QueryOptions => {\n logger.default(`QueryBuilder adding event queries with options: ${stringifyJSON(options)}, events: ${stringifyJSON(events)}`);\n Object.keys(events).forEach((key: string) => {\n\n if (!model.getAttributes()[`${key}At`]) {\n throw new Error(`Event ${key} is not supported on model '${model.name}', column '${key}At' not found. Available columns: [${Object.keys(model.getAttributes()).join(', ')}]. Event query: ${stringifyJSON(events[key])}`);\n }\n\n let whereClauses = {};\n\n const event = events[key];\n if (event.start) {\n whereClauses = { ...whereClauses, [Op.gte]: new Date(event.start) };\n }\n if (event.end) {\n whereClauses = { ...whereClauses, [Op.lt]: new Date(event.end) };\n }\n\n if (event.by) {\n if (!model.getAttributes()[`${key}By`]) {\n throw new Error(`Event ${key} is not supported on model '${model.name}', column '${key}By' not found. Available columns: [${Object.keys(model.getAttributes()).join(', ')}]. Event query: ${stringifyJSON(events[key])}`);\n }\n whereClauses = { ...whereClauses, [Op.eq]: event.by };\n }\n\n options.where[`${key}At`] = whereClauses;\n\n });\n return options;\n}\n\n// Add the references to the query\nconst addReferenceQueries = (options: any, references: References, model: ModelStatic<any>): any => {\n logger.default(`QueryBuilder adding reference queries with options: ${stringifyJSON(options)}, references: ${stringifyJSON(references)}`);\n\n Object.keys(references).forEach((key: string) => {\n logger.default(`QueryBuilder adding reference query for key: ${key}, references: ${stringifyJSON(references)}`);\n\n if (!model.getAttributes()[`${key}Id`]) {\n throw new Error(`Reference ${key} is not supported on model '${model.name}', column '${key}Id' not found. Available columns: [${Object.keys(model.getAttributes()).join(', ')}]. Reference query: ${stringifyJSON(references[key])}`);\n }\n\n if (isPriKey(references[key])) {\n const priKey: PriKey<string> = references[key] as PriKey<string>;\n\n if (priKey.pk == null || priKey.pk === '' || (typeof priKey.pk === 'object' && Object.keys(priKey.pk).length === 0)) {\n logger.error(`Reference key '${key}' has invalid pk value: ${stringifyJSON(priKey.pk)}`, { priKey, references });\n throw new Error(`Reference key '${key}' has invalid pk value: ${stringifyJSON(priKey.pk)}. Model: '${model.name}', Key type: '${priKey.kt}', Full reference: ${stringifyJSON(references[key])}`);\n }\n\n logger.trace(`[QueryBuilder] Setting reference where clause: ${key}Id = ${stringifyJSON(priKey.pk)} (type: ${typeof priKey.pk})`);\n options.where[`${key}Id`] = {\n [Op.eq]: priKey.pk\n }\n } else if (isComKey(references[key])) {\n throw new Error(`ComKeys are not supported in Sequelize. Reference key: '${key}', Model: '${model.name}', ComKey: ${stringifyJSON(references[key])}`);\n }\n });\n return options;\n}\n\nexport const addCompoundCondition = (options: any, compoundCondition: CompoundCondition, model: ModelStatic<any>) => {\n // Ensure options.where exists\n options.where = options.where || {};\n\n let compoundOp: symbol;\n const compoundType = compoundCondition.compoundType;\n if (compoundType === \"AND\") {\n compoundOp = Op.and;\n } else {\n compoundOp = Op.or;\n };\n\n let conditions: Record<string, any> = {};\n compoundCondition.conditions.forEach((condition: Condition | CompoundCondition) => {\n if (isCondition(condition)) {\n conditions = addCondition(conditions, condition, model);\n } else {\n throw new Error(`Nested Compound conditions not supported. Model: '${model.name}', Compound condition: ${stringifyJSON(compoundCondition)}, Nested condition: ${stringifyJSON(condition)}`);\n }\n });\n\n // Merge with existing where conditions instead of replacing\n if (Object.keys(options.where).length > 0) {\n // If there are existing conditions, wrap everything in an AND\n options.where = {\n [Op.and]: [\n options.where,\n { [compoundOp]: conditions }\n ]\n };\n } else {\n // If no existing conditions, just set the compound condition\n options.where[compoundOp] = conditions;\n }\n\n return options;\n}\n\nconst getSequelizeOperator = (operator: string): symbol => {\n if (operator === '==') {\n return Op.eq;\n } else if (operator === '<') {\n return Op.lt;\n } else if (operator === '>') {\n return Op.gt;\n } else if (operator === '<=') {\n return Op.lte;\n } else if (operator === '>=') {\n return Op.gte;\n } else if (operator === 'in') {\n return Op.in;\n } else {\n throw new Error(`Operator ${operator} not supported`);\n }\n};\n\nconst addAssociationCondition = (\n conditions: Record<string, any>,\n condition: Condition,\n model: ModelStatic<any>\n): Record<string, any> => {\n const [associationName, attributeName] = condition.column.split('.', 2);\n\n // Check if the association exists on the model\n if (!model.associations || !model.associations[associationName]) {\n throw new Error(`Association ${associationName} not found on model ${model.name}`);\n }\n\n const association: Association<any, any> = model.associations[associationName];\n const associatedModel = association.target;\n\n // Check if the attribute exists on the associated model\n if (!associatedModel.getAttributes()[attributeName]) {\n throw new Error(`Attribute ${attributeName} not found on associated model ${associatedModel.name} for association ${associationName}`);\n }\n\n // Use Sequelize's $association.attribute$ syntax for querying associated models\n const sequelizeAssociationColumn = `$${associationName}.${attributeName}$`;\n const conditionOp = getSequelizeOperator(condition.operator);\n\n if (condition.value == null && condition.operator !== '==' && condition.operator !== 'in') {\n logger.error(`Association condition for '${associationName}.${attributeName}' has undefined/null value`, { condition });\n throw new Error(`Association condition for '${associationName}.${attributeName}' has undefined/null value`);\n }\n\n logger.trace(`[QueryBuilder] Setting association condition: ${sequelizeAssociationColumn} = ${stringifyJSON(condition.value)} (type: ${typeof condition.value})`);\n conditions[sequelizeAssociationColumn] = {\n [conditionOp]: condition.value\n };\n\n return conditions;\n};\n\nconst addAttributeCondition = (\n conditions: Record<string, any>,\n condition: Condition,\n model: ModelStatic<any>\n): Record<string, any> => {\n const conditionColumn = condition.column;\n\n if (!model.getAttributes()[conditionColumn]) {\n throw new Error(`Condition column ${conditionColumn} not found on model ${model.name}`);\n }\n\n const conditionOp = getSequelizeOperator(condition.operator);\n\n if (condition.value == null && condition.operator !== '==' && condition.operator !== 'in') {\n logger.error(`Attribute condition for '${conditionColumn}' has undefined/null value`, { condition });\n throw new Error(`Attribute condition for '${conditionColumn}' has undefined/null value`);\n }\n\n logger.trace(`[QueryBuilder] Setting attribute condition: ${conditionColumn} = ${stringifyJSON(condition.value)} (type: ${typeof condition.value})`);\n conditions[conditionColumn] = {\n [conditionOp]: condition.value\n };\n\n return conditions;\n};\n\nexport const addCondition = (conditions: Record<string, any>, condition: Condition, model: ModelStatic<any>) => {\n const conditionColumn: string = condition.column;\n\n // Check if this is an association query (contains a dot)\n if (conditionColumn.includes('.')) {\n return addAssociationCondition(conditions, condition, model);\n }\n\n // Handle regular column queries\n return addAttributeCondition(conditions, condition, model);\n}\n\nconst collectAssociationsFromConditions = (conditions: any): Set<string> => {\n const associations = new Set<string>();\n\n const processObject = (obj: any) => {\n if (typeof obj === 'object' && obj !== null) {\n // Check string keys\n Object.keys(obj).forEach(key => {\n // Check if this is an association reference ($association.attribute$)\n if (typeof key === 'string' && key.startsWith('$') && key.endsWith('$') && key.includes('.')) {\n const associationName = key.substring(1, key.indexOf('.'));\n associations.add(associationName);\n }\n\n // Recursively process nested objects\n if (typeof obj[key] === 'object') {\n processObject(obj[key]);\n }\n });\n\n // Also check Symbol keys (for compound conditions like Op.and, Op.or)\n Object.getOwnPropertySymbols(obj).forEach(symbol => {\n if (typeof obj[symbol] === 'object') {\n processObject(obj[symbol]);\n }\n });\n }\n\n // Handle arrays (for compound conditions that might be arrays)\n if (Array.isArray(obj)) {\n obj.forEach(item => {\n if (typeof item === 'object') {\n processObject(item);\n }\n });\n }\n };\n\n processObject(conditions);\n return associations;\n};\n\nconst addAssociationIncludes = (options: any, model: ModelStatic<any>): any => {\n // Collect all association names used in conditions\n const referencedAssociations = collectAssociationsFromConditions(options.where);\n\n if (referencedAssociations.size > 0) {\n options.include = options.include || [];\n\n // Add each referenced association to the include array\n referencedAssociations.forEach(associationName => {\n // Check if this association is already included\n const alreadyIncluded = options.include.some((inc: any) =>\n (typeof inc === 'string' && inc === associationName) ||\n (typeof inc === 'object' && inc.association === associationName)\n );\n\n if (!alreadyIncluded && model.associations && model.associations[associationName]) {\n options.include.push({\n model: model.associations[associationName].target,\n as: associationName,\n required: false // Use LEFT JOIN so records without associations are still returned\n });\n }\n });\n }\n\n return options;\n};\n\nexport const buildQuery = (\n itemQuery: ItemQuery,\n model: ModelStatic<any>\n): any => {\n logger.default(`QueryBuilder build called with itemQuery: ${stringifyJSON(itemQuery)}`);\n\n let options: any = {\n where: {},\n };\n\n if (itemQuery.compoundCondition) {\n logger.default(`QueryBuilder adding conditions: ${stringifyJSON(itemQuery.compoundCondition)}`);\n options = addCompoundCondition(options, itemQuery.compoundCondition, model);\n }\n\n // If the model has a deletedAt column, we need to add a delete query\n if (model.getAttributes().deletedAt || model.getAttributes().isDeleted) {\n options = addDeleteQuery(options, model);\n }\n\n if (itemQuery.refs) {\n options = addReferenceQueries(options, itemQuery.refs, model);\n }\n if (itemQuery.events) {\n options = addEventQueries(options, itemQuery.events, model);\n }\n\n // TODO: Once we start to support Aggs on the server-side, we'll need to parse agg queries\n\n // Apply a limit to the result set\n if (itemQuery.limit) {\n logger.default(`QueryBuilder applying limit: ${itemQuery.limit}`);\n options.limit = itemQuery.limit;\n }\n\n // Apply an offset to the result set\n if (itemQuery.offset) {\n options.offset = itemQuery.offset;\n }\n\n // Add orderBy to the query\n if (itemQuery.orderBy) {\n itemQuery.orderBy.forEach((orderBy: OrderBy) => {\n if (!model.getAttributes()[orderBy.field]) {\n throw new Error(`Order by field ${orderBy.field} not found on model ${model.name}`);\n }\n options.order = [\n [orderBy.field, orderBy.direction]\n ];\n });\n }\n\n // Add includes for any associations referenced in conditions\n options = addAssociationIncludes(options, model);\n\n return options;\n}\n", "\n/* eslint-disable */\nexport const clean = (obj: any) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, v]) => v !== undefined)\n );\n}\n\n//Recursive implementation of jSON.stringify;\nexport const stringifyJSON = function (obj: any, visited: Set<any> = new Set()): string {\n const arrOfKeyVals: string[] = [];\n const arrVals: string[] = [];\n let objKeys: string[] = [];\n\n /*********CHECK FOR PRIMITIVE TYPES**********/\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null)\n return '' + obj;\n else if (typeof obj === 'string')\n return '\"' + obj + '\"';\n\n /*********DETECT CIRCULAR REFERENCES**********/\n if (obj instanceof Object && visited.has(obj)) {\n return '\"(circular)\"';\n }\n\n /*********CHECK FOR ARRAY**********/\n else if (Array.isArray(obj)) {\n //check for empty array\n if (obj.length === 0)\n return '[]';\n else {\n // Add array to visited before processing its elements\n visited.add(obj);\n obj.forEach(function (el) {\n arrVals.push(stringifyJSON(el, visited));\n });\n // Remove from visited after processing to allow arrays at different levels\n visited.delete(obj);\n return '[' + arrVals + ']';\n }\n }\n /*********CHECK FOR OBJECT**********/\n else if (obj instanceof Object) {\n // Add object to visited before processing its properties\n visited.add(obj);\n //get object keys\n objKeys = Object.keys(obj);\n //set key output;\n objKeys.forEach(function (key) {\n const keyOut = '\"' + key + '\":';\n const keyValOut = obj[key];\n //skip functions and undefined properties\n if (keyValOut instanceof Function || keyValOut === undefined)\n return; // Skip this entry entirely instead of pushing an empty string\n else if (typeof keyValOut === 'string')\n arrOfKeyVals.push(keyOut + '\"' + keyValOut + '\"');\n else if (typeof keyValOut === 'boolean' || typeof keyValOut === 'number' || keyValOut === null)\n arrOfKeyVals.push(keyOut + keyValOut);\n //check for nested objects, call recursively until no more objects\n else if (keyValOut instanceof Object) {\n arrOfKeyVals.push(keyOut + stringifyJSON(keyValOut, visited));\n }\n });\n // Remove from visited after processing to allow objects at different levels\n visited.delete(obj);\n return '{' + arrOfKeyVals + '}';\n }\n return '';\n};\n", "/* eslint-disable indent */\nimport { ModelStatic } from 'sequelize';\n\nexport interface RelationshipChainResult {\n success: boolean;\n path?: string;\n includes?: any[];\n}\n\nexport interface RelationshipPathResult {\n found: boolean;\n path?: string;\n includes?: any[];\n isDirect?: boolean;\n}\n\n/**\n * Helper function to build relationship chain includes\n */\nexport const buildRelationshipChain = (\n targetModel: ModelStatic<any>,\n kta: string[],\n currentIndex: number,\n targetIndex: number\n): RelationshipChainResult => {\n // Build the association path and validate relationships exist\n const associationParts: string[] = [];\n const modelChain: ModelStatic<any>[] = [targetModel];\n let currentModel = targetModel;\n\n // Validate that all associations exist and build model chain\n for (let i = currentIndex + 1; i <= targetIndex; i++) {\n const intermediateType = kta[i];\n const associationName = intermediateType;\n\n if (!currentModel.associations || !currentModel.associations[associationName]) {\n return { success: false };\n }\n\n associationParts.push(associationName);\n currentModel = currentModel.associations[associationName].target;\n modelChain.push(currentModel);\n }\n\n // Build the full association path for the target field\n const targetPrimaryKey = currentModel.primaryKeyAttribute || 'id';\n const associationPath = `$${associationParts.join('.')}.${targetPrimaryKey}$`;\n\n // Build nested includes structure iteratively (clearer than recursion)\n let deepestInclude: any = null;\n\n // Build from the deepest level back to the root\n for (let i = targetIndex; i > currentIndex; i--) {\n const currentType = kta[i];\n const modelIndex = i - currentIndex;\n\n const includeObj: any = {\n model: modelChain[modelIndex],\n as: currentType,\n required: true\n };\n\n if (deepestInclude) {\n includeObj.include = [deepestInclude];\n }\n\n deepestInclude = includeObj;\n }\n\n const includes = deepestInclude ? [deepestInclude] : [];\n\n return { success: true, path: associationPath, includes };\n};\n\n/**\n * Helper function to build relationship path for a locator\n * @param includeIsDirect Whether to include the isDirect flag in the result\n */\nexport const buildRelationshipPath = (\n targetModel: ModelStatic<any>,\n locatorType: string,\n kta: string[],\n includeIsDirect: boolean = false\n): RelationshipPathResult => {\n\n // First check if the field exists directly\n const directFieldName = `${locatorType}Id`;\n const attributes = targetModel.getAttributes();\n if (attributes && attributes[directFieldName]) {\n const result: RelationshipPathResult = { found: true };\n if (includeIsDirect) {\n result.isDirect = true;\n }\n return result;\n }\n\n // If not direct, look for relationship path\n const targetIndex = kta.indexOf(locatorType);\n if (targetIndex === -1) {\n const result: RelationshipPathResult = { found: false };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n }\n\n const currentIndex = 0; // We're always looking from the base model\n\n if (targetIndex <= currentIndex) {\n const result: RelationshipPathResult = { found: false };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n }\n\n const chainResult = buildRelationshipChain(targetModel, kta, currentIndex, targetIndex);\n if (chainResult.success) {\n const result: RelationshipPathResult = {\n found: true,\n path: chainResult.path,\n includes: chainResult.includes\n };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n }\n\n const result: RelationshipPathResult = { found: false };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n};\n", "/* eslint-disable max-len */\n/* eslint-disable indent */\nimport {\n AllItemTypeArrays,\n Item,\n} from '@fjell/core';\n\nimport LibLogger from './logger';\nimport { Model, ModelStatic } from 'sequelize';\nimport { buildRelationshipPath } from './util/relationshipUtils';\n\nconst logger = LibLogger.get('sequelize', 'KeyMaster');\n\n// Helper function to extract location key value from item\nconst extractLocationKeyValue = (\n model: ModelStatic<any>,\n item: any,\n locatorType: string,\n kta: string[]\n): any => {\n logger.default('Extracting location key value', { locatorType, kta });\n\n const relationshipInfo = buildRelationshipPath(model, locatorType, kta, true);\n\n if (!relationshipInfo.found) {\n throw new Error(`Location key '${locatorType}' cannot be resolved on model '${model.name}' or through its relationships. Key type array: [${kta.join(', ')}]. Available associations: [${Object.keys(model.associations || {}).join(', ')}]`);\n }\n\n if (relationshipInfo.isDirect) {\n // Direct foreign key field\n const foreignKeyField = `${locatorType}Id`;\n const value = item[foreignKeyField];\n if (typeof value === 'undefined' || value === null) {\n throw new Error(`Direct foreign key field '${foreignKeyField}' is missing or null in item. Model: '${model.name}', Locator type: '${locatorType}', Available item properties: [${Object.keys(item || {}).join(', ')}]`);\n }\n return value;\n } else {\n // Need to traverse relationship hierarchy\n // Find the path through the key type array\n const locatorIndex = kta.indexOf(locatorType);\n if (locatorIndex === -1) {\n throw new Error(`Locator type '${locatorType}' not found in key type array. Model: '${model.name}', Key type array: [${kta.join(', ')}]`);\n }\n\n // Start from the current item (index 0 in kta)\n let currentObject = item;\n\n // Traverse through each intermediate relationship to reach the target\n for (let i = 1; i < locatorIndex; i++) {\n const intermediateType = kta[i];\n\n // Check if the intermediate relationship object is loaded\n if (currentObject[intermediateType] && typeof currentObject[intermediateType] === 'object') {\n currentObject = currentObject[intermediateType];\n } else {\n // Try the foreign key approach if the relationship object isn't loaded\n const foreignKeyField = `${intermediateType}Id`;\n if (typeof currentObject[foreignKeyField] !== 'undefined' && currentObject[foreignKeyField] !== null) {\n // We have the foreign key but not the loaded object, we can't traverse further\n throw new Error(`Intermediate relationship '${intermediateType}' is not loaded. Cannot traverse to '${locatorType}'. Model: '${model.name}', Available item properties: [${Object.keys(currentObject || {}).join(', ')}]. Either include the relationship in your query or ensure it's loaded.`);\n }\n throw new Error(`Intermediate relationship '${intermediateType}' is missing in the relationship chain. Model: '${model.name}', Expected path: ${kta.slice(0, locatorIndex + 1).join(' \u2192 ')}, Available item properties: [${Object.keys(currentObject || {}).join(', ')}]`);\n }\n }\n\n // Now extract the target locator value from the current object\n // First try to get it from the loaded relationship object\n if (currentObject[locatorType] && typeof currentObject[locatorType] === 'object' && typeof currentObject[locatorType].id !== 'undefined') {\n return currentObject[locatorType].id;\n }\n\n // If the relationship object isn't loaded, try the foreign key field\n const foreignKeyField = `${locatorType}Id`;\n if (typeof currentObject[foreignKeyField] !== 'undefined' && currentObject[foreignKeyField] !== null) {\n return currentObject[foreignKeyField];\n }\n\n const traversalPath = kta.slice(0, locatorIndex + 1).join(' \u2192 ');\n throw new Error(\n `Unable to extract location key for '${locatorType}'. ` +\n `Neither the relationship object nor direct foreign key is available. ` +\n `Traversal path: ${traversalPath}`\n );\n }\n};\n\nexport const removeKey = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>,\n): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Removing Key', { item });\n delete item.key;\n return item;\n}\n\n// export const populateKey = <\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: ItemProperties<S, L1, L2, L3, L4, L5>,\n// keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>\n// ): ItemProperties<S, L1, L2, L3, L4, L5> => {\n// if (keyTypes.length === 1) {\n// item.key = { kt: keyTypes[0], pk: item.id };\n// delete item.id;\n// } else if (keyTypes.length === 2) {\n// item.key = {\n// kt: keyTypes[0], pk: item.id,\n// // TODO: Shouldn't this be inspecting the model to get the primary key type?\n// loc: [{ kt: keyTypes[1], lk: item[keyTypes[1] + 'Id'] }],\n// };\n// delete item.id;\n// delete item[keyTypes[1] + 'Id'];\n// } else {\n// throw new Error('Not implemented');\n// }\n// return item;\n// }\n\nexport const addKey = <\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 model: Model<any, any>,\n item: Partial<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.default('Adding Key', { item });\n const key = {};\n const modelClass = model.constructor as ModelStatic<any>;\n const primaryKeyAttr = modelClass.primaryKeyAttribute;\n\n if (Array.isArray(keyTypes) && keyTypes.length > 1) {\n const type = [...keyTypes];\n const pkType = type.shift();\n Object.assign(key, { kt: pkType, pk: item[primaryKeyAttr] });\n\n // Build location keys for composite key\n const locationKeys = [];\n for (const locatorType of type) {\n try {\n const lk = extractLocationKeyValue(modelClass, item, locatorType, keyTypes as string[]);\n locationKeys.push({ kt: locatorType, lk });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to extract location key for '${locatorType}'`, { error: errorMessage, item, keyTypes });\n throw error;\n }\n }\n\n Object.assign(key, { loc: locationKeys });\n } else {\n Object.assign(key, { kt: keyTypes[0], pk: item[primaryKeyAttr] });\n }\n Object.assign(item, { key });\n return item as Item<S, L1, L2, L3, L4, L5>;\n};\n", "/* eslint-disable indent */\n\nimport { AllItemTypeArrays, Item } from \"@fjell/core\";\nimport { Model } from \"sequelize\";\n\nimport LibLogger from \"./logger\";\nimport { addKey } from \"./KeyMaster\";\nimport { AggregationDefinition, ReferenceDefinition } from \"./Options\";\nimport * as Library from \"@fjell/lib\";\nimport {\n buildAggregation,\n buildReference,\n contextManager,\n createOperationContext,\n OperationContext\n} from \"@fjell/lib\";\nimport { stringifyJSON } from \"./util/general\";\nimport { populateEvents } from \"./EventCoordinator\";\n\nconst logger = LibLogger.get('sequelize', 'RowProcessor');\n\n// Re-export types and functions from @fjell/lib for backwards compatibility\nexport type { OperationContext };\nexport { createOperationContext, contextManager };\n\nexport const processRow = async <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 row: Model<any, any>,\n keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>,\n referenceDefinitions: ReferenceDefinition[],\n aggregationDefinitions: AggregationDefinition[],\n registry: Library.Registry,\n context?: OperationContext\n ): Promise<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Processing Row', { row });\n\n // Use provided context or create new one\n const operationContext = context || createOperationContext();\n\n // Process the row within the context to ensure all operations share the same context\n return contextManager.withContext(operationContext, async () => {\n let item = row.get({ plain: true }) as any;\n logger.default('Adding Key to Item with Key Types: %s', stringifyJSON(keyTypes));\n item = addKey(row, item, keyTypes);\n item = populateEvents(item);\n logger.default('Key Added to Item: %s', stringifyJSON(item.key));\n\n // Mark this item as in progress to detect circular references\n operationContext.markInProgress(item.key);\n\n try {\n if (referenceDefinitions && referenceDefinitions.length > 0) {\n for (const referenceDefinition of referenceDefinitions) {\n logger.default('Processing Reference for %s to %s', item.key.kt, stringifyJSON(referenceDefinition.kta));\n item = await buildReference(item, referenceDefinition, registry, operationContext);\n }\n }\n if (aggregationDefinitions && aggregationDefinitions.length > 0) {\n for (const aggregationDefinition of aggregationDefinitions) {\n logger.default('Processing Aggregation for %s from %s', item.key.kt, stringifyJSON(aggregationDefinition.kta));\n item = await buildAggregation(item, aggregationDefinition, registry, operationContext);\n }\n }\n\n // Cache the fully processed item\n operationContext.setCached(item.key, item);\n } finally {\n // Mark this item as complete\n operationContext.markComplete(item.key);\n }\n\n logger.default('Processed Row: %j', stringifyJSON(item));\n return item as Item<S, L1, L2, L3, L4, L5>;\n });\n};\n", "import {\n Evented,\n Item,\n ManagedEvents\n} from '@fjell/core';\nimport deepmerge from 'deepmerge';\n\nimport LibLogger from './logger';\n\nconst logger = LibLogger.get(\"sequelize\", \"EventCoordinator\");\n\nexport const createEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>):\n Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Creating Events', { item });\n const currentDate = new Date();\n\n let events = item.events;\n\n if (events) {\n if (!events.created) {\n events = deepmerge(events, { created: { at: currentDate } });\n }\n if (!events.updated) {\n events = deepmerge(events, { updated: { at: currentDate } });\n }\n if (!events.deleted) {\n events = deepmerge(events, { deleted: { at: null } });\n }\n\n } else {\n events = {\n created: { at: currentDate },\n updated: { at: currentDate },\n deleted: { at: null },\n };\n }\n\n return deepmerge(item, { events }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n}\n\nexport const updateEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>):\n Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Updating Events', { item });\n const currentDate = new Date();\n const events: Evented = {\n updated: { at: currentDate },\n };\n\n // TODO: This is clean-up code, we should remove it\n // If the event lacks a created data, let's just insert it here...\n if (!item.events || !item.events.created || !item.events.created.at) {\n events.created = { at: currentDate };\n }\n\n return deepmerge(item, { events }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n}\n//#endregion\n\nexport const populateEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n const events: ManagedEvents = {\n created: { at: item.createdAt || null },\n updated: { at: item.updatedAt || null },\n deleted: { at: null }\n };\n item.events = events;\n return item;\n}\n\nexport const extractEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Extracting Events to database fields', { item });\n\n if (item.events) {\n if (item.events.created?.at) {\n item.createdAt = item.events.created.at;\n }\n if (item.events.updated?.at) {\n item.updatedAt = item.events.updated.at;\n }\n if (item.events.deleted?.at) {\n item.deletedAt = item.events.deleted.at;\n }\n }\n\n return item;\n}\n\nexport const removeEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Removing Events', { item });\n delete item.events;\n return item;\n}\n", "/* eslint-disable indent */\nimport { ComKey, isComKey, isPriKey, Item, LocKeyArray, PriKey, validateKeys } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport { processRow } from \"../RowProcessor\";\nimport * as Library from \"@fjell/lib\";\nimport { ModelStatic } from \"sequelize\";\nimport { extractEvents, removeEvents } from \"../EventCoordinator\";\nimport { buildRelationshipChain, buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'create');\n\n// Helper function to translate PostgreSQL errors to meaningful messages\nfunction translateDatabaseError(error: any, itemData: any, modelName: string): Error {\n const originalMessage = error.message || '';\n const errorCode = error.original?.code;\n const constraint = error.original?.constraint;\n const detail = error.original?.detail;\n\n logger.error('Database error during create operation', {\n errorCode,\n constraint,\n detail,\n originalMessage,\n modelName,\n itemData: JSON.stringify(itemData, null, 2)\n });\n\n // Handle specific PostgreSQL error codes\n switch (errorCode) {\n case '23505': // unique_violation\n if (constraint) {\n return new Error(`Duplicate value violates unique constraint '${constraint}'. ${detail || ''}`);\n }\n return new Error(`Duplicate value detected. This record already exists. ${detail || ''}`);\n\n case '23503': // foreign_key_violation\n if (constraint) {\n return new Error(`Foreign key constraint '${constraint}' violated. Referenced record does not exist. ${detail || ''}`);\n }\n return new Error(`Referenced record does not exist. Check that all related records are valid. ${detail || ''}`);\n\n case '23502': // not_null_violation\n const column = error.original?.column;\n if (column) {\n return new Error(`Required field '${column}' cannot be null`);\n }\n return new Error(`Required field is missing or null`);\n\n case '23514': // check_violation\n if (constraint) {\n return new Error(`Check constraint '${constraint}' violated. ${detail || ''}`);\n }\n return new Error(`Data validation failed. Check constraint violated. ${detail || ''}`);\n\n case '22001': // string_data_right_truncation\n return new Error(`Data too long for field. Check string lengths. ${detail || ''}`);\n\n case '22003': // numeric_value_out_of_range\n return new Error(`Numeric value out of range. Check number values. ${detail || ''}`);\n\n case '42703': // undefined_column\n const undefinedColumn = error.original?.column;\n if (undefinedColumn) {\n return new Error(`Column '${undefinedColumn}' does not exist in table '${modelName}'`);\n }\n return new Error(`Referenced column does not exist`);\n\n case '42P01': // undefined_table\n return new Error(`Table '${modelName}' does not exist`);\n\n default:\n // Handle SQLite-specific errors that don't have error codes\n if (originalMessage.includes('notNull Violation')) {\n const fieldMatches = originalMessage.match(/([a-zA-Z]+\\.[a-zA-Z]+) cannot be null/g);\n if (fieldMatches) {\n const fields = fieldMatches.map((match: string) => {\n const parts = match.split('.');\n return parts[1]?.split(' ')[0]; // Extract field name like 'code' from 'WidgetType.code'\n }).filter(Boolean);\n if (fields.length > 0) {\n return new Error(`Required field${fields.length > 1 ? 's' : ''} ${fields.join(', ')} cannot be null`);\n }\n }\n return new Error('Required fields are missing');\n }\n\n // For unknown errors, provide the original message with context\n return new Error(`Database error in ${modelName}.create(): ${originalMessage}. Item data: ${JSON.stringify(itemData, null, 2)}`);\n }\n}\n\n// Helper function to validate hierarchical chain exists\nasync function validateHierarchicalChain(\n models: ModelStatic<any>[],\n locKey: { kt: string; lk: any },\n kta: string[]\n): Promise<void> {\n try {\n // Find the direct parent model that contains this locator\n const locatorIndex = kta.indexOf(locKey.kt);\n if (locatorIndex === -1) {\n throw new Error(`Locator type '${locKey.kt}' not found in kta array`);\n }\n\n // Get the model for this locator\n const locatorModel = models[locatorIndex] || models[0]; // Fallback to primary model\n\n // Build a query to validate the chain exists\n const chainResult = buildRelationshipChain(locatorModel, kta, locatorIndex, kta.length - 1);\n\n if (!chainResult.success) {\n // If we can't build a chain, just validate the record exists\n const record = await locatorModel.findByPk(locKey.lk);\n if (!record) {\n throw new Error(`Referenced ${locKey.kt} with id ${locKey.lk} does not exist`);\n }\n return;\n }\n\n // Validate that the chain exists\n const queryOptions: any = {\n where: { id: locKey.lk }\n };\n\n if (chainResult.includes && chainResult.includes.length > 0) {\n queryOptions.include = chainResult.includes;\n }\n\n const record = await locatorModel.findOne(queryOptions);\n if (!record) {\n throw new Error(`Referenced ${locKey.kt} with id ${locKey.lk} does not exist or chain is invalid`);\n }\n } catch (error: any) {\n // Add context to validation errors\n if (error.original) {\n throw translateDatabaseError(error, { locKey, kta }, locKey.kt);\n }\n throw error;\n }\n}\n\nexport const getCreateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n\n registry: Library.Registry\n) => {\n\n const create = async (\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n options?: {\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n locations?: never;\n } | {\n key?: never;\n locations: LocKeyArray<L1, L2, L3, L4, L5>,\n },\n ): Promise<V> => {\n const constraints = options?.key\n ? `key: pk=${options.key.pk}, loc=[${isComKey(options.key)\n ? (options.key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')\n : ''}]`\n : options?.locations\n ? `locations: ${options.locations.map(loc => `${loc.kt}=${loc.lk}`).join(', ')}`\n : 'no constraints';\n logger.debug(`CREATE operation called on ${models[0].name} with ${constraints}`);\n logger.default(`Create configured for ${models[0].name} with ${Object.keys(item).length} item fields`);\n\n const { coordinate, options: { references, aggregations } } = definition;\n const { kta } = coordinate;\n\n // Get the primary model (first model in array)\n const model = models[0];\n const modelAttributes = model.getAttributes();\n\n // Validate that all item attributes exist on the model\n let itemData = { ...item } as any;\n\n // TODO: We need the opposite of processRow, something to step down from fjell to database.\n itemData = extractEvents(itemData);\n itemData = removeEvents(itemData);\n\n // Validate that all item attributes exist on the model\n const invalidAttributes: string[] = [];\n for (const key of Object.keys(itemData)) {\n if (!modelAttributes[key]) {\n invalidAttributes.push(key);\n }\n }\n\n if (invalidAttributes.length > 0) {\n const availableAttributes = Object.keys(modelAttributes).join(', ');\n throw new Error(\n `Invalid attributes for model '${model.name}': [${invalidAttributes.join(', ')}]. ` +\n `Available attributes: [${availableAttributes}]. ` +\n `Item data: ${JSON.stringify(itemData, null, 2)}`\n );\n }\n\n // Handle key options\n // If a key is supplied, assume its contents are to be assigned to the appropriate ids.\n // For most cases this will be null as key generation is often through autoIncrement.\n // If this is a CItem then the locations will be present.\n if (options?.key) {\n const key = options.key;\n if (isPriKey(key)) {\n // Set the primary key\n itemData.id = key.pk;\n } else if (isComKey(key)) {\n // Set primary key\n itemData.id = key.pk;\n\n // Process location keys - only set direct foreign keys, validate hierarchical chains\n const comKey = key as ComKey<S, L1, L2, L3, L4, L5>;\n const directLocations: Array<{ kt: string; lk: any }> = [];\n const hierarchicalLocations: Array<{ kt: string; lk: any }> = [];\n\n // Categorize location keys as direct or hierarchical\n for (const locKey of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const associations = model.associations ? Object.keys(model.associations) : [];\n const errorMessage = `Composite key locator '${locKey.kt}' cannot be resolved on model '${model.name}' or through its relationships. ` +\n `Available associations: [${associations.join(', ')}]. ` +\n `KTA: [${kta.join(', ')}]. ` +\n `Composite key: ${JSON.stringify(comKey, null, 2)}`;\n logger.error(errorMessage, { key: comKey, kta, associations });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n directLocations.push(locKey);\n } else {\n hierarchicalLocations.push(locKey);\n }\n }\n\n // Set direct foreign keys\n for (const locKey of directLocations) {\n if (locKey.lk == null || locKey.lk === '') {\n logger.error(`Composite key location '${locKey.kt}' has undefined/null lk value`, { locKey, key: comKey });\n throw new Error(`Composite key location '${locKey.kt}' has undefined/null lk value`);\n }\n const foreignKeyField = locKey.kt + 'Id';\n itemData[foreignKeyField] = locKey.lk;\n }\n\n // Validate hierarchical chains exist\n for (const locKey of hierarchicalLocations) {\n await validateHierarchicalChain(models, locKey, kta);\n }\n }\n }\n\n // Handle locations options\n // This is the most frequent way relationship ids will be set\n if (options?.locations) {\n const directLocations: Array<{ kt: string; lk: any }> = [];\n const hierarchicalLocations: Array<{ kt: string; lk: any }> = [];\n\n // Categorize location keys as direct or hierarchical\n for (const locKey of options.locations) {\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const associations = model.associations ? Object.keys(model.associations) : [];\n const errorMessage = `Location key '${locKey.kt}' cannot be resolved on model '${model.name}' or through its relationships. ` +\n `Available associations: [${associations.join(', ')}]. ` +\n `KTA: [${kta.join(', ')}]. ` +\n `Locations: ${JSON.stringify(options.locations, null, 2)}`;\n logger.error(errorMessage, { locations: options.locations, kta, associations });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n directLocations.push(locKey);\n } else {\n hierarchicalLocations.push(locKey);\n }\n }\n\n // Set direct foreign keys\n for (const locKey of directLocations) {\n if (locKey.lk == null || locKey.lk === '') {\n logger.error(`Location option '${locKey.kt}' has undefined/null lk value`, { locKey, locations: options.locations });\n throw new Error(`Location option '${locKey.kt}' has undefined/null lk value`);\n }\n const foreignKeyField = locKey.kt + 'Id';\n itemData[foreignKeyField] = locKey.lk;\n }\n\n // Validate hierarchical chains exist\n for (const locKey of hierarchicalLocations) {\n await validateHierarchicalChain(models, locKey, kta);\n }\n }\n\n // Create the record\n try {\n logger.trace(`[CREATE] Executing ${model.name}.create() with data: ${stringifyJSON(itemData)}`);\n const createdRecord = await model.create(itemData);\n\n // Add key and events\n // Create operations get their own context since they're top-level operations\n const processedRecord = await processRow(createdRecord, kta, references, aggregations, registry);\n const result = validateKeys(processedRecord, kta) as V;\n\n logger.debug(`[CREATE] Created ${model.name} with key: ${(result as any).key ? JSON.stringify((result as any).key) : `id=${createdRecord.id}`}`);\n return result;\n } catch (error: any) {\n throw translateDatabaseError(error, itemData, model.name);\n }\n }\n\n return create;\n}\n", "/* eslint-disable indent */\nimport { Item, LocKeyArray, validateKeys } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport { ModelStatic } from \"sequelize\";\nimport { processRow } from \"../RowProcessor\";\nimport * as Library from \"@fjell/lib\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'find');\n\nexport const getFindOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n const { options: { finders, references, aggregations } } = definition;\n\n const find = async (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [],\n\n ): Promise<V[]> => {\n const locationFilters = locations?.map(loc => `${loc.kt}=${loc.lk}`).join(', ') || 'none';\n logger.debug(\n `FIND operation called on ${models[0].name} with finder '${finder}' ` +\n `and ${locations?.length || 0} location filters: ${locationFilters}`\n );\n logger.default(`Find configured for ${models[0].name} using finder '${finder}' with ${Object.keys(finderParams).length} params`);\n\n // Note that we execute the createFinders function here because we want to make sure we're always getting the\n // most up to date methods.\n if (finders && finders[finder]) {\n const finderMethod = finders[finder];\n if (finderMethod) {\n logger.trace(`[FIND] Executing finder '${finder}' on ${models[0].name} with params: ${stringifyJSON(finderParams)}, locations: ${stringifyJSON(locations)}`);\n const results = await finderMethod(finderParams, locations);\n if (results && results.length > 0) {\n const processedResults = (await Promise.all(results.map(async (row: any) => {\n // Each found row gets its own context to prevent interference between concurrent processing\n const processedRow = await processRow(row, definition.coordinate.kta, references, aggregations, registry);\n return validateKeys(processedRow, definition.coordinate.kta);\n })) as V[]);\n\n logger.debug(`[FIND] Found ${processedResults.length} ${models[0].name} records using finder '${finder}'`);\n return processedResults;\n } else {\n logger.debug(`[FIND] Found 0 ${models[0].name} records using finder '${finder}'`);\n return [];\n }\n } else {\n logger.error(`Finder %s not found`, finder);\n throw new Error(`Finder ${finder} not found`);\n }\n } else {\n logger.error(`No finders have been defined for this lib`);\n throw new Error(`No finders found`);\n }\n }\n\n return find;\n}\n", "/* eslint-disable max-len */\n/* eslint-disable indent */\nimport {\n ComKey,\n isComKey,\n isPriKey,\n isValidItemKey,\n Item,\n PriKey,\n validateKeys\n} from '@fjell/core';\n\nimport LibLogger from '../logger';\nimport { ModelStatic } from 'sequelize';\nimport { processRow } from '../RowProcessor';\nimport { Definition } from '../Definition';\nimport { NotFoundError } from '@fjell/lib';\nimport * as Library from \"@fjell/lib\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { contextManager } from \"../RowProcessor\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'get');\n\n// Helper function to process composite key and build query options\nconst processCompositeKey = (\n comKey: ComKey<any, any, any, any, any, any>,\n model: ModelStatic<any>,\n kta: string[]\n): { where: { [key: string]: any }; include?: any[] } => {\n const where: { [key: string]: any } = { id: comKey.pk };\n const includes: any[] = [];\n\n for (const locator of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locator.kt, kta);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Composite key locator '${locator.kt}' cannot be resolved on model '${model.name}' or through its relationships. Key type array: [${kta.join(', ')}], Composite key: ${stringifyJSON(comKey)}, Available associations: [${Object.keys(model.associations || {}).join(', ')}]`;\n logger.error(errorMessage, { key: comKey, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.path) {\n // This requires a relationship traversal\n where[relationshipInfo.path] = locator.lk;\n if (relationshipInfo.includes) {\n includes.push(...relationshipInfo.includes);\n }\n } else {\n // This is a direct field\n const fieldName = `${locator.kt}Id`;\n where[fieldName] = locator.lk;\n }\n }\n\n const result: { where: { [key: string]: any }; include?: any[] } = { where };\n if (includes.length > 0) {\n result.include = includes;\n }\n\n return result;\n};\n\nexport const getGetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n const { coordinate, options: { references, aggregations } } = definition;\n const { kta } = coordinate;\n\n const get = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>\n ): Promise<V> => {\n if (!isValidItemKey(key)) {\n logger.error('Key for Get is not a valid ItemKey: %j', key);\n throw new Error('Key for Get is not a valid ItemKey');\n }\n\n const keyDescription = isPriKey(key)\n ? `primary key: pk=${key.pk}`\n : `composite key: pk=${key.pk}, loc=[${(key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')}]`;\n logger.debug(`GET operation called on ${models[0].name} with ${keyDescription}`);\n logger.default(`Get configured for ${models[0].name} with ${isPriKey(key) ? 'primary' : 'composite'} key`);\n\n const itemKey = key;\n\n // @ts-ignore\n const model = models[0];\n\n let item;\n\n if (isPriKey(itemKey)) {\n // This is the easy case because we can just find the item by its primary key\n logger.trace(`[GET] Executing ${model.name}.findByPk() with pk: ${(itemKey as PriKey<S>).pk}`);\n item = await model.findByPk((itemKey as PriKey<S>).pk);\n } else if (isComKey(itemKey)) {\n // This is a composite key, so we need to build a where clause based on the composite key's locators\n const comKey = itemKey as ComKey<S, L1, L2, L3, L4, L5>;\n const queryOptions = processCompositeKey(comKey, model, kta);\n\n logger.default('Composite key query', { queryOptions });\n logger.trace(`[GET] Executing ${model.name}.findOne() with options: ${stringifyJSON(queryOptions)}`);\n item = await model.findOne(queryOptions);\n }\n\n if (!item) {\n throw new NotFoundError<S, L1, L2, L3, L4, L5>('get', coordinate, key);\n } else {\n // Use current context if available (prevents infinite recursion in reference loading)\n // This ensures proper circular dependency detection within the same operation\n const currentContext = contextManager.getCurrentContext();\n const result = validateKeys(await processRow(item, kta, references, aggregations, registry, currentContext), kta) as V;\n\n logger.debug(`[GET] Retrieved ${model.name} with key: ${(result as any).key ? JSON.stringify((result as any).key) : `id=${item.id}`}`);\n return result;\n }\n }\n\n return get;\n}\n", "/* eslint-disable indent */\nimport { Item, ItemQuery, LocKeyArray } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport { ModelStatic } from \"sequelize\";\nimport { getAllOperation } from \"./all\";\nimport * as Library from \"@fjell/lib\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'one');\n\nexport const getOneOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n const one = async (\n itemQuery: ItemQuery,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = [],\n ): Promise<V | null> => {\n logger.debug(`ONE operation called on ${models[0].name} with ${locations.length} location filters: ${locations.map(loc => `${loc.kt}=${loc.lk}`).join(', ') || 'none'}`);\n logger.default(`One configured for ${models[0].name} delegating to all operation`);\n\n const items = await getAllOperation(models, definition, registry)(itemQuery, locations);\n if (items.length > 0) {\n const result = items[0] as V;\n logger.debug(`[ONE] Found ${models[0].name} record with key: ${(result as any).key ? JSON.stringify((result as any).key) : 'unknown'}`);\n return result;\n } else {\n logger.debug(`[ONE] No ${models[0].name} record found`);\n return null;\n }\n }\n\n return one;\n}", "/* eslint-disable */\nimport { ComKey, isValidItemKey, PriKey } from \"@fjell/core\";\n\nimport { abbrevIK, isComKey, isPriKey, Item } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport { populateEvents } from \"../EventCoordinator\";\nimport { addKey } from \"../KeyMaster\";\nimport LibLogger from '../logger';\nimport { ModelStatic } from \"sequelize\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { stringifyJSON } from \"../util/general\";\nimport { NotFoundError } from \"@fjell/lib\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'remove');\n\n// Helper function to process composite key and build query options\nconst processCompositeKey = (\n comKey: ComKey<any, any, any, any, any, any>,\n model: ModelStatic<any>,\n kta: string[]\n): { where: { [key: string]: any }; include?: any[] } => {\n const where: { [key: string]: any } = { id: comKey.pk };\n const includes: any[] = [];\n\n for (const locator of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locator.kt, kta);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Composite key locator '${locator.kt}' cannot be resolved on model '${model.name}' or through its relationships.`;\n logger.error(errorMessage, { key: comKey, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.path) {\n // This requires a relationship traversal\n where[relationshipInfo.path] = locator.lk;\n if (relationshipInfo.includes) {\n includes.push(...relationshipInfo.includes);\n }\n } else {\n // This is a direct field\n const fieldName = `${locator.kt}Id`;\n where[fieldName] = locator.lk;\n }\n }\n\n const result: { where: { [key: string]: any }; include?: any[] } = { where };\n if (includes.length > 0) {\n result.include = includes;\n }\n\n return result;\n};\n\nexport const getRemoveOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n _registry: import('@fjell/lib').Registry\n) => {\n const { coordinate, options } = definition;\n const { kta } = coordinate;\n\n const remove = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n ): Promise<V> => {\n if (!isValidItemKey(key)) {\n logger.error('Key for Remove is not a valid ItemKey: %j', key);\n throw new Error('Key for Remove is not a valid ItemKey');\n }\n\n const keyDescription = isPriKey(key)\n ? `primary key: pk=${key.pk}`\n : `composite key: pk=${key.pk}, loc=[${(key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')}]`;\n logger.debug(`REMOVE operation called on ${models[0].name} with ${keyDescription}`);\n logger.default(`Remove configured for ${models[0].name} with ${isPriKey(key) ? 'primary' : 'composite'} key`);\n\n // @ts-ignore\n const model = models[0];\n\n let item;\n let returnItem;\n\n logger.debug('remove: %s', abbrevIK(key));\n if (isPriKey(key)) {\n logger.debug(`[REMOVE] Executing ${model.name}.findByPk() with pk: ${(key as PriKey<S>).pk}`);\n item = await model.findByPk((key as PriKey<S>).pk);\n } else if (isComKey(key)) {\n // This is a composite key, so we need to build a where clause based on the composite key's locators\n const comKey = key as ComKey<S, L1, L2, L3, L4, L5>;\n const queryOptions = processCompositeKey(comKey, model, kta);\n\n logger.default(`Remove composite key query for ${model.name} with where fields: ${queryOptions.where ? Object.keys(queryOptions.where).join(', ') : 'none'}`);\n logger.debug(`[REMOVE] Executing ${model.name}.findOne() with options: ${stringifyJSON(queryOptions)}`);\n item = await model.findOne(queryOptions);\n }\n\n if (!item) {\n throw new NotFoundError<S, L1, L2, L3, L4, L5>('remove', coordinate, key);\n }\n\n const isDeletedAttribute = model.getAttributes().isDeleted;\n const deletedAtAttribute = model.getAttributes().deletedAt;\n\n if (isDeletedAttribute || deletedAtAttribute) {\n if (model.getAttributes().isDeleted) {\n item.isDeleted = true;\n }\n\n if (model.getAttributes().deletedAt) {\n item.deletedAt = new Date();\n }\n\n // Save the object\n logger.debug(`[REMOVE] Executing ${model.name}.save() for soft delete`);\n await item?.save();\n returnItem = item?.get({ plain: true }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n returnItem = addKey(item, returnItem as any, kta);\n returnItem = populateEvents(returnItem);\n } else if (options.deleteOnRemove) {\n logger.debug(`[REMOVE] Executing ${model.name}.destroy() for hard delete`);\n await item?.destroy();\n returnItem = item?.get({ plain: true }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n returnItem = addKey(item, returnItem as any, kta);\n returnItem = populateEvents(returnItem);\n } else {\n throw new Error('No deletedAt or isDeleted attribute found in model, and deleteOnRemove is not set');\n }\n\n logger.debug(`[REMOVE] Removed ${model.name} with key: ${(returnItem as any).key ? JSON.stringify((returnItem as any).key) : `id=${item.id}`}`);\n return returnItem as V;\n }\n\n return remove;\n}\n", "/* eslint-disable indent */\nimport { abbrevIK, isComKey, validateKeys } from \"@fjell/core\";\n\nimport { isPriKey } from \"@fjell/core\";\n\nimport { ComKey, Item, PriKey } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport { extractEvents, removeEvents } from \"../EventCoordinator\";\nimport { removeKey } from \"../KeyMaster\";\nimport LibLogger from '../logger';\nimport { processRow } from \"../RowProcessor\";\n\nimport * as Library from \"@fjell/lib\";\nimport { NotFoundError } from \"@fjell/lib\";\nimport { ModelStatic, Op } from \"sequelize\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'update');\n\n// Helper function to merge includes avoiding duplicates\nconst mergeIncludes = (existingIncludes: any[], newIncludes: any[]): any[] => {\n const mergedIncludes = [...existingIncludes];\n\n for (const newInclude of newIncludes) {\n const existingIndex = mergedIncludes.findIndex(\n (existing: any) => existing.as === newInclude.as && existing.model === newInclude.model\n );\n if (existingIndex === -1) {\n mergedIncludes.push(newInclude);\n } else if (newInclude.include && mergedIncludes[existingIndex].include) {\n mergedIncludes[existingIndex].include = [\n ...mergedIncludes[existingIndex].include,\n ...newInclude.include\n ];\n } else if (newInclude.include) {\n mergedIncludes[existingIndex].include = newInclude.include;\n }\n }\n\n return mergedIncludes;\n};\n\nexport const getUpdateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n\n registry: Library.Registry\n) => {\n\n const { options: { references, aggregations } } = definition;\n\n const update = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n ): Promise<V> => {\n const keyDescription = isPriKey(key)\n ? `primary key: pk=${key.pk}`\n : `composite key: pk=${key.pk}, loc=[${(key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')}]`;\n logger.debug(`UPDATE operation called on ${models[0].name} with ${keyDescription}`);\n const { coordinate } = definition;\n const { kta } = coordinate;\n\n logger.debug('update: %s, %j', abbrevIK(key), item);\n // Find the object we're updating\n // @ts-ignore\n const model = models[0];\n\n let response;\n\n if (isPriKey(key)) {\n // Find the model by using the PK\n const priKey = key as PriKey<S>;\n logger.trace(`[UPDATE] Executing ${model.name}.findByPk() with pk: ${priKey.pk}`);\n response = await model.findByPk(priKey.pk);\n } else if (isComKey(key)) {\n const comKey = key as ComKey<S, L1, L2, L3, L4, L5>;\n\n // Build query options for composite key with multiple location keys\n const where: { [key: string]: any } = { id: comKey.pk };\n const additionalIncludes: any[] = [];\n\n // Process all location keys in the composite key\n for (const locator of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locator.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Composite key locator '${locator.kt}' cannot be resolved on model '${model.name}' or through its relationships.`;\n logger.error(errorMessage, { key: comKey, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n // Direct foreign key field\n const fieldName = `${locator.kt}Id`;\n where[fieldName] = locator.lk;\n } else if (relationshipInfo.path) {\n // Hierarchical relationship requiring traversal\n where[relationshipInfo.path] = {\n [Op.eq]: locator.lk\n };\n\n // Add necessary includes for relationship traversal\n if (relationshipInfo.includes) {\n additionalIncludes.push(...relationshipInfo.includes);\n }\n }\n }\n\n // Build final query options\n const queryOptions: any = { where };\n if (additionalIncludes.length > 0) {\n queryOptions.include = mergeIncludes([], additionalIncludes);\n }\n\n logger.default(`Update composite key query for ${model.name} with where fields: ${queryOptions.where ? Object.keys(queryOptions.where).join(', ') : 'none'}`);\n logger.trace(`[UPDATE] Executing ${model.name}.findOne() with options: ${stringifyJSON(queryOptions)}`);\n response = await model.findOne(queryOptions);\n }\n\n if (response) {\n\n // Remove the key and events\n let updateProps = removeKey(item)\n // TODO: We need the opposite of processRow, something to step down from fjell to database.\n updateProps = extractEvents(updateProps);\n updateProps = removeEvents(updateProps);\n\n logger.default(`Update found ${model.name} record to modify`);\n logger.default(`Update properties configured: ${Object.keys(updateProps).join(', ')}`);\n\n // Update the object\n logger.trace(`[UPDATE] Executing ${model.name}.update() with properties: ${stringifyJSON(updateProps)}`);\n response = await response.update(updateProps);\n\n // Populate the key and events\n // Update operations get their own context since they're top-level operations\n const processedItem = await processRow(response, kta, references, aggregations, registry);\n const returnItem = validateKeys(processedItem, kta);\n\n logger.debug(`[UPDATE] Updated ${model.name} with key: ${(returnItem as any).key ? JSON.stringify((returnItem as any).key) : `id=${response.id}`}`);\n return returnItem as V;\n } else {\n throw new NotFoundError<S, L1, L2, L3, L4, L5>('update', coordinate, key);\n }\n\n }\n\n return update;\n}\n", "/* eslint-disable indent */\nimport { ComKey, isValidItemKey, Item, PriKey } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport * as Library from \"@fjell/lib\";\nimport { ModelStatic } from \"sequelize\";\nimport { getGetOperation } from \"./get\";\nimport { getUpdateOperation } from \"./update\";\nimport { getCreateOperation } from \"./create\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'upsert');\n\nexport const getUpsertOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n // Get the individual operations we'll use\n const get = getGetOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n const update = getUpdateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n const create = getCreateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n\n const upsert = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>\n ): Promise<V> => {\n\n if (!isValidItemKey(key)) {\n logger.error('Key for Upsert is not a valid ItemKey: %j', key);\n throw new Error(`Key for Upsert is not a valid ItemKey: ${stringifyJSON(key)}`);\n }\n\n logger.debug(`[UPSERT] Attempting upsert with key: ${stringifyJSON(key)}`);\n\n try {\n // Try to get the existing item first\n const existingItem = await get(key);\n if (existingItem) {\n logger.debug(`[UPSERT] Item exists, updating with key: ${stringifyJSON(key)}`);\n // Item exists, update it\n return await update(key, item);\n }\n } catch {\n // Item doesn't exist (get threw NotFoundError), fall through to create\n logger.debug(`[UPSERT] Item not found, creating new item with key: ${stringifyJSON(key)}`);\n }\n\n // Item doesn't exist, create it\n return await create(item, { key });\n }\n\n return upsert;\n}\n", "/* eslint-disable indent */\nimport { Item } from \"@fjell/core\";\n\nimport * as Library from \"@fjell/lib\";\nimport { Registry } from \"./Registry\";\nimport { getAllOperation } from \"./ops/all\";\nimport { getCreateOperation } from \"./ops/create\";\nimport { getFindOperation } from \"./ops/find\";\nimport { getGetOperation } from \"./ops/get\";\nimport { getOneOperation } from \"./ops/one\";\nimport { getRemoveOperation } from \"./ops/remove\";\nimport { getUpdateOperation } from \"./ops/update\";\nimport { getUpsertOperation } from \"./ops/upsert\";\nimport { ModelStatic } from \"sequelize\";\nimport { Coordinate } from \"@fjell/registry\";\n\nexport const createOperations = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>,\n registry: Registry,\n options: import('./Options').Options<V, S, L1, L2, L3, L4, L5>\n): Library.Operations<V, S, L1, L2, L3, L4, L5> => {\n\n const operations = {} as Library.Operations<V, S, L1, L2, L3, L4, L5>;\n\n // Create a definition-like object for backward compatibility with existing operation functions\n const definition = { coordinate, options };\n\n operations.all = getAllOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.one = getOneOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.create = getCreateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.update = getUpdateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.get = getGetOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.remove = getRemoveOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.find = getFindOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.upsert = getUpsertOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.allFacet = async (): Promise<any> => { };\n operations.allAction = async (): Promise<any> => { };\n operations.action = async (): Promise<any> => { };\n operations.facet = async (): Promise<any> => { };\n\n operations.finders = { ...(options.finders || {}) };\n operations.actions = { ...(options.actions || {}) };\n operations.facets = { ...(options.facets || {}) };\n operations.allActions = { ...(options.allActions || {}) };\n operations.allFacets = { ...(options.allFacets || {}) };\n\n return operations;\n}\n", "import { Item } from \"@fjell/core\";\nimport { Options } from \"./Options\";\nimport { Registry as LocalRegistry } from \"./Registry\";\nimport { InstanceFactory as BaseInstanceFactory, Registry as BaseRegistry, Coordinate, RegistryHub } from \"@fjell/registry\";\nimport { createSequelizeLibrary, SequelizeLibrary } from \"./SequelizeLibrary\";\nimport { ModelStatic } from \"sequelize\";\nimport SequelizeLogger from \"./logger\";\n\nconst logger = SequelizeLogger.get(\"InstanceFactory\");\n\n/**\n * Sequelize Library Factory type that extends the base factory\n * to include Sequelize-specific models parameter\n */\nexport type SequelizeLibraryFactory<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n options: Options<V, S, L1, L2, L3, L4, L5>\n) => BaseInstanceFactory<S, L1, L2, L3, L4, L5>;\n\n/**\n * Factory function for creating Sequelize libraries\n * This extends the fjell-lib pattern by adding Sequelize-specific models\n */\nexport const createSequelizeLibraryFactory = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n options: Options<V, S, L1, L2, L3, L4, L5>\n ): BaseInstanceFactory<S, L1, L2, L3, L4, L5> => {\n return (coordinate: Coordinate<S, L1, L2, L3, L4, L5>, context: { registry: BaseRegistry, registryHub?: RegistryHub }) => {\n logger.debug(\"Creating Sequelize instance\", {\n coordinate,\n registry: context.registry,\n models: models.map(m => m.name),\n options\n });\n\n return createSequelizeLibrary<V, S, L1, L2, L3, L4, L5>(\n context.registry as LocalRegistry,\n coordinate,\n models,\n options\n ) as SequelizeLibrary<V, S, L1, L2, L3, L4, L5>;\n };\n};\n", "export * from './SequelizeLibrary';\n", "\nimport { SequelizeLibrary as AbstractSequelizeLibrary } from '../SequelizeLibrary';\nimport { Item, ItemTypeArray } from '@fjell/core';\nimport { Contained } from '@fjell/lib';\nimport * as Library from '@fjell/lib';\nimport { createOperations } from '../Operations';\nimport { ModelStatic } from 'sequelize';\nimport { Registry } from '../Registry';\nimport { createOptions, Options } from '../Options';\nimport { Coordinate, createCoordinate } from '../Coordinate';\n\nexport interface SequelizeLibrary<\n V extends Item<S>,\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> extends AbstractSequelizeLibrary<V, S, L1, L2, L3, L4, L5> {\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>;\n registry: Registry;\n operations: Library.Operations<V, S, L1, L2, L3, L4, L5>;\n options: Options<V, S, L1, L2, L3, L4, L5>;\n models: ModelStatic<any>[];\n}\n\nexport function createSequelizeLibrary<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 keyTypes: ItemTypeArray<S, L1, L2, L3, L4, L5>,\n models: ModelStatic<any>[],\n libOptions: Partial<Options<V, S, L1, L2, L3, L4, L5>> = {},\n scopes: string[] = [],\n registry: Registry\n): SequelizeLibrary<V, S, L1, L2, L3, L4, L5> {\n\n // Create coordinate and options separately following new pattern\n const coordinate = createCoordinate(keyTypes, scopes);\n const options = createOptions(libOptions);\n\n // Create operations with the new signature\n const operations = createOperations<V, S, L1, L2, L3, L4, L5>(models, coordinate, registry, options);\n\n // Wrap operations for contained pattern\n const wrappedOperations = Contained.wrapOperations(operations, options as any, coordinate, registry);\n\n return {\n coordinate,\n registry,\n operations: wrappedOperations,\n options,\n models,\n } as unknown as SequelizeLibrary<V, S, L1, L2, L3, L4, L5>;\n}\n", "export * from './SequelizeLibrary';\n", "\nimport { SequelizeLibrary as AbstractSequelizeLibrary } from '../SequelizeLibrary';\nimport { Item } from '@fjell/core';\nimport { Primary } from '@fjell/lib';\nimport * as Library from '@fjell/lib';\nimport { createOperations } from '../Operations';\nimport { ModelStatic } from 'sequelize';\nimport { createOptions, Options } from '../Options';\nimport { Registry } from '../Registry';\nimport { Coordinate, createCoordinate } from '../Coordinate';\n\nimport LibLogger from '../logger';\n\nconst logger = LibLogger.get('lib-sequelize', 'primary', 'library');\n\nexport interface SequelizeLibrary<\n V extends Item<S>,\n S extends string\n> extends AbstractSequelizeLibrary<V, S> {\n coordinate: Coordinate<S>;\n registry: Registry;\n operations: Library.Operations<V, S>;\n options: Options<V, S>;\n models: ModelStatic<any>[];\n}\n\nexport function createSequelizeLibrary<\n V extends Item<S>,\n S extends string\n>(\n keyType: S,\n models: ModelStatic<any>[],\n libOptions: Partial<Options<V, S>> = {},\n scopes: string[] = [],\n registry: Registry\n): SequelizeLibrary<V, S> {\n logger.debug('createSequelizeLibrary', { keyType, models, libOptions, scopes });\n\n // Create coordinate and options separately following new pattern\n const coordinate = createCoordinate([keyType], scopes);\n const options = createOptions(libOptions);\n\n // Create operations with the new signature\n const operations = createOperations<V, S>(models, coordinate, registry, options);\n\n // Wrap operations for primary pattern\n const wrappedOperations = Primary.wrapOperations(operations, options as any, coordinate, registry);\n\n return {\n coordinate,\n registry,\n operations: wrappedOperations,\n options,\n models,\n } as unknown as SequelizeLibrary<V, S>;\n}\n"],
5
- "mappings": ";;;;;;;AAAA,YAAY,aAAa;AAqBlB,IAAMA,iBAAgB,CAQ3B,qBAAqG;AAErG,QAAM,cAAsB,sBAAc,gBAAgB;AAG1D,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,YAAY,YAAY,cAAc,CAAC;AAAA,IACvC,cAAc,YAAY,gBAAgB,CAAC;AAAA,IAC3C,gBAAgB,kBAAkB,kBAAkB;AAAA,EACtD;AAEA,SAAO;AACT;;;AC1CA,OAAO,aAAa;AAEpB,IAAM,YAAY,QAAQ,UAAU,sBAAsB;AAE1D,IAAO,iBAAQ;;;ACHf,SAAqB,oBAAoB,4BAA4B;AAGrE,IAAM,SAAS,eAAU,IAAI,YAAY;AAElC,IAAM,kBAAkB;AAExB,IAAM,mBAAmB,CAO9B,KAA2C,WAAyD;AACpG,SAAO,MAAM,oBAAoB,EAAE,KAAK,OAAO,CAAC;AAChD,QAAM,aAAa,qBAAqB,KAAK,CAAC,iBAAiB,GAAI,UAAU,CAAC,CAAE,CAAC;AACjF,SAAO;AACT;;;ACdA,IAAMC,UAAS,eAAU,IAAI,iBAAiB,YAAY;AAenD,IAAM,mBAAmB,CAS5B,KACA,QACA,eACyC;AAC3C,EAAAA,QAAO,MAAM,oBAAoB,EAAE,KAAK,QAAQ,WAAW,CAAC;AAC5D,QAAM,aAAa,iBAAiB,KAAK,MAAM;AAC/C,QAAM,UAAUC,eAAwC,UAAU;AAElE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACxCA,YAAYC,cAAa;;;ACCzB,SAAS,oBAAoB;;;ACD7B;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AAEP,SAAmC,UAAU;;;ACLtC,IAAM,gBAAgB,SAAU,KAAU,UAAoB,oBAAI,IAAI,GAAW;AACtF,QAAM,eAAyB,CAAC;AAChC,QAAM,UAAoB,CAAC;AAC3B,MAAI,UAAoB,CAAC;AAGzB,MAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,aAAa,QAAQ;AACjE,WAAO,KAAK;AAAA,WACL,OAAO,QAAQ;AACtB,WAAO,MAAM,MAAM;AAGrB,MAAI,eAAe,UAAU,QAAQ,IAAI,GAAG,GAAG;AAC7C,WAAO;AAAA,EACT,WAGS,MAAM,QAAQ,GAAG,GAAG;AAE3B,QAAI,IAAI,WAAW;AACjB,aAAO;AAAA,SACJ;AAEH,cAAQ,IAAI,GAAG;AACf,UAAI,QAAQ,SAAU,IAAI;AACxB,gBAAQ,KAAK,cAAc,IAAI,OAAO,CAAC;AAAA,MACzC,CAAC;AAED,cAAQ,OAAO,GAAG;AAClB,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF,WAES,eAAe,QAAQ;AAE9B,YAAQ,IAAI,GAAG;AAEf,cAAU,OAAO,KAAK,GAAG;AAEzB,YAAQ,QAAQ,SAAU,KAAK;AAC7B,YAAM,SAAS,MAAM,MAAM;AAC3B,YAAM,YAAY,IAAI,GAAG;AAEzB,UAAI,qBAAqB,YAAY,cAAc;AACjD;AAAA,eACO,OAAO,cAAc;AAC5B,qBAAa,KAAK,SAAS,MAAM,YAAY,GAAG;AAAA,eACzC,OAAO,cAAc,aAAa,OAAO,cAAc,YAAY,cAAc;AACxF,qBAAa,KAAK,SAAS,SAAS;AAAA,eAE7B,qBAAqB,QAAQ;AACpC,qBAAa,KAAK,SAAS,cAAc,WAAW,OAAO,CAAC;AAAA,MAC9D;AAAA,IACF,CAAC;AAED,YAAQ,OAAO,GAAG;AAClB,WAAO,MAAM,eAAe;AAAA,EAC9B;AACA,SAAO;AACT;;;ADlDA,IAAMC,UAAS,eAAU,IAAI,aAAa,cAAc;AAUxD,IAAM,iBAAiB,CAAC,SAAuB,UAA0C;AACvF,EAAAA,QAAO,QAAQ,kDAAkD,cAAc,OAAO,CAAC,EAAE;AACzF,MAAI,MAAM,cAAc,EAAE,WAAW;AACnC,YAAQ,MAAM,WAAW,IAAI;AAAA,MAC3B,CAAC,GAAG,EAAE,GAAG;AAAA,IACX;AAAA,EACF,WAAW,MAAM,cAAc,EAAE,WAAW;AAC1C,YAAQ,MAAM,WAAW,IAAI;AAAA,MAC3B,CAAC,GAAG,EAAE,GAAG;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,kBAAkB,CACtB,SAAuB,QAAoC,UAA0C;AACrG,EAAAA,QAAO,QAAQ,mDAAmD,cAAc,OAAO,CAAC,aAAa,cAAc,MAAM,CAAC,EAAE;AAC5H,SAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAgB;AAE3C,QAAI,CAAC,MAAM,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG;AACtC,YAAM,IAAI,MAAM,SAAS,GAAG,+BAA+B,MAAM,IAAI,cAAc,GAAG,sCAAsC,OAAO,KAAK,MAAM,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC,mBAAmB,cAAc,OAAO,GAAG,CAAC,CAAC,EAAE;AAAA,IAC1N;AAEA,QAAI,eAAe,CAAC;AAEpB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,MAAM,OAAO;AACf,qBAAe,EAAE,GAAG,cAAc,CAAC,GAAG,GAAG,GAAG,IAAI,KAAK,MAAM,KAAK,EAAE;AAAA,IACpE;AACA,QAAI,MAAM,KAAK;AACb,qBAAe,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE;AAAA,IACjE;AAEA,QAAI,MAAM,IAAI;AACZ,UAAI,CAAC,MAAM,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG;AACtC,cAAM,IAAI,MAAM,SAAS,GAAG,+BAA+B,MAAM,IAAI,cAAc,GAAG,sCAAsC,OAAO,KAAK,MAAM,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC,mBAAmB,cAAc,OAAO,GAAG,CAAC,CAAC,EAAE;AAAA,MAC1N;AACA,qBAAe,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG;AAAA,IACtD;AAEA,YAAQ,MAAM,GAAG,GAAG,IAAI,IAAI;AAAA,EAE9B,CAAC;AACD,SAAO;AACT;AAGA,IAAM,sBAAsB,CAAC,SAAc,YAAwB,UAAiC;AAClG,EAAAA,QAAO,QAAQ,uDAAuD,cAAc,OAAO,CAAC,iBAAiB,cAAc,UAAU,CAAC,EAAE;AAExI,SAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,QAAgB;AAC/C,IAAAA,QAAO,QAAQ,gDAAgD,GAAG,iBAAiB,cAAc,UAAU,CAAC,EAAE;AAE9G,QAAI,CAAC,MAAM,cAAc,EAAE,GAAG,GAAG,IAAI,GAAG;AACtC,YAAM,IAAI,MAAM,aAAa,GAAG,+BAA+B,MAAM,IAAI,cAAc,GAAG,sCAAsC,OAAO,KAAK,MAAM,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC,uBAAuB,cAAc,WAAW,GAAG,CAAC,CAAC,EAAE;AAAA,IACtO;AAEA,QAAI,SAAS,WAAW,GAAG,CAAC,GAAG;AAC7B,YAAM,SAAyB,WAAW,GAAG;AAE7C,UAAI,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAO,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,OAAO,EAAE,EAAE,WAAW,GAAI;AACnH,QAAAA,QAAO,MAAM,kBAAkB,GAAG,2BAA2B,cAAc,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,WAAW,CAAC;AAC/G,cAAM,IAAI,MAAM,kBAAkB,GAAG,2BAA2B,cAAc,OAAO,EAAE,CAAC,aAAa,MAAM,IAAI,iBAAiB,OAAO,EAAE,sBAAsB,cAAc,WAAW,GAAG,CAAC,CAAC,EAAE;AAAA,MACjM;AAEA,MAAAA,QAAO,MAAM,kDAAkD,GAAG,QAAQ,cAAc,OAAO,EAAE,CAAC,WAAW,OAAO,OAAO,EAAE,GAAG;AAChI,cAAQ,MAAM,GAAG,GAAG,IAAI,IAAI;AAAA,QAC1B,CAAC,GAAG,EAAE,GAAG,OAAO;AAAA,MAClB;AAAA,IACF,WAAW,SAAS,WAAW,GAAG,CAAC,GAAG;AACpC,YAAM,IAAI,MAAM,2DAA2D,GAAG,cAAc,MAAM,IAAI,cAAc,cAAc,WAAW,GAAG,CAAC,CAAC,EAAE;AAAA,IACtJ;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEO,IAAM,uBAAuB,CAAC,SAAc,mBAAsC,UAA4B;AAEnH,UAAQ,QAAQ,QAAQ,SAAS,CAAC;AAElC,MAAI;AACJ,QAAM,eAAe,kBAAkB;AACvC,MAAI,iBAAiB,OAAO;AAC1B,iBAAa,GAAG;AAAA,EAClB,OAAO;AACL,iBAAa,GAAG;AAAA,EAClB;AAAC;AAED,MAAI,aAAkC,CAAC;AACvC,oBAAkB,WAAW,QAAQ,CAAC,cAA6C;AACjF,QAAI,YAAY,SAAS,GAAG;AAC1B,mBAAa,aAAa,YAAY,WAAW,KAAK;AAAA,IACxD,OAAO;AACL,YAAM,IAAI,MAAM,qDAAqD,MAAM,IAAI,0BAA0B,cAAc,iBAAiB,CAAC,uBAAuB,cAAc,SAAS,CAAC,EAAE;AAAA,IAC5L;AAAA,EACF,CAAC;AAGD,MAAI,OAAO,KAAK,QAAQ,KAAK,EAAE,SAAS,GAAG;AAEzC,YAAQ,QAAQ;AAAA,MACd,CAAC,GAAG,GAAG,GAAG;AAAA,QACR,QAAQ;AAAA,QACR,EAAE,CAAC,UAAU,GAAG,WAAW;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,YAAQ,MAAM,UAAU,IAAI;AAAA,EAC9B;AAEA,SAAO;AACT;AAEA,IAAM,uBAAuB,CAAC,aAA6B;AACzD,MAAI,aAAa,MAAM;AACrB,WAAO,GAAG;AAAA,EACZ,WAAW,aAAa,KAAK;AAC3B,WAAO,GAAG;AAAA,EACZ,WAAW,aAAa,KAAK;AAC3B,WAAO,GAAG;AAAA,EACZ,WAAW,aAAa,MAAM;AAC5B,WAAO,GAAG;AAAA,EACZ,WAAW,aAAa,MAAM;AAC5B,WAAO,GAAG;AAAA,EACZ,WAAW,aAAa,MAAM;AAC5B,WAAO,GAAG;AAAA,EACZ,OAAO;AACL,UAAM,IAAI,MAAM,YAAY,QAAQ,gBAAgB;AAAA,EACtD;AACF;AAEA,IAAM,0BAA0B,CAC9B,YACA,WACA,UACwB;AACxB,QAAM,CAAC,iBAAiB,aAAa,IAAI,UAAU,OAAO,MAAM,KAAK,CAAC;AAGtE,MAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,aAAa,eAAe,GAAG;AAC/D,UAAM,IAAI,MAAM,eAAe,eAAe,uBAAuB,MAAM,IAAI,EAAE;AAAA,EACnF;AAEA,QAAM,cAAqC,MAAM,aAAa,eAAe;AAC7E,QAAM,kBAAkB,YAAY;AAGpC,MAAI,CAAC,gBAAgB,cAAc,EAAE,aAAa,GAAG;AACnD,UAAM,IAAI,MAAM,aAAa,aAAa,kCAAkC,gBAAgB,IAAI,oBAAoB,eAAe,EAAE;AAAA,EACvI;AAGA,QAAM,6BAA6B,IAAI,eAAe,IAAI,aAAa;AACvE,QAAM,cAAc,qBAAqB,UAAU,QAAQ;AAE3D,MAAI,UAAU,SAAS,QAAQ,UAAU,aAAa,QAAQ,UAAU,aAAa,MAAM;AACzF,IAAAA,QAAO,MAAM,8BAA8B,eAAe,IAAI,aAAa,8BAA8B,EAAE,UAAU,CAAC;AACtH,UAAM,IAAI,MAAM,8BAA8B,eAAe,IAAI,aAAa,4BAA4B;AAAA,EAC5G;AAEA,EAAAA,QAAO,MAAM,iDAAiD,0BAA0B,MAAM,cAAc,UAAU,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG;AAChK,aAAW,0BAA0B,IAAI;AAAA,IACvC,CAAC,WAAW,GAAG,UAAU;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAC5B,YACA,WACA,UACwB;AACxB,QAAM,kBAAkB,UAAU;AAElC,MAAI,CAAC,MAAM,cAAc,EAAE,eAAe,GAAG;AAC3C,UAAM,IAAI,MAAM,oBAAoB,eAAe,uBAAuB,MAAM,IAAI,EAAE;AAAA,EACxF;AAEA,QAAM,cAAc,qBAAqB,UAAU,QAAQ;AAE3D,MAAI,UAAU,SAAS,QAAQ,UAAU,aAAa,QAAQ,UAAU,aAAa,MAAM;AACzF,IAAAA,QAAO,MAAM,4BAA4B,eAAe,8BAA8B,EAAE,UAAU,CAAC;AACnG,UAAM,IAAI,MAAM,4BAA4B,eAAe,4BAA4B;AAAA,EACzF;AAEA,EAAAA,QAAO,MAAM,+CAA+C,eAAe,MAAM,cAAc,UAAU,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG;AACnJ,aAAW,eAAe,IAAI;AAAA,IAC5B,CAAC,WAAW,GAAG,UAAU;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,IAAM,eAAe,CAAC,YAAiC,WAAsB,UAA4B;AAC9G,QAAM,kBAA0B,UAAU;AAG1C,MAAI,gBAAgB,SAAS,GAAG,GAAG;AACjC,WAAO,wBAAwB,YAAY,WAAW,KAAK;AAAA,EAC7D;AAGA,SAAO,sBAAsB,YAAY,WAAW,KAAK;AAC3D;AAEA,IAAM,oCAAoC,CAAC,eAAiC;AAC1E,QAAM,eAAe,oBAAI,IAAY;AAErC,QAAM,gBAAgB,CAAC,QAAa;AAClC,QAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAE3C,aAAO,KAAK,GAAG,EAAE,QAAQ,SAAO;AAE9B,YAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;AAC5F,gBAAM,kBAAkB,IAAI,UAAU,GAAG,IAAI,QAAQ,GAAG,CAAC;AACzD,uBAAa,IAAI,eAAe;AAAA,QAClC;AAGA,YAAI,OAAO,IAAI,GAAG,MAAM,UAAU;AAChC,wBAAc,IAAI,GAAG,CAAC;AAAA,QACxB;AAAA,MACF,CAAC;AAGD,aAAO,sBAAsB,GAAG,EAAE,QAAQ,YAAU;AAClD,YAAI,OAAO,IAAI,MAAM,MAAM,UAAU;AACnC,wBAAc,IAAI,MAAM,CAAC;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,QAAQ,UAAQ;AAClB,YAAI,OAAO,SAAS,UAAU;AAC5B,wBAAc,IAAI;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,gBAAc,UAAU;AACxB,SAAO;AACT;AAEA,IAAM,yBAAyB,CAAC,SAAc,UAAiC;AAE7E,QAAM,yBAAyB,kCAAkC,QAAQ,KAAK;AAE9E,MAAI,uBAAuB,OAAO,GAAG;AACnC,YAAQ,UAAU,QAAQ,WAAW,CAAC;AAGtC,2BAAuB,QAAQ,qBAAmB;AAEhD,YAAM,kBAAkB,QAAQ,QAAQ;AAAA,QAAK,CAAC,QAC3C,OAAO,QAAQ,YAAY,QAAQ,mBACnC,OAAO,QAAQ,YAAY,IAAI,gBAAgB;AAAA,MAClD;AAEA,UAAI,CAAC,mBAAmB,MAAM,gBAAgB,MAAM,aAAa,eAAe,GAAG;AACjF,gBAAQ,QAAQ,KAAK;AAAA,UACnB,OAAO,MAAM,aAAa,eAAe,EAAE;AAAA,UAC3C,IAAI;AAAA,UACJ,UAAU;AAAA;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,IAAM,aAAa,CACxB,WACA,UACQ;AACR,EAAAA,QAAO,QAAQ,6CAA6C,cAAc,SAAS,CAAC,EAAE;AAEtF,MAAI,UAAe;AAAA,IACjB,OAAO,CAAC;AAAA,EACV;AAEA,MAAI,UAAU,mBAAmB;AAC/B,IAAAA,QAAO,QAAQ,mCAAmC,cAAc,UAAU,iBAAiB,CAAC,EAAE;AAC9F,cAAU,qBAAqB,SAAS,UAAU,mBAAmB,KAAK;AAAA,EAC5E;AAGA,MAAI,MAAM,cAAc,EAAE,aAAa,MAAM,cAAc,EAAE,WAAW;AACtE,cAAU,eAAe,SAAS,KAAK;AAAA,EACzC;AAEA,MAAI,UAAU,MAAM;AAClB,cAAU,oBAAoB,SAAS,UAAU,MAAM,KAAK;AAAA,EAC9D;AACA,MAAI,UAAU,QAAQ;AACpB,cAAU,gBAAgB,SAAS,UAAU,QAAQ,KAAK;AAAA,EAC5D;AAKA,MAAI,UAAU,OAAO;AACnB,IAAAA,QAAO,QAAQ,gCAAgC,UAAU,KAAK,EAAE;AAChE,YAAQ,QAAQ,UAAU;AAAA,EAC5B;AAGA,MAAI,UAAU,QAAQ;AACpB,YAAQ,SAAS,UAAU;AAAA,EAC7B;AAGA,MAAI,UAAU,SAAS;AACrB,cAAU,QAAQ,QAAQ,CAAC,YAAqB;AAC9C,UAAI,CAAC,MAAM,cAAc,EAAE,QAAQ,KAAK,GAAG;AACzC,cAAM,IAAI,MAAM,kBAAkB,QAAQ,KAAK,uBAAuB,MAAM,IAAI,EAAE;AAAA,MACpF;AACA,cAAQ,QAAQ;AAAA,QACd,CAAC,QAAQ,OAAO,QAAQ,SAAS;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAGA,YAAU,uBAAuB,SAAS,KAAK;AAE/C,SAAO;AACT;;;AEtVO,IAAM,yBAAyB,CAClC,aACA,KACA,cACA,gBAC0B;AAE1B,QAAM,mBAA6B,CAAC;AACpC,QAAM,aAAiC,CAAC,WAAW;AACnD,MAAI,eAAe;AAGnB,WAAS,IAAI,eAAe,GAAG,KAAK,aAAa,KAAK;AAClD,UAAM,mBAAmB,IAAI,CAAC;AAC9B,UAAM,kBAAkB;AAExB,QAAI,CAAC,aAAa,gBAAgB,CAAC,aAAa,aAAa,eAAe,GAAG;AAC3E,aAAO,EAAE,SAAS,MAAM;AAAA,IAC5B;AAEA,qBAAiB,KAAK,eAAe;AACrC,mBAAe,aAAa,aAAa,eAAe,EAAE;AAC1D,eAAW,KAAK,YAAY;AAAA,EAChC;AAGA,QAAM,mBAAmB,aAAa,uBAAuB;AAC7D,QAAM,kBAAkB,IAAI,iBAAiB,KAAK,GAAG,CAAC,IAAI,gBAAgB;AAG1E,MAAI,iBAAsB;AAG1B,WAAS,IAAI,aAAa,IAAI,cAAc,KAAK;AAC7C,UAAM,cAAc,IAAI,CAAC;AACzB,UAAM,aAAa,IAAI;AAEvB,UAAM,aAAkB;AAAA,MACpB,OAAO,WAAW,UAAU;AAAA,MAC5B,IAAI;AAAA,MACJ,UAAU;AAAA,IACd;AAEA,QAAI,gBAAgB;AAChB,iBAAW,UAAU,CAAC,cAAc;AAAA,IACxC;AAEA,qBAAiB;AAAA,EACrB;AAEA,QAAM,WAAW,iBAAiB,CAAC,cAAc,IAAI,CAAC;AAEtD,SAAO,EAAE,SAAS,MAAM,MAAM,iBAAiB,SAAS;AAC5D;AAMO,IAAM,wBAAwB,CACjC,aACA,aACA,KACA,kBAA2B,UACF;AAGzB,QAAM,kBAAkB,GAAG,WAAW;AACtC,QAAM,aAAa,YAAY,cAAc;AAC7C,MAAI,cAAc,WAAW,eAAe,GAAG;AAC3C,UAAMC,UAAiC,EAAE,OAAO,KAAK;AACrD,QAAI,iBAAiB;AACjB,MAAAA,QAAO,WAAW;AAAA,IACtB;AACA,WAAOA;AAAA,EACX;AAGA,QAAM,cAAc,IAAI,QAAQ,WAAW;AAC3C,MAAI,gBAAgB,IAAI;AACpB,UAAMA,UAAiC,EAAE,OAAO,MAAM;AACtD,QAAI,iBAAiB;AACjB,MAAAA,QAAO,WAAW;AAAA,IACtB;AACA,WAAOA;AAAA,EACX;AAEA,QAAM,eAAe;AAErB,MAAI,eAAe,cAAc;AAC7B,UAAMA,UAAiC,EAAE,OAAO,MAAM;AACtD,QAAI,iBAAiB;AACjB,MAAAA,QAAO,WAAW;AAAA,IACtB;AACA,WAAOA;AAAA,EACX;AAEA,QAAM,cAAc,uBAAuB,aAAa,KAAK,cAAc,WAAW;AACtF,MAAI,YAAY,SAAS;AACrB,UAAMA,UAAiC;AAAA,MACnC,OAAO;AAAA,MACP,MAAM,YAAY;AAAA,MAClB,UAAU,YAAY;AAAA,IAC1B;AACA,QAAI,iBAAiB;AACjB,MAAAA,QAAO,WAAW;AAAA,IACtB;AACA,WAAOA;AAAA,EACX;AAEA,QAAM,SAAiC,EAAE,OAAO,MAAM;AACtD,MAAI,iBAAiB;AACjB,WAAO,WAAW;AAAA,EACtB;AACA,SAAO;AACX;;;AC3HA,IAAMC,UAAS,eAAU,IAAI,aAAa,WAAW;AAGrD,IAAM,0BAA0B,CAC9B,OACA,MACA,aACA,QACQ;AACR,EAAAA,QAAO,QAAQ,iCAAiC,EAAE,aAAa,IAAI,CAAC;AAEpE,QAAM,mBAAmB,sBAAsB,OAAO,aAAa,KAAK,IAAI;AAE5E,MAAI,CAAC,iBAAiB,OAAO;AAC3B,UAAM,IAAI,MAAM,iBAAiB,WAAW,kCAAkC,MAAM,IAAI,oDAAoD,IAAI,KAAK,IAAI,CAAC,+BAA+B,OAAO,KAAK,MAAM,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EAC9O;AAEA,MAAI,iBAAiB,UAAU;AAE7B,UAAM,kBAAkB,GAAG,WAAW;AACtC,UAAM,QAAQ,KAAK,eAAe;AAClC,QAAI,OAAO,UAAU,eAAe,UAAU,MAAM;AAClD,YAAM,IAAI,MAAM,6BAA6B,eAAe,yCAAyC,MAAM,IAAI,qBAAqB,WAAW,kCAAkC,OAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IACxN;AACA,WAAO;AAAA,EACT,OAAO;AAGL,UAAM,eAAe,IAAI,QAAQ,WAAW;AAC5C,QAAI,iBAAiB,IAAI;AACvB,YAAM,IAAI,MAAM,iBAAiB,WAAW,0CAA0C,MAAM,IAAI,uBAAuB,IAAI,KAAK,IAAI,CAAC,GAAG;AAAA,IAC1I;AAGA,QAAI,gBAAgB;AAGpB,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,YAAM,mBAAmB,IAAI,CAAC;AAG9B,UAAI,cAAc,gBAAgB,KAAK,OAAO,cAAc,gBAAgB,MAAM,UAAU;AAC1F,wBAAgB,cAAc,gBAAgB;AAAA,MAChD,OAAO;AAEL,cAAMC,mBAAkB,GAAG,gBAAgB;AAC3C,YAAI,OAAO,cAAcA,gBAAe,MAAM,eAAe,cAAcA,gBAAe,MAAM,MAAM;AAEpG,gBAAM,IAAI,MAAM,8BAA8B,gBAAgB,wCAAwC,WAAW,cAAc,MAAM,IAAI,kCAAkC,OAAO,KAAK,iBAAiB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,yEAAyE;AAAA,QACjS;AACA,cAAM,IAAI,MAAM,8BAA8B,gBAAgB,mDAAmD,MAAM,IAAI,qBAAqB,IAAI,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,UAAK,CAAC,iCAAiC,OAAO,KAAK,iBAAiB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,MAC3Q;AAAA,IACF;AAIA,QAAI,cAAc,WAAW,KAAK,OAAO,cAAc,WAAW,MAAM,YAAY,OAAO,cAAc,WAAW,EAAE,OAAO,aAAa;AACxI,aAAO,cAAc,WAAW,EAAE;AAAA,IACpC;AAGA,UAAM,kBAAkB,GAAG,WAAW;AACtC,QAAI,OAAO,cAAc,eAAe,MAAM,eAAe,cAAc,eAAe,MAAM,MAAM;AACpG,aAAO,cAAc,eAAe;AAAA,IACtC;AAEA,UAAM,gBAAgB,IAAI,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,UAAK;AAC/D,UAAM,IAAI;AAAA,MACR,uCAAuC,WAAW,2FAE/B,aAAa;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,YAAY,CAQvB,SACyC;AACzC,EAAAD,QAAO,QAAQ,gBAAgB,EAAE,KAAK,CAAC;AACvC,SAAO,KAAK;AACZ,SAAO;AACT;AA8BO,IAAM,SAAS,CAQpB,OACA,MACA,aACgC;AAChC,EAAAA,QAAO,QAAQ,cAAc,EAAE,KAAK,CAAC;AACrC,QAAM,MAAM,CAAC;AACb,QAAM,aAAa,MAAM;AACzB,QAAM,iBAAiB,WAAW;AAElC,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,UAAM,OAAO,CAAC,GAAG,QAAQ;AACzB,UAAM,SAAS,KAAK,MAAM;AAC1B,WAAO,OAAO,KAAK,EAAE,IAAI,QAAQ,IAAI,KAAK,cAAc,EAAE,CAAC;AAG3D,UAAM,eAAe,CAAC;AACtB,eAAW,eAAe,MAAM;AAC9B,UAAI;AACF,cAAM,KAAK,wBAAwB,YAAY,MAAM,aAAa,QAAoB;AACtF,qBAAa,KAAK,EAAE,IAAI,aAAa,GAAG,CAAC;AAAA,MAC3C,SAAS,OAAO;AACd,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,QAAAA,QAAO,MAAM,uCAAuC,WAAW,KAAK,EAAE,OAAO,cAAc,MAAM,SAAS,CAAC;AAC3G,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,EAAE,KAAK,aAAa,CAAC;AAAA,EAC1C,OAAO;AACL,WAAO,OAAO,KAAK,EAAE,IAAI,SAAS,CAAC,GAAG,IAAI,KAAK,cAAc,EAAE,CAAC;AAAA,EAClE;AACA,SAAO,OAAO,MAAM,EAAE,IAAI,CAAC;AAC3B,SAAO;AACT;;;ACjKA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACVP,OAAO,eAAe;AAItB,IAAME,UAAS,eAAU,IAAI,aAAa,kBAAkB;AA+DrD,IAAM,iBAAiB,CAO5B,SAAqF;AACrF,QAAM,SAAwB;AAAA,IAC5B,SAAS,EAAE,IAAI,KAAK,aAAa,KAAK;AAAA,IACtC,SAAS,EAAE,IAAI,KAAK,aAAa,KAAK;AAAA,IACtC,SAAS,EAAE,IAAI,KAAK;AAAA,EACtB;AACA,OAAK,SAAS;AACd,SAAO;AACT;AAEO,IAAM,gBAAgB,CAO3B,SAAqF;AACrF,EAAAC,QAAO,QAAQ,wCAAwC,EAAE,KAAK,CAAC;AAE/D,MAAI,KAAK,QAAQ;AACf,QAAI,KAAK,OAAO,SAAS,IAAI;AAC3B,WAAK,YAAY,KAAK,OAAO,QAAQ;AAAA,IACvC;AACA,QAAI,KAAK,OAAO,SAAS,IAAI;AAC3B,WAAK,YAAY,KAAK,OAAO,QAAQ;AAAA,IACvC;AACA,QAAI,KAAK,OAAO,SAAS,IAAI;AAC3B,WAAK,YAAY,KAAK,OAAO,QAAQ;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,eAAe,CAO1B,SAAqF;AACrF,EAAAA,QAAO,QAAQ,mBAAmB,EAAE,KAAK,CAAC;AAC1C,SAAO,KAAK;AACZ,SAAO;AACT;;;AD1GA,IAAMC,UAAS,eAAU,IAAI,aAAa,cAAc;AAMjD,IAAM,aAAa,OAMtB,KACA,UACA,sBACA,wBACA,UACA,YACyC;AAC3C,EAAAC,QAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC;AAGxC,QAAM,mBAAmB,WAAW,uBAAuB;AAG3D,SAAO,eAAe,YAAY,kBAAkB,YAAY;AAC9D,QAAI,OAAO,IAAI,IAAI,EAAE,OAAO,KAAK,CAAC;AAClC,IAAAA,QAAO,QAAQ,yCAAyC,cAAc,QAAQ,CAAC;AAC/E,WAAO,OAAO,KAAK,MAAM,QAAQ;AACjC,WAAO,eAAe,IAAI;AAC1B,IAAAA,QAAO,QAAQ,yBAAyB,cAAc,KAAK,GAAG,CAAC;AAG/D,qBAAiB,eAAe,KAAK,GAAG;AAExC,QAAI;AACF,UAAI,wBAAwB,qBAAqB,SAAS,GAAG;AAC3D,mBAAW,uBAAuB,sBAAsB;AACtD,UAAAA,QAAO,QAAQ,qCAAqC,KAAK,IAAI,IAAI,cAAc,oBAAoB,GAAG,CAAC;AACvG,iBAAO,MAAM,eAAe,MAAM,qBAAqB,UAAU,gBAAgB;AAAA,QACnF;AAAA,MACF;AACA,UAAI,0BAA0B,uBAAuB,SAAS,GAAG;AAC/D,mBAAW,yBAAyB,wBAAwB;AAC1D,UAAAA,QAAO,QAAQ,yCAAyC,KAAK,IAAI,IAAI,cAAc,sBAAsB,GAAG,CAAC;AAC7G,iBAAO,MAAM,iBAAiB,MAAM,uBAAuB,UAAU,gBAAgB;AAAA,QACvF;AAAA,MACF;AAGA,uBAAiB,UAAU,KAAK,KAAK,IAAI;AAAA,IAC3C,UAAE;AAEA,uBAAiB,aAAa,KAAK,GAAG;AAAA,IACxC;AAEA,IAAAA,QAAO,QAAQ,qBAAqB,cAAc,IAAI,CAAC;AACvD,WAAO;AAAA,EACT,CAAC;AACH;;;ALnEA,SAAsB,MAAAC,WAAU;AAMhC,IAAMC,UAAS,eAAU,IAAI,aAAa,OAAO,KAAK;AAGtD,IAAM,gBAAgB,CAAC,kBAAyB,gBAA8B;AAC5E,QAAM,iBAAiB,CAAC,GAAG,gBAAgB;AAE3C,aAAW,cAAc,aAAa;AACpC,UAAM,gBAAgB,eAAe;AAAA,MACnC,CAAC,aAAkB,SAAS,OAAO,WAAW,MAAM,SAAS,UAAU,WAAW;AAAA,IACpF;AACA,QAAI,kBAAkB,IAAI;AACxB,qBAAe,KAAK,UAAU;AAAA,IAChC,WAAW,WAAW,WAAW,eAAe,aAAa,EAAE,SAAS;AACtE,qBAAe,aAAa,EAAE,UAAU;AAAA,QACtC,GAAG,eAAe,aAAa,EAAE;AAAA,QACjC,GAAG,WAAW;AAAA,MAChB;AAAA,IACF,WAAW,WAAW,SAAS;AAC7B,qBAAe,aAAa,EAAE,UAAU,WAAW;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,kBAAkB,CAS7B,QACA,YACA,aACG;AAEH,QAAM,EAAE,YAAY,SAAS,EAAE,YAAY,aAAa,EAAE,IAAI;AAG9D,QAAM,MAAM,OACV,WACA,cACiB;AACjB,IAAAA,QAAO,MAAM,2BAA2B,OAAO,CAAC,EAAE,IAAI,SAAS,WAAW,UAAU,CAAC,sBAAsB,WAAW,IAAI,CAAAC,SAAO,GAAGA,KAAI,EAAE,IAAIA,KAAI,EAAE,EAAE,EAAE,KAAK,IAAI,KAAK,MAAM,EAAE;AAC9K,UAAM,MAA4C,aAAa,CAAC;AAGhE,UAAM,QAAQ,OAAO,CAAC;AAGtB,UAAM,UAAU,WAAW,WAAW,KAAK;AAG3C,QAAI,IAAI,SAAS,GAAG;AAClB,YAAM,EAAE,IAAI,IAAI;AAChB,YAAM,kBAAkD,CAAC;AACzD,YAAM,wBAAwD,CAAC;AAC/D,YAAM,qBAA4B,CAAC;AAGnC,iBAAW,UAAU,KAAK;AACxB,cAAM,mBAAmB,sBAAsB,OAAO,OAAO,IAAI,KAAK,IAAI;AAE1E,YAAI,CAAC,iBAAiB,OAAO;AAC3B,gBAAM,eAAe,iBAAiB,OAAO,EAAE,kCAAkC,MAAM,IAAI;AAC3F,UAAAD,QAAO,MAAM,cAAc,EAAE,WAAW,KAAK,IAAI,CAAC;AAClD,gBAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAEA,YAAI,iBAAiB,UAAU;AAC7B,0BAAgB,KAAK,MAAM;AAAA,QAC7B,OAAO;AACL,gCAAsB,KAAK,MAAM;AAAA,QACnC;AAAA,MACF;AAGA,iBAAW,UAAU,iBAAiB;AACpC,YAAI,OAAO,OAAO,UAAa,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAO,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,OAAO,EAAE,EAAE,WAAW,GAAI;AAC9I,UAAAA,QAAO,MAAM,iBAAiB,OAAO,EAAE,2BAA2B,cAAc,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,WAAW,IAAI,CAAC;AACxH,gBAAM,IAAI,MAAM,iBAAiB,OAAO,EAAE,2BAA2B,cAAc,OAAO,EAAE,CAAC,EAAE;AAAA,QACjG;AACA,cAAM,kBAAkB,OAAO,KAAK;AAGpC,YAAI,QAAQ,MAAM,eAAe,GAAG;AAClC,UAAAA,QAAO,MAAM,eAAe,eAAe,oFAAoF;AAC/H;AAAA,QACF;AAEA,QAAAA,QAAO,MAAM,+CAA+C,eAAe,MAAM,cAAc,OAAO,EAAE,CAAC,WAAW,OAAO,OAAO,EAAE,GAAG;AACvI,gBAAQ,MAAM,eAAe,IAAI;AAAA,UAC/B,CAACE,IAAG,EAAE,GAAG,OAAO;AAAA,QAClB;AAAA,MACF;AAGA,iBAAW,UAAU,uBAAuB;AAC1C,YAAI,OAAO,OAAO,UAAa,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAO,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,OAAO,EAAE,EAAE,WAAW,GAAI;AAC9I,UAAAF,QAAO,MAAM,8BAA8B,OAAO,EAAE,2BAA2B,cAAc,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,WAAW,IAAI,CAAC;AACrI,gBAAM,IAAI,MAAM,8BAA8B,OAAO,EAAE,2BAA2B,cAAc,OAAO,EAAE,CAAC,EAAE;AAAA,QAC9G;AACA,cAAM,mBAAmB,sBAAsB,OAAO,OAAO,IAAI,GAAG;AAEpE,YAAI,iBAAiB,SAAS,iBAAiB,MAAM;AAEnD,cAAI,QAAQ,MAAM,iBAAiB,IAAI,GAAG;AACxC,YAAAA,QAAO,MAAM,eAAe,iBAAiB,IAAI,iGAAiG;AAClJ;AAAA,UACF;AAGA,UAAAA,QAAO,MAAM,qDAAqD,iBAAiB,IAAI,MAAM,cAAc,OAAO,EAAE,CAAC,WAAW,OAAO,OAAO,EAAE,GAAG;AACnJ,kBAAQ,MAAM,iBAAiB,IAAI,IAAI;AAAA,YACrC,CAACE,IAAG,EAAE,GAAG,OAAO;AAAA,UAClB;AAGA,cAAI,iBAAiB,UAAU;AAC7B,+BAAmB,KAAK,GAAG,iBAAiB,QAAQ;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAGA,UAAI,mBAAmB,SAAS,GAAG;AACjC,cAAM,mBAAmB,QAAQ,WAAW,CAAC;AAC7C,gBAAQ,UAAU,cAAc,kBAAkB,kBAAkB;AAAA,MACtE;AAAA,IACF;AAEA,IAAAF,QAAO,QAAQ,4BAA4B,MAAM,IAAI,uBAAuB,QAAQ,QAAQ,OAAO,KAAK,QAAQ,KAAK,EAAE,KAAK,IAAI,IAAI,MAAM,eAAe,QAAQ,SAAS,UAAU,CAAC,EAAE;AAEvL,QAAI;AACF,MAAAA,QAAO,MAAM,mBAAmB,MAAM,IAAI,4BAA4B,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC,EAAE;AAAA,IAC1G,QAAQ;AAEN,MAAAA,QAAO,MAAM,mBAAmB,MAAM,IAAI,kEAAkE,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC,EAAE,MAAM,oBAAoB;AAAA,IACzK;AACA,UAAM,gBAAgB,MAAM,MAAM,QAAQ,OAAO;AASjD,UAAM,iBAAiB,eAAe,kBAAkB;AACxD,UAAM,UAAW,MAAM,QAAQ,IAAI,cAAc,IAAI,OAAO,QAAa;AAEvE,YAAM,eAAe,MAAM,WAAW,KAAK,WAAW,KAAK,YAAY,cAAc,UAAU,cAAc;AAC7G,aAAO,aAAa,cAAc,WAAW,GAAG;AAAA,IAClD,CAAC,CAAC;AAEF,IAAAA,QAAO,MAAM,mBAAmB,QAAQ,MAAM,IAAI,MAAM,IAAI,UAAU;AACtE,WAAO;AAAA,EACT;AAEA,SAAO;AAET;;;AOpLA,SAAiB,YAAAG,WAAU,YAAAC,WAAqC,gBAAAC,qBAAoB;AAWpF,IAAMC,UAAS,eAAU,IAAI,aAAa,OAAO,QAAQ;AAGzD,SAAS,uBAAuB,OAAY,UAAe,WAA0B;AACnF,QAAM,kBAAkB,MAAM,WAAW;AACzC,QAAM,YAAY,MAAM,UAAU;AAClC,QAAM,aAAa,MAAM,UAAU;AACnC,QAAM,SAAS,MAAM,UAAU;AAE/B,EAAAA,QAAO,MAAM,0CAA0C;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,EAC5C,CAAC;AAGD,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,UAAI,YAAY;AACd,eAAO,IAAI,MAAM,+CAA+C,UAAU,MAAM,UAAU,EAAE,EAAE;AAAA,MAChG;AACA,aAAO,IAAI,MAAM,yDAAyD,UAAU,EAAE,EAAE;AAAA,IAE1F,KAAK;AACH,UAAI,YAAY;AACd,eAAO,IAAI,MAAM,2BAA2B,UAAU,iDAAiD,UAAU,EAAE,EAAE;AAAA,MACvH;AACA,aAAO,IAAI,MAAM,+EAA+E,UAAU,EAAE,EAAE;AAAA,IAEhH,KAAK;AACH,YAAM,SAAS,MAAM,UAAU;AAC/B,UAAI,QAAQ;AACV,eAAO,IAAI,MAAM,mBAAmB,MAAM,kBAAkB;AAAA,MAC9D;AACA,aAAO,IAAI,MAAM,mCAAmC;AAAA,IAEtD,KAAK;AACH,UAAI,YAAY;AACd,eAAO,IAAI,MAAM,qBAAqB,UAAU,eAAe,UAAU,EAAE,EAAE;AAAA,MAC/E;AACA,aAAO,IAAI,MAAM,sDAAsD,UAAU,EAAE,EAAE;AAAA,IAEvF,KAAK;AACH,aAAO,IAAI,MAAM,kDAAkD,UAAU,EAAE,EAAE;AAAA,IAEnF,KAAK;AACH,aAAO,IAAI,MAAM,oDAAoD,UAAU,EAAE,EAAE;AAAA,IAErF,KAAK;AACH,YAAM,kBAAkB,MAAM,UAAU;AACxC,UAAI,iBAAiB;AACnB,eAAO,IAAI,MAAM,WAAW,eAAe,8BAA8B,SAAS,GAAG;AAAA,MACvF;AACA,aAAO,IAAI,MAAM,kCAAkC;AAAA,IAErD,KAAK;AACH,aAAO,IAAI,MAAM,UAAU,SAAS,kBAAkB;AAAA,IAExD;AAEE,UAAI,gBAAgB,SAAS,mBAAmB,GAAG;AACjD,cAAM,eAAe,gBAAgB,MAAM,wCAAwC;AACnF,YAAI,cAAc;AAChB,gBAAM,SAAS,aAAa,IAAI,CAAC,UAAkB;AACjD,kBAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,mBAAO,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAAA,UAC/B,CAAC,EAAE,OAAO,OAAO;AACjB,cAAI,OAAO,SAAS,GAAG;AACrB,mBAAO,IAAI,MAAM,iBAAiB,OAAO,SAAS,IAAI,MAAM,EAAE,IAAI,OAAO,KAAK,IAAI,CAAC,iBAAiB;AAAA,UACtG;AAAA,QACF;AACA,eAAO,IAAI,MAAM,6BAA6B;AAAA,MAChD;AAGA,aAAO,IAAI,MAAM,qBAAqB,SAAS,cAAc,eAAe,gBAAgB,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC,EAAE;AAAA,EACnI;AACF;AAGA,eAAe,0BACb,QACA,QACA,KACe;AACf,MAAI;AAEF,UAAM,eAAe,IAAI,QAAQ,OAAO,EAAE;AAC1C,QAAI,iBAAiB,IAAI;AACvB,YAAM,IAAI,MAAM,iBAAiB,OAAO,EAAE,0BAA0B;AAAA,IACtE;AAGA,UAAM,eAAe,OAAO,YAAY,KAAK,OAAO,CAAC;AAGrD,UAAM,cAAc,uBAAuB,cAAc,KAAK,cAAc,IAAI,SAAS,CAAC;AAE1F,QAAI,CAAC,YAAY,SAAS;AAExB,YAAMC,UAAS,MAAM,aAAa,SAAS,OAAO,EAAE;AACpD,UAAI,CAACA,SAAQ;AACX,cAAM,IAAI,MAAM,cAAc,OAAO,EAAE,YAAY,OAAO,EAAE,iBAAiB;AAAA,MAC/E;AACA;AAAA,IACF;AAGA,UAAM,eAAoB;AAAA,MACxB,OAAO,EAAE,IAAI,OAAO,GAAG;AAAA,IACzB;AAEA,QAAI,YAAY,YAAY,YAAY,SAAS,SAAS,GAAG;AAC3D,mBAAa,UAAU,YAAY;AAAA,IACrC;AAEA,UAAM,SAAS,MAAM,aAAa,QAAQ,YAAY;AACtD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,cAAc,OAAO,EAAE,YAAY,OAAO,EAAE,qCAAqC;AAAA,IACnG;AAAA,EACF,SAAS,OAAY;AAEnB,QAAI,MAAM,UAAU;AAClB,YAAM,uBAAuB,OAAO,EAAE,QAAQ,IAAI,GAAG,OAAO,EAAE;AAAA,IAChE;AACA,UAAM;AAAA,EACR;AACF;AAEO,IAAM,qBAAqB,CAShC,QACA,YAEA,aACG;AAEH,QAAM,SAAS,OACb,MACA,YAOe;AACf,UAAM,cAAc,SAAS,MACzB,WAAW,QAAQ,IAAI,EAAE,UAAUC,UAAS,QAAQ,GAAG,IACpD,QAAQ,IAAsC,IAAI,IAAI,CAAC,MAAW,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,IAC/F,EAAE,MACJ,SAAS,YACP,cAAc,QAAQ,UAAU,IAAI,SAAO,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC,KAC5E;AACN,IAAAF,QAAO,MAAM,8BAA8B,OAAO,CAAC,EAAE,IAAI,SAAS,WAAW,EAAE;AAC/E,IAAAA,QAAO,QAAQ,yBAAyB,OAAO,CAAC,EAAE,IAAI,SAAS,OAAO,KAAK,IAAI,EAAE,MAAM,cAAc;AAErG,UAAM,EAAE,YAAY,SAAS,EAAE,YAAY,aAAa,EAAE,IAAI;AAC9D,UAAM,EAAE,IAAI,IAAI;AAGhB,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,kBAAkB,MAAM,cAAc;AAG5C,QAAI,WAAW,EAAE,GAAG,KAAK;AAGzB,eAAW,cAAc,QAAQ;AACjC,eAAW,aAAa,QAAQ;AAGhC,UAAM,oBAA8B,CAAC;AACrC,eAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,0BAAkB,KAAK,GAAG;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,kBAAkB,SAAS,GAAG;AAChC,YAAM,sBAAsB,OAAO,KAAK,eAAe,EAAE,KAAK,IAAI;AAClE,YAAM,IAAI;AAAA,QACR,iCAAiC,MAAM,IAAI,OAAO,kBAAkB,KAAK,IAAI,CAAC,6BACpD,mBAAmB,iBAC/B,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,MACjD;AAAA,IACF;AAMA,QAAI,SAAS,KAAK;AAChB,YAAM,MAAM,QAAQ;AACpB,UAAIG,UAAS,GAAG,GAAG;AAEjB,iBAAS,KAAK,IAAI;AAAA,MACpB,WAAWD,UAAS,GAAG,GAAG;AAExB,iBAAS,KAAK,IAAI;AAGlB,cAAM,SAAS;AACf,cAAM,kBAAkD,CAAC;AACzD,cAAM,wBAAwD,CAAC;AAG/D,mBAAW,UAAU,OAAO,KAAK;AAC/B,gBAAM,mBAAmB,sBAAsB,OAAO,OAAO,IAAI,KAAK,IAAI;AAE1E,cAAI,CAAC,iBAAiB,OAAO;AAC3B,kBAAM,eAAe,MAAM,eAAe,OAAO,KAAK,MAAM,YAAY,IAAI,CAAC;AAC7E,kBAAM,eAAe,0BAA0B,OAAO,EAAE,kCAAkC,MAAM,IAAI,4DACtE,aAAa,KAAK,IAAI,CAAC,YAC1C,IAAI,KAAK,IAAI,CAAC,qBACL,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACnD,YAAAF,QAAO,MAAM,cAAc,EAAE,KAAK,QAAQ,KAAK,aAAa,CAAC;AAC7D,kBAAM,IAAI,MAAM,YAAY;AAAA,UAC9B;AAEA,cAAI,iBAAiB,UAAU;AAC7B,4BAAgB,KAAK,MAAM;AAAA,UAC7B,OAAO;AACL,kCAAsB,KAAK,MAAM;AAAA,UACnC;AAAA,QACF;AAGA,mBAAW,UAAU,iBAAiB;AACpC,cAAI,OAAO,MAAM,QAAQ,OAAO,OAAO,IAAI;AACzC,YAAAA,QAAO,MAAM,2BAA2B,OAAO,EAAE,iCAAiC,EAAE,QAAQ,KAAK,OAAO,CAAC;AACzG,kBAAM,IAAI,MAAM,2BAA2B,OAAO,EAAE,+BAA+B;AAAA,UACrF;AACA,gBAAM,kBAAkB,OAAO,KAAK;AACpC,mBAAS,eAAe,IAAI,OAAO;AAAA,QACrC;AAGA,mBAAW,UAAU,uBAAuB;AAC1C,gBAAM,0BAA0B,QAAQ,QAAQ,GAAG;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAIA,QAAI,SAAS,WAAW;AACtB,YAAM,kBAAkD,CAAC;AACzD,YAAM,wBAAwD,CAAC;AAG/D,iBAAW,UAAU,QAAQ,WAAW;AACtC,cAAM,mBAAmB,sBAAsB,OAAO,OAAO,IAAI,KAAK,IAAI;AAE1E,YAAI,CAAC,iBAAiB,OAAO;AAC3B,gBAAM,eAAe,MAAM,eAAe,OAAO,KAAK,MAAM,YAAY,IAAI,CAAC;AAC7E,gBAAM,eAAe,iBAAiB,OAAO,EAAE,kCAAkC,MAAM,IAAI,4DAC7D,aAAa,KAAK,IAAI,CAAC,YAC1C,IAAI,KAAK,IAAI,CAAC,iBACT,KAAK,UAAU,QAAQ,WAAW,MAAM,CAAC,CAAC;AAC1D,UAAAA,QAAO,MAAM,cAAc,EAAE,WAAW,QAAQ,WAAW,KAAK,aAAa,CAAC;AAC9E,gBAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAEA,YAAI,iBAAiB,UAAU;AAC7B,0BAAgB,KAAK,MAAM;AAAA,QAC7B,OAAO;AACL,gCAAsB,KAAK,MAAM;AAAA,QACnC;AAAA,MACF;AAGA,iBAAW,UAAU,iBAAiB;AACpC,YAAI,OAAO,MAAM,QAAQ,OAAO,OAAO,IAAI;AACzC,UAAAA,QAAO,MAAM,oBAAoB,OAAO,EAAE,iCAAiC,EAAE,QAAQ,WAAW,QAAQ,UAAU,CAAC;AACnH,gBAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE,+BAA+B;AAAA,QAC9E;AACA,cAAM,kBAAkB,OAAO,KAAK;AACpC,iBAAS,eAAe,IAAI,OAAO;AAAA,MACrC;AAGA,iBAAW,UAAU,uBAAuB;AAC1C,cAAM,0BAA0B,QAAQ,QAAQ,GAAG;AAAA,MACrD;AAAA,IACF;AAGA,QAAI;AACF,MAAAA,QAAO,MAAM,sBAAsB,MAAM,IAAI,wBAAwB,cAAc,QAAQ,CAAC,EAAE;AAC9F,YAAM,gBAAgB,MAAM,MAAM,OAAO,QAAQ;AAIjD,YAAM,kBAAkB,MAAM,WAAW,eAAe,KAAK,YAAY,cAAc,QAAQ;AAC/F,YAAM,SAASI,cAAa,iBAAiB,GAAG;AAEhD,MAAAJ,QAAO,MAAM,oBAAoB,MAAM,IAAI,cAAe,OAAe,MAAM,KAAK,UAAW,OAAe,GAAG,IAAI,MAAM,cAAc,EAAE,EAAE,EAAE;AAC/I,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,YAAM,uBAAuB,OAAO,UAAU,MAAM,IAAI;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AACT;;;ACtUA,SAA4B,gBAAAK,qBAAoB;AAShD,IAAMC,UAAS,eAAU,IAAI,aAAa,OAAO,MAAM;AAEhD,IAAM,mBAAmB,CAS9B,QACA,YACA,aACG;AAEH,QAAM,EAAE,SAAS,EAAE,SAAS,YAAY,aAAa,EAAE,IAAI;AAE3D,QAAM,OAAO,OACX,QACA,cACA,cAEiB;AACjB,UAAM,kBAAkB,WAAW,IAAI,SAAO,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,KAAK;AACnF,IAAAA,QAAO;AAAA,MACL,4BAA4B,OAAO,CAAC,EAAE,IAAI,iBAAiB,MAAM,SAC1D,WAAW,UAAU,CAAC,sBAAsB,eAAe;AAAA,IACpE;AACA,IAAAA,QAAO,QAAQ,uBAAuB,OAAO,CAAC,EAAE,IAAI,kBAAkB,MAAM,UAAU,OAAO,KAAK,YAAY,EAAE,MAAM,SAAS;AAI/H,QAAI,WAAW,QAAQ,MAAM,GAAG;AAC9B,YAAM,eAAe,QAAQ,MAAM;AACnC,UAAI,cAAc;AAChB,QAAAA,QAAO,MAAM,4BAA4B,MAAM,QAAQ,OAAO,CAAC,EAAE,IAAI,iBAAiB,cAAc,YAAY,CAAC,gBAAgB,cAAc,SAAS,CAAC,EAAE;AAC3J,cAAM,UAAU,MAAM,aAAa,cAAc,SAAS;AAC1D,YAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,gBAAM,mBAAoB,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,QAAa;AAE1E,kBAAM,eAAe,MAAM,WAAW,KAAK,WAAW,WAAW,KAAK,YAAY,cAAc,QAAQ;AACxG,mBAAOC,cAAa,cAAc,WAAW,WAAW,GAAG;AAAA,UAC7D,CAAC,CAAC;AAEF,UAAAD,QAAO,MAAM,gBAAgB,iBAAiB,MAAM,IAAI,OAAO,CAAC,EAAE,IAAI,0BAA0B,MAAM,GAAG;AACzG,iBAAO;AAAA,QACT,OAAO;AACL,UAAAA,QAAO,MAAM,kBAAkB,OAAO,CAAC,EAAE,IAAI,0BAA0B,MAAM,GAAG;AAChF,iBAAO,CAAC;AAAA,QACV;AAAA,MACF,OAAO;AACL,QAAAA,QAAO,MAAM,uBAAuB,MAAM;AAC1C,cAAM,IAAI,MAAM,UAAU,MAAM,YAAY;AAAA,MAC9C;AAAA,IACF,OAAO;AACL,MAAAA,QAAO,MAAM,2CAA2C;AACxD,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;;;ACtEA;AAAA,EAEE,YAAAE;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EAGA,gBAAAC;AAAA,OACK;AAMP,SAAS,qBAAqB;AAM9B,IAAMC,WAAS,eAAU,IAAI,aAAa,OAAO,KAAK;AAGtD,IAAM,sBAAsB,CAC1B,QACA,OACA,QACuD;AACvD,QAAM,QAAgC,EAAE,IAAI,OAAO,GAAG;AACtD,QAAM,WAAkB,CAAC;AAEzB,aAAW,WAAW,OAAO,KAAK;AAChC,UAAM,mBAAmB,sBAAsB,OAAO,QAAQ,IAAI,GAAG;AAErE,QAAI,CAAC,iBAAiB,OAAO;AAC3B,YAAM,eAAe,0BAA0B,QAAQ,EAAE,kCAAkC,MAAM,IAAI,oDAAoD,IAAI,KAAK,IAAI,CAAC,qBAAqB,cAAc,MAAM,CAAC,8BAA8B,OAAO,KAAK,MAAM,gBAAgB,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAC/R,MAAAA,SAAO,MAAM,cAAc,EAAE,KAAK,QAAQ,IAAI,CAAC;AAC/C,YAAM,IAAI,MAAM,YAAY;AAAA,IAC9B;AAEA,QAAI,iBAAiB,MAAM;AAEzB,YAAM,iBAAiB,IAAI,IAAI,QAAQ;AACvC,UAAI,iBAAiB,UAAU;AAC7B,iBAAS,KAAK,GAAG,iBAAiB,QAAQ;AAAA,MAC5C;AAAA,IACF,OAAO;AAEL,YAAM,YAAY,GAAG,QAAQ,EAAE;AAC/B,YAAM,SAAS,IAAI,QAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,SAA6D,EAAE,MAAM;AAC3E,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,IAAM,kBAAkB,CAS7B,QACA,YACA,aACG;AAEH,QAAM,EAAE,YAAY,SAAS,EAAE,YAAY,aAAa,EAAE,IAAI;AAC9D,QAAM,EAAE,IAAI,IAAI;AAEhB,QAAM,MAAM,OACV,QACe;AACf,QAAI,CAAC,eAAe,GAAG,GAAG;AACxB,MAAAA,SAAO,MAAM,0CAA0C,GAAG;AAC1D,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,iBAAiBC,UAAS,GAAG,IAC/B,mBAAmB,IAAI,EAAE,KACzB,qBAAqB,IAAI,EAAE,UAAW,IAAsC,IAAI,IAAI,CAAC,MAAW,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AACjI,IAAAD,SAAO,MAAM,2BAA2B,OAAO,CAAC,EAAE,IAAI,SAAS,cAAc,EAAE;AAC/E,IAAAA,SAAO,QAAQ,sBAAsB,OAAO,CAAC,EAAE,IAAI,SAASC,UAAS,GAAG,IAAI,YAAY,WAAW,MAAM;AAEzG,UAAM,UAAU;AAGhB,UAAM,QAAQ,OAAO,CAAC;AAEtB,QAAI;AAEJ,QAAIA,UAAS,OAAO,GAAG;AAErB,MAAAD,SAAO,MAAM,mBAAmB,MAAM,IAAI,wBAAyB,QAAsB,EAAE,EAAE;AAC7F,aAAO,MAAM,MAAM,SAAU,QAAsB,EAAE;AAAA,IACvD,WAAWE,UAAS,OAAO,GAAG;AAE5B,YAAM,SAAS;AACf,YAAM,eAAe,oBAAoB,QAAQ,OAAO,GAAG;AAE3D,MAAAF,SAAO,QAAQ,uBAAuB,EAAE,aAAa,CAAC;AACtD,MAAAA,SAAO,MAAM,mBAAmB,MAAM,IAAI,4BAA4B,cAAc,YAAY,CAAC,EAAE;AACnG,aAAO,MAAM,MAAM,QAAQ,YAAY;AAAA,IACzC;AAEA,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,cAAqC,OAAO,YAAY,GAAG;AAAA,IACvE,OAAO;AAGL,YAAM,iBAAiB,eAAe,kBAAkB;AACxD,YAAM,SAASG,cAAa,MAAM,WAAW,MAAM,KAAK,YAAY,cAAc,UAAU,cAAc,GAAG,GAAG;AAEhH,MAAAH,SAAO,MAAM,mBAAmB,MAAM,IAAI,cAAe,OAAe,MAAM,KAAK,UAAW,OAAe,GAAG,IAAI,MAAM,KAAK,EAAE,EAAE,EAAE;AACrI,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACxHA,IAAMI,WAAS,eAAU,IAAI,aAAa,OAAO,KAAK;AAE/C,IAAM,kBAAkB,CAS7B,QACA,YACA,aACG;AACH,QAAM,MAAM,OACV,WACA,YAAkD,CAAC,MAC7B;AACtB,IAAAA,SAAO,MAAM,2BAA2B,OAAO,CAAC,EAAE,IAAI,SAAS,UAAU,MAAM,sBAAsB,UAAU,IAAI,SAAO,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,KAAK,MAAM,EAAE;AACvK,IAAAA,SAAO,QAAQ,sBAAsB,OAAO,CAAC,EAAE,IAAI,8BAA8B;AAEjF,UAAM,QAAQ,MAAM,gBAAgB,QAAQ,YAAY,QAAQ,EAAE,WAAW,SAAS;AACtF,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,SAAS,MAAM,CAAC;AACtB,MAAAA,SAAO,MAAM,eAAe,OAAO,CAAC,EAAE,IAAI,qBAAsB,OAAe,MAAM,KAAK,UAAW,OAAe,GAAG,IAAI,SAAS,EAAE;AACtI,aAAO;AAAA,IACT,OAAO;AACL,MAAAA,SAAO,MAAM,YAAY,OAAO,CAAC,EAAE,IAAI,eAAe;AACtD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC1CA,SAAiB,kBAAAC,uBAA8B;AAE/C,SAAS,UAAU,YAAAC,WAAU,YAAAC,iBAAsB;AASnD,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,WAAS,eAAU,IAAI,aAAa,OAAO,QAAQ;AAGzD,IAAMC,uBAAsB,CAC1B,QACA,OACA,QACuD;AACvD,QAAM,QAAgC,EAAE,IAAI,OAAO,GAAG;AACtD,QAAM,WAAkB,CAAC;AAEzB,aAAW,WAAW,OAAO,KAAK;AAChC,UAAM,mBAAmB,sBAAsB,OAAO,QAAQ,IAAI,GAAG;AAErE,QAAI,CAAC,iBAAiB,OAAO;AAC3B,YAAM,eAAe,0BAA0B,QAAQ,EAAE,kCAAkC,MAAM,IAAI;AACrG,MAAAD,SAAO,MAAM,cAAc,EAAE,KAAK,QAAQ,IAAI,CAAC;AAC/C,YAAM,IAAI,MAAM,YAAY;AAAA,IAC9B;AAEA,QAAI,iBAAiB,MAAM;AAEzB,YAAM,iBAAiB,IAAI,IAAI,QAAQ;AACvC,UAAI,iBAAiB,UAAU;AAC7B,iBAAS,KAAK,GAAG,iBAAiB,QAAQ;AAAA,MAC5C;AAAA,IACF,OAAO;AAEL,YAAM,YAAY,GAAG,QAAQ,EAAE;AAC/B,YAAM,SAAS,IAAI,QAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,SAA6D,EAAE,MAAM;AAC3E,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,IAAM,qBAAqB,CAShC,QACA,YACA,cACG;AACH,QAAM,EAAE,YAAY,QAAQ,IAAI;AAChC,QAAM,EAAE,IAAI,IAAI;AAEhB,QAAM,SAAS,OACb,QACe;AACf,QAAI,CAACE,gBAAe,GAAG,GAAG;AACxB,MAAAF,SAAO,MAAM,6CAA6C,GAAG;AAC7D,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,iBAAiBG,UAAS,GAAG,IAC/B,mBAAmB,IAAI,EAAE,KACzB,qBAAqB,IAAI,EAAE,UAAW,IAAsC,IAAI,IAAI,CAAC,MAAW,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AACjI,IAAAH,SAAO,MAAM,8BAA8B,OAAO,CAAC,EAAE,IAAI,SAAS,cAAc,EAAE;AAClF,IAAAA,SAAO,QAAQ,yBAAyB,OAAO,CAAC,EAAE,IAAI,SAASG,UAAS,GAAG,IAAI,YAAY,WAAW,MAAM;AAG5G,UAAM,QAAQ,OAAO,CAAC;AAEtB,QAAI;AACJ,QAAI;AAEJ,IAAAH,SAAO,MAAM,cAAc,SAAS,GAAG,CAAC;AACxC,QAAIG,UAAS,GAAG,GAAG;AACjB,MAAAH,SAAO,MAAM,sBAAsB,MAAM,IAAI,wBAAyB,IAAkB,EAAE,EAAE;AAC5F,aAAO,MAAM,MAAM,SAAU,IAAkB,EAAE;AAAA,IACnD,WAAWI,UAAS,GAAG,GAAG;AAExB,YAAM,SAAS;AACf,YAAM,eAAeH,qBAAoB,QAAQ,OAAO,GAAG;AAE3D,MAAAD,SAAO,QAAQ,kCAAkC,MAAM,IAAI,uBAAuB,aAAa,QAAQ,OAAO,KAAK,aAAa,KAAK,EAAE,KAAK,IAAI,IAAI,MAAM,EAAE;AAC5J,MAAAA,SAAO,MAAM,sBAAsB,MAAM,IAAI,4BAA4B,cAAc,YAAY,CAAC,EAAE;AACtG,aAAO,MAAM,MAAM,QAAQ,YAAY;AAAA,IACzC;AAEA,QAAI,CAAC,MAAM;AACT,YAAM,IAAID,eAAqC,UAAU,YAAY,GAAG;AAAA,IAC1E;AAEA,UAAM,qBAAqB,MAAM,cAAc,EAAE;AACjD,UAAM,qBAAqB,MAAM,cAAc,EAAE;AAEjD,QAAI,sBAAsB,oBAAoB;AAC5C,UAAI,MAAM,cAAc,EAAE,WAAW;AACnC,aAAK,YAAY;AAAA,MACnB;AAEA,UAAI,MAAM,cAAc,EAAE,WAAW;AACnC,aAAK,YAAY,oBAAI,KAAK;AAAA,MAC5B;AAGA,MAAAC,SAAO,MAAM,sBAAsB,MAAM,IAAI,yBAAyB;AACtE,YAAM,MAAM,KAAK;AACjB,mBAAa,MAAM,IAAI,EAAE,OAAO,KAAK,CAAC;AACtC,mBAAa,OAAO,MAAM,YAAmB,GAAG;AAChD,mBAAa,eAAe,UAAU;AAAA,IACxC,WAAW,QAAQ,gBAAgB;AACjC,MAAAA,SAAO,MAAM,sBAAsB,MAAM,IAAI,4BAA4B;AACzE,YAAM,MAAM,QAAQ;AACpB,mBAAa,MAAM,IAAI,EAAE,OAAO,KAAK,CAAC;AACtC,mBAAa,OAAO,MAAM,YAAmB,GAAG;AAChD,mBAAa,eAAe,UAAU;AAAA,IACxC,OAAO;AACL,YAAM,IAAI,MAAM,mFAAmF;AAAA,IACrG;AAEA,IAAAA,SAAO,MAAM,oBAAoB,MAAM,IAAI,cAAe,WAAmB,MAAM,KAAK,UAAW,WAAmB,GAAG,IAAI,MAAM,KAAK,EAAE,EAAE,EAAE;AAC9I,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC7IA,SAAS,YAAAK,WAAU,YAAAC,WAAU,gBAAAC,qBAAoB;AAEjD,SAAS,YAAAC,iBAAgB;AAWzB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAsB,MAAAC,WAAU;AAIhC,IAAMC,WAAS,eAAU,IAAI,aAAa,OAAO,QAAQ;AAGzD,IAAMC,iBAAgB,CAAC,kBAAyB,gBAA8B;AAC5E,QAAM,iBAAiB,CAAC,GAAG,gBAAgB;AAE3C,aAAW,cAAc,aAAa;AACpC,UAAM,gBAAgB,eAAe;AAAA,MACnC,CAAC,aAAkB,SAAS,OAAO,WAAW,MAAM,SAAS,UAAU,WAAW;AAAA,IACpF;AACA,QAAI,kBAAkB,IAAI;AACxB,qBAAe,KAAK,UAAU;AAAA,IAChC,WAAW,WAAW,WAAW,eAAe,aAAa,EAAE,SAAS;AACtE,qBAAe,aAAa,EAAE,UAAU;AAAA,QACtC,GAAG,eAAe,aAAa,EAAE;AAAA,QACjC,GAAG,WAAW;AAAA,MAChB;AAAA,IACF,WAAW,WAAW,SAAS;AAC7B,qBAAe,aAAa,EAAE,UAAU,WAAW;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,qBAAqB,CAShC,QACA,YAEA,aACG;AAEH,QAAM,EAAE,SAAS,EAAE,YAAY,aAAa,EAAE,IAAI;AAElD,QAAM,SAAS,OACb,KACA,SACe;AACf,UAAM,iBAAiBC,UAAS,GAAG,IAC/B,mBAAmB,IAAI,EAAE,KACzB,qBAAqB,IAAI,EAAE,UAAW,IAAsC,IAAI,IAAI,CAAC,MAAW,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AACjI,IAAAF,SAAO,MAAM,8BAA8B,OAAO,CAAC,EAAE,IAAI,SAAS,cAAc,EAAE;AAClF,UAAM,EAAE,WAAW,IAAI;AACvB,UAAM,EAAE,IAAI,IAAI;AAEhB,IAAAA,SAAO,MAAM,kBAAkBG,UAAS,GAAG,GAAG,IAAI;AAGlD,UAAM,QAAQ,OAAO,CAAC;AAEtB,QAAI;AAEJ,QAAID,UAAS,GAAG,GAAG;AAEjB,YAAM,SAAS;AACf,MAAAF,SAAO,MAAM,sBAAsB,MAAM,IAAI,wBAAwB,OAAO,EAAE,EAAE;AAChF,iBAAW,MAAM,MAAM,SAAS,OAAO,EAAE;AAAA,IAC3C,WAAWI,UAAS,GAAG,GAAG;AACxB,YAAM,SAAS;AAGf,YAAM,QAAgC,EAAE,IAAI,OAAO,GAAG;AACtD,YAAM,qBAA4B,CAAC;AAGnC,iBAAW,WAAW,OAAO,KAAK;AAChC,cAAM,mBAAmB,sBAAsB,OAAO,QAAQ,IAAI,KAAK,IAAI;AAE3E,YAAI,CAAC,iBAAiB,OAAO;AAC3B,gBAAM,eAAe,0BAA0B,QAAQ,EAAE,kCAAkC,MAAM,IAAI;AACrG,UAAAJ,SAAO,MAAM,cAAc,EAAE,KAAK,QAAQ,IAAI,CAAC;AAC/C,gBAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAEA,YAAI,iBAAiB,UAAU;AAE7B,gBAAM,YAAY,GAAG,QAAQ,EAAE;AAC/B,gBAAM,SAAS,IAAI,QAAQ;AAAA,QAC7B,WAAW,iBAAiB,MAAM;AAEhC,gBAAM,iBAAiB,IAAI,IAAI;AAAA,YAC7B,CAACK,IAAG,EAAE,GAAG,QAAQ;AAAA,UACnB;AAGA,cAAI,iBAAiB,UAAU;AAC7B,+BAAmB,KAAK,GAAG,iBAAiB,QAAQ;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,eAAoB,EAAE,MAAM;AAClC,UAAI,mBAAmB,SAAS,GAAG;AACjC,qBAAa,UAAUJ,eAAc,CAAC,GAAG,kBAAkB;AAAA,MAC7D;AAEA,MAAAD,SAAO,QAAQ,kCAAkC,MAAM,IAAI,uBAAuB,aAAa,QAAQ,OAAO,KAAK,aAAa,KAAK,EAAE,KAAK,IAAI,IAAI,MAAM,EAAE;AAC5J,MAAAA,SAAO,MAAM,sBAAsB,MAAM,IAAI,4BAA4B,cAAc,YAAY,CAAC,EAAE;AACtG,iBAAW,MAAM,MAAM,QAAQ,YAAY;AAAA,IAC7C;AAEA,QAAI,UAAU;AAGZ,UAAI,cAAc,UAAU,IAAI;AAEhC,oBAAc,cAAc,WAAW;AACvC,oBAAc,aAAa,WAAW;AAEtC,MAAAA,SAAO,QAAQ,gBAAgB,MAAM,IAAI,mBAAmB;AAC5D,MAAAA,SAAO,QAAQ,iCAAiC,OAAO,KAAK,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE;AAGrF,MAAAA,SAAO,MAAM,sBAAsB,MAAM,IAAI,8BAA8B,cAAc,WAAW,CAAC,EAAE;AACvG,iBAAW,MAAM,SAAS,OAAO,WAAW;AAI5C,YAAM,gBAAgB,MAAM,WAAW,UAAU,KAAK,YAAY,cAAc,QAAQ;AACxF,YAAM,aAAaM,cAAa,eAAe,GAAG;AAElD,MAAAN,SAAO,MAAM,oBAAoB,MAAM,IAAI,cAAe,WAAmB,MAAM,KAAK,UAAW,WAAmB,GAAG,IAAI,MAAM,SAAS,EAAE,EAAE,EAAE;AAClJ,aAAO;AAAA,IACT,OAAO;AACL,YAAM,IAAIO,eAAqC,UAAU,YAAY,GAAG;AAAA,IAC1E;AAAA,EAEF;AAEA,SAAO;AACT;;;AC7JA,SAAiB,kBAAAC,uBAAoC;AAWrD,IAAMC,WAAS,eAAU,IAAI,aAAa,OAAO,QAAQ;AAElD,IAAM,qBAAqB,CAShC,QACA,YACA,aACG;AAGH,QAAM,MAAM,gBAA0C,QAAQ,YAAY,QAAQ;AAClF,QAAM,SAAS,mBAA6C,QAAQ,YAAY,QAAQ;AACxF,QAAM,SAAS,mBAA6C,QAAQ,YAAY,QAAQ;AAExF,QAAM,SAAS,OACb,KACA,SACe;AAEf,QAAI,CAACC,gBAAe,GAAG,GAAG;AACxB,MAAAD,SAAO,MAAM,6CAA6C,GAAG;AAC7D,YAAM,IAAI,MAAM,0CAA0C,cAAc,GAAG,CAAC,EAAE;AAAA,IAChF;AAEA,IAAAA,SAAO,MAAM,wCAAwC,cAAc,GAAG,CAAC,EAAE;AAEzE,QAAI;AAEF,YAAM,eAAe,MAAM,IAAI,GAAG;AAClC,UAAI,cAAc;AAChB,QAAAA,SAAO,MAAM,4CAA4C,cAAc,GAAG,CAAC,EAAE;AAE7E,eAAO,MAAM,OAAO,KAAK,IAAI;AAAA,MAC/B;AAAA,IACF,QAAQ;AAEN,MAAAA,SAAO,MAAM,wDAAwD,cAAc,GAAG,CAAC,EAAE;AAAA,IAC3F;AAGA,WAAO,MAAM,OAAO,MAAM,EAAE,IAAI,CAAC;AAAA,EACnC;AAEA,SAAO;AACT;;;AC/CO,IAAM,mBAAmB,CAS9B,QACA,YACA,UACA,YACiD;AAEjD,QAAM,aAAa,CAAC;AAGpB,QAAM,aAAa,EAAE,YAAY,QAAQ;AAEzC,aAAW,MAAM,gBAA0C,QAAQ,YAAY,QAAQ;AACvF,aAAW,MAAM,gBAA0C,QAAQ,YAAY,QAAQ;AACvF,aAAW,SAAS,mBAA6C,QAAQ,YAAY,QAAQ;AAC7F,aAAW,SAAS,mBAA6C,QAAQ,YAAY,QAAQ;AAC7F,aAAW,MAAM,gBAA0C,QAAQ,YAAY,QAAQ;AACvF,aAAW,SAAS,mBAA6C,QAAQ,YAAY,QAAQ;AAC7F,aAAW,OAAO,iBAA2C,QAAQ,YAAY,QAAQ;AACzF,aAAW,SAAS,mBAA6C,QAAQ,YAAY,QAAQ;AAC7F,aAAW,WAAW,YAA0B;AAAA,EAAE;AAClD,aAAW,YAAY,YAA0B;AAAA,EAAE;AACnD,aAAW,SAAS,YAA0B;AAAA,EAAE;AAChD,aAAW,QAAQ,YAA0B;AAAA,EAAE;AAE/C,aAAW,UAAU,EAAE,GAAI,QAAQ,WAAW,CAAC,EAAG;AAClD,aAAW,UAAU,EAAE,GAAI,QAAQ,WAAW,CAAC,EAAG;AAClD,aAAW,SAAS,EAAE,GAAI,QAAQ,UAAU,CAAC,EAAG;AAChD,aAAW,aAAa,EAAE,GAAI,QAAQ,cAAc,CAAC,EAAG;AACxD,aAAW,YAAY,EAAE,GAAI,QAAQ,aAAa,CAAC,EAAG;AAEtD,SAAO;AACT;;;Af9CA,IAAME,WAAS,eAAgB,IAAI,kBAAkB;AA4B9C,IAAM,yBAAyB,CASlC,UACA,YACA,QACA,YAC+C;AACjD,EAAAA,SAAO,MAAM,0BAA0B,EAAE,YAAY,QAAQ,UAAU,QAAQ,CAAC;AAGhF,QAAM,aAAa,iBAA2C,QAAQ,YAAY,UAAU,OAAO;AAGnG,QAAM,oBAA4B,wBAAe,YAAY,SAAS,YAAY,QAAQ;AAG1F,QAAM,aAAqB,uBAAc,UAAU,YAAY,mBAAmB,OAAO;AAEzF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAKO,IAAM,qBAAqB,CAAC,YAAiF;AAClH,SAAO,WAAW,QAChB,QAAQ,cAAc,QACtB,QAAQ,cAAc,QACtB,QAAQ,WAAW,QACnB,QAAQ,YAAY,QACpB,QAAQ,UAAU,QAClB,MAAM,QAAQ,QAAQ,MAAM;AAChC;;;AgBxEA,IAAMC,WAAS,eAAgB,IAAI,iBAAiB;AAuB7C,IAAM,gCAAgC,CASzC,QACA,YAC+C;AACjD,SAAO,CAAC,YAA+C,YAAmE;AACxH,IAAAA,SAAO,MAAM,+BAA+B;AAAA,MAC1C;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,QAAQ,OAAO,IAAI,OAAK,EAAE,IAAI;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC1DA;AAAA;AAAA,gCAAAC;AAAA;;;ACGA,SAAS,iBAAiB;AAwBnB,SAASC,wBASd,UACA,QACA,aAAyD,CAAC,GAC1D,SAAmB,CAAC,GACpB,UAC4C;AAG5C,QAAM,aAAa,iBAAiB,UAAU,MAAM;AACpD,QAAM,UAAUC,eAAc,UAAU;AAGxC,QAAM,aAAa,iBAA2C,QAAQ,YAAY,UAAU,OAAO;AAGnG,QAAM,oBAAoB,UAAU,eAAe,YAAY,SAAgB,YAAY,QAAQ;AAEnG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;;;AC5DA;AAAA;AAAA,gCAAAC;AAAA;;;ACGA,SAAS,eAAe;AAUxB,IAAMC,WAAS,eAAU,IAAI,iBAAiB,WAAW,SAAS;AAa3D,SAASC,wBAId,SACA,QACA,aAAqC,CAAC,GACtC,SAAmB,CAAC,GACpB,UACwB;AACxB,EAAAD,SAAO,MAAM,0BAA0B,EAAE,SAAS,QAAQ,YAAY,OAAO,CAAC;AAG9E,QAAM,aAAa,iBAAiB,CAAC,OAAO,GAAG,MAAM;AACrD,QAAM,UAAUE,eAAc,UAAU;AAGxC,QAAM,aAAa,iBAAuB,QAAQ,YAAY,UAAU,OAAO;AAG/E,QAAM,oBAAoB,QAAQ,eAAe,YAAY,SAAgB,YAAY,QAAQ;AAEjG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;",
3
+ "sources": ["../src/Options.ts", "../src/logger.ts", "../src/Coordinate.ts", "../src/Definition.ts", "../src/SequelizeLibrary.ts", "../src/ops/all.ts", "../src/QueryBuilder.ts", "../src/util/general.ts", "../src/util/relationshipUtils.ts", "../src/KeyMaster.ts", "../src/RowProcessor.ts", "../src/EventCoordinator.ts", "../src/processing/ReferenceBuilder.ts", "../src/ops/create.ts", "../src/ops/find.ts", "../src/ops/get.ts", "../src/ops/one.ts", "../src/ops/remove.ts", "../src/ops/update.ts", "../src/ops/upsert.ts", "../src/Operations.ts", "../src/SequelizeLibraryFactory.ts", "../src/contained/index.ts", "../src/contained/SequelizeLibrary.ts", "../src/primary/index.ts", "../src/primary/SequelizeLibrary.ts"],
4
+ "sourcesContent": ["import * as Library from '@fjell/lib';\nimport { ComKey, Item, LocKeyArray, PriKey } from '@fjell/core';\nimport { SequelizeReferenceDefinition } from './processing/ReferenceBuilder';\n\n// Re-export AggregationDefinition from @fjell/lib for backwards compatibility\nexport type { AggregationDefinition } from '@fjell/lib';\n\n// Export Sequelize-specific reference definition\nexport type { SequelizeReferenceDefinition } from './processing/ReferenceBuilder';\n\n/**\n * Sequelize-specific Options that uses SequelizeReferenceDefinition\n * instead of the generic ReferenceDefinition\n */\nexport interface Options<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 hooks?: {\n preCreate?: (\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n options?:\n {\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n locations?: never;\n } | {\n key?: never;\n locations: LocKeyArray<L1, L2, L3, L4, L5>,\n }\n ) => Promise<Partial<Item<S, L1, L2, L3, L4, L5>>>;\n postCreate?: (\n item: V,\n ) => Promise<V>;\n preUpdate?: (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n ) => Promise<Partial<Item<S, L1, L2, L3, L4, L5>>>;\n postUpdate?: (\n item: V,\n ) => Promise<V>;\n preRemove?: (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n ) => Promise<Partial<Item<S, L1, L2, L3, L4, L5>>>;\n postRemove?: (\n item: V,\n ) => Promise<V>;\n },\n validators?: {\n onCreate?: (\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n options?:\n {\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n locations?: never;\n } | {\n key?: never;\n locations: LocKeyArray<L1, L2, L3, L4, L5>,\n }\n ) => Promise<boolean>;\n onUpdate?: (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n ) => Promise<boolean>;\n onRemove?: (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n ) => Promise<boolean>;\n },\n finders?: Record<string, Library.FinderMethod<V, S, L1, L2, L3, L4, L5>>,\n actions?: Record<string, Library.ActionMethod<V, S, L1, L2, L3, L4, L5>>,\n facets?: Record<string, Library.FacetMethod<V, S, L1, L2, L3, L4, L5>>,\n allActions?: Record<string, Library.AllActionMethod<V, S, L1, L2, L3, L4, L5>>,\n allFacets?: Record<string, Library.AllFacetMethod<L1, L2, L3, L4, L5>>,\n references?: SequelizeReferenceDefinition[], // Sequelize-specific!\n aggregations?: Library.AggregationDefinition[],\n deleteOnRemove?: boolean; // Sequelize-specific option\n}\n\nexport const createOptions = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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>(sequelizeOptions?: Options<V, S, L1, L2, L3, L4, L5>): Options<V, S, L1, L2, L3, L4, L5> => {\n // Convert Sequelize options to Library options (excluding references which have different types)\n const { references, deleteOnRemove, ...libCompatibleOptions } = sequelizeOptions || {};\n \n // Create base options from Library\n const baseOptions = Library.createOptions(libCompatibleOptions as Library.Options<V, S, L1, L2, L3, L4, L5>);\n\n // Return Sequelize options with Sequelize-specific references, aggregations, and deleteOnRemove\n return {\n ...baseOptions,\n references: references ?? [], // Keep Sequelize-specific references\n aggregations: baseOptions.aggregations ?? [], // Ensure aggregations is always present\n deleteOnRemove: deleteOnRemove ?? false, // Sequelize-specific option\n } as Options<V, S, L1, L2, L3, L4, L5>;\n}\n", "import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/lib-sequelize');\n\nexport default LibLogger;\n", "import { ItemTypeArray } from '@fjell/core';\nimport { Coordinate, createCoordinate as createBaseCoordinate } from '@fjell/registry';\nimport LibLogger from './logger';\n\nconst logger = LibLogger.get('Coordinate');\n\nexport const SCOPE_SEQUELIZE = 'sequelize';\n\nexport const createCoordinate = <\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>(kta: ItemTypeArray<S, L1, L2, L3, L4, L5>, scopes?: string[]): Coordinate<S, L1, L2, L3, L4, L5> => {\n logger.debug('createCoordinate', { kta, scopes });\n const coordinate = createBaseCoordinate(kta, [SCOPE_SEQUELIZE, ...(scopes || [])]);\n return coordinate;\n};\n\n// Re-export the Coordinate type\nexport type { Coordinate } from '@fjell/registry';\n", "import { Item, ItemTypeArray } from '@fjell/core';\nimport { createOptions, Options } from './Options';\nimport LibLogger from './logger';\nimport { createCoordinate } from './Coordinate';\n\nconst logger = LibLogger.get('lib-sequelize', 'Definition');\n\nexport interface Definition<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 coordinate: import('@fjell/registry').Coordinate<S, L1, L2, L3, L4, L5>;\n options: Options<V, S, L1, L2, L3, L4, L5>;\n}\n\nexport const createDefinition = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 kta: ItemTypeArray<S, L1, L2, L3, L4, L5>,\n scopes: string[],\n libOptions?: Partial<Options<V, S, L1, L2, L3, L4, L5>>,\n ): Definition<V, S, L1, L2, L3, L4, L5> => {\n logger.debug('createDefinition', { kta, scopes, libOptions });\n const coordinate = createCoordinate(kta, scopes);\n const options = createOptions<V, S, L1, L2, L3, L4, L5>(libOptions);\n\n return {\n coordinate,\n options,\n }\n}\n", "\nimport * as Library from '@fjell/lib';\nimport { Item } from '@fjell/core';\nimport { Coordinate } from '@fjell/registry';\nimport { Registry } from './Registry';\nimport { createOperations } from './Operations';\nimport { ModelStatic } from 'sequelize';\nimport { Options } from './Options';\nimport SequelizeLogger from './logger';\n\nconst logger = SequelizeLogger.get(\"SequelizeLibrary\");\n\n/**\n * The SequelizeLibrary interface extends the fjell-lib Library\n * and adds Sequelize-specific functionality:\n * - models: Array of Sequelize model classes for this library\n *\n * @template V - The type of the data model item, extending Item\n * @template S - The string literal type representing the model's key type\n * @template L1-L5 - Optional string literal types for location hierarchy levels\n */\nexport interface SequelizeLibrary<\n V extends Item<S, L1, L2, L3, L4, L5>,\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> extends Library.Library<V, S, L1, L2, L3, L4, L5> {\n /** Array of Sequelize model classes associated with this library */\n models: ModelStatic<any>[];\n}\n\n/**\n * Creates a new SequelizeLibrary that extends the fjell-lib Library\n * with Sequelize-specific functionality\n */\nexport const createSequelizeLibrary = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 registry: Registry,\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>,\n models: ModelStatic<any>[],\n options: Options<V, S, L1, L2, L3, L4, L5>\n ): SequelizeLibrary<V, S, L1, L2, L3, L4, L5> => {\n logger.debug(\"createSequelizeLibrary\", { coordinate, models, registry, options });\n\n // Create Sequelize-specific operations\n const operations = createOperations<V, S, L1, L2, L3, L4, L5>(models, coordinate, registry, options);\n\n // Wrap operations with validation and hooks from base library\n const wrappedOperations = Library.wrapOperations(operations, options, coordinate, registry);\n\n // Create the base fjell-lib library\n const libLibrary = Library.createLibrary(registry, coordinate, wrappedOperations, options);\n\n return {\n ...libLibrary,\n models,\n };\n}\n\n/**\n * Type guard to check if an object is a SequelizeLibrary\n */\nexport const isSequelizeLibrary = (library: any): library is SequelizeLibrary<any, any, any, any, any, any, any> => {\n return library != null &&\n library.coordinate != null &&\n library.operations != null &&\n library.options != null &&\n library.registry != null &&\n library.models != null &&\n Array.isArray(library.models);\n}\n", "/* eslint-disable no-undefined */\n/* eslint-disable indent */\nimport { validateKeys } from \"@fjell/core\";\n\nimport { buildQuery } from \"../QueryBuilder\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport * as Library from \"@fjell/lib\";\nimport { processRow } from \"../RowProcessor\";\nimport { Item, ItemQuery, LocKeyArray } from \"@fjell/core\";\nimport { ModelStatic, Op } from \"sequelize\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { contextManager } from \"../RowProcessor\";\n\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'all');\n\n// Helper function to merge includes avoiding duplicates\nconst mergeIncludes = (existingIncludes: any[], newIncludes: any[]): any[] => {\n const mergedIncludes = [...existingIncludes];\n\n for (const newInclude of newIncludes) {\n const existingIndex = mergedIncludes.findIndex(\n (existing: any) => existing.as === newInclude.as && existing.model === newInclude.model\n );\n if (existingIndex === -1) {\n mergedIncludes.push(newInclude);\n } else if (newInclude.include && mergedIncludes[existingIndex].include) {\n mergedIncludes[existingIndex].include = [\n ...mergedIncludes[existingIndex].include,\n ...newInclude.include\n ];\n } else if (newInclude.include) {\n mergedIncludes[existingIndex].include = newInclude.include;\n }\n }\n\n return mergedIncludes;\n};\n\nexport const getAllOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n const { coordinate, options: { references, aggregations } } = definition;\n\n //#region Query\n const all = async (\n itemQuery: ItemQuery,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [] | undefined\n ): Promise<V[]> => {\n logger.debug(`ALL operation called on ${models[0].name} with ${locations?.length || 0} location filters: ${locations?.map(loc => `${loc.kt}=${loc.lk}`).join(', ') || 'none'}`);\n const loc: LocKeyArray<L1, L2, L3, L4, L5> | [] = locations || [];\n\n // @ts-ignore\n const model = models[0];\n\n // Build base query from itemQuery\n const options = buildQuery(itemQuery, model);\n\n // Handle location keys if present\n if (loc.length > 0) {\n const { kta } = coordinate;\n const directLocations: Array<{ kt: string; lk: any }> = [];\n const hierarchicalLocations: Array<{ kt: string; lk: any }> = [];\n const additionalIncludes: any[] = [];\n\n // Categorize location keys as direct or hierarchical\n for (const locKey of loc) {\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Location key '${locKey.kt}' cannot be resolved on model '${model.name}' or through its relationships.`;\n logger.error(errorMessage, { locations: loc, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n directLocations.push(locKey);\n } else {\n hierarchicalLocations.push(locKey);\n }\n }\n\n // Handle direct location keys (simple foreign key constraints)\n for (const locKey of directLocations) {\n if (locKey.lk === undefined || locKey.lk == null || locKey.lk === '' || (typeof locKey.lk === 'object' && Object.keys(locKey.lk).length === 0)) {\n logger.error(`Location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`, { locKey, locations: loc });\n throw new Error(`Location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`);\n }\n const foreignKeyField = locKey.kt + 'Id';\n\n // Check if this field already has a condition from the itemQuery\n if (options.where[foreignKeyField]) {\n logger.debug(`[ALL] Field ${foreignKeyField} already constrained by itemQuery, skipping location constraint to avoid conflicts`);\n continue; // Skip this location constraint to avoid conflicts\n }\n\n logger.trace(`[ALL] Setting direct location where clause: ${foreignKeyField} = ${stringifyJSON(locKey.lk)} (type: ${typeof locKey.lk})`);\n options.where[foreignKeyField] = {\n [Op.eq]: locKey.lk\n };\n }\n\n // Handle hierarchical location keys (requires relationship traversal)\n for (const locKey of hierarchicalLocations) {\n if (locKey.lk === undefined || locKey.lk == null || locKey.lk === '' || (typeof locKey.lk === 'object' && Object.keys(locKey.lk).length === 0)) {\n logger.error(`Hierarchical location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`, { locKey, locations: loc });\n throw new Error(`Hierarchical location key '${locKey.kt}' has invalid lk value: ${stringifyJSON(locKey.lk)}`);\n }\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta);\n\n if (relationshipInfo.found && relationshipInfo.path) {\n // Check if this field already has a condition from the itemQuery\n if (options.where[relationshipInfo.path]) {\n logger.debug(`[ALL] Field ${relationshipInfo.path} already constrained by itemQuery, skipping hierarchical location constraint to avoid conflicts`);\n continue; // Skip this location constraint to avoid conflicts\n }\n\n // Add the relationship constraint using the path\n logger.trace(`[ALL] Setting hierarchical location where clause: ${relationshipInfo.path} = ${stringifyJSON(locKey.lk)} (type: ${typeof locKey.lk})`);\n options.where[relationshipInfo.path] = {\n [Op.eq]: locKey.lk\n };\n\n // Add necessary includes for the relationship traversal\n if (relationshipInfo.includes) {\n additionalIncludes.push(...relationshipInfo.includes);\n }\n }\n }\n\n // Merge additional includes with existing includes\n if (additionalIncludes.length > 0) {\n const existingIncludes = options.include || [];\n options.include = mergeIncludes(existingIncludes, additionalIncludes);\n }\n }\n\n logger.default(`All query configured for ${model.name} with where fields: ${options.where ? Object.keys(options.where).join(', ') : 'none'}, includes: ${options.include?.length || 0}`);\n\n try {\n logger.trace(`[ALL] Executing ${model.name}.findAll() with options: ${JSON.stringify(options, null, 2)}`);\n } catch {\n // Fallback for cases where JSON.stringify fails on Sequelize operators\n logger.trace(`[ALL] Executing ${model.name}.findAll() with options containing non-serializable operators (${Object.keys(options.where || {}).length} where conditions)`);\n }\n const matchingItems = await model.findAll(options);\n\n // this.logger.default('Matching Items', { matchingItems });\n\n // Pass null as context to let processRow create a new context for each top-level operation\n // This prevents circular dependency false positives between concurrent operations\n // while still detecting legitimate circular references within the same operation\n\n // TODO: Move this Up!\n const currentContext = contextManager.getCurrentContext();\n const results = (await Promise.all(matchingItems.map(async (row: any) => {\n // Each row in an all() operation should get its own context to prevent interference\n const processedRow = await processRow(row, coordinate.kta, references || [], aggregations || [], registry, currentContext);\n return validateKeys(processedRow, coordinate.kta);\n }))) as V[];\n\n logger.debug(`[ALL] Returning ${results.length} ${model.name} records`);\n return results;\n }\n\n return all;\n\n}\n", "/* eslint-disable max-len */\nimport {\n CompoundCondition,\n Condition,\n EventQuery,\n isComKey,\n isCondition,\n isPriKey,\n ItemQuery,\n OrderBy,\n PriKey,\n References\n} from '@fjell/core';\n\nimport { Association, ModelStatic, Op } from 'sequelize';\nimport LibLogger from './logger';\nimport { stringifyJSON } from './util/general';\n\nconst logger = LibLogger.get('sequelize', 'QueryBuilder');\n\nexport type QueryOptions = {\n where: Record<string, any>;\n limit?: number;\n offset?: number;\n order?: Array<[string, string]>;\n include?: Array<any>;\n}\n\nconst addDeleteQuery = (options: QueryOptions, model: ModelStatic<any>): QueryOptions => {\n logger.default(`QueryBuilder adding delete query with options: ${stringifyJSON(options)}`);\n if (model.getAttributes().deletedAt) {\n options.where['deletedAt'] = {\n [Op.eq]: null\n }\n } else if (model.getAttributes().isDeleted) {\n options.where['isDeleted'] = {\n [Op.eq]: false\n }\n }\n\n return options;\n}\n\nconst addEventQueries = (\n options: QueryOptions, events: Record<string, EventQuery>, model: ModelStatic<any>): QueryOptions => {\n logger.default(`QueryBuilder adding event queries with options: ${stringifyJSON(options)}, events: ${stringifyJSON(events)}`);\n Object.keys(events).forEach((key: string) => {\n\n if (!model.getAttributes()[`${key}At`]) {\n throw new Error(`Event ${key} is not supported on model '${model.name}', column '${key}At' not found. Available columns: [${Object.keys(model.getAttributes()).join(', ')}]. Event query: ${stringifyJSON(events[key])}`);\n }\n\n let whereClauses = {};\n\n const event = events[key];\n if (event.start) {\n whereClauses = { ...whereClauses, [Op.gte]: new Date(event.start) };\n }\n if (event.end) {\n whereClauses = { ...whereClauses, [Op.lt]: new Date(event.end) };\n }\n\n if (event.by) {\n if (!model.getAttributes()[`${key}By`]) {\n throw new Error(`Event ${key} is not supported on model '${model.name}', column '${key}By' not found. Available columns: [${Object.keys(model.getAttributes()).join(', ')}]. Event query: ${stringifyJSON(events[key])}`);\n }\n whereClauses = { ...whereClauses, [Op.eq]: event.by };\n }\n\n options.where[`${key}At`] = whereClauses;\n\n });\n return options;\n}\n\n// Add the references to the query\nconst addReferenceQueries = (options: any, references: References, model: ModelStatic<any>): any => {\n logger.default(`QueryBuilder adding reference queries with options: ${stringifyJSON(options)}, references: ${stringifyJSON(references)}`);\n\n Object.keys(references).forEach((key: string) => {\n logger.default(`QueryBuilder adding reference query for key: ${key}, references: ${stringifyJSON(references)}`);\n\n if (!model.getAttributes()[`${key}Id`]) {\n throw new Error(`Reference ${key} is not supported on model '${model.name}', column '${key}Id' not found. Available columns: [${Object.keys(model.getAttributes()).join(', ')}]. Reference query: ${stringifyJSON(references[key])}`);\n }\n\n const refValue = references[key];\n const keyValue = (refValue as any).key || refValue;\n \n if (isPriKey(keyValue)) {\n const priKey: PriKey<string> = keyValue as PriKey<string>;\n\n if (priKey.pk == null || priKey.pk === '' || (typeof priKey.pk === 'object' && Object.keys(priKey.pk).length === 0)) {\n logger.error(`Reference key '${key}' has invalid pk value: ${stringifyJSON(priKey.pk)}`, { priKey, references });\n throw new Error(`Reference key '${key}' has invalid pk value: ${stringifyJSON(priKey.pk)}. Model: '${model.name}', Key type: '${priKey.kt}', Full reference: ${stringifyJSON(references[key])}`);\n }\n\n logger.trace(`[QueryBuilder] Setting reference where clause: ${key}Id = ${stringifyJSON(priKey.pk)} (type: ${typeof priKey.pk})`);\n options.where[`${key}Id`] = {\n [Op.eq]: priKey.pk\n }\n } else if (isComKey(references[key])) {\n throw new Error(`ComKeys are not supported in Sequelize. Reference key: '${key}', Model: '${model.name}', ComKey: ${stringifyJSON(references[key])}`);\n }\n });\n return options;\n}\n\nexport const addCompoundCondition = (options: any, compoundCondition: CompoundCondition, model: ModelStatic<any>) => {\n // Ensure options.where exists\n options.where = options.where || {};\n\n let compoundOp: symbol;\n const compoundType = compoundCondition.compoundType;\n if (compoundType === \"AND\") {\n compoundOp = Op.and;\n } else {\n compoundOp = Op.or;\n };\n\n let conditions: Record<string, any> = {};\n compoundCondition.conditions.forEach((condition: Condition | CompoundCondition) => {\n if (isCondition(condition)) {\n conditions = addCondition(conditions, condition, model);\n } else {\n throw new Error(`Nested Compound conditions not supported. Model: '${model.name}', Compound condition: ${stringifyJSON(compoundCondition)}, Nested condition: ${stringifyJSON(condition)}`);\n }\n });\n\n // Merge with existing where conditions instead of replacing\n if (Object.keys(options.where).length > 0) {\n // If there are existing conditions, wrap everything in an AND\n options.where = {\n [Op.and]: [\n options.where,\n { [compoundOp]: conditions }\n ]\n };\n } else {\n // If no existing conditions, just set the compound condition\n options.where[compoundOp] = conditions;\n }\n\n return options;\n}\n\nconst getSequelizeOperator = (operator: string): symbol => {\n if (operator === '==') {\n return Op.eq;\n } else if (operator === '<') {\n return Op.lt;\n } else if (operator === '>') {\n return Op.gt;\n } else if (operator === '<=') {\n return Op.lte;\n } else if (operator === '>=') {\n return Op.gte;\n } else if (operator === 'in') {\n return Op.in;\n } else {\n throw new Error(`Operator ${operator} not supported`);\n }\n};\n\nconst addAssociationCondition = (\n conditions: Record<string, any>,\n condition: Condition,\n model: ModelStatic<any>\n): Record<string, any> => {\n const [associationName, attributeName] = condition.column.split('.', 2);\n\n // Check if the association exists on the model\n if (!model.associations || !model.associations[associationName]) {\n throw new Error(`Association ${associationName} not found on model ${model.name}`);\n }\n\n const association: Association<any, any> = model.associations[associationName];\n const associatedModel = association.target;\n\n // Check if the attribute exists on the associated model\n if (!associatedModel.getAttributes()[attributeName]) {\n throw new Error(`Attribute ${attributeName} not found on associated model ${associatedModel.name} for association ${associationName}`);\n }\n\n // Use Sequelize's $association.attribute$ syntax for querying associated models\n const sequelizeAssociationColumn = `$${associationName}.${attributeName}$`;\n const conditionOp = getSequelizeOperator(condition.operator);\n\n if (condition.value == null && condition.operator !== '==' && condition.operator !== 'in') {\n logger.error(`Association condition for '${associationName}.${attributeName}' has undefined/null value`, { condition });\n throw new Error(`Association condition for '${associationName}.${attributeName}' has undefined/null value`);\n }\n\n logger.trace(`[QueryBuilder] Setting association condition: ${sequelizeAssociationColumn} = ${stringifyJSON(condition.value)} (type: ${typeof condition.value})`);\n conditions[sequelizeAssociationColumn] = {\n [conditionOp]: condition.value\n };\n\n return conditions;\n};\n\nconst addAttributeCondition = (\n conditions: Record<string, any>,\n condition: Condition,\n model: ModelStatic<any>\n): Record<string, any> => {\n const conditionColumn = condition.column;\n\n if (!model.getAttributes()[conditionColumn]) {\n throw new Error(`Condition column ${conditionColumn} not found on model ${model.name}`);\n }\n\n const conditionOp = getSequelizeOperator(condition.operator);\n\n if (condition.value == null && condition.operator !== '==' && condition.operator !== 'in') {\n logger.error(`Attribute condition for '${conditionColumn}' has undefined/null value`, { condition });\n throw new Error(`Attribute condition for '${conditionColumn}' has undefined/null value`);\n }\n\n logger.trace(`[QueryBuilder] Setting attribute condition: ${conditionColumn} = ${stringifyJSON(condition.value)} (type: ${typeof condition.value})`);\n conditions[conditionColumn] = {\n [conditionOp]: condition.value\n };\n\n return conditions;\n};\n\nexport const addCondition = (conditions: Record<string, any>, condition: Condition, model: ModelStatic<any>) => {\n const conditionColumn: string = condition.column;\n\n // Check if this is an association query (contains a dot)\n if (conditionColumn.includes('.')) {\n return addAssociationCondition(conditions, condition, model);\n }\n\n // Handle regular column queries\n return addAttributeCondition(conditions, condition, model);\n}\n\nconst collectAssociationsFromConditions = (conditions: any): Set<string> => {\n const associations = new Set<string>();\n\n const processObject = (obj: any) => {\n if (typeof obj === 'object' && obj !== null) {\n // Check string keys\n Object.keys(obj).forEach(key => {\n // Check if this is an association reference ($association.attribute$)\n if (typeof key === 'string' && key.startsWith('$') && key.endsWith('$') && key.includes('.')) {\n const associationName = key.substring(1, key.indexOf('.'));\n associations.add(associationName);\n }\n\n // Recursively process nested objects\n if (typeof obj[key] === 'object') {\n processObject(obj[key]);\n }\n });\n\n // Also check Symbol keys (for compound conditions like Op.and, Op.or)\n Object.getOwnPropertySymbols(obj).forEach(symbol => {\n if (typeof obj[symbol] === 'object') {\n processObject(obj[symbol]);\n }\n });\n }\n\n // Handle arrays (for compound conditions that might be arrays)\n if (Array.isArray(obj)) {\n obj.forEach(item => {\n if (typeof item === 'object') {\n processObject(item);\n }\n });\n }\n };\n\n processObject(conditions);\n return associations;\n};\n\nconst addAssociationIncludes = (options: any, model: ModelStatic<any>): any => {\n // Collect all association names used in conditions\n const referencedAssociations = collectAssociationsFromConditions(options.where);\n\n if (referencedAssociations.size > 0) {\n options.include = options.include || [];\n\n // Add each referenced association to the include array\n referencedAssociations.forEach(associationName => {\n // Check if this association is already included\n const alreadyIncluded = options.include.some((inc: any) =>\n (typeof inc === 'string' && inc === associationName) ||\n (typeof inc === 'object' && inc.association === associationName)\n );\n\n if (!alreadyIncluded && model.associations && model.associations[associationName]) {\n options.include.push({\n model: model.associations[associationName].target,\n as: associationName,\n required: false // Use LEFT JOIN so records without associations are still returned\n });\n }\n });\n }\n\n return options;\n};\n\nexport const buildQuery = (\n itemQuery: ItemQuery,\n model: ModelStatic<any>\n): any => {\n logger.default(`QueryBuilder build called with itemQuery: ${stringifyJSON(itemQuery)}`);\n\n let options: any = {\n where: {},\n };\n\n if (itemQuery.compoundCondition) {\n logger.default(`QueryBuilder adding conditions: ${stringifyJSON(itemQuery.compoundCondition)}`);\n options = addCompoundCondition(options, itemQuery.compoundCondition, model);\n }\n\n // If the model has a deletedAt column, we need to add a delete query\n if (model.getAttributes().deletedAt || model.getAttributes().isDeleted) {\n options = addDeleteQuery(options, model);\n }\n\n if (itemQuery.refs) {\n options = addReferenceQueries(options, itemQuery.refs, model);\n }\n if (itemQuery.events) {\n options = addEventQueries(options, itemQuery.events, model);\n }\n\n // TODO: Once we start to support Aggs on the server-side, we'll need to parse agg queries\n\n // Apply a limit to the result set\n if (itemQuery.limit) {\n logger.default(`QueryBuilder applying limit: ${itemQuery.limit}`);\n options.limit = itemQuery.limit;\n }\n\n // Apply an offset to the result set\n if (itemQuery.offset) {\n options.offset = itemQuery.offset;\n }\n\n // Add orderBy to the query\n if (itemQuery.orderBy) {\n itemQuery.orderBy.forEach((orderBy: OrderBy) => {\n if (!model.getAttributes()[orderBy.field]) {\n throw new Error(`Order by field ${orderBy.field} not found on model ${model.name}`);\n }\n options.order = [\n [orderBy.field, orderBy.direction]\n ];\n });\n }\n\n // Add includes for any associations referenced in conditions\n options = addAssociationIncludes(options, model);\n\n return options;\n}\n", "\n/* eslint-disable */\nexport const clean = (obj: any) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, v]) => v !== undefined)\n );\n}\n\n//Recursive implementation of jSON.stringify;\nexport const stringifyJSON = function (obj: any, visited: Set<any> = new Set()): string {\n const arrOfKeyVals: string[] = [];\n const arrVals: string[] = [];\n let objKeys: string[] = [];\n\n /*********CHECK FOR PRIMITIVE TYPES**********/\n if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null)\n return '' + obj;\n else if (typeof obj === 'string')\n return '\"' + obj + '\"';\n\n /*********DETECT CIRCULAR REFERENCES**********/\n if (obj instanceof Object && visited.has(obj)) {\n return '\"(circular)\"';\n }\n\n /*********CHECK FOR ARRAY**********/\n else if (Array.isArray(obj)) {\n //check for empty array\n if (obj.length === 0)\n return '[]';\n else {\n // Add array to visited before processing its elements\n visited.add(obj);\n obj.forEach(function (el) {\n arrVals.push(stringifyJSON(el, visited));\n });\n // Remove from visited after processing to allow arrays at different levels\n visited.delete(obj);\n return '[' + arrVals + ']';\n }\n }\n /*********CHECK FOR OBJECT**********/\n else if (obj instanceof Object) {\n // Add object to visited before processing its properties\n visited.add(obj);\n //get object keys\n objKeys = Object.keys(obj);\n //set key output;\n objKeys.forEach(function (key) {\n const keyOut = '\"' + key + '\":';\n const keyValOut = obj[key];\n //skip functions and undefined properties\n if (keyValOut instanceof Function || keyValOut === undefined)\n return; // Skip this entry entirely instead of pushing an empty string\n else if (typeof keyValOut === 'string')\n arrOfKeyVals.push(keyOut + '\"' + keyValOut + '\"');\n else if (typeof keyValOut === 'boolean' || typeof keyValOut === 'number' || keyValOut === null)\n arrOfKeyVals.push(keyOut + keyValOut);\n //check for nested objects, call recursively until no more objects\n else if (keyValOut instanceof Object) {\n arrOfKeyVals.push(keyOut + stringifyJSON(keyValOut, visited));\n }\n });\n // Remove from visited after processing to allow objects at different levels\n visited.delete(obj);\n return '{' + arrOfKeyVals + '}';\n }\n return '';\n};\n", "/* eslint-disable indent */\nimport { ModelStatic } from 'sequelize';\n\nexport interface RelationshipChainResult {\n success: boolean;\n path?: string;\n includes?: any[];\n}\n\nexport interface RelationshipPathResult {\n found: boolean;\n path?: string;\n includes?: any[];\n isDirect?: boolean;\n}\n\n/**\n * Helper function to build relationship chain includes\n */\nexport const buildRelationshipChain = (\n targetModel: ModelStatic<any>,\n kta: string[],\n currentIndex: number,\n targetIndex: number\n): RelationshipChainResult => {\n // Build the association path and validate relationships exist\n const associationParts: string[] = [];\n const modelChain: ModelStatic<any>[] = [targetModel];\n let currentModel = targetModel;\n\n // Validate that all associations exist and build model chain\n for (let i = currentIndex + 1; i <= targetIndex; i++) {\n const intermediateType = kta[i];\n const associationName = intermediateType;\n\n if (!currentModel.associations || !currentModel.associations[associationName]) {\n return { success: false };\n }\n\n associationParts.push(associationName);\n currentModel = currentModel.associations[associationName].target;\n modelChain.push(currentModel);\n }\n\n // Build the full association path for the target field\n const targetPrimaryKey = currentModel.primaryKeyAttribute || 'id';\n const associationPath = `$${associationParts.join('.')}.${targetPrimaryKey}$`;\n\n // Build nested includes structure iteratively (clearer than recursion)\n let deepestInclude: any = null;\n\n // Build from the deepest level back to the root\n for (let i = targetIndex; i > currentIndex; i--) {\n const currentType = kta[i];\n const modelIndex = i - currentIndex;\n\n const includeObj: any = {\n model: modelChain[modelIndex],\n as: currentType,\n required: true\n };\n\n if (deepestInclude) {\n includeObj.include = [deepestInclude];\n }\n\n deepestInclude = includeObj;\n }\n\n const includes = deepestInclude ? [deepestInclude] : [];\n\n return { success: true, path: associationPath, includes };\n};\n\n/**\n * Helper function to build relationship path for a locator\n * @param includeIsDirect Whether to include the isDirect flag in the result\n */\nexport const buildRelationshipPath = (\n targetModel: ModelStatic<any>,\n locatorType: string,\n kta: string[],\n includeIsDirect: boolean = false\n): RelationshipPathResult => {\n\n // First check if the field exists directly\n const directFieldName = `${locatorType}Id`;\n const attributes = targetModel.getAttributes();\n if (attributes && attributes[directFieldName]) {\n const result: RelationshipPathResult = { found: true };\n if (includeIsDirect) {\n result.isDirect = true;\n }\n return result;\n }\n\n // If not direct, look for relationship path\n const targetIndex = kta.indexOf(locatorType);\n if (targetIndex === -1) {\n const result: RelationshipPathResult = { found: false };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n }\n\n const currentIndex = 0; // We're always looking from the base model\n\n if (targetIndex <= currentIndex) {\n const result: RelationshipPathResult = { found: false };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n }\n\n const chainResult = buildRelationshipChain(targetModel, kta, currentIndex, targetIndex);\n if (chainResult.success) {\n const result: RelationshipPathResult = {\n found: true,\n path: chainResult.path,\n includes: chainResult.includes\n };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n }\n\n const result: RelationshipPathResult = { found: false };\n if (includeIsDirect) {\n result.isDirect = false;\n }\n return result;\n};\n", "/* eslint-disable max-len */\n/* eslint-disable indent */\nimport {\n AllItemTypeArrays,\n Item,\n} from '@fjell/core';\n\nimport LibLogger from './logger';\nimport { Model, ModelStatic } from 'sequelize';\nimport { buildRelationshipPath } from './util/relationshipUtils';\n\nconst logger = LibLogger.get('sequelize', 'KeyMaster');\n\n// Helper function to extract location key value from item\nconst extractLocationKeyValue = (\n model: ModelStatic<any>,\n item: any,\n locatorType: string,\n kta: string[]\n): any => {\n logger.default('Extracting location key value', { locatorType, kta });\n\n const relationshipInfo = buildRelationshipPath(model, locatorType, kta, true);\n\n if (!relationshipInfo.found) {\n throw new Error(`Location key '${locatorType}' cannot be resolved on model '${model.name}' or through its relationships. Key type array: [${kta.join(', ')}]. Available associations: [${Object.keys(model.associations || {}).join(', ')}]`);\n }\n\n if (relationshipInfo.isDirect) {\n // Direct foreign key field\n const foreignKeyField = `${locatorType}Id`;\n const value = item[foreignKeyField];\n if (typeof value === 'undefined' || value === null) {\n throw new Error(`Direct foreign key field '${foreignKeyField}' is missing or null in item. Model: '${model.name}', Locator type: '${locatorType}', Available item properties: [${Object.keys(item || {}).join(', ')}]`);\n }\n return value;\n } else {\n // Need to traverse relationship hierarchy\n // Find the path through the key type array\n const locatorIndex = kta.indexOf(locatorType);\n if (locatorIndex === -1) {\n throw new Error(`Locator type '${locatorType}' not found in key type array. Model: '${model.name}', Key type array: [${kta.join(', ')}]`);\n }\n\n // Start from the current item (index 0 in kta)\n let currentObject = item;\n\n // Traverse through each intermediate relationship to reach the target\n for (let i = 1; i < locatorIndex; i++) {\n const intermediateType = kta[i];\n\n // Check if the intermediate relationship object is loaded\n if (currentObject[intermediateType] && typeof currentObject[intermediateType] === 'object') {\n currentObject = currentObject[intermediateType];\n } else {\n // Try the foreign key approach if the relationship object isn't loaded\n const foreignKeyField = `${intermediateType}Id`;\n if (typeof currentObject[foreignKeyField] !== 'undefined' && currentObject[foreignKeyField] !== null) {\n // We have the foreign key but not the loaded object, we can't traverse further\n throw new Error(`Intermediate relationship '${intermediateType}' is not loaded. Cannot traverse to '${locatorType}'. Model: '${model.name}', Available item properties: [${Object.keys(currentObject || {}).join(', ')}]. Either include the relationship in your query or ensure it's loaded.`);\n }\n throw new Error(`Intermediate relationship '${intermediateType}' is missing in the relationship chain. Model: '${model.name}', Expected path: ${kta.slice(0, locatorIndex + 1).join(' \u2192 ')}, Available item properties: [${Object.keys(currentObject || {}).join(', ')}]`);\n }\n }\n\n // Now extract the target locator value from the current object\n // First try to get it from the loaded relationship object\n if (currentObject[locatorType] && typeof currentObject[locatorType] === 'object' && typeof currentObject[locatorType].id !== 'undefined') {\n return currentObject[locatorType].id;\n }\n\n // If the relationship object isn't loaded, try the foreign key field\n const foreignKeyField = `${locatorType}Id`;\n if (typeof currentObject[foreignKeyField] !== 'undefined' && currentObject[foreignKeyField] !== null) {\n return currentObject[foreignKeyField];\n }\n\n const traversalPath = kta.slice(0, locatorIndex + 1).join(' \u2192 ');\n throw new Error(\n `Unable to extract location key for '${locatorType}'. ` +\n `Neither the relationship object nor direct foreign key is available. ` +\n `Traversal path: ${traversalPath}`\n );\n }\n};\n\nexport const removeKey = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>,\n): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Removing Key', { item });\n delete item.key;\n return item;\n}\n\n// export const populateKey = <\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: ItemProperties<S, L1, L2, L3, L4, L5>,\n// keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>\n// ): ItemProperties<S, L1, L2, L3, L4, L5> => {\n// if (keyTypes.length === 1) {\n// item.key = { kt: keyTypes[0], pk: item.id };\n// delete item.id;\n// } else if (keyTypes.length === 2) {\n// item.key = {\n// kt: keyTypes[0], pk: item.id,\n// // TODO: Shouldn't this be inspecting the model to get the primary key type?\n// loc: [{ kt: keyTypes[1], lk: item[keyTypes[1] + 'Id'] }],\n// };\n// delete item.id;\n// delete item[keyTypes[1] + 'Id'];\n// } else {\n// throw new Error('Not implemented');\n// }\n// return item;\n// }\n\nexport const addKey = <\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 model: Model<any, any>,\n item: Partial<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.default('Adding Key', { item });\n const key = {};\n const modelClass = model.constructor as ModelStatic<any>;\n const primaryKeyAttr = modelClass.primaryKeyAttribute;\n\n if (Array.isArray(keyTypes) && keyTypes.length > 1) {\n const type = [...keyTypes];\n const pkType = type.shift();\n Object.assign(key, { kt: pkType, pk: item[primaryKeyAttr] });\n\n // Build location keys for composite key\n const locationKeys = [];\n for (const locatorType of type) {\n try {\n const lk = extractLocationKeyValue(modelClass, item, locatorType, keyTypes as string[]);\n locationKeys.push({ kt: locatorType, lk });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Failed to extract location key for '${locatorType}'`, { error: errorMessage, item, keyTypes });\n throw error;\n }\n }\n\n Object.assign(key, { loc: locationKeys });\n } else {\n Object.assign(key, { kt: keyTypes[0], pk: item[primaryKeyAttr] });\n }\n Object.assign(item, { key });\n return item as Item<S, L1, L2, L3, L4, L5>;\n};\n", "/* eslint-disable indent */\n\nimport { AllItemTypeArrays, Item } from \"@fjell/core\";\nimport { Model } from \"sequelize\";\n\nimport LibLogger from \"./logger\";\nimport { addKey } from \"./KeyMaster\";\nimport { AggregationDefinition, SequelizeReferenceDefinition } from \"./Options\";\nimport * as Library from \"@fjell/lib\";\nimport {\n buildAggregation,\n contextManager,\n createOperationContext,\n OperationContext\n} from \"@fjell/lib\";\nimport { stringifyJSON } from \"./util/general\";\nimport { populateEvents } from \"./EventCoordinator\";\nimport { buildSequelizeReference } from \"./processing/ReferenceBuilder\";\n\nconst logger = LibLogger.get('sequelize', 'RowProcessor');\n\n// Re-export types and functions from @fjell/lib for backwards compatibility\nexport type { OperationContext };\nexport { createOperationContext, contextManager };\n\nexport const processRow = async <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 row: Model<any, any>,\n keyTypes: AllItemTypeArrays<S, L1, L2, L3, L4, L5>,\n referenceDefinitions: SequelizeReferenceDefinition[],\n aggregationDefinitions: AggregationDefinition[],\n registry: Library.Registry,\n context?: OperationContext\n ): Promise<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Processing Row', { row });\n\n // Use provided context or create new one\n const operationContext = context || createOperationContext();\n\n // Process the row within the context to ensure all operations share the same context\n return contextManager.withContext(operationContext, async () => {\n let item = row.get({ plain: true }) as any;\n logger.default('Adding Key to Item with Key Types: %s', stringifyJSON(keyTypes));\n item = addKey(row, item, keyTypes);\n item = populateEvents(item);\n logger.default('Key Added to Item: %s', stringifyJSON(item.key));\n\n // Mark this item as in progress to detect circular references\n operationContext.markInProgress(item.key);\n\n try {\n if (referenceDefinitions && referenceDefinitions.length > 0) {\n for (const referenceDefinition of referenceDefinitions) {\n logger.default('Processing Reference for %s to %s', item.key.kt, stringifyJSON(referenceDefinition.kta));\n item = await buildSequelizeReference(item, referenceDefinition, registry, operationContext);\n }\n }\n if (aggregationDefinitions && aggregationDefinitions.length > 0) {\n for (const aggregationDefinition of aggregationDefinitions) {\n logger.default('Processing Aggregation for %s from %s', item.key.kt, stringifyJSON(aggregationDefinition.kta));\n item = await buildAggregation(item, aggregationDefinition, registry, operationContext);\n }\n }\n\n // Cache the fully processed item\n operationContext.setCached(item.key, item);\n } finally {\n // Mark this item as complete\n operationContext.markComplete(item.key);\n }\n\n logger.default('Processed Row: %j', stringifyJSON(item));\n return item as Item<S, L1, L2, L3, L4, L5>;\n });\n};\n", "import {\n Evented,\n Item,\n ManagedEvents\n} from '@fjell/core';\nimport deepmerge from 'deepmerge';\n\nimport LibLogger from './logger';\n\nconst logger = LibLogger.get(\"sequelize\", \"EventCoordinator\");\n\nexport const createEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>):\n Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Creating Events', { item });\n const currentDate = new Date();\n\n let events = item.events;\n\n if (events) {\n if (!events.created) {\n events = deepmerge(events, { created: { at: currentDate } });\n }\n if (!events.updated) {\n events = deepmerge(events, { updated: { at: currentDate } });\n }\n if (!events.deleted) {\n events = deepmerge(events, { deleted: { at: null } });\n }\n\n } else {\n events = {\n created: { at: currentDate },\n updated: { at: currentDate },\n deleted: { at: null },\n };\n }\n\n return deepmerge(item, { events }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n}\n\nexport const updateEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>):\n Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Updating Events', { item });\n const currentDate = new Date();\n const events: Evented = {\n updated: { at: currentDate },\n };\n\n // TODO: This is clean-up code, we should remove it\n // If the event lacks a created data, let's just insert it here...\n if (!item.events || !item.events.created || !item.events.created.at) {\n events.created = { at: currentDate };\n }\n\n return deepmerge(item, { events }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n}\n//#endregion\n\nexport const populateEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n const events: ManagedEvents = {\n created: { at: item.createdAt || null },\n updated: { at: item.updatedAt || null },\n deleted: { at: null }\n };\n item.events = events;\n return item;\n}\n\nexport const extractEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Extracting Events to database fields', { item });\n\n if (item.events) {\n if (item.events.created?.at) {\n item.createdAt = item.events.created.at;\n }\n if (item.events.updated?.at) {\n item.updatedAt = item.events.updated.at;\n }\n if (item.events.deleted?.at) {\n item.deletedAt = item.events.deleted.at;\n }\n }\n\n return item;\n}\n\nexport const removeEvents = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n logger.default('Removing Events', { item });\n delete item.events;\n return item;\n}\n", "import { Item, PriKey } from \"@fjell/core\";\nimport type { Registry } from \"@fjell/lib\";\nimport { OperationContext } from \"@fjell/lib\";\nimport logger from \"../logger\";\n\n/**\n * Sequelize-specific definition for a reference relationship.\n * References in Sequelize are stored as foreign key columns (e.g., \"authorId\")\n * and populated into properties on the item.\n */\nexport interface SequelizeReferenceDefinition {\n /** Column name containing the foreign key value (e.g., \"authorId\") */\n column: string;\n /** Key type array of the referenced item */\n kta: string[];\n /** Property name to populate with the referenced item (e.g., \"author\") */\n property: string;\n}\n\n/**\n * Build a reference by looking up a related item by its key from a column value.\n * The referenced item will be populated directly into a property on the item.\n *\n * @param item - The item to populate with reference data\n * @param referenceDefinition - Sequelize-specific definition of what to reference\n * @param registry - Registry to look up library instances\n * @param context - Optional operation context for caching and cycle detection\n * @returns The item with the reference property populated\n */\nexport const buildSequelizeReference = async (\n item: any,\n referenceDefinition: SequelizeReferenceDefinition,\n registry: Registry,\n context?: OperationContext\n) => {\n const libLogger = logger.get('processing', 'ReferenceBuilder');\n \n // For multikey references, we assume that the primary key of the first key type is unique\n // and can be used to retrieve the composite item with just a PriKey<S>\n const primaryKeyType = referenceDefinition.kta[0];\n\n if (referenceDefinition.kta.length > 1) {\n libLogger.debug(\n 'Using multikey reference with PriKey assumption',\n {\n kta: referenceDefinition.kta,\n primaryKeyType,\n property: referenceDefinition.property,\n column: referenceDefinition.column\n }\n );\n\n // TODO: Add validation to check if the target model has a unique primary key\n libLogger.debug(\n 'ASSUMPTION: The primary key for key type \"%s\" is unique and can be used to retrieve composite items',\n primaryKeyType\n );\n }\n\n // Check if dependencies exist\n if (!registry) {\n throw new Error(\n `This model definition has a reference definition, but the registry is not present. ` +\n `Reference property: '${referenceDefinition.property}', ` +\n `key types: [${referenceDefinition.kta.join(', ')}], column: '${referenceDefinition.column}'`\n );\n }\n\n // Find the Library.Instance for the key type\n const library: any = registry.get(referenceDefinition.kta as any);\n if (!library) {\n throw new Error(\n `This model definition has a reference definition, but the dependency is not present in registry. ` +\n `Reference property: '${referenceDefinition.property}', ` +\n `missing key type: '${primaryKeyType}', column: '${referenceDefinition.column}'`\n );\n }\n\n // Check if the column value is null - if so, skip the reference\n const columnValue = item[referenceDefinition.column];\n if (columnValue == null) {\n item[referenceDefinition.property] = null;\n return item;\n }\n\n // Create a PriKey using the column value from item\n // For multikey references, we use the primary key type (first in the kta array)\n const priKey: PriKey<string> = {\n kt: primaryKeyType,\n pk: columnValue\n };\n\n let referencedItem;\n\n if (context) {\n // Check if we already have this item cached\n if (context.isCached(priKey)) {\n libLogger.debug('Using cached reference', { priKey, property: referenceDefinition.property });\n referencedItem = context.getCached(priKey);\n }\n // Check if this item is currently being loaded (circular dependency)\n else if (context.isInProgress(priKey)) {\n libLogger.debug('Circular dependency detected, creating reference placeholder', {\n priKey,\n property: referenceDefinition.property\n });\n\n // Create a minimal reference object with just the key to break the cycle\n referencedItem = {\n key: priKey,\n // Add any other minimal properties that might be needed\n // This prevents infinite loops while still providing the key for identification\n };\n }\n else {\n // Mark this key as in progress before loading\n context.markInProgress(priKey);\n try {\n // Get the referenced item using the Library.Operations get method (context now managed internally)\n referencedItem = await library!.operations.get(priKey);\n\n // Cache the result\n context.setCached(priKey, referencedItem);\n } catch (error: any) {\n throw error; // Re-throw to maintain original behavior\n } finally {\n // Always mark as complete, even if there was an error\n context.markComplete(priKey);\n }\n }\n } else {\n // Fallback to original behavior if no context provided\n referencedItem = await library!.operations.get(priKey);\n }\n\n // Store the result in the property on item (Sequelize style - direct property)\n item[referenceDefinition.property] = referencedItem;\n\n return item;\n};\n\n/**\n * Strip populated reference properties from item before writing to database.\n * This ensures we only store the foreign key columns, not the full populated items.\n *\n * @param item - The item to strip references from\n * @param referenceDefinitions - Array of reference definitions to strip\n * @returns The item with only foreign key values (no populated items)\n */\nexport const stripSequelizeReferenceItems = <\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: Partial<Item<S, L1, L2, L3, L4, L5>>,\n referenceDefinitions: SequelizeReferenceDefinition[]\n ): Partial<Item<S, L1, L2, L3, L4, L5>> => {\n const result = { ...item };\n\n // Remove populated reference properties but keep the foreign key columns\n for (const refDef of referenceDefinitions) {\n // Delete the populated property (e.g., delete item.author)\n // Keep the foreign key column (e.g., keep item.authorId)\n delete result[refDef.property as keyof typeof result];\n }\n\n return result;\n};\n\n", "/* eslint-disable indent */\nimport { ComKey, isComKey, isPriKey, Item, LocKeyArray, PriKey, validateKeys } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport { processRow } from \"../RowProcessor\";\nimport * as Library from \"@fjell/lib\";\nimport { ModelStatic } from \"sequelize\";\nimport { extractEvents, removeEvents } from \"../EventCoordinator\";\nimport { buildRelationshipChain, buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'create');\n\n// Helper function to translate PostgreSQL errors to meaningful messages\nfunction translateDatabaseError(error: any, itemData: any, modelName: string): Error {\n const originalMessage = error.message || '';\n const errorCode = error.original?.code;\n const constraint = error.original?.constraint;\n const detail = error.original?.detail;\n\n logger.error('Database error during create operation', {\n errorCode,\n constraint,\n detail,\n originalMessage,\n modelName,\n itemData: JSON.stringify(itemData, null, 2)\n });\n\n // Handle specific PostgreSQL error codes\n switch (errorCode) {\n case '23505': // unique_violation\n if (constraint) {\n return new Error(`Duplicate value violates unique constraint '${constraint}'. ${detail || ''}`);\n }\n return new Error(`Duplicate value detected. This record already exists. ${detail || ''}`);\n\n case '23503': // foreign_key_violation\n if (constraint) {\n return new Error(`Foreign key constraint '${constraint}' violated. Referenced record does not exist. ${detail || ''}`);\n }\n return new Error(`Referenced record does not exist. Check that all related records are valid. ${detail || ''}`);\n\n case '23502': // not_null_violation\n const column = error.original?.column;\n if (column) {\n return new Error(`Required field '${column}' cannot be null`);\n }\n return new Error(`Required field is missing or null`);\n\n case '23514': // check_violation\n if (constraint) {\n return new Error(`Check constraint '${constraint}' violated. ${detail || ''}`);\n }\n return new Error(`Data validation failed. Check constraint violated. ${detail || ''}`);\n\n case '22001': // string_data_right_truncation\n return new Error(`Data too long for field. Check string lengths. ${detail || ''}`);\n\n case '22003': // numeric_value_out_of_range\n return new Error(`Numeric value out of range. Check number values. ${detail || ''}`);\n\n case '42703': // undefined_column\n const undefinedColumn = error.original?.column;\n if (undefinedColumn) {\n return new Error(`Column '${undefinedColumn}' does not exist in table '${modelName}'`);\n }\n return new Error(`Referenced column does not exist`);\n\n case '42P01': // undefined_table\n return new Error(`Table '${modelName}' does not exist`);\n\n default:\n // Handle SQLite-specific errors that don't have error codes\n if (originalMessage.includes('notNull Violation')) {\n const fieldMatches = originalMessage.match(/([a-zA-Z]+\\.[a-zA-Z]+) cannot be null/g);\n if (fieldMatches) {\n const fields = fieldMatches.map((match: string) => {\n const parts = match.split('.');\n return parts[1]?.split(' ')[0]; // Extract field name like 'code' from 'WidgetType.code'\n }).filter(Boolean);\n if (fields.length > 0) {\n return new Error(`Required field${fields.length > 1 ? 's' : ''} ${fields.join(', ')} cannot be null`);\n }\n }\n return new Error('Required fields are missing');\n }\n\n // For unknown errors, provide the original message with context\n return new Error(`Database error in ${modelName}.create(): ${originalMessage}. Item data: ${JSON.stringify(itemData, null, 2)}`);\n }\n}\n\n// Helper function to validate hierarchical chain exists\nasync function validateHierarchicalChain(\n models: ModelStatic<any>[],\n locKey: { kt: string; lk: any },\n kta: string[]\n): Promise<void> {\n try {\n // Find the direct parent model that contains this locator\n const locatorIndex = kta.indexOf(locKey.kt);\n if (locatorIndex === -1) {\n throw new Error(`Locator type '${locKey.kt}' not found in kta array`);\n }\n\n // Get the model for this locator\n const locatorModel = models[locatorIndex] || models[0]; // Fallback to primary model\n\n // Build a query to validate the chain exists\n const chainResult = buildRelationshipChain(locatorModel, kta, locatorIndex, kta.length - 1);\n\n if (!chainResult.success) {\n // If we can't build a chain, just validate the record exists\n const record = await locatorModel.findByPk(locKey.lk);\n if (!record) {\n throw new Error(`Referenced ${locKey.kt} with id ${locKey.lk} does not exist`);\n }\n return;\n }\n\n // Validate that the chain exists\n const queryOptions: any = {\n where: { id: locKey.lk }\n };\n\n if (chainResult.includes && chainResult.includes.length > 0) {\n queryOptions.include = chainResult.includes;\n }\n\n const record = await locatorModel.findOne(queryOptions);\n if (!record) {\n throw new Error(`Referenced ${locKey.kt} with id ${locKey.lk} does not exist or chain is invalid`);\n }\n } catch (error: any) {\n // Add context to validation errors\n if (error.original) {\n throw translateDatabaseError(error, { locKey, kta }, locKey.kt);\n }\n throw error;\n }\n}\n\nexport const getCreateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n\n registry: Library.Registry\n) => {\n\n const create = async (\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n options?: {\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n locations?: never;\n } | {\n key?: never;\n locations: LocKeyArray<L1, L2, L3, L4, L5>,\n },\n ): Promise<V> => {\n const constraints = options?.key\n ? `key: pk=${options.key.pk}, loc=[${isComKey(options.key)\n ? (options.key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')\n : ''}]`\n : options?.locations\n ? `locations: ${options.locations.map(loc => `${loc.kt}=${loc.lk}`).join(', ')}`\n : 'no constraints';\n logger.debug(`CREATE operation called on ${models[0].name} with ${constraints}`);\n logger.default(`Create configured for ${models[0].name} with ${Object.keys(item).length} item fields`);\n\n const { coordinate, options: { references, aggregations } } = definition;\n const { kta } = coordinate;\n\n // Get the primary model (first model in array)\n const model = models[0];\n const modelAttributes = model.getAttributes();\n\n // Validate that all item attributes exist on the model\n let itemData = { ...item } as any;\n\n // TODO: We need the opposite of processRow, something to step down from fjell to database.\n itemData = extractEvents(itemData);\n itemData = removeEvents(itemData);\n\n // Validate that all item attributes exist on the model\n const invalidAttributes: string[] = [];\n for (const key of Object.keys(itemData)) {\n if (!modelAttributes[key]) {\n invalidAttributes.push(key);\n }\n }\n\n if (invalidAttributes.length > 0) {\n const availableAttributes = Object.keys(modelAttributes).join(', ');\n throw new Error(\n `Invalid attributes for model '${model.name}': [${invalidAttributes.join(', ')}]. ` +\n `Available attributes: [${availableAttributes}]. ` +\n `Item data: ${JSON.stringify(itemData, null, 2)}`\n );\n }\n\n // Handle key options\n // If a key is supplied, assume its contents are to be assigned to the appropriate ids.\n // For most cases this will be null as key generation is often through autoIncrement.\n // If this is a CItem then the locations will be present.\n if (options?.key) {\n const key = options.key;\n if (isPriKey(key)) {\n // Set the primary key\n itemData.id = key.pk;\n } else if (isComKey(key)) {\n // Set primary key\n itemData.id = key.pk;\n\n // Process location keys - only set direct foreign keys, validate hierarchical chains\n const comKey = key as ComKey<S, L1, L2, L3, L4, L5>;\n const directLocations: Array<{ kt: string; lk: any }> = [];\n const hierarchicalLocations: Array<{ kt: string; lk: any }> = [];\n\n // Categorize location keys as direct or hierarchical\n for (const locKey of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const associations = model.associations ? Object.keys(model.associations) : [];\n const errorMessage = `Composite key locator '${locKey.kt}' cannot be resolved on model '${model.name}' or through its relationships. ` +\n `Available associations: [${associations.join(', ')}]. ` +\n `KTA: [${kta.join(', ')}]. ` +\n `Composite key: ${JSON.stringify(comKey, null, 2)}`;\n logger.error(errorMessage, { key: comKey, kta, associations });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n directLocations.push(locKey);\n } else {\n hierarchicalLocations.push(locKey);\n }\n }\n\n // Set direct foreign keys\n for (const locKey of directLocations) {\n if (locKey.lk == null || locKey.lk === '') {\n logger.error(`Composite key location '${locKey.kt}' has undefined/null lk value`, { locKey, key: comKey });\n throw new Error(`Composite key location '${locKey.kt}' has undefined/null lk value`);\n }\n const foreignKeyField = locKey.kt + 'Id';\n itemData[foreignKeyField] = locKey.lk;\n }\n\n // Validate hierarchical chains exist\n for (const locKey of hierarchicalLocations) {\n await validateHierarchicalChain(models, locKey, kta);\n }\n }\n }\n\n // Handle locations options\n // This is the most frequent way relationship ids will be set\n if (options?.locations) {\n const directLocations: Array<{ kt: string; lk: any }> = [];\n const hierarchicalLocations: Array<{ kt: string; lk: any }> = [];\n\n // Categorize location keys as direct or hierarchical\n for (const locKey of options.locations) {\n const relationshipInfo = buildRelationshipPath(model, locKey.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const associations = model.associations ? Object.keys(model.associations) : [];\n const errorMessage = `Location key '${locKey.kt}' cannot be resolved on model '${model.name}' or through its relationships. ` +\n `Available associations: [${associations.join(', ')}]. ` +\n `KTA: [${kta.join(', ')}]. ` +\n `Locations: ${JSON.stringify(options.locations, null, 2)}`;\n logger.error(errorMessage, { locations: options.locations, kta, associations });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n directLocations.push(locKey);\n } else {\n hierarchicalLocations.push(locKey);\n }\n }\n\n // Set direct foreign keys\n for (const locKey of directLocations) {\n if (locKey.lk == null || locKey.lk === '') {\n logger.error(`Location option '${locKey.kt}' has undefined/null lk value`, { locKey, locations: options.locations });\n throw new Error(`Location option '${locKey.kt}' has undefined/null lk value`);\n }\n const foreignKeyField = locKey.kt + 'Id';\n itemData[foreignKeyField] = locKey.lk;\n }\n\n // Validate hierarchical chains exist\n for (const locKey of hierarchicalLocations) {\n await validateHierarchicalChain(models, locKey, kta);\n }\n }\n\n // Create the record\n try {\n logger.trace(`[CREATE] Executing ${model.name}.create() with data: ${stringifyJSON(itemData)}`);\n const createdRecord = await model.create(itemData);\n\n // Add key and events\n // Create operations get their own context since they're top-level operations\n const processedRecord = await processRow(createdRecord, kta, references || [], aggregations || [], registry);\n const result = validateKeys(processedRecord, kta) as V;\n\n logger.debug(`[CREATE] Created ${model.name} with key: ${(result as any).key ? JSON.stringify((result as any).key) : `id=${createdRecord.id}`}`);\n return result;\n } catch (error: any) {\n throw translateDatabaseError(error, itemData, model.name);\n }\n }\n\n return create;\n}\n", "/* eslint-disable indent */\nimport { Item, LocKeyArray, validateKeys } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport { ModelStatic } from \"sequelize\";\nimport { processRow } from \"../RowProcessor\";\nimport * as Library from \"@fjell/lib\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'find');\n\nexport const getFindOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n const { options: { finders, references, aggregations } } = definition;\n\n const find = async (\n finder: string,\n finderParams: Record<string, string | number | boolean | Date | Array<string | number | boolean | Date>>,\n locations?: LocKeyArray<L1, L2, L3, L4, L5> | [],\n\n ): Promise<V[]> => {\n const locationFilters = locations?.map(loc => `${loc.kt}=${loc.lk}`).join(', ') || 'none';\n logger.debug(\n `FIND operation called on ${models[0].name} with finder '${finder}' ` +\n `and ${locations?.length || 0} location filters: ${locationFilters}`\n );\n logger.default(`Find configured for ${models[0].name} using finder '${finder}' with ${Object.keys(finderParams).length} params`);\n\n // Note that we execute the createFinders function here because we want to make sure we're always getting the\n // most up to date methods.\n if (finders && finders[finder]) {\n const finderMethod = finders[finder];\n if (finderMethod) {\n logger.trace(`[FIND] Executing finder '${finder}' on ${models[0].name} with params: ${stringifyJSON(finderParams)}, locations: ${stringifyJSON(locations)}`);\n const results = await finderMethod(finderParams, locations);\n if (results && results.length > 0) {\n const processedResults = (await Promise.all(results.map(async (row: any) => {\n // Each found row gets its own context to prevent interference between concurrent processing\n const processedRow = await processRow(row, definition.coordinate.kta, references || [], aggregations || [], registry);\n return validateKeys(processedRow, definition.coordinate.kta);\n })) as V[]);\n\n logger.debug(`[FIND] Found ${processedResults.length} ${models[0].name} records using finder '${finder}'`);\n return processedResults;\n } else {\n logger.debug(`[FIND] Found 0 ${models[0].name} records using finder '${finder}'`);\n return [];\n }\n } else {\n logger.error(`Finder %s not found`, finder);\n throw new Error(`Finder ${finder} not found`);\n }\n } else {\n logger.error(`No finders have been defined for this lib`);\n throw new Error(`No finders found`);\n }\n }\n\n return find;\n}\n", "/* eslint-disable max-len */\n/* eslint-disable indent */\nimport {\n ComKey,\n isComKey,\n isPriKey,\n isValidItemKey,\n Item,\n PriKey,\n validateKeys\n} from '@fjell/core';\n\nimport LibLogger from '../logger';\nimport { ModelStatic } from 'sequelize';\nimport { processRow } from '../RowProcessor';\nimport { Definition } from '../Definition';\nimport { NotFoundError } from '@fjell/lib';\nimport * as Library from \"@fjell/lib\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { contextManager } from \"../RowProcessor\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'get');\n\n// Helper function to process composite key and build query options\nconst processCompositeKey = (\n comKey: ComKey<any, any, any, any, any, any>,\n model: ModelStatic<any>,\n kta: string[]\n): { where: { [key: string]: any }; include?: any[] } => {\n const where: { [key: string]: any } = { id: comKey.pk };\n const includes: any[] = [];\n\n for (const locator of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locator.kt, kta);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Composite key locator '${locator.kt}' cannot be resolved on model '${model.name}' or through its relationships. Key type array: [${kta.join(', ')}], Composite key: ${stringifyJSON(comKey)}, Available associations: [${Object.keys(model.associations || {}).join(', ')}]`;\n logger.error(errorMessage, { key: comKey, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.path) {\n // This requires a relationship traversal\n where[relationshipInfo.path] = locator.lk;\n if (relationshipInfo.includes) {\n includes.push(...relationshipInfo.includes);\n }\n } else {\n // This is a direct field\n const fieldName = `${locator.kt}Id`;\n where[fieldName] = locator.lk;\n }\n }\n\n const result: { where: { [key: string]: any }; include?: any[] } = { where };\n if (includes.length > 0) {\n result.include = includes;\n }\n\n return result;\n};\n\nexport const getGetOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n const { coordinate, options: { references, aggregations } } = definition;\n const { kta } = coordinate;\n\n const get = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>\n ): Promise<V> => {\n if (!isValidItemKey(key)) {\n logger.error('Key for Get is not a valid ItemKey: %j', key);\n throw new Error('Key for Get is not a valid ItemKey');\n }\n\n const keyDescription = isPriKey(key)\n ? `primary key: pk=${key.pk}`\n : `composite key: pk=${key.pk}, loc=[${(key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')}]`;\n logger.debug(`GET operation called on ${models[0].name} with ${keyDescription}`);\n logger.default(`Get configured for ${models[0].name} with ${isPriKey(key) ? 'primary' : 'composite'} key`);\n\n const itemKey = key;\n\n // @ts-ignore\n const model = models[0];\n\n let item;\n\n if (isPriKey(itemKey)) {\n // This is the easy case because we can just find the item by its primary key\n logger.trace(`[GET] Executing ${model.name}.findByPk() with pk: ${(itemKey as PriKey<S>).pk}`);\n item = await model.findByPk((itemKey as PriKey<S>).pk);\n } else if (isComKey(itemKey)) {\n // This is a composite key, so we need to build a where clause based on the composite key's locators\n const comKey = itemKey as ComKey<S, L1, L2, L3, L4, L5>;\n const queryOptions = processCompositeKey(comKey, model, kta);\n\n logger.default('Composite key query', { queryOptions });\n logger.trace(`[GET] Executing ${model.name}.findOne() with options: ${stringifyJSON(queryOptions)}`);\n item = await model.findOne(queryOptions);\n }\n\n if (!item) {\n throw new NotFoundError<S, L1, L2, L3, L4, L5>('get', coordinate, key);\n } else {\n // Use current context if available (prevents infinite recursion in reference loading)\n // This ensures proper circular dependency detection within the same operation\n const currentContext = contextManager.getCurrentContext();\n const result = validateKeys(await processRow(item, kta, references || [], aggregations || [], registry, currentContext), kta) as V;\n\n logger.debug(`[GET] Retrieved ${model.name} with key: ${(result as any).key ? JSON.stringify((result as any).key) : `id=${item.id}`}`);\n return result;\n }\n }\n\n return get;\n}\n", "/* eslint-disable indent */\nimport { Item, ItemQuery, LocKeyArray } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport { ModelStatic } from \"sequelize\";\nimport { getAllOperation } from \"./all\";\nimport * as Library from \"@fjell/lib\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'one');\n\nexport const getOneOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n const one = async (\n itemQuery: ItemQuery,\n locations: LocKeyArray<L1, L2, L3, L4, L5> | [] = [],\n ): Promise<V | null> => {\n logger.debug(`ONE operation called on ${models[0].name} with ${locations.length} location filters: ${locations.map(loc => `${loc.kt}=${loc.lk}`).join(', ') || 'none'}`);\n logger.default(`One configured for ${models[0].name} delegating to all operation`);\n\n const items = await getAllOperation(models, definition, registry)(itemQuery, locations);\n if (items.length > 0) {\n const result = items[0] as V;\n logger.debug(`[ONE] Found ${models[0].name} record with key: ${(result as any).key ? JSON.stringify((result as any).key) : 'unknown'}`);\n return result;\n } else {\n logger.debug(`[ONE] No ${models[0].name} record found`);\n return null;\n }\n }\n\n return one;\n}", "/* eslint-disable */\nimport { ComKey, isValidItemKey, PriKey } from \"@fjell/core\";\n\nimport { abbrevIK, isComKey, isPriKey, Item } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport { populateEvents } from \"../EventCoordinator\";\nimport { addKey } from \"../KeyMaster\";\nimport LibLogger from '../logger';\nimport { ModelStatic } from \"sequelize\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { stringifyJSON } from \"../util/general\";\nimport { NotFoundError } from \"@fjell/lib\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'remove');\n\n// Helper function to process composite key and build query options\nconst processCompositeKey = (\n comKey: ComKey<any, any, any, any, any, any>,\n model: ModelStatic<any>,\n kta: string[]\n): { where: { [key: string]: any }; include?: any[] } => {\n const where: { [key: string]: any } = { id: comKey.pk };\n const includes: any[] = [];\n\n for (const locator of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locator.kt, kta);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Composite key locator '${locator.kt}' cannot be resolved on model '${model.name}' or through its relationships.`;\n logger.error(errorMessage, { key: comKey, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.path) {\n // This requires a relationship traversal\n where[relationshipInfo.path] = locator.lk;\n if (relationshipInfo.includes) {\n includes.push(...relationshipInfo.includes);\n }\n } else {\n // This is a direct field\n const fieldName = `${locator.kt}Id`;\n where[fieldName] = locator.lk;\n }\n }\n\n const result: { where: { [key: string]: any }; include?: any[] } = { where };\n if (includes.length > 0) {\n result.include = includes;\n }\n\n return result;\n};\n\nexport const getRemoveOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n _registry: import('@fjell/lib').Registry\n) => {\n const { coordinate, options } = definition;\n const { kta } = coordinate;\n\n const remove = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n ): Promise<V> => {\n if (!isValidItemKey(key)) {\n logger.error('Key for Remove is not a valid ItemKey: %j', key);\n throw new Error('Key for Remove is not a valid ItemKey');\n }\n\n const keyDescription = isPriKey(key)\n ? `primary key: pk=${key.pk}`\n : `composite key: pk=${key.pk}, loc=[${(key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')}]`;\n logger.debug(`REMOVE operation called on ${models[0].name} with ${keyDescription}`);\n logger.default(`Remove configured for ${models[0].name} with ${isPriKey(key) ? 'primary' : 'composite'} key`);\n\n // @ts-ignore\n const model = models[0];\n\n let item;\n let returnItem;\n\n logger.debug('remove: %s', abbrevIK(key));\n if (isPriKey(key)) {\n logger.debug(`[REMOVE] Executing ${model.name}.findByPk() with pk: ${(key as PriKey<S>).pk}`);\n item = await model.findByPk((key as PriKey<S>).pk);\n } else if (isComKey(key)) {\n // This is a composite key, so we need to build a where clause based on the composite key's locators\n const comKey = key as ComKey<S, L1, L2, L3, L4, L5>;\n const queryOptions = processCompositeKey(comKey, model, kta);\n\n logger.default(`Remove composite key query for ${model.name} with where fields: ${queryOptions.where ? Object.keys(queryOptions.where).join(', ') : 'none'}`);\n logger.debug(`[REMOVE] Executing ${model.name}.findOne() with options: ${stringifyJSON(queryOptions)}`);\n item = await model.findOne(queryOptions);\n }\n\n if (!item) {\n throw new NotFoundError<S, L1, L2, L3, L4, L5>('remove', coordinate, key);\n }\n\n const isDeletedAttribute = model.getAttributes().isDeleted;\n const deletedAtAttribute = model.getAttributes().deletedAt;\n\n if (isDeletedAttribute || deletedAtAttribute) {\n if (model.getAttributes().isDeleted) {\n item.isDeleted = true;\n }\n\n if (model.getAttributes().deletedAt) {\n item.deletedAt = new Date();\n }\n\n // Save the object\n logger.debug(`[REMOVE] Executing ${model.name}.save() for soft delete`);\n await item?.save();\n returnItem = item?.get({ plain: true }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n returnItem = addKey(item, returnItem as any, kta);\n returnItem = populateEvents(returnItem);\n } else if (options.deleteOnRemove) {\n logger.debug(`[REMOVE] Executing ${model.name}.destroy() for hard delete`);\n await item?.destroy();\n returnItem = item?.get({ plain: true }) as Partial<Item<S, L1, L2, L3, L4, L5>>;\n returnItem = addKey(item, returnItem as any, kta);\n returnItem = populateEvents(returnItem);\n } else {\n throw new Error('No deletedAt or isDeleted attribute found in model, and deleteOnRemove is not set');\n }\n\n logger.debug(`[REMOVE] Removed ${model.name} with key: ${(returnItem as any).key ? JSON.stringify((returnItem as any).key) : `id=${item.id}`}`);\n return returnItem as V;\n }\n\n return remove;\n}\n", "/* eslint-disable indent */\nimport { abbrevIK, isComKey, validateKeys } from \"@fjell/core\";\n\nimport { isPriKey } from \"@fjell/core\";\n\nimport { ComKey, Item, PriKey } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport { extractEvents, removeEvents } from \"../EventCoordinator\";\nimport { removeKey } from \"../KeyMaster\";\nimport LibLogger from '../logger';\nimport { processRow } from \"../RowProcessor\";\n\nimport * as Library from \"@fjell/lib\";\nimport { NotFoundError } from \"@fjell/lib\";\nimport { ModelStatic, Op } from \"sequelize\";\nimport { buildRelationshipPath } from \"../util/relationshipUtils\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'update');\n\n// Helper function to merge includes avoiding duplicates\nconst mergeIncludes = (existingIncludes: any[], newIncludes: any[]): any[] => {\n const mergedIncludes = [...existingIncludes];\n\n for (const newInclude of newIncludes) {\n const existingIndex = mergedIncludes.findIndex(\n (existing: any) => existing.as === newInclude.as && existing.model === newInclude.model\n );\n if (existingIndex === -1) {\n mergedIncludes.push(newInclude);\n } else if (newInclude.include && mergedIncludes[existingIndex].include) {\n mergedIncludes[existingIndex].include = [\n ...mergedIncludes[existingIndex].include,\n ...newInclude.include\n ];\n } else if (newInclude.include) {\n mergedIncludes[existingIndex].include = newInclude.include;\n }\n }\n\n return mergedIncludes;\n};\n\nexport const getUpdateOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n\n registry: Library.Registry\n) => {\n\n const { options: { references, aggregations } } = definition;\n\n const update = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>,\n ): Promise<V> => {\n const keyDescription = isPriKey(key)\n ? `primary key: pk=${key.pk}`\n : `composite key: pk=${key.pk}, loc=[${(key as ComKey<S, L1, L2, L3, L4, L5>).loc.map((l: any) => `${l.kt}=${l.lk}`).join(', ')}]`;\n logger.debug(`UPDATE operation called on ${models[0].name} with ${keyDescription}`);\n const { coordinate } = definition;\n const { kta } = coordinate;\n\n logger.debug('update: %s, %j', abbrevIK(key), item);\n // Find the object we're updating\n // @ts-ignore\n const model = models[0];\n\n let response;\n\n if (isPriKey(key)) {\n // Find the model by using the PK\n const priKey = key as PriKey<S>;\n logger.trace(`[UPDATE] Executing ${model.name}.findByPk() with pk: ${priKey.pk}`);\n response = await model.findByPk(priKey.pk);\n } else if (isComKey(key)) {\n const comKey = key as ComKey<S, L1, L2, L3, L4, L5>;\n\n // Build query options for composite key with multiple location keys\n const where: { [key: string]: any } = { id: comKey.pk };\n const additionalIncludes: any[] = [];\n\n // Process all location keys in the composite key\n for (const locator of comKey.loc) {\n const relationshipInfo = buildRelationshipPath(model, locator.kt, kta, true);\n\n if (!relationshipInfo.found) {\n const errorMessage = `Composite key locator '${locator.kt}' cannot be resolved on model '${model.name}' or through its relationships.`;\n logger.error(errorMessage, { key: comKey, kta });\n throw new Error(errorMessage);\n }\n\n if (relationshipInfo.isDirect) {\n // Direct foreign key field\n const fieldName = `${locator.kt}Id`;\n where[fieldName] = locator.lk;\n } else if (relationshipInfo.path) {\n // Hierarchical relationship requiring traversal\n where[relationshipInfo.path] = {\n [Op.eq]: locator.lk\n };\n\n // Add necessary includes for relationship traversal\n if (relationshipInfo.includes) {\n additionalIncludes.push(...relationshipInfo.includes);\n }\n }\n }\n\n // Build final query options\n const queryOptions: any = { where };\n if (additionalIncludes.length > 0) {\n queryOptions.include = mergeIncludes([], additionalIncludes);\n }\n\n logger.default(`Update composite key query for ${model.name} with where fields: ${queryOptions.where ? Object.keys(queryOptions.where).join(', ') : 'none'}`);\n logger.trace(`[UPDATE] Executing ${model.name}.findOne() with options: ${stringifyJSON(queryOptions)}`);\n response = await model.findOne(queryOptions);\n }\n\n if (response) {\n\n // Remove the key and events\n let updateProps = removeKey(item)\n // TODO: We need the opposite of processRow, something to step down from fjell to database.\n updateProps = extractEvents(updateProps);\n updateProps = removeEvents(updateProps);\n\n logger.default(`Update found ${model.name} record to modify`);\n logger.default(`Update properties configured: ${Object.keys(updateProps).join(', ')}`);\n\n // Update the object\n logger.trace(`[UPDATE] Executing ${model.name}.update() with properties: ${stringifyJSON(updateProps)}`);\n response = await response.update(updateProps);\n\n // Populate the key and events\n // Update operations get their own context since they're top-level operations\n const processedItem = await processRow(response, kta, references || [], aggregations || [], registry);\n const returnItem = validateKeys(processedItem, kta);\n\n logger.debug(`[UPDATE] Updated ${model.name} with key: ${(returnItem as any).key ? JSON.stringify((returnItem as any).key) : `id=${response.id}`}`);\n return returnItem as V;\n } else {\n throw new NotFoundError<S, L1, L2, L3, L4, L5>('update', coordinate, key);\n }\n\n }\n\n return update;\n}\n", "/* eslint-disable indent */\nimport { ComKey, isValidItemKey, Item, PriKey } from \"@fjell/core\";\n\nimport { Definition } from \"../Definition\";\nimport LibLogger from '../logger';\nimport * as Library from \"@fjell/lib\";\nimport { ModelStatic } from \"sequelize\";\nimport { getGetOperation } from \"./get\";\nimport { getUpdateOperation } from \"./update\";\nimport { getCreateOperation } from \"./create\";\nimport { stringifyJSON } from \"../util/general\";\n\nconst logger = LibLogger.get('sequelize', 'ops', 'upsert');\n\nexport const getUpsertOperation = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n definition: Definition<V, S, L1, L2, L3, L4, L5>,\n registry: Library.Registry\n) => {\n\n // Get the individual operations we'll use\n const get = getGetOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n const update = getUpdateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n const create = getCreateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n\n const upsert = async (\n key: PriKey<S> | ComKey<S, L1, L2, L3, L4, L5>,\n item: Partial<Item<S, L1, L2, L3, L4, L5>>\n ): Promise<V> => {\n\n if (!isValidItemKey(key)) {\n logger.error('Key for Upsert is not a valid ItemKey: %j', key);\n throw new Error(`Key for Upsert is not a valid ItemKey: ${stringifyJSON(key)}`);\n }\n\n logger.debug(`[UPSERT] Attempting upsert with key: ${stringifyJSON(key)}`);\n\n try {\n // Try to get the existing item first\n const existingItem = await get(key);\n if (existingItem) {\n logger.debug(`[UPSERT] Item exists, updating with key: ${stringifyJSON(key)}`);\n // Item exists, update it\n return await update(key, item);\n }\n } catch {\n // Item doesn't exist (get threw NotFoundError), fall through to create\n logger.debug(`[UPSERT] Item not found, creating new item with key: ${stringifyJSON(key)}`);\n }\n\n // Item doesn't exist, create it\n return await create(item, { key });\n }\n\n return upsert;\n}\n", "/* eslint-disable indent */\nimport { Item } from \"@fjell/core\";\n\nimport * as Library from \"@fjell/lib\";\nimport { Registry } from \"./Registry\";\nimport { getAllOperation } from \"./ops/all\";\nimport { getCreateOperation } from \"./ops/create\";\nimport { getFindOperation } from \"./ops/find\";\nimport { getGetOperation } from \"./ops/get\";\nimport { getOneOperation } from \"./ops/one\";\nimport { getRemoveOperation } from \"./ops/remove\";\nimport { getUpdateOperation } from \"./ops/update\";\nimport { getUpsertOperation } from \"./ops/upsert\";\nimport { ModelStatic } from \"sequelize\";\nimport { Coordinate } from \"@fjell/registry\";\n\nexport const createOperations = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: Array<ModelStatic<any>>,\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>,\n registry: Registry,\n options: import('./Options').Options<V, S, L1, L2, L3, L4, L5>\n): Library.Operations<V, S, L1, L2, L3, L4, L5> => {\n\n const operations = {} as Library.Operations<V, S, L1, L2, L3, L4, L5>;\n\n // Create a definition-like object for backward compatibility with existing operation functions\n const definition = { coordinate, options };\n\n operations.all = getAllOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.one = getOneOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.create = getCreateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.update = getUpdateOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.get = getGetOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.remove = getRemoveOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.find = getFindOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.upsert = getUpsertOperation<V, S, L1, L2, L3, L4, L5>(models, definition, registry);\n operations.allFacet = async (): Promise<any> => { };\n operations.allAction = async (): Promise<any> => { };\n operations.action = async (): Promise<any> => { };\n operations.facet = async (): Promise<any> => { };\n\n operations.finders = { ...(options.finders || {}) };\n operations.actions = { ...(options.actions || {}) };\n operations.facets = { ...(options.facets || {}) };\n operations.allActions = { ...(options.allActions || {}) };\n operations.allFacets = { ...(options.allFacets || {}) };\n\n return operations;\n}\n", "import { Item } from \"@fjell/core\";\nimport { Options } from \"./Options\";\nimport { Registry as LocalRegistry } from \"./Registry\";\nimport { InstanceFactory as BaseInstanceFactory, Registry as BaseRegistry, Coordinate, RegistryHub } from \"@fjell/registry\";\nimport { createSequelizeLibrary, SequelizeLibrary } from \"./SequelizeLibrary\";\nimport { ModelStatic } from \"sequelize\";\nimport SequelizeLogger from \"./logger\";\n\nconst logger = SequelizeLogger.get(\"InstanceFactory\");\n\n/**\n * Sequelize Library Factory type that extends the base factory\n * to include Sequelize-specific models parameter\n */\nexport type SequelizeLibraryFactory<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n options: Options<V, S, L1, L2, L3, L4, L5>\n) => BaseInstanceFactory<S, L1, L2, L3, L4, L5>;\n\n/**\n * Factory function for creating Sequelize libraries\n * This extends the fjell-lib pattern by adding Sequelize-specific models\n */\nexport const createSequelizeLibraryFactory = <\n V extends Item<S, L1, L2, L3, L4, L5>,\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 models: ModelStatic<any>[],\n options: Options<V, S, L1, L2, L3, L4, L5>\n ): BaseInstanceFactory<S, L1, L2, L3, L4, L5> => {\n return (coordinate: Coordinate<S, L1, L2, L3, L4, L5>, context: { registry: BaseRegistry, registryHub?: RegistryHub }) => {\n logger.debug(\"Creating Sequelize instance\", {\n coordinate,\n registry: context.registry,\n models: models.map(m => m.name),\n options\n });\n\n return createSequelizeLibrary<V, S, L1, L2, L3, L4, L5>(\n context.registry as LocalRegistry,\n coordinate,\n models,\n options\n ) as SequelizeLibrary<V, S, L1, L2, L3, L4, L5>;\n };\n};\n", "export * from './SequelizeLibrary';\n", "\nimport { SequelizeLibrary as AbstractSequelizeLibrary } from '../SequelizeLibrary';\nimport { Item, ItemTypeArray } from '@fjell/core';\nimport { Contained } from '@fjell/lib';\nimport * as Library from '@fjell/lib';\nimport { createOperations } from '../Operations';\nimport { ModelStatic } from 'sequelize';\nimport { Registry } from '../Registry';\nimport { createOptions, Options } from '../Options';\nimport { Coordinate, createCoordinate } from '../Coordinate';\n\nexport interface SequelizeLibrary<\n V extends Item<S>,\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> extends AbstractSequelizeLibrary<V, S, L1, L2, L3, L4, L5> {\n coordinate: Coordinate<S, L1, L2, L3, L4, L5>;\n registry: Registry;\n operations: Library.Operations<V, S, L1, L2, L3, L4, L5>;\n options: Options<V, S, L1, L2, L3, L4, L5>;\n models: ModelStatic<any>[];\n}\n\nexport function createSequelizeLibrary<\n V extends Item<S, L1, L2, L3, L4, L5>,\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 keyTypes: ItemTypeArray<S, L1, L2, L3, L4, L5>,\n models: ModelStatic<any>[],\n libOptions: Partial<Options<V, S, L1, L2, L3, L4, L5>> = {},\n scopes: string[] = [],\n registry: Registry\n): SequelizeLibrary<V, S, L1, L2, L3, L4, L5> {\n\n // Create coordinate and options separately following new pattern\n const coordinate = createCoordinate(keyTypes, scopes);\n const options = createOptions(libOptions);\n\n // Create operations with the new signature\n const operations = createOperations<V, S, L1, L2, L3, L4, L5>(models, coordinate, registry, options);\n\n // Wrap operations for contained pattern\n const wrappedOperations = Contained.wrapOperations(operations, options as any, coordinate, registry);\n\n return {\n coordinate,\n registry,\n operations: wrappedOperations,\n options,\n models,\n } as unknown as SequelizeLibrary<V, S, L1, L2, L3, L4, L5>;\n}\n", "export * from './SequelizeLibrary';\n", "\nimport { SequelizeLibrary as AbstractSequelizeLibrary } from '../SequelizeLibrary';\nimport { Item } from '@fjell/core';\nimport { Primary } from '@fjell/lib';\nimport * as Library from '@fjell/lib';\nimport { createOperations } from '../Operations';\nimport { ModelStatic } from 'sequelize';\nimport { createOptions, Options } from '../Options';\nimport { Registry } from '../Registry';\nimport { Coordinate, createCoordinate } from '../Coordinate';\n\nimport LibLogger from '../logger';\n\nconst logger = LibLogger.get('lib-sequelize', 'primary', 'library');\n\nexport interface SequelizeLibrary<\n V extends Item<S>,\n S extends string\n> extends AbstractSequelizeLibrary<V, S> {\n coordinate: Coordinate<S>;\n registry: Registry;\n operations: Library.Operations<V, S>;\n options: Options<V, S>;\n models: ModelStatic<any>[];\n}\n\nexport function createSequelizeLibrary<\n V extends Item<S>,\n S extends string\n>(\n keyType: S,\n models: ModelStatic<any>[],\n libOptions: Partial<Options<V, S>> = {},\n scopes: string[] = [],\n registry: Registry\n): SequelizeLibrary<V, S> {\n logger.debug('createSequelizeLibrary', { keyType, models, libOptions, scopes });\n\n // Create coordinate and options separately following new pattern\n const coordinate = createCoordinate([keyType], scopes);\n const options = createOptions(libOptions);\n\n // Create operations with the new signature\n const operations = createOperations<V, S>(models, coordinate, registry, options);\n\n // Wrap operations for primary pattern\n const wrappedOperations = Primary.wrapOperations(operations, options as any, coordinate, registry);\n\n return {\n coordinate,\n registry,\n operations: wrappedOperations,\n options,\n models,\n } as unknown as SequelizeLibrary<V, S>;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["createOptions", "logger", "createOptions", "Library", "logger", "result", "logger", "foreignKeyField", "logger", "logger", "logger", "logger", "Op", "logger", "loc", "Op", "isComKey", "isPriKey", "validateKeys", "logger", "record", "isComKey", "isPriKey", "validateKeys", "validateKeys", "logger", "validateKeys", "isComKey", "isPriKey", "validateKeys", "logger", "isPriKey", "isComKey", "validateKeys", "logger", "isValidItemKey", "isComKey", "isPriKey", "NotFoundError", "logger", "processCompositeKey", "isValidItemKey", "isPriKey", "isComKey", "abbrevIK", "isComKey", "validateKeys", "isPriKey", "NotFoundError", "Op", "logger", "mergeIncludes", "isPriKey", "abbrevIK", "isComKey", "Op", "validateKeys", "NotFoundError", "isValidItemKey", "logger", "isValidItemKey", "logger", "logger", "createSequelizeLibrary", "createSequelizeLibrary", "createOptions", "createSequelizeLibrary", "logger", "createSequelizeLibrary", "createOptions"]
7
7
  }
@@ -0,0 +1,37 @@
1
+ import { Item } from "@fjell/core";
2
+ import type { Registry } from "@fjell/lib";
3
+ import { OperationContext } from "@fjell/lib";
4
+ /**
5
+ * Sequelize-specific definition for a reference relationship.
6
+ * References in Sequelize are stored as foreign key columns (e.g., "authorId")
7
+ * and populated into properties on the item.
8
+ */
9
+ export interface SequelizeReferenceDefinition {
10
+ /** Column name containing the foreign key value (e.g., "authorId") */
11
+ column: string;
12
+ /** Key type array of the referenced item */
13
+ kta: string[];
14
+ /** Property name to populate with the referenced item (e.g., "author") */
15
+ property: string;
16
+ }
17
+ /**
18
+ * Build a reference by looking up a related item by its key from a column value.
19
+ * The referenced item will be populated directly into a property on the item.
20
+ *
21
+ * @param item - The item to populate with reference data
22
+ * @param referenceDefinition - Sequelize-specific definition of what to reference
23
+ * @param registry - Registry to look up library instances
24
+ * @param context - Optional operation context for caching and cycle detection
25
+ * @returns The item with the reference property populated
26
+ */
27
+ export declare const buildSequelizeReference: (item: any, referenceDefinition: SequelizeReferenceDefinition, registry: Registry, context?: OperationContext) => Promise<any>;
28
+ /**
29
+ * Strip populated reference properties from item before writing to database.
30
+ * This ensures we only store the foreign key columns, not the full populated items.
31
+ *
32
+ * @param item - The item to strip references from
33
+ * @param referenceDefinitions - Array of reference definitions to strip
34
+ * @returns The item with only foreign key values (no populated items)
35
+ */
36
+ export declare const stripSequelizeReferenceItems: <S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never>(item: Partial<Item<S, L1, L2, L3, L4, L5>>, referenceDefinitions: SequelizeReferenceDefinition[]) => Partial<Item<S, L1, L2, L3, L4, L5>>;
37
+ //# sourceMappingURL=ReferenceBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferenceBuilder.d.ts","sourceRoot":"","sources":["../../src/processing/ReferenceBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAU,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,GAClC,MAAM,GAAG,EACT,qBAAqB,4BAA4B,EACjD,UAAU,QAAQ,EAClB,UAAU,gBAAgB,iBA0G3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,GACvC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEvB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAC1C,sBAAsB,4BAA4B,EAAE,KACnD,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAWvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type { SequelizeReferenceDefinition } from './ReferenceBuilder';
2
+ export { buildSequelizeReference, stripSequelizeReferenceItems } from './ReferenceBuilder';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/processing/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjell/lib-sequelize",
3
- "version": "4.4.45",
3
+ "version": "4.4.47",
4
4
  "license": "Apache-2.0",
5
5
  "keywords": [
6
6
  "library",
@@ -41,10 +41,10 @@
41
41
  "docs:test": "cd docs && npm run test"
42
42
  },
43
43
  "dependencies": {
44
- "@fjell/core": "^4.4.42",
45
- "@fjell/lib": "^4.4.46",
44
+ "@fjell/core": "^4.4.43",
45
+ "@fjell/lib": "^4.4.49",
46
46
  "@fjell/logging": "^4.4.47",
47
- "@fjell/registry": "^4.4.41",
47
+ "@fjell/registry": "^4.4.43",
48
48
  "dayjs": "^1.11.13",
49
49
  "deepmerge": "^4.3.1",
50
50
  "sequelize": "^6.37.7",