@memberjunction/external-change-detection 5.5.0 → 5.6.0

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.
@@ -1,5 +1,5 @@
1
- import { BaseEngine, BaseEntity, CompositeKey, EntityField, EntityInfo, IMetadataProvider, Metadata, UserInfo } from "@memberjunction/core";
2
- import { MJRecordChangeEntity, MJRecordChangeReplayRunEntity } from "@memberjunction/core-entities";
1
+ import { BaseEngine, BaseEntity, CompositeKey, EntityFieldTSType, EntityInfo, IMetadataProvider, Metadata, UserInfo } from "@memberjunction/core";
2
+ import { MJRecordChangeReplayRunEntity } from "@memberjunction/core-entities";
3
3
  /**
4
4
  * Represents a change to a single field in a record
5
5
  */
@@ -39,6 +39,7 @@ export declare class ChangeDetectionResult {
39
39
  * This is a server only package
40
40
  */
41
41
  export declare class ExternalChangeDetectorEngine extends BaseEngine<ExternalChangeDetectorEngine> {
42
+ private _dialect;
42
43
  Config(forceRefresh?: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
43
44
  static get Instance(): ExternalChangeDetectorEngine;
44
45
  private _IneligibleEntities;
@@ -77,62 +78,37 @@ export declare class ExternalChangeDetectorEngine extends BaseEngine<ExternalCha
77
78
  changes: FieldChange[];
78
79
  latestRecord: BaseEntity;
79
80
  }>;
80
- protected DoValuesDiffer(field: EntityField, value1: any, value2: any): {
81
+ protected DoValuesDiffer(tsType: EntityFieldTSType, value1: any, value2: any): {
81
82
  differ: boolean;
82
83
  castValue1: any;
83
84
  castValue2: any;
84
85
  };
85
- protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<any>;
86
- protected GetLatestDatabaseRecord(md: Metadata, change: ChangeDetectionItem): Promise<BaseEntity>;
87
86
  /**
88
- * Get all of the latest database records together in grouped queries for each entity that has records we need instead
89
- * of one at a time like GetLatestDatabaseRecord does. This method will return true/false and will place the LatestRecord
90
- * into each item in the changes array for you.
91
- * @param md
92
- * @param changes
93
- * @returns
87
+ * Casts a value to a boolean, properly handling string representations like 'false' and '0'
88
+ * which are truthy in JavaScript but should be treated as false.
94
89
  */
90
+ protected CastToBoolean(value: unknown): boolean;
91
+ protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<any>;
95
92
  protected GetLatestDatabaseRecords(md: Metadata, changes: ChangeDetectionItem[]): Promise<boolean>;
93
+ protected GetLatestDatabaseRecord(md: Metadata, change: ChangeDetectionItem): Promise<BaseEntity>;
96
94
  protected getPrimaryKeyString(entity: EntityInfo, tablePrefix: string): string;
97
- protected generateDetectUpdatesQuery(entity: EntityInfo): string;
98
- protected generateDetectCreationsQuery(entity: EntityInfo): string;
99
- protected generateDetectDeletionsQuery(entity: EntityInfo): string;
100
95
  /**
101
96
  * Detects changes across all of the entities specified
97
+ * @param entities Array of entities to process
98
+ * @param entityBatchSize Optional, defines how many entities to process in parallel. Defaults to 10.
102
99
  * @returns
103
100
  */
104
- DetectChangesForEntities(entities: EntityInfo[]): Promise<ChangeDetectionResult>;
105
- /**
106
- * This method will detect changes for all eligible entities as defined by the EligibleEntities property
107
- */
108
- DetectChangesForAllEligibleEntities(): Promise<ChangeDetectionResult>;
101
+ DetectChangesForEntities(entities: EntityInfo[], entityBatchSize?: number): Promise<ChangeDetectionResult>;
102
+ DetectChangesForAllEligibleEntities(entityBatchSize?: number): Promise<ChangeDetectionResult>;
109
103
  /**
110
104
  * This method will replay all of the items in the changes array
111
105
  * @param changes Array of changes to replay.
112
106
  * @param batchSize Optional, defines the # of concurrent changes to replay at once. If you want to replay changes serially, set this to 1
107
+ * @param staleTimeoutHours Optional, defines how many hours a run can be in progress before it is considered stale. Defaults to 24.
113
108
  * @returns {Promise<boolean>} - Returns true if all changes are successfully replayed, otherwise false.
114
109
  */
115
- ReplayChanges(changes: ChangeDetectionItem[], batchSize?: number): Promise<boolean>;
116
- /**
117
- * Method creates a new Record Change Replay Run and returns the object for the run
118
- */
119
- protected StartRun(): Promise<MJRecordChangeReplayRunEntity>;
120
- /**
121
- * Replays a single change item within a given run. This method will:
122
- * 1) Create a new Record Change record for the replay item
123
- * 2) Load a BaseEntity derived class for the entity in question and call either Save() or Delete() and pass in the Replay Only option
124
- * 3) Record the result in the Record Change record, updating status and if appropriate, the error message
125
- * @param change
126
- */
127
- protected ReplaySingleChange(md: Metadata, run: MJRecordChangeReplayRunEntity, change: ChangeDetectionItem): Promise<boolean>;
128
- /**
129
- * This method will attempt to update the RecordChange record and return true if succesful, false otherwise.
130
- */
131
- protected FinishRecordChangeRecord(rc: MJRecordChangeEntity, code: 'error' | 'success', errorMessage: string): Promise<boolean>;
132
- /**
133
- * Creates a new record change record for the start of the replay process.
134
- * @param change
135
- */
136
- protected CreateRecordChangeRecord(md: Metadata, run: MJRecordChangeReplayRunEntity, change: ChangeDetectionItem): Promise<MJRecordChangeEntity>;
110
+ ReplayChanges(changes: ChangeDetectionItem[], batchSize?: number, staleTimeoutHours?: number): Promise<boolean>;
111
+ protected ReplayChange(md: Metadata, change: ChangeDetectionItem): Promise<boolean>;
112
+ protected StartRun(staleTimeoutHours?: number): Promise<MJRecordChangeReplayRunEntity>;
137
113
  }
138
114
  //# sourceMappingURL=ChangeDetector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { BaseEngine, CompositeKey, ConsoleColor, EntityFieldTSType, EntityInfo, LogError, LogStatus, Metadata, RunView, UpdateCurrentConsoleLine, UpdateCurrentConsoleProgress } from "@memberjunction/core";
1
+ import { BaseEngine, CompositeKey, ConsoleColor, EntityFieldTSType, EntityInfo, LogError, LogStatus, Metadata, RunQuery, RunView, UpdateCurrentConsoleLine, UpdateCurrentConsoleProgress } from "@memberjunction/core";
2
2
  import { UUIDsEqual } from "@memberjunction/global";
3
+ import { PostgreSQLDialect, SQLServerDialect } from "@memberjunction/sql-dialect";
3
4
  /**
4
5
  * Represents a change to a single field in a record
5
6
  */
@@ -31,6 +32,9 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
31
32
  }
32
33
  async Config(forceRefresh, contextUser, provider) {
33
34
  const p = (provider || Metadata.Provider);
35
+ // Initialize dialect
36
+ const platform = p.DatabasePlatform || 'sqlserver';
37
+ this._dialect = platform === 'postgresql' ? new PostgreSQLDialect() : new SQLServerDialect();
34
38
  const c = [
35
39
  {
36
40
  EntityName: "MJ: Entities",
@@ -84,17 +88,28 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
84
88
  throw new Error(`Entity ${entity.Name} is not eligible for external change detection. Refer to the documentation on the EligibleEntities and IneligibleEntities properties for more information.`);
85
89
  }
86
90
  const md = new Metadata();
87
- const sqlCreates = this.generateDetectCreationsQuery(entity);
88
- const sqlUpdates = this.generateDetectUpdatesQuery(entity);
89
- const sqlDeletes = this.generateDetectDeletionsQuery(entity);
90
- const provider = Metadata.Provider;
91
- const createResult = await provider.ExecuteSQL(sqlCreates);
92
- const updateResult = await provider.ExecuteSQL(sqlUpdates);
93
- const deleteResult = await provider.ExecuteSQL(sqlDeletes);
91
+ const rq = new RunQuery();
92
+ const commonParams = {
93
+ EntityID: entity.ID,
94
+ SchemaName: entity.SchemaName,
95
+ BaseView: entity.BaseView,
96
+ ColumnList: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)}`).join(', '),
97
+ PrimaryKeyJoin: this.getPrimaryKeyString(entity, 'ot'),
98
+ CreatedAtField: EntityInfo.CreatedAtFieldName,
99
+ UpdatedAtField: EntityInfo.UpdatedAtFieldName
100
+ };
101
+ const [createResult, updateResult, deleteResult] = await rq.RunQueries([
102
+ { QueryName: 'ExternalChangeDetection_DetectCreations', Parameters: commonParams },
103
+ { QueryName: 'ExternalChangeDetection_DetectUpdates', Parameters: commonParams },
104
+ { QueryName: 'ExternalChangeDetection_DetectDeletions', Parameters: {
105
+ ...commonParams,
106
+ PrimaryKeyIsNull: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)} IS NULL`).join(' AND ')
107
+ } }
108
+ ], this.ContextUser);
94
109
  // we have the results for all of the queries, now we need to convert them into ChangeDetectionItems
95
110
  const changes = [];
96
- if (createResult && createResult.length > 0) {
97
- for (const row of createResult) {
111
+ if (createResult && createResult.Success && createResult.Results.length > 0) {
112
+ for (const row of createResult.Results) {
98
113
  const item = new ChangeDetectionItem();
99
114
  item.Entity = entity;
100
115
  item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => {
@@ -109,8 +124,8 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
109
124
  changes.push(item);
110
125
  }
111
126
  }
112
- if (updateResult && updateResult.length > 0) {
113
- for (const row of updateResult) {
127
+ if (updateResult && updateResult.Success && updateResult.Results.length > 0) {
128
+ for (const row of updateResult.Results) {
114
129
  const item = new ChangeDetectionItem();
115
130
  item.Entity = entity;
116
131
  item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => {
@@ -128,8 +143,8 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
128
143
  }
129
144
  }
130
145
  }
131
- if (deleteResult && deleteResult.length > 0) {
132
- deleteResult.forEach(row => {
146
+ if (deleteResult && deleteResult.Success && deleteResult.Results.length > 0) {
147
+ deleteResult.Results.forEach(row => {
133
148
  const item = new ChangeDetectionItem();
134
149
  item.Entity = entity;
135
150
  const ck = new CompositeKey();
@@ -193,7 +208,7 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
193
208
  const changes = [];
194
209
  for (const field of record.Fields) {
195
210
  if (!field.IsPrimaryKey) {
196
- const differResult = this.DoValuesDiffer(field, field.Value, json[field.Name]);
211
+ const differResult = this.DoValuesDiffer(field.FieldType, field.Value, json[field.Name]);
197
212
  if (differResult.differ) {
198
213
  changes.push({
199
214
  FieldName: field.Name,
@@ -210,105 +225,102 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
210
225
  return { changes: [], latestRecord: record };
211
226
  }
212
227
  }
213
- else
214
- throw new Error(`Failed to load record: ${change.Entity.Name}: ${change.PrimaryKey}`);
228
+ else {
229
+ // record not found in database, this could happen if it was deleted between detection and replay
230
+ return { changes: [], latestRecord: null };
231
+ }
215
232
  }
216
233
  catch (e) {
217
234
  LogError(e);
218
235
  return { changes: [], latestRecord: null };
219
236
  }
220
237
  }
221
- DoValuesDiffer(field, value1, value2) {
222
- // type specific comparisons
223
- // for each scenario, make sure both value1 and value 2 are of the type we care about, if they're not, create new variables
224
- // of those types and then do type specific comparisons for equality
225
- switch (field.EntityFieldInfo.TSType) {
226
- case EntityFieldTSType.Boolean:
227
- // check to see if value1 and value2 are both boolean, if not, convert them to boolean
228
- const v1 = typeof value1 === 'boolean' ? value1 : value1 === 'true' ? true : false;
229
- const v2 = typeof value2 === 'boolean' ? value2 : value2 === 'true' ? true : false;
230
- return { differ: v1 !== v2, castValue1: v1, castValue2: v2 };
238
+ DoValuesDiffer(tsType, value1, value2) {
239
+ let castValue1 = value1;
240
+ let castValue2 = value2;
241
+ switch (tsType) {
231
242
  case EntityFieldTSType.Date:
232
- // check to see if value1 and value2 are both dates, if not, convert them to dates
233
- const d1 = value1 instanceof Date ? value1 : new Date(value1);
234
- const d2 = value2 instanceof Date ? value2 : new Date(value2);
235
- return { differ: d1.getTime() !== d2.getTime(), castValue1: d1, castValue2: d2 };
243
+ castValue1 = value1 ? new Date(value1) : null;
244
+ castValue2 = value2 ? new Date(value2) : null;
245
+ if (castValue1 && castValue2) {
246
+ // check both to see if they're the same - up to 3 digits of precision
247
+ // because when we get the values back into JavaScript objects, Date objects only have 3 digits of precision
248
+ const d1 = castValue1.getTime();
249
+ const d2 = castValue2.getTime();
250
+ return { differ: d1 !== d2, castValue1, castValue2 };
251
+ }
252
+ else
253
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
236
254
  case EntityFieldTSType.Number:
237
- // check to see if value1 and value2 are both numbers, if not, convert them to numbers
238
- const n1 = value1 ? typeof value1 === 'number' ? value1 : parseFloat(value1) : value1;
239
- const n2 = value2 ? typeof value2 === 'number' ? value2 : parseFloat(value2) : value2;
240
- return { differ: n1 !== n2, castValue1: n1, castValue2: n2 };
241
- case EntityFieldTSType.String:
242
- // check to see if value1 and value2 are both strings, if not, convert them to strings
243
- const s1 = typeof value1 === 'string' || !value1 ? value1 : value1.toString();
244
- const s2 = typeof value2 === 'string' || !value2 ? value2 : value2.toString();
245
- return { differ: s1 !== s2, castValue1: s1, castValue2: s2 };
255
+ castValue1 = value1 ? parseFloat(value1) : 0;
256
+ castValue2 = value2 ? parseFloat(value2) : 0;
257
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
258
+ case EntityFieldTSType.Boolean:
259
+ castValue1 = this.CastToBoolean(value1);
260
+ castValue2 = this.CastToBoolean(value2);
261
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
246
262
  default:
247
- // don't know the type, shouldn't get here, just do a basic TypeScript equality check
248
- // with a single != instead of !== because we don't want to check type just value
249
- return { differ: value1 != value2, castValue1: value1, castValue2: value2 };
263
+ castValue1 = value1 ? value1.toString().trim() : '';
264
+ castValue2 = value2 ? value2.toString().trim() : '';
265
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
250
266
  }
251
267
  }
268
+ /**
269
+ * Casts a value to a boolean, properly handling string representations like 'false' and '0'
270
+ * which are truthy in JavaScript but should be treated as false.
271
+ */
272
+ CastToBoolean(value) {
273
+ if (typeof value === 'string') {
274
+ const lower = value.toLowerCase().trim();
275
+ return lower === 'true' || lower === '1';
276
+ }
277
+ return !!value;
278
+ }
252
279
  async GetLatestRecordChangesDataForEntityRecord(change) {
253
- const Provider = this.ProviderToUse;
254
- const sql = `SELECT
255
- TOP 1 FullRecordJSON
256
- FROM
257
- ${Provider.MJCoreSchemaName}.vwRecordChanges
258
- WHERE
259
- RecordID = '${change.PrimaryKey.ToConcatenatedString()}'
260
- AND EntityID = '${change.Entity.ID}'
261
- AND Status <> 'Pending'
262
- ORDER BY
263
- ChangedAt DESC`;
264
- const result = await Provider.ExecuteSQL(sql);
265
- if (result && result.length > 0)
266
- return result[0];
267
- else
280
+ try {
281
+ const rv = new RunView();
282
+ const result = await rv.RunView({
283
+ EntityName: "MJ: Record Changes",
284
+ ExtraFilter: `EntityID = '${change.Entity.ID}' AND RecordID = '${change.PrimaryKey.ToConcatenatedString()}' AND Type IN ('Update', 'Create')`,
285
+ OrderBy: "ChangedAt DESC"
286
+ }, this.ContextUser);
287
+ if (result && result.Success && result.Results.length > 0) {
288
+ return result.Results[0];
289
+ }
290
+ else
291
+ return null;
292
+ }
293
+ catch (e) {
294
+ LogError(e);
268
295
  return null;
269
- }
270
- async GetLatestDatabaseRecord(md, change) {
271
- const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
272
- if (await record.InnerLoad(change.PrimaryKey)) {
273
- return record;
274
296
  }
275
- else
276
- throw new Error(`Failed to load record: ${change.Entity.Name}: ${change.PrimaryKey}`);
277
297
  }
278
- /**
279
- * Get all of the latest database records together in grouped queries for each entity that has records we need instead
280
- * of one at a time like GetLatestDatabaseRecord does. This method will return true/false and will place the LatestRecord
281
- * into each item in the changes array for you.
282
- * @param md
283
- * @param changes
284
- * @returns
285
- */
286
298
  async GetLatestDatabaseRecords(md, changes) {
287
299
  try {
288
- // Step 1 - group by entity and get a complete list of entities from the changes
300
+ const provider = Metadata.Provider;
301
+ // distinct list of entities
289
302
  const entities = [];
290
- const provider = this.ProviderToUse;
291
303
  for (const c of changes) {
292
- let e = entities.find(e => UUIDsEqual(e.entity.ID, c.Entity.ID));
293
- if (!e) {
294
- e = {
295
- entity: c.Entity,
296
- keys: [c.PrimaryKey]
297
- };
298
- entities.push(e);
299
- }
300
- else {
301
- e.keys.push(c.PrimaryKey);
304
+ if (c.Type === 'Update' || c.Type === 'Create') {
305
+ let entry = entities.find(e => UUIDsEqual(e.entity.ID, c.Entity.ID));
306
+ if (!entry) {
307
+ entry = { entity: c.Entity, keys: [] };
308
+ entities.push(entry);
309
+ }
310
+ entry.keys.push(c.PrimaryKey);
302
311
  }
303
312
  }
304
313
  // now we have a distinct list of entities and all of the pkeys for each one, so we can run a single
305
314
  // select statement for each entity
306
315
  for (const e of entities) {
307
- const sql = `SELECT * FROM [${e.entity.SchemaName}].[${e.entity.BaseView}]
316
+ const quotedTable = this._dialect.QuoteSchema(e.entity.SchemaName, e.entity.BaseView);
317
+ const sql = `SELECT * FROM ${quotedTable}
308
318
  WHERE ${e.keys.map(k => `(${k.KeyValuePairs.map(kvp => {
309
319
  const f = e.entity.Fields.find(f => kvp.FieldName.trim().toLowerCase() === f.Name);
310
320
  const quotes = f?.NeedsQuotes ? "'" : "";
311
- return `[${kvp.FieldName}]=${quotes}${kvp.Value}${quotes}`;
321
+ const quotedField = this._dialect.QuoteIdentifier(kvp.FieldName);
322
+ const escapedValue = typeof kvp.Value === 'string' ? kvp.Value.replace(/'/g, "''") : kvp.Value;
323
+ return `${quotedField}=${quotes}${escapedValue}${quotes}`;
312
324
  }).join(' AND ')})`).join(' OR ')} `;
313
325
  const result = await provider.ExecuteSQL(sql);
314
326
  if (result) {
@@ -338,77 +350,34 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
338
350
  return false;
339
351
  }
340
352
  }
341
- getPrimaryKeyString(entity, tablePrefix) {
342
- return entity.PrimaryKeys.map(pk => `'${pk.Name}${CompositeKey.DefaultValueDelimiter}' + CAST(${tablePrefix}.[${pk.Name}] AS NVARCHAR(MAX))`).join(` + '${CompositeKey.DefaultFieldDelimiter}' + `);
343
- }
344
- generateDetectUpdatesQuery(entity) {
345
- const primaryKeyString = this.getPrimaryKeyString(entity, 'ot');
346
- return `
347
- SELECT
348
- ${entity.PrimaryKeys.map(pk => `ot.[${pk.Name}]`).join(', ')}, ot.${EntityInfo.UpdatedAtFieldName} AS UpdatedAt, rc.last_change_time LatestRecordChangeAt
349
- FROM
350
- [${entity.SchemaName}].[${entity.BaseView}] ot
351
- INNER JOIN (
352
- SELECT
353
- RecordID, MAX(ChangedAt) AS last_change_time
354
- FROM
355
- __mj.vwRecordChanges
356
- WHERE
357
- Type IN ('Update', 'Create') AND EntityID = '${entity.ID}'
358
- GROUP BY
359
- RecordID
360
- ) rc ON ${primaryKeyString} = rc.RecordID
361
- WHERE
362
- FORMAT(ot.${EntityInfo.UpdatedAtFieldName}, 'yyyy-MM-dd HH:mm:ss.fff') > COALESCE(FORMAT(rc.last_change_time, 'yyyy-MM-dd HH:mm:ss.fff'), '1900-01-01 00:00:00.000');`;
363
- // use up to 3 digits of precision because when we get the values back into JavaScript objects, Date objects only have 3 digits of precision
364
- }
365
- generateDetectCreationsQuery(entity) {
366
- const primaryKeyString = this.getPrimaryKeyString(entity, 'ot');
367
- return `
368
- SELECT
369
- ${entity.PrimaryKeys.map(pk => `ot.[${pk.Name}]`).join(', ')}, ot.${EntityInfo.CreatedAtFieldName} AS CreatedAt, ot.${EntityInfo.UpdatedAtFieldName} AS UpdatedAt
370
- FROM
371
- [${entity.SchemaName}].[${entity.BaseView}] ot
372
- LEFT JOIN
373
- __mj.vwRecordChanges rc
374
- ON
375
- (${primaryKeyString} = rc.RecordID) AND
376
- rc.Type = 'Create' AND
377
- rc.EntityID = '${entity.ID}'
378
- WHERE
379
- rc.RecordID IS NULL;
380
- `;
353
+ async GetLatestDatabaseRecord(md, change) {
354
+ try {
355
+ const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
356
+ if (await record.InnerLoad(change.PrimaryKey)) {
357
+ return record;
358
+ }
359
+ else
360
+ return null;
361
+ }
362
+ catch (e) {
363
+ LogError(e);
364
+ return null;
365
+ }
381
366
  }
382
- generateDetectDeletionsQuery(entity) {
383
- const primaryKeyString = this.getPrimaryKeyString(entity, 'ot');
384
- return `
385
- SELECT
386
- rc.RecordID, MAX(rc.ChangedAt) ChangedAt
387
- FROM
388
- __mj.vwRecordChanges rc
389
- LEFT JOIN
390
- [${entity.SchemaName}].[${entity.BaseView}] ot
391
- ON
392
- rc.RecordID = ${primaryKeyString}
393
- WHERE
394
- ${entity.PrimaryKeys.map(pk => `ot.[${pk.Name}] IS NULL`).join(' AND ')}
395
- AND
396
- rc.EntityID = '${entity.ID}'
397
- AND
398
- NOT EXISTS
399
- (
400
- SELECT rc2.ID FROM __mj.vwRecordChanges rc2 WHERE
401
- rc2.RecordID = rc.RecordID AND rc2.EntityID=rc.EntityID AND rc2.Type='Delete'
402
- )
403
- GROUP BY
404
- rc.RecordID
405
- `; // last part of above query makes sure we don't include records already deleted in Record Changes
367
+ getPrimaryKeyString(entity, tablePrefix) {
368
+ const concatOp = this._dialect.ConcatOperator();
369
+ const castToText = (expr) => this._dialect.CastToText(expr);
370
+ const quote = (id) => this._dialect.QuoteIdentifier(id);
371
+ const table = quote(tablePrefix);
372
+ return entity.PrimaryKeys.map(pk => `'${pk.Name}${CompositeKey.DefaultValueDelimiter}' ${concatOp} ${castToText(`${table}.${quote(pk.Name)}`)}`).join(` ${concatOp} '${CompositeKey.DefaultFieldDelimiter}' ${concatOp} `);
406
373
  }
407
374
  /**
408
375
  * Detects changes across all of the entities specified
376
+ * @param entities Array of entities to process
377
+ * @param entityBatchSize Optional, defines how many entities to process in parallel. Defaults to 10.
409
378
  * @returns
410
379
  */
411
- async DetectChangesForEntities(entities) {
380
+ async DetectChangesForEntities(entities, entityBatchSize = 10) {
412
381
  try {
413
382
  if (!entities)
414
383
  throw new Error("entities parameter is required");
@@ -417,23 +386,28 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
417
386
  const result = new ChangeDetectionResult();
418
387
  result.Success = true;
419
388
  result.Changes = [];
420
- const promises = [];
421
- // fire them all off in parallel
422
- LogStatus(`Detecting changes for ${entities.length} entities`);
423
- let numFinished = 0;
424
- entities.forEach((e) => {
425
- UpdateCurrentConsoleLine(` Starting change detection changes for ${e.Name}`, ConsoleColor.gray);
426
- const p = this.DetectChangesForEntity(e); // no await
427
- promises.push(p);
428
- p.then(entityResult => {
429
- UpdateCurrentConsoleProgress(` Finished change detection changes for ${e.Name}`, ++numFinished, entities.length, entityResult.Success ? ConsoleColor.cyan : ConsoleColor.crimson);
430
- result.Changes = result.Changes.concat(entityResult.Changes);
431
- result.Success = result.Success && entityResult.Success;
389
+ LogStatus(`Detecting changes for ${entities.length} entities in batches of ${entityBatchSize}`);
390
+ // process entities in batches
391
+ for (let i = 0; i < entities.length; i += entityBatchSize) {
392
+ const batch = entities.slice(i, i + entityBatchSize);
393
+ const batchPromises = batch.map(e => {
394
+ UpdateCurrentConsoleLine(` Starting change detection changes for ${e.Name}`, ConsoleColor.gray);
395
+ return this.DetectChangesForEntity(e);
432
396
  });
433
- });
434
- // now wait for all of the promises to finish
435
- await Promise.all(promises);
436
- UpdateCurrentConsoleProgress(` Finished detecting changes for ${entities.length} entities`, entities.length, entities.length, result.Success ? ConsoleColor.green : ConsoleColor.red);
397
+ const batchResults = await Promise.all(batchPromises);
398
+ for (let j = 0; j < batch.length; j++) {
399
+ const r = batchResults[j];
400
+ const e = batch[j];
401
+ if (r.Success) {
402
+ result.Changes.push(...r.Changes);
403
+ }
404
+ else {
405
+ result.Success = false;
406
+ result.ErrorMessage = (result.ErrorMessage ? result.ErrorMessage + "\n" : "") + `Error detecting changes for ${e.Name}: ` + r.ErrorMessage;
407
+ }
408
+ UpdateCurrentConsoleProgress(` Finished change detection changes for ${e.Name}`, i + j + 1, entities.length, r.Success ? ConsoleColor.cyan : ConsoleColor.crimson);
409
+ }
410
+ }
437
411
  return result;
438
412
  }
439
413
  catch (e) {
@@ -445,237 +419,141 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
445
419
  };
446
420
  }
447
421
  }
448
- /**
449
- * This method will detect changes for all eligible entities as defined by the EligibleEntities property
450
- */
451
- async DetectChangesForAllEligibleEntities() {
452
- return await this.DetectChangesForEntities(this.EligibleEntities);
422
+ async DetectChangesForAllEligibleEntities(entityBatchSize = 10) {
423
+ return await this.DetectChangesForEntities(this.EligibleEntities, entityBatchSize);
453
424
  }
454
425
  /**
455
426
  * This method will replay all of the items in the changes array
456
427
  * @param changes Array of changes to replay.
457
428
  * @param batchSize Optional, defines the # of concurrent changes to replay at once. If you want to replay changes serially, set this to 1
429
+ * @param staleTimeoutHours Optional, defines how many hours a run can be in progress before it is considered stale. Defaults to 24.
458
430
  * @returns {Promise<boolean>} - Returns true if all changes are successfully replayed, otherwise false.
459
431
  */
460
- async ReplayChanges(changes, batchSize = 20) {
432
+ async ReplayChanges(changes, batchSize = 20, staleTimeoutHours = 24) {
461
433
  let run; // delcare outside of try block so we have access to it in the catch block
462
434
  try {
463
435
  if (changes && changes.length > 0) {
464
436
  const md = new Metadata();
465
437
  const results = [];
466
- run = await this.StartRun();
438
+ run = await this.StartRun(staleTimeoutHours);
467
439
  LogStatus(`Replaying ${changes.length} changes`);
468
440
  let numProcessed = 0;
469
441
  for (let i = 0; i < changes.length; i += batchSize) {
470
442
  const batch = changes.slice(i, i + batchSize);
471
- // Process the current batch
472
- const batchPromises = batch.map(async (change) => {
473
- UpdateCurrentConsoleProgress(` Replaying ${change.Entity.Name} ${change.Type} ${change.PrimaryKey.ToConcatenatedString()}`, ++numProcessed, changes.length, ConsoleColor.gray);
474
- const result = await this.ReplaySingleChange(md, run, change);
475
- return { Success: result, change: change };
443
+ const batchPromises = batch.map(async (c) => {
444
+ const result = await this.ReplayChange(md, c);
445
+ numProcessed++;
446
+ UpdateCurrentConsoleProgress(` Replayed ${numProcessed} of ${changes.length} changes`, numProcessed, changes.length);
447
+ return result;
476
448
  });
477
- // Wait for all promises in the current batch to complete
478
449
  const batchResults = await Promise.all(batchPromises);
479
450
  results.push(...batchResults);
480
451
  }
481
- // for (const change of changes) {
482
- // UpdateCurrentConsoleProgress(` Replaying ${change.Entity.Name} ${change.Type} ${change.PrimaryKey.ToConcatenatedString()}`, changes.indexOf(change), changes.length, ConsoleColor.gray);
483
- // const result = await this.ReplaySingleChange(md, run, change);
484
- // results.push({Success: result, change: change});
485
- // }
452
+ // finalize the run record
453
+ run.Status = 'Complete';
486
454
  run.EndedAt = new Date();
487
- run.Status = results.every(r => r.Success) ? 'Complete' : 'Error';
488
- if (await run.Save()) {
489
- return results.every(r => r.Success);
490
- }
491
- else {
492
- throw new Error("Failed to save run");
493
- }
455
+ await run.Save();
456
+ return results.every(r => r === true);
457
+ }
458
+ else {
459
+ return true; // no changes to replay
494
460
  }
495
- else
496
- return true; // no changes to process
497
461
  }
498
462
  catch (e) {
499
463
  LogError(e);
500
464
  if (run) {
501
- // attempt to mark the run as error
502
- try {
503
- run.Status = 'Error';
504
- run.EndedAt = new Date();
505
- await run.Save(); // dont' care about return value here, we've already tried to save it and the return value will be false anyway and message is the original root cause of the first exception
506
- }
507
- catch (innerError) {
508
- LogError('Attempted to mark run as error failed, make sure you update the database for future runs to be allowed.');
509
- LogError(innerError);
510
- return false; // couldn't get it done
511
- }
465
+ run.Status = 'Error';
466
+ run.EndedAt = new Date();
467
+ await run.Save();
512
468
  }
513
469
  return false;
514
470
  }
515
471
  }
516
- /**
517
- * Method creates a new Record Change Replay Run and returns the object for the run
518
- */
519
- async StartRun() {
520
- // first make sure an existing run isn't in progress
521
- const rv = new RunView();
522
- const existingRun = await rv.RunView({
523
- EntityName: "MJ: Record Change Replay Runs",
524
- ExtraFilter: "Status NOT IN('Complete', 'Error')"
525
- }, this.ContextUser);
526
- if (existingRun && existingRun.Success) {
527
- if (existingRun.Results.length > 0)
528
- throw new Error(`Existing Record Change Replay Run ${existingRun.Results[0].ID} is not complete or marked as error, cannot start a new run.`);
529
- else {
530
- const md = new Metadata();
531
- const run = await md.GetEntityObject("MJ: Record Change Replay Runs", this.ContextUser);
532
- run.StartedAt = new Date();
533
- run.UserID = this.ContextUser.ID;
534
- run.Status = 'In Progress';
535
- if (await run.Save()) {
536
- return run;
537
- }
538
- else
539
- throw new Error("Failed to start run");
540
- }
541
- }
542
- else {
543
- // failed to run the view
544
- throw new Error("Failed to check for existing run: " + existingRun.ErrorMessage);
545
- }
546
- }
547
- /**
548
- * Replays a single change item within a given run. This method will:
549
- * 1) Create a new Record Change record for the replay item
550
- * 2) Load a BaseEntity derived class for the entity in question and call either Save() or Delete() and pass in the Replay Only option
551
- * 3) Record the result in the Record Change record, updating status and if appropriate, the error message
552
- * @param change
553
- */
554
- async ReplaySingleChange(md, run, change) {
472
+ async ReplayChange(md, change) {
555
473
  try {
556
- const rc = await this.CreateRecordChangeRecord(md, run, change);
557
- if (rc) {
558
- // step 2 - get the base entity for the change
559
- let entityObject = change.LatestRecord; // for updates and creates we already have this
560
- if (!entityObject) {
561
- // for deletes we don't have this yet - it is not the normal load from DB since it wont be in the database at all
562
- entityObject = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
563
- const latestRCData = await this.GetLatestRecordChangesDataForEntityRecord(change);
564
- if (latestRCData && latestRCData.FullRecordJSON?.length > 0) {
565
- const obj = JSON.parse(latestRCData.FullRecordJSON);
566
- await entityObject.LoadFromData(obj); // loaded up from the latest data in the Record Change table
474
+ switch (change.Type) {
475
+ case 'Create':
476
+ case 'Update':
477
+ // for creates and updates we have the latest record already loaded
478
+ // and we have the list of changes, so we just need to save the record
479
+ if (change.LatestRecord) {
480
+ return await change.LatestRecord.Save();
481
+ }
482
+ else
483
+ return false;
484
+ case 'Delete':
485
+ // for deletes we need to load the record and then delete it
486
+ const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
487
+ if (await record.InnerLoad(change.PrimaryKey)) {
488
+ return await record.Delete();
567
489
  }
568
490
  else {
569
- // we have an issue becuase we don't have data in the RecordChange table so we can't replay the DELETE, so mark that in the error for the RecordChange
570
- return this.FinishRecordChangeRecord(rc, 'error', 'No prior record data is available in the Record Changes entity, so it is not possible to replay the Delete');
491
+ // if we can't load it, it's already gone, so we're good
492
+ return true;
571
493
  }
572
- }
573
- // if we get here, entityObject is now all set to go for replay!
574
- if (change.Type === 'Delete') {
575
- const result = await entityObject.Delete({
576
- ReplayOnly: true
577
- });
578
- return this.FinishRecordChangeRecord(rc, result ? 'success' : 'error', entityObject.LatestResult?.CompleteMessage);
579
- }
580
- else {
581
- // for updates and creates we just call Save() with the ReplayOnly option
582
- const result = await entityObject.Save({
583
- ReplayOnly: true,
584
- IgnoreDirtyState: false //not relevant for replay
585
- });
586
- return this.FinishRecordChangeRecord(rc, result ? 'success' : 'error', entityObject.LatestResult?.CompleteMessage);
587
- }
588
494
  }
589
- else {
590
- throw new Error("Failed to create Record Change record");
591
- }
592
- }
593
- catch (e) {
594
- LogError(e);
595
- return false;
596
- }
597
- }
598
- /**
599
- * This method will attempt to update the RecordChange record and return true if succesful, false otherwise.
600
- */
601
- async FinishRecordChangeRecord(rc, code, errorMessage) {
602
- try {
603
- rc.Status = code === 'error' ? 'Error' : 'Complete';
604
- rc.ErrorLog = errorMessage;
605
- if (await rc.Save())
606
- return true;
607
- else
608
- return false;
609
495
  }
610
496
  catch (e) {
611
497
  LogError(e);
612
498
  return false;
613
499
  }
614
500
  }
615
- /**
616
- * Creates a new record change record for the start of the replay process.
617
- * @param change
618
- */
619
- async CreateRecordChangeRecord(md, run, change) {
620
- try {
621
- const rc = await md.GetEntityObject("MJ: Record Changes", this.ContextUser);
622
- rc.EntityID = change.Entity.ID;
623
- if (change.LegacyKey)
624
- rc.RecordID = change.LegacyKeyValue; // need to match legacy key otherwise the other RC records will keep coming back up in detect changes runs in the future
625
- else
626
- rc.RecordID = change.PrimaryKey.ToConcatenatedString();
627
- rc.Source = 'External';
628
- rc.Type = change.Type;
629
- rc.Status = 'Pending';
630
- if (change.ChangedAt)
631
- rc.ChangedAt = change.ChangedAt;
632
- else {
633
- // we don't have a ChangedAt from the database, so we need to use the current date
634
- // however, we want UTC date/time for now as that is what we use in the DB for all of
635
- // these fields.
636
- const d = new Date();
637
- rc.ChangedAt = new Date(d.toISOString());
638
- }
639
- const changesObject = {};
640
- for (const field of change.Changes) {
641
- changesObject[field.FieldName] = {
642
- field: field.FieldName,
643
- oldValue: field.OldValue,
644
- newValue: field.NewValue
645
- };
501
+ async StartRun(staleTimeoutHours = 24) {
502
+ // first make sure an existing run isn't in progress
503
+ const rv = new RunView();
504
+ const existingRun = await rv.RunView({
505
+ EntityName: "MJ: Record Change Replay Runs",
506
+ ExtraFilter: "Status NOT IN('Complete', 'Error')"
507
+ }, this.ContextUser);
508
+ if (existingRun && existingRun.Success) {
509
+ if (existingRun.Results.length > 0) {
510
+ // we have an existing run, check to see if it is "stale"
511
+ const runData = existingRun.Results[0];
512
+ const startedAt = new Date(runData.StartedAt);
513
+ const now = new Date();
514
+ const diff = now.getTime() - startedAt.getTime();
515
+ const hours = diff / (1000 * 60 * 60);
516
+ if (hours > staleTimeoutHours) {
517
+ // this is a stale run, so mark it as error and allow a new run to proceed
518
+ const md = new Metadata();
519
+ const staleRun = await md.GetEntityObject("MJ: Record Change Replay Runs", this.ContextUser);
520
+ await staleRun.InnerLoad(runData.ID);
521
+ staleRun.Status = 'Error';
522
+ staleRun.EndedAt = new Date();
523
+ await staleRun.Save();
524
+ LogStatus(`Marked stale Record Change Replay Run ${runData.ID} as Error (Started: ${startedAt.toISOString()})`);
525
+ }
526
+ else {
527
+ throw new Error(`Existing Record Change Replay Run ${runData.ID} is not complete or marked as error, cannot start a new run. It started at ${startedAt.toISOString()}.`);
528
+ }
646
529
  }
647
- if (change.Type === 'Update')
648
- rc.ChangesJSON = JSON.stringify(changesObject);
649
- else
650
- rc.ChangesJSON = ''; // not null
651
- if (change.Type !== 'Delete') {
652
- const obj = change.LatestRecord?.GetAll();
653
- if (obj)
654
- rc.FullRecordJSON = JSON.stringify(obj);
655
- else
656
- rc.FullRecordJSON = ''; // null not allowed
530
+ // if we get here, either there was no existing run, or we just marked a stale run as error
531
+ const md = new Metadata();
532
+ const run = await md.GetEntityObject("MJ: Record Change Replay Runs", this.ContextUser);
533
+ run.StartedAt = new Date();
534
+ run.UserID = this.ContextUser.ID;
535
+ run.Status = 'In Progress';
536
+ if (await run.Save()) {
537
+ // Mitigate race conditions: double-check that no other process started a run at the exact same time
538
+ const doubleCheck = await rv.RunView({
539
+ EntityName: "MJ: Record Change Replay Runs",
540
+ ExtraFilter: `Status = 'In Progress' AND ID <> '${run.ID}'`
541
+ }, this.ContextUser);
542
+ if (doubleCheck && doubleCheck.Success && doubleCheck.Results.length > 0) {
543
+ // Another run snuck in! Back out to prevent duplicate processing.
544
+ run.Status = 'Error';
545
+ run.EndedAt = new Date();
546
+ await run.Save(); // Mark it as an error rather than deleting it to keep an audit trail
547
+ throw new Error("Another process started a run concurrently. Aborting this run to prevent duplicate work.");
548
+ }
549
+ return run;
657
550
  }
658
551
  else
659
- rc.FullRecordJSON = ''; // null not allowed
660
- const provider = this.ProviderToUse;
661
- if (change.Type === 'Update')
662
- rc.ChangesDescription = provider.CreateUserDescriptionOfChanges(changesObject);
663
- else if (change.Type === 'Create')
664
- rc.ChangesDescription = 'New Record';
665
- else
666
- rc.ChangesDescription = 'Record Deleted';
667
- rc.ReplayRunID = run.ID;
668
- rc.UserID = this.ContextUser.ID;
669
- if (await rc.Save()) {
670
- return rc;
671
- }
672
- else {
673
- throw new Error("Failed to save Record Change record: " + rc.LatestResult?.CompleteMessage);
674
- }
552
+ throw new Error("Failed to start run");
675
553
  }
676
- catch (e) {
677
- LogError(e);
678
- return null;
554
+ else {
555
+ // failed to run the view
556
+ throw new Error("Failed to check for existing run: " + existingRun.ErrorMessage);
679
557
  }
680
558
  }
681
559
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAmC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAY,MAAM,sBAAsB,CAAC;AAExS,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAc,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG9F;;GAEG;AACH,MAAM,OAAO,WAAW;CAIvB;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAAhC;QAWW,cAAS,GAAa,KAAK,CAAC,CAAC,iFAAiF;IAEzH,CAAC;CAAA;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;CAIjC;AAED;;;;;GAKG;AACH,MAAM,OAAO,4BAA6B,SAAQ,UAAwC;IAA1F;;QA0BY,wBAAmB,GAAa,EAAE,CAAC,CAAA,wKAAwK;IA6iBvN,CAAC;IApkBU,KAAK,CAAC,MAAM,CAAC,YAAsB,EAAE,WAAsB,EAAE,QAA4B;QAC5F,MAAM,CAAC,GAA2B,CAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAE,CAAC;QAEpE,qBAAqB;QACrB,MAAM,QAAQ,GAAI,CAAS,CAAC,gBAAgB,IAAI,WAAW,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAE7F,MAAM,CAAC,GAA6C;YAChD;gBACI,UAAU,EAAE,cAAc;gBAC1B,YAAY,EAAE,mBAAmB;gBACjC,MAAM,EAAE,yBAAyB,CAAC,CAAC,gBAAgB,wCAAwC,EAAE,2IAA2I;gBACxO,UAAU,EAAE,IAAI;aACnB;SACJ,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAEM,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,EAAgC,CAAC;IAC7D,CAAC;IAID;;;;;;;;;OASG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAID;;;;;;;;OAQG;IACH,IAAW,gBAAgB;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxJ,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,sBAAsB,CAAC,MAAkB;QAClD,IAAI,CAAC;YACD,6DAA6D;YAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;iBACI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,4JAA4J,CAAC,CAAC;YACvM,CAAC;YAED,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG;gBACjB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnG,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACtD,cAAc,EAAE,UAAU,CAAC,kBAAkB;gBAC7C,cAAc,EAAE,UAAU,CAAC,kBAAkB;aAChD,CAAC;YAEF,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC;gBACnE,EAAE,SAAS,EAAE,yCAAyC,EAAE,UAAU,EAAE,YAAY,EAAE;gBAClF,EAAE,SAAS,EAAE,uCAAuC,EAAE,UAAU,EAAE,YAAY,EAAE;gBAChF,EAAE,SAAS,EAAE,yCAAyC,EAAE,UAAU,EAAE;wBAChE,GAAG,YAAY;wBACf,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;qBACvH,EAAE;aACN,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAErB,oGAAoG;YACpG,MAAM,OAAO,GAA0B,EAAE,CAAC;YAC1C,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;oBACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;oBACrB,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;wBAC3D,OAAO;4BACH,SAAS,EAAE,EAAE,CAAC,IAAI;4BAClB,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;yBACtB,CAAA;oBACL,CAAC,CAAC,CAAC,CAAC;oBACJ,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;oBAChF,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,uCAAuC;oBAE1D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;YACL,CAAC;YAED,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;oBACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;oBACrB,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;wBAC3D,OAAO;4BACH,SAAS,EAAE,EAAE,CAAC,IAAI;4BAClB,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;yBACtB,CAAA;oBACL,CAAC,CAAC,CAAC,CAAC;oBACJ,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;oBAE/B,8EAA8E;oBAC9E,6DAA6D;oBAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;wBAC3D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvB,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBAC/B,MAAM,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;oBACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;oBACrB,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;oBAC9B,2GAA2G;oBAC3G,8GAA8G;oBAC9G,kHAAkH;oBAClH,4FAA4F;oBAC5F,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBAClE,uEAAuE;wBACvE,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,iDAAiD;wBAC1H,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;wBACtB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC;oBACvC,CAAC;;wBAEG,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,8DAA8D;oBAE/G,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;oBACrB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;oBACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;oBAC/B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,8CAA8C;oBACjE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC,CAAC,CAAC;YACP,CAAC;YAED,MAAM,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,gDAAgD;YAElG,gGAAgG;YAChG,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC/D,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;gBACtC,CAAC;YACL,CAAC;YAED,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,OAAO;aACnB,CAAC;QACN,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,OAAO;gBACvB,OAAO,EAAE,EAAE;aACd,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,sBAAsB,CAAC,EAAY,EAAE,MAA2B;QACzE,IAAI,CAAC;YACD,+EAA+E;YAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1G,IAAI,MAAM,EAAE,CAAC;gBACT,0FAA0F;gBAC1F,8GAA8G;gBAC9G,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yCAAyC,CAAC,MAAM,CAAC,CAAC;gBAC5E,IAAI,MAAM,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtE,4EAA4E;oBAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;oBAC/C,8EAA8E;oBAC9E,MAAM,OAAO,GAAkB,EAAE,CAAC;oBAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;4BACtB,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;4BACxF,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gCACtB,OAAO,CAAC,IAAI,CAAC;oCACT,SAAS,EAAE,KAAK,CAAC,IAAI;oCACrB,QAAQ,EAAE,YAAY,CAAC,UAAU,EAAE,qDAAqD;oCACxF,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAE,qDAAqD;iCAC3F,CAAC,CAAC;4BACP,CAAC;wBACL,CAAC;oBACL,CAAC;oBACD,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAC,CAAC;gBAC3C,CAAC;qBACI,CAAC;oBACF,SAAS,CAAC,sFAAsF,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;oBACnK,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAC,CAAC;gBAC/C,CAAC;YACL,CAAC;iBACI,CAAC;gBACF,iGAAiG;gBACjG,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAES,cAAc,CAAC,MAAyB,EAAE,MAAW,EAAE,MAAW;QACxE,IAAI,UAAU,GAAQ,MAAM,CAAC;QAC7B,IAAI,UAAU,GAAQ,MAAM,CAAC;QAE7B,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,iBAAiB,CAAC,IAAI;gBACvB,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9C,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9C,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;oBAC3B,sEAAsE;oBACtE,4GAA4G;oBAC5G,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;oBAChC,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;oBAChC,OAAO,EAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;gBACvD,CAAC;;oBAEG,OAAO,EAAC,MAAM,EAAE,UAAU,KAAK,UAAU,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;YAC3E,KAAK,iBAAiB,CAAC,MAAM;gBACzB,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO,EAAC,MAAM,EAAE,UAAU,KAAK,UAAU,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;YACvE,KAAK,iBAAiB,CAAC,OAAO;gBAC1B,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACxC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACxC,OAAO,EAAC,MAAM,EAAE,UAAU,KAAK,UAAU,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;YACvE;gBACI,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,OAAO,EAAC,MAAM,EAAE,UAAU,KAAK,UAAU,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC;QAC3E,CAAC;IACL,CAAC;IAED;;;OAGG;IACO,aAAa,CAAC,KAAc;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YACzC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,CAAC,KAAK,CAAC;IACnB,CAAC;IAES,KAAK,CAAC,yCAAyC,CAAC,MAA2B;QACjF,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;gBAC5B,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,eAAe,MAAM,CAAC,MAAM,CAAC,EAAE,qBAAqB,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,oCAAoC;gBAC7I,OAAO,EAAE,gBAAgB;aAC5B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAErB,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;;gBAEG,OAAO,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAES,KAAK,CAAC,wBAAwB,CAAC,EAAY,EAAE,OAA8B;QACjF,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAiC,CAAC;YAC5D,4BAA4B;YAC5B,MAAM,QAAQ,GAAiD,EAAE,CAAC;YAClE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7C,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;oBACpE,IAAI,CAAC,KAAK,EAAE,CAAC;wBACT,KAAK,GAAG,EAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAC,CAAC;wBACrC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;YAED,oGAAoG;YACpG,mCAAmC;YACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtF,MAAM,GAAG,GAAG,iBAAiB,WAAW;oCACpB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;oBACnF,MAAM,MAAM,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACjE,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC/F,OAAO,GAAG,WAAW,IAAI,MAAM,GAAG,YAAY,GAAG,MAAM,EAAE,CAAA;gBAC7D,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;gBACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,MAAM,EAAE,CAAC;oBACT,yGAAyG;oBACzG,wCAAwC;oBACxC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACrB,MAAM,GAAG,GAAmB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;4BACtD,OAAO;gCACH,SAAS,EAAE,EAAE,CAAC,IAAI;gCAClB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;6BACpB,CAAA;wBACL,CAAC,CAAC,CAAA;wBACF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;wBAC7F,IAAI,UAAU,EAAE,CAAC;4BACb,wCAAwC;4BACxC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;4BAClF,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;4BAC7B,UAAU,CAAC,YAAY,GAAG,MAAM,CAAC;wBACrC,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAES,KAAK,CAAC,uBAAuB,CAAC,EAAY,EAAE,MAA2B;QAC7E,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9E,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,OAAO,MAAM,CAAC;YAClB,CAAC;;gBAEG,OAAO,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAES,mBAAmB,CAAC,MAAkB,EAAE,WAAmB;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QAEjC,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAC/B,IAAI,EAAE,CAAC,IAAI,GAAG,YAAY,CAAC,qBAAqB,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC9G,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,YAAY,CAAC,qBAAqB,KAAK,QAAQ,GAAG,CAAC,CAAC;IAChF,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,wBAAwB,CAAC,QAAsB,EAAE,kBAA0B,EAAE;QACtF,IAAI,CAAC;YACD,IAAI,CAAC,QAAQ;gBACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;iBACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAE9E,MAAM,MAAM,GAA0B,IAAI,qBAAqB,EAAE,CAAC;YAClE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;YAEpB,SAAS,CAAC,yBAAyB,QAAQ,CAAC,MAAM,2BAA2B,eAAe,EAAE,CAAC,CAAA;YAE/F,8BAA8B;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC;gBACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC;gBACrD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAChC,wBAAwB,CAAC,4CAA4C,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;oBAClG,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;gBAEH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACnB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;oBACtC,CAAC;yBACI,CAAC;wBACF,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;wBACvB,MAAM,CAAC,YAAY,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,+BAA+B,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC;oBAC/I,CAAC;oBACD,4BAA4B,CAAC,4CAA4C,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACzK,CAAC;YACL,CAAC;YAED,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,OAAO;gBACvB,OAAO,EAAE,EAAE;aACd,CAAA;QACL,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAAC,kBAA0B,EAAE;QACzE,OAAO,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,aAAa,CAAC,OAA8B,EAAE,YAAoB,EAAE,EAAE,oBAA4B,EAAE;QAC7G,IAAI,GAAG,CAAC,CAAC,0EAA0E;QACnF,IAAI,CAAC;YACD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,EAAE,CAAC;gBACnB,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;gBAC7C,SAAS,CAAC,aAAa,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;gBAEjD,IAAI,YAAY,GAAG,CAAC,CAAC;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;oBAE9C,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;wBACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;wBAC9C,YAAY,EAAE,CAAC;wBACf,4BAA4B,CAAC,eAAe,YAAY,OAAO,OAAO,CAAC,MAAM,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;wBACvH,OAAO,MAAM,CAAC;oBAClB,CAAC,CAAC,CAAC;oBAEH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACtD,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;gBAClC,CAAC;gBAED,0BAA0B;gBAC1B,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;gBACxB,GAAG,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAEjB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YAC1C,CAAC;iBACI,CAAC;gBACF,OAAO,IAAI,CAAC,CAAC,uBAAuB;YACxC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,GAAG,EAAE,CAAC;gBACN,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;gBACrB,GAAG,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,EAAY,EAAE,MAA2B;QAClE,IAAI,CAAC;YACD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClB,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ;oBACT,oEAAoE;oBACpE,sEAAsE;oBACtE,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;wBACtB,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;oBAC5C,CAAC;;wBAEG,OAAO,KAAK,CAAC;gBACrB,KAAK,QAAQ;oBACT,4DAA4D;oBAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC9E,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5C,OAAO,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;oBACjC,CAAC;yBACI,CAAC;wBACF,wDAAwD;wBACxD,OAAO,IAAI,CAAC;oBAChB,CAAC;YACT,CAAC;QACL,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,oBAA4B,EAAE;QACnD,oDAAoD;QACpD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;YACjC,UAAU,EAAE,+BAA+B;YAC3C,WAAW,EAAE,oCAAoC;SACpD,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACrB,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,yDAAyD;gBACzD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBACtC,IAAI,KAAK,GAAG,iBAAiB,EAAE,CAAC;oBAC5B,0EAA0E;oBAC1E,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC1B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAAgC,+BAA+B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC5H,MAAM,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACrC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC;oBAC1B,QAAQ,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC9B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACtB,SAAS,CAAC,yCAAyC,OAAO,CAAC,EAAE,uBAAuB,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACpH,CAAC;qBACI,CAAC;oBACF,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,CAAC,EAAE,8EAA8E,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAC7K,CAAC;YACL,CAAC;YAED,2FAA2F;YAC3F,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,eAAe,CAAgC,+BAA+B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YACtH,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC3B,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC;YAC3B,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,oGAAoG;gBACpG,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC;oBACjC,UAAU,EAAE,+BAA+B;oBAC3C,WAAW,EAAE,qCAAqC,GAAG,CAAC,EAAE,GAAG;iBAC9D,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAErB,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvE,kEAAkE;oBAClE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;oBACrB,GAAG,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;oBACzB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,qEAAqE;oBACvF,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;gBAChH,CAAC;gBAED,OAAO,GAAG,CAAC;YACf,CAAC;;gBAEG,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC/C,CAAC;aACI,CAAC;YACF,yBAAyB;YACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QACrF,CAAC;IACL,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/external-change-detection",
3
3
  "type": "module",
4
- "version": "5.5.0",
4
+ "version": "5.6.0",
5
5
  "description": "Library used by server side applications to determine if changes have been made to entities by external systems/integrations",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -20,10 +20,11 @@
20
20
  "typescript": "^5.9.3"
21
21
  },
22
22
  "dependencies": {
23
- "@memberjunction/core": "5.5.0",
24
- "@memberjunction/core-entities": "5.5.0",
25
- "@memberjunction/global": "5.5.0",
26
- "@memberjunction/sqlserver-dataprovider": "5.5.0"
23
+ "@memberjunction/core": "5.6.0",
24
+ "@memberjunction/core-entities": "5.6.0",
25
+ "@memberjunction/global": "5.6.0",
26
+ "@memberjunction/sql-dialect": "5.6.0",
27
+ "@memberjunction/sqlserver-dataprovider": "5.6.0"
27
28
  },
28
29
  "repository": {
29
30
  "type": "git",