@memberjunction/record-set-processor 5.42.0 → 5.44.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.
Files changed (36) hide show
  1. package/dist/RecordProcessExecutor.d.ts +31 -4
  2. package/dist/RecordProcessExecutor.d.ts.map +1 -1
  3. package/dist/RecordProcessExecutor.js +74 -9
  4. package/dist/RecordProcessExecutor.js.map +1 -1
  5. package/dist/RecordSetProcessor.d.ts.map +1 -1
  6. package/dist/RecordSetProcessor.js +1 -0
  7. package/dist/RecordSetProcessor.js.map +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/operations/RecordProcessControlOperations.d.ts +12 -40
  13. package/dist/operations/RecordProcessControlOperations.d.ts.map +1 -1
  14. package/dist/operations/RecordProcessControlOperations.js +40 -40
  15. package/dist/operations/RecordProcessControlOperations.js.map +1 -1
  16. package/dist/operations/RecordProcessGetRunStatusOperation.d.ts +4 -19
  17. package/dist/operations/RecordProcessGetRunStatusOperation.d.ts.map +1 -1
  18. package/dist/operations/RecordProcessGetRunStatusOperation.js +8 -10
  19. package/dist/operations/RecordProcessGetRunStatusOperation.js.map +1 -1
  20. package/dist/processors/FieldRulesProcessor.d.ts +44 -0
  21. package/dist/processors/FieldRulesProcessor.d.ts.map +1 -0
  22. package/dist/processors/FieldRulesProcessor.js +130 -0
  23. package/dist/processors/FieldRulesProcessor.js.map +1 -0
  24. package/dist/processors/WriteBackProcessor.d.ts +5 -1
  25. package/dist/processors/WriteBackProcessor.d.ts.map +1 -1
  26. package/dist/processors/WriteBackProcessor.js +6 -1
  27. package/dist/processors/WriteBackProcessor.js.map +1 -1
  28. package/dist/trackers/GenericProcessRunTracker.d.ts +7 -0
  29. package/dist/trackers/GenericProcessRunTracker.d.ts.map +1 -1
  30. package/dist/trackers/GenericProcessRunTracker.js +19 -6
  31. package/dist/trackers/GenericProcessRunTracker.js.map +1 -1
  32. package/dist/writeBack.d.ts +16 -2
  33. package/dist/writeBack.d.ts.map +1 -1
  34. package/dist/writeBack.js +48 -20
  35. package/dist/writeBack.js.map +1 -1
  36. package/package.json +13 -11
@@ -1 +1 @@
1
- {"version":3,"file":"RecordProcessGetRunStatusOperation.js","sourceRoot":"","sources":["../../src/operations/RecordProcessGetRunStatusOperation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAA+B,MAAM,sBAAsB,CAAC;AAmB3F,2DAA2D;AAEpD,IAAM,kCAAkC,GAAxC,MAAM,kCAAmC,SAAQ,sBAAuF;IAAxI;;QACa,iBAAY,GAAG,4BAA4B,CAAC;QAC5C,kBAAa,GAAG,uBAAuB,CAAC;IAoB5D,CAAC;IAlBa,KAAK,CAAC,eAAe,CAAC,KAAqC,EAAE,QAA2B,EAAE,IAAc;QAC9G,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAqB,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,CAAC,YAAY,aAAa,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACH,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,cAAc;YAC7B,KAAK,EAAE,GAAG,CAAC,cAAc;YACzB,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,KAAK,EAAE,GAAG,CAAC,UAAU;YACrB,OAAO,EAAE,GAAG,CAAC,YAAY;SAC5B,CAAC;IACN,CAAC;CACJ,CAAA;AAtBY,kCAAkC;IAD9C,aAAa,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;GACvD,kCAAkC,CAsB9C;;AAED;;;GAGG;AACH,MAAM,UAAU,sCAAsC;IAClD,sBAAsB;AAC1B,CAAC"}
1
+ {"version":3,"file":"RecordProcessGetRunStatusOperation.js","sourceRoot":"","sources":["../../src/operations/RecordProcessGetRunStatusOperation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAA+B,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAEH,kCAAkC,GAGrC,MAAM,+BAA+B,CAAC;AAEvC,wFAAwF;AACxF,qFAAqF;AAErF,gIAAgI;AAEzH,IAAM,wCAAwC,GAA9C,MAAM,wCAAyC,SAAQ,kCAAkC;IAElF,KAAK,CAAC,eAAe,CAAC,KAAqC,EAAE,QAA2B,EAAE,IAAc;QAC9G,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAqB,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,CAAC,YAAY,aAAa,CAAC,CAAC;QACrE,CAAC;QACD,OAAO;YACH,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,cAAc;YAC7B,KAAK,EAAE,GAAG,CAAC,cAAc;YACzB,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,KAAK,EAAE,GAAG,CAAC,UAAU;YACrB,OAAO,EAAE,GAAG,CAAC,YAAY;SAC5B,CAAC;IACN,CAAC;CACJ,CAAA;AApBY,wCAAwC;IADpD,aAAa,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;GACvD,wCAAwC,CAoBpD;;AAED;;;GAGG;AACH,MAAM,UAAU,sCAAsC;IAClD,sBAAsB;AAC1B,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type FieldChange, type FieldRuleSet } from '@memberjunction/global';
2
+ import { type IRecordProcessor, type RecordProcessorContext, type RecordRef, type RecordResult } from '@memberjunction/record-set-processor-base';
3
+ /** Options for a {@link FieldRulesProcessor}. */
4
+ export interface FieldRulesProcessorOptions {
5
+ /** The rules to apply to each record. */
6
+ RuleSet: FieldRuleSet;
7
+ /** When true, COMPUTE the changes but do NOT save — each result payload carries the per-field diff. */
8
+ DryRun?: boolean;
9
+ }
10
+ /** The structured payload recorded on each Process Run Detail (the per-record diff). */
11
+ export interface FieldRulesResultPayload {
12
+ DryRun: boolean;
13
+ Changes: FieldChange[];
14
+ ChangedFields: string[];
15
+ }
16
+ /**
17
+ * Applies field rules to a single record via {@link EntityFieldRules}. Single-primary-key entities only
18
+ * (composite keys return a clear Failed result). On a real run the record is persisted via
19
+ * `BaseEntity.Save()`, so MJ's built-in Record Changes versioning captures the before/after automatically.
20
+ */
21
+ export declare class FieldRulesProcessor implements IRecordProcessor {
22
+ private readonly options;
23
+ constructor(options: FieldRulesProcessorOptions);
24
+ ProcessRecord(record: RecordRef, context: RecordProcessorContext): Promise<RecordResult>;
25
+ /** Maps the entity-level apply result onto the record-level outcome. */
26
+ private toRecordResult;
27
+ /** Loads the BaseEntity for a record, or returns an error string. */
28
+ private loadRecord;
29
+ /**
30
+ * Supplies core's `EntityFieldRules` with a real `AIPromptRunner`-backed resolver for `prompt` rule
31
+ * sources (core can't depend on the AI stack itself). Each prompt source runs the named prompt with
32
+ * the record (or its shaped data) as input; the prompt's output becomes the field value. One model
33
+ * call per record per prompt-rule — pair with dry-run + bounded concurrency on large sets.
34
+ */
35
+ private buildPromptResolver;
36
+ /**
37
+ * Supplies core's `EntityFieldRules` with a resolver for `entityDocument` rule sources, backed by the
38
+ * existing Entity Document + Template render infrastructure (core can't depend on templates itself).
39
+ * Renders the named Entity Document's template against the record and returns the text — typically
40
+ * fed into a `prompt` source's `Data` to give the LLM a curated rendering of the record.
41
+ */
42
+ private buildEntityDocumentResolver;
43
+ }
44
+ //# sourceMappingURL=FieldRulesProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldRulesProcessor.d.ts","sourceRoot":"","sources":["../../src/processors/FieldRulesProcessor.ts"],"names":[],"mappings":"AAaA,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,YAAY,EAAuB,MAAM,wBAAwB,CAAC;AAO9G,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,YAAY,EACpB,MAAM,2CAA2C,CAAC;AAEnD,iDAAiD;AACjD,MAAM,WAAW,0BAA0B;IACvC,yCAAyC;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,uGAAuG;IACvG,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wFAAwF;AACxF,MAAM,WAAW,uBAAuB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,0BAA0B;IAMnD,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;IAerG,wEAAwE;IACxE,OAAO,CAAC,cAAc;IAkBtB,qEAAqE;YACvD,UAAU;IAgBxB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;CAkBtC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @fileoverview FieldRulesProcessor — applies a declarative {@link FieldRuleSet} to each record: the
3
+ * rules-based bulk-update unit of work for the Record Set Processor.
4
+ *
5
+ * It is intentionally thin: the record set + batching / concurrency / pause-resume come from the engine,
6
+ * and the actual rule logic (compute → metadata-validate → type-coerce → write/preview, plus the
7
+ * RunView-backed lookup resolver) lives in {@link EntityFieldRules} in `@memberjunction/core`. This
8
+ * processor just maps a {@link RecordRef} to a loaded entity and translates the apply result into a
9
+ * {@link RecordResult}. The transform/rule substrate beneath `EntityFieldRules` is the pure
10
+ * field-rules engine in `@memberjunction/global` — the same one the integration field-mapping engine uses.
11
+ * @module @memberjunction/record-set-processor
12
+ */
13
+ import { CompositeKey, EntityFieldRules } from '@memberjunction/core';
14
+ import { UUIDsEqual } from '@memberjunction/global';
15
+ import { AIEngine } from '@memberjunction/aiengine';
16
+ import { AIPromptRunner } from '@memberjunction/ai-prompts';
17
+ import { AIPromptParams } from '@memberjunction/ai-core-plus';
18
+ import { TemplateEngineServer } from '@memberjunction/templates';
19
+ import { RegisterFieldRulesTransforms } from '@memberjunction/field-rules-transforms';
20
+ /**
21
+ * Applies field rules to a single record via {@link EntityFieldRules}. Single-primary-key entities only
22
+ * (composite keys return a clear Failed result). On a real run the record is persisted via
23
+ * `BaseEntity.Save()`, so MJ's built-in Record Changes versioning captures the before/after automatically.
24
+ */
25
+ export class FieldRulesProcessor {
26
+ constructor(options) {
27
+ this.options = options;
28
+ // Make the extended transforms (jsonpath / xpath) available to rules. Idempotent — registers
29
+ // the plugins into the global transform registry the first time a processor is created.
30
+ RegisterFieldRulesTransforms();
31
+ }
32
+ async ProcessRecord(record, context) {
33
+ const started = Date.now();
34
+ try {
35
+ const obj = await this.loadRecord(record, context);
36
+ if (typeof obj === 'string') {
37
+ return { Status: 'Failed', ErrorMessage: obj, DurationMs: Date.now() - started };
38
+ }
39
+ const rules = new EntityFieldRules(context.contextUser, this.buildPromptResolver(context), this.buildEntityDocumentResolver(context));
40
+ const result = await rules.ApplyToEntity(obj, this.options.RuleSet, { DryRun: this.options.DryRun });
41
+ return this.toRecordResult(result, started);
42
+ }
43
+ catch (err) {
44
+ return { Status: 'Failed', ErrorMessage: err instanceof Error ? err.message : String(err), DurationMs: Date.now() - started };
45
+ }
46
+ }
47
+ /** Maps the entity-level apply result onto the record-level outcome. */
48
+ toRecordResult(result, started) {
49
+ const ResultPayload = { DryRun: result.DryRun, Changes: result.Changes, ChangedFields: result.AppliedFields };
50
+ const DurationMs = Date.now() - started;
51
+ if (result.Errors.length > 0) {
52
+ return { Status: 'Failed', ResultPayload, ErrorMessage: result.Errors.join('; '), DurationMs };
53
+ }
54
+ if (result.DryRun) {
55
+ return { Status: 'Succeeded', ResultPayload, DurationMs }; // preview — the diff is the deliverable
56
+ }
57
+ if (result.AppliedFields.length === 0) {
58
+ return { Status: 'Skipped', ResultPayload, DurationMs };
59
+ }
60
+ if (!result.Saved) {
61
+ return { Status: 'Failed', ResultPayload, ErrorMessage: result.SaveError ?? 'save failed', DurationMs };
62
+ }
63
+ return { Status: 'Succeeded', ResultPayload, DurationMs };
64
+ }
65
+ /** Loads the BaseEntity for a record, or returns an error string. */
66
+ async loadRecord(record, context) {
67
+ const entity = context.provider.EntityByID(record.EntityID);
68
+ if (!entity) {
69
+ return `entity '${record.EntityID}' not found in metadata`;
70
+ }
71
+ if (entity.PrimaryKeys.length !== 1) {
72
+ return `field-rules updates support single-primary-key entities only ('${entity.Name}')`;
73
+ }
74
+ const obj = await context.provider.GetEntityObject(entity.Name, context.contextUser);
75
+ const loaded = await obj.InnerLoad(CompositeKey.FromKeyValuePair(entity.FirstPrimaryKey.Name, record.RecordID));
76
+ if (!loaded) {
77
+ return `record '${record.RecordID}' of '${entity.Name}' not found`;
78
+ }
79
+ return obj;
80
+ }
81
+ /**
82
+ * Supplies core's `EntityFieldRules` with a real `AIPromptRunner`-backed resolver for `prompt` rule
83
+ * sources (core can't depend on the AI stack itself). Each prompt source runs the named prompt with
84
+ * the record (or its shaped data) as input; the prompt's output becomes the field value. One model
85
+ * call per record per prompt-rule — pair with dry-run + bounded concurrency on large sets.
86
+ */
87
+ buildPromptResolver(context) {
88
+ return async ({ PromptID, Data }) => {
89
+ await AIEngine.Instance.Config(false, context.contextUser);
90
+ const prompt = AIEngine.Instance.Prompts.find((p) => UUIDsEqual(p.ID, PromptID));
91
+ if (!prompt) {
92
+ throw new Error(`AI Prompt '${PromptID}' not found`);
93
+ }
94
+ const params = new AIPromptParams();
95
+ params.prompt = prompt;
96
+ params.data = Data;
97
+ params.contextUser = context.contextUser;
98
+ const result = await new AIPromptRunner().ExecutePrompt(params);
99
+ if (!result.success) {
100
+ throw new Error(result.errorMessage ?? 'AI prompt execution failed');
101
+ }
102
+ return result.result;
103
+ };
104
+ }
105
+ /**
106
+ * Supplies core's `EntityFieldRules` with a resolver for `entityDocument` rule sources, backed by the
107
+ * existing Entity Document + Template render infrastructure (core can't depend on templates itself).
108
+ * Renders the named Entity Document's template against the record and returns the text — typically
109
+ * fed into a `prompt` source's `Data` to give the LLM a curated rendering of the record.
110
+ */
111
+ buildEntityDocumentResolver(context) {
112
+ return async ({ EntityDocumentID, Record }) => {
113
+ if (!EntityDocumentID) {
114
+ throw new Error('an entityDocument source requires an EntityDocumentID');
115
+ }
116
+ // Configure the template engine first so the EntityDocument's virtual TemplateText resolves.
117
+ await TemplateEngineServer.Instance.Config(false, context.contextUser);
118
+ const doc = await context.provider.GetEntityObject('MJ: Entity Documents', context.contextUser);
119
+ if (!(await doc.Load(EntityDocumentID))) {
120
+ throw new Error(`Entity Document '${EntityDocumentID}' not found`);
121
+ }
122
+ const rendered = await TemplateEngineServer.Instance.RenderTemplateSimple(doc.TemplateText, Record);
123
+ if (!rendered.Success) {
124
+ throw new Error(rendered.Message ?? 'entity document render failed');
125
+ }
126
+ return rendered.Output ?? '';
127
+ };
128
+ }
129
+ }
130
+ //# sourceMappingURL=FieldRulesProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldRulesProcessor.js","sourceRoot":"","sources":["../../src/processors/FieldRulesProcessor.ts"],"names":[],"mappings":"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"}
@@ -10,11 +10,15 @@ import { OutputMappingConfig } from '../writeBack.js';
10
10
  export declare class WriteBackProcessor implements IRecordProcessor {
11
11
  private readonly inner;
12
12
  private readonly outputMapping;
13
+ private readonly dryRun;
13
14
  /**
14
15
  * @param inner - The processor that produces the work result.
15
16
  * @param outputMapping - The `OutputMapping` config to apply to each successful result.
17
+ * @param dryRun - When true, the inner work still runs but the write-back only computes a
18
+ * preview (no entity is saved / no child is created), so a dry-run of any wrapped work type
19
+ * reports its effect without mutating data. Mirrors `FieldRulesProcessor`'s dry-run.
16
20
  */
17
- constructor(inner: IRecordProcessor, outputMapping: OutputMappingConfig);
21
+ constructor(inner: IRecordProcessor, outputMapping: OutputMappingConfig, dryRun?: boolean);
18
22
  ProcessRecord(record: RecordRef, context: RecordProcessorContext): Promise<RecordResult>;
19
23
  }
20
24
  //# sourceMappingURL=WriteBackProcessor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WriteBackProcessor.d.ts","sourceRoot":"","sources":["../../src/processors/WriteBackProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,SAAS,EACT,YAAY,EACf,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,cAAc,CAAC;AAEvE,yFAAyF;AACzF,qBAAa,kBAAmB,YAAW,gBAAgB;IAK3C,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAoB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAJpF;;;OAGG;gBAC0B,KAAK,EAAE,gBAAgB,EAAmB,aAAa,EAAE,mBAAmB;IAE5F,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;CAoBxG"}
1
+ {"version":3,"file":"WriteBackProcessor.d.ts","sourceRoot":"","sources":["../../src/processors/WriteBackProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,SAAS,EACT,YAAY,EACf,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,cAAc,CAAC;AAEvE,yFAAyF;AACzF,qBAAa,kBAAmB,YAAW,gBAAgB;IASnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAV3B;;;;;;OAMG;gBAEkB,KAAK,EAAE,gBAAgB,EACvB,aAAa,EAAE,mBAAmB,EAClC,MAAM,GAAE,OAAe;IAG/B,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBxG"}
@@ -11,10 +11,14 @@ export class WriteBackProcessor {
11
11
  /**
12
12
  * @param inner - The processor that produces the work result.
13
13
  * @param outputMapping - The `OutputMapping` config to apply to each successful result.
14
+ * @param dryRun - When true, the inner work still runs but the write-back only computes a
15
+ * preview (no entity is saved / no child is created), so a dry-run of any wrapped work type
16
+ * reports its effect without mutating data. Mirrors `FieldRulesProcessor`'s dry-run.
14
17
  */
15
- constructor(inner, outputMapping) {
18
+ constructor(inner, outputMapping, dryRun = false) {
16
19
  this.inner = inner;
17
20
  this.outputMapping = outputMapping;
21
+ this.dryRun = dryRun;
18
22
  }
19
23
  async ProcessRecord(record, context) {
20
24
  const result = await this.inner.ProcessRecord(record, context);
@@ -28,6 +32,7 @@ export class WriteBackProcessor {
28
32
  record,
29
33
  contextUser: context.contextUser,
30
34
  provider: context.provider,
35
+ dryRun: this.dryRun,
31
36
  });
32
37
  return { ...result, ResultPayload: { output: result.ResultPayload, writeBack } };
33
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WriteBackProcessor.js","sourceRoot":"","sources":["../../src/processors/WriteBackProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAOhD,OAAO,EAAuB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvE,yFAAyF;AACzF,MAAM,OAAO,kBAAkB;IAC3B;;;OAGG;IACH,YAA6B,KAAuB,EAAmB,aAAkC;QAA5E,UAAK,GAAL,KAAK,CAAkB;QAAmB,kBAAa,GAAb,aAAa,CAAqB;IAAG,CAAC;IAEtG,KAAK,CAAC,aAAa,CAAC,MAAiB,EAAE,OAA+B;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;gBACvC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,MAAM,EAAE,MAAM,CAAC,aAAa;gBAC5B,MAAM;gBACN,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC7B,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC;QACrF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,QAAQ,CAAC,qDAAqD,MAAM,CAAC,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;YAC9F,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,sBAAsB,OAAO,EAAE,EAAE,CAAC;QAC1F,CAAC;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"WriteBackProcessor.js","sourceRoot":"","sources":["../../src/processors/WriteBackProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAOhD,OAAO,EAAuB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvE,yFAAyF;AACzF,MAAM,OAAO,kBAAkB;IAC3B;;;;;;OAMG;IACH,YACqB,KAAuB,EACvB,aAAkC,EAClC,SAAkB,KAAK;QAFvB,UAAK,GAAL,KAAK,CAAkB;QACvB,kBAAa,GAAb,aAAa,CAAqB;QAClC,WAAM,GAAN,MAAM,CAAiB;IACzC,CAAC;IAEG,KAAK,CAAC,aAAa,CAAC,MAAiB,EAAE,OAA+B;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;gBACvC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,MAAM,EAAE,MAAM,CAAC,aAAa;gBAC5B,MAAM;gBACN,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;aACtB,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC;QACrF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,QAAQ,CAAC,qDAAqD,MAAM,CAAC,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;YAC9F,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,sBAAsB,OAAO,EAAE,EAAE,CAAC;QAC1F,CAAC;IACL,CAAC;CACJ"}
@@ -8,6 +8,13 @@ import { IMetadataProvider, UserInfo } from '@memberjunction/core';
8
8
  import { IProcessRunTracker, ProcessCursor, ProcessRunMeta, ProcessRunSummary, RecordRef, RecordResult, RunCounts, RunHandle } from '@memberjunction/record-set-processor-base';
9
9
  /** The default tracker, persisting to the generic `MJ: Process Runs` / `MJ: Process Run Details` tables. */
10
10
  export declare class GenericProcessRunTracker implements IProcessRunTracker {
11
+ /**
12
+ * Fire-and-forget queue for per-record detail INSERTs. Each detail is its own entity instance (a
13
+ * distinct key), so detail writes run concurrently without blocking the per-record loop; `CompleteRun`
14
+ * flushes them before finalizing the run. (Reliable/insert-before-fire mode is a future enhancement —
15
+ * it needs a per-record start hook on `IProcessRunTracker`.)
16
+ */
17
+ private readonly detailQueue;
11
18
  BeginRun(meta: ProcessRunMeta, contextUser: UserInfo, provider?: IMetadataProvider): Promise<RunHandle>;
12
19
  RecordResult(handle: RunHandle, record: RecordRef, result: RecordResult, contextUser: UserInfo, provider?: IMetadataProvider): Promise<void>;
13
20
  Checkpoint(handle: RunHandle, cursor: ProcessCursor, counts: RunCounts, _contextUser: UserInfo, _provider?: IMetadataProvider): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"GenericProcessRunTracker.d.ts","sourceRoot":"","sources":["../../src/trackers/GenericProcessRunTracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAsB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EACH,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACZ,MAAM,2CAA2C,CAAC;AAOnD,4GAA4G;AAC5G,qBAAa,wBAAyB,YAAW,kBAAkB;IAClD,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IA+BvG,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5I,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BhJ,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhI,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAU9I"}
1
+ {"version":3,"file":"GenericProcessRunTracker.d.ts","sourceRoot":"","sources":["../../src/trackers/GenericProcessRunTracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,iBAAiB,EAAsB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE5G,OAAO,EACH,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,SAAS,EACT,SAAS,EACZ,MAAM,2CAA2C,CAAC;AAOnD,4GAA4G;AAC5G,qBAAa,wBAAyB,YAAW,kBAAkB;IAC/D;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAE5C,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IAgCvG,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5I,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BhJ,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BhI,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAU9I"}
@@ -4,9 +4,18 @@
4
4
  * handshake by re-reading the run row's `CancellationRequested` flag at each checkpoint.
5
5
  * @module @memberjunction/record-set-processor
6
6
  */
7
- import { LogError, Metadata } from '@memberjunction/core';
7
+ import { BaseEntitySaveQueue, LogError, Metadata } from '@memberjunction/core';
8
8
  /** The default tracker, persisting to the generic `MJ: Process Runs` / `MJ: Process Run Details` tables. */
9
9
  export class GenericProcessRunTracker {
10
+ constructor() {
11
+ /**
12
+ * Fire-and-forget queue for per-record detail INSERTs. Each detail is its own entity instance (a
13
+ * distinct key), so detail writes run concurrently without blocking the per-record loop; `CompleteRun`
14
+ * flushes them before finalizing the run. (Reliable/insert-before-fire mode is a future enhancement —
15
+ * it needs a per-record start hook on `IProcessRunTracker`.)
16
+ */
17
+ this.detailQueue = new BaseEntitySaveQueue();
18
+ }
10
19
  async BeginRun(meta, contextUser, provider) {
11
20
  const md = provider ?? Metadata.Provider;
12
21
  const run = await md.GetEntityObject('MJ: Process Runs', contextUser);
@@ -27,6 +36,7 @@ export class GenericProcessRunTracker {
27
36
  run.SkippedCount = 0;
28
37
  run.BatchSize = meta.BatchSize ?? null;
29
38
  run.CancellationRequested = false;
39
+ run.DryRun = meta.DryRun ?? false;
30
40
  run.StartedByUserID = contextUser?.ID ?? null;
31
41
  if (meta.Configuration !== undefined) {
32
42
  run.Configuration = JSON.stringify(meta.Configuration);
@@ -54,11 +64,9 @@ export class GenericProcessRunTracker {
54
64
  detail.ErrorMessage = result.ErrorMessage ?? null;
55
65
  detail.ActionExecutionLogID = result.ActionExecutionLogID ?? null;
56
66
  detail.AIAgentRunID = result.AIAgentRunID ?? null;
57
- const saved = await detail.Save();
58
- if (!saved) {
59
- // A failed detail write must not abort the run — log and continue.
60
- LogError(`GenericProcessRunTracker: failed to save Process Run Detail for record '${record.RecordID}': ${detail.LatestResult?.CompleteMessage ?? 'unknown error'}`);
61
- }
67
+ // Fire-and-forget the detail write must not block the per-record loop, and a failed write must
68
+ // not abort the run (the queue logs failures; CompleteRun flushes + reports the count).
69
+ this.detailQueue.Insert(detail);
62
70
  }
63
71
  async Checkpoint(handle, cursor, counts, _contextUser, _provider) {
64
72
  const run = handle.run;
@@ -88,6 +96,11 @@ export class GenericProcessRunTracker {
88
96
  return true;
89
97
  }
90
98
  async CompleteRun(handle, summary, _contextUser, _provider) {
99
+ // Ensure every fire-and-forget detail write has landed before we finalize the run header.
100
+ const flush = await this.detailQueue.Flush();
101
+ if (flush.failures > 0) {
102
+ LogError(`GenericProcessRunTracker: ${flush.failures} Process Run Detail write(s) failed for run '${handle.run.ID}'`);
103
+ }
91
104
  const run = handle.run;
92
105
  run.Status = summary.Status;
93
106
  run.EndTime = summary.EndTime ?? new Date();
@@ -1 +1 @@
1
- {"version":3,"file":"GenericProcessRunTracker.js","sourceRoot":"","sources":["../../src/trackers/GenericProcessRunTracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GenericProcessRunTracker.js","sourceRoot":"","sources":["../../src/trackers/GenericProcessRunTracker.ts"],"names":[],"mappings":"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"}
@@ -22,15 +22,27 @@ export interface OutputMappingConfig {
22
22
  }
23
23
  /** Outcome of {@link applyOutputMapping}. */
24
24
  export interface WriteBackResult {
25
- /** True if the processed record's fields were updated. */
25
+ /** True if the processed record's fields were actually updated (always false on a dry-run). */
26
26
  updatedRecord: boolean;
27
- /** ID of the created child record, when a child mapping was applied. */
27
+ /** ID of the created child record, when a child mapping was applied (absent on a dry-run). */
28
28
  createdChildID?: string;
29
+ /** True when this was a dry-run: values were computed (and field names validated) but NOTHING was saved. */
30
+ dryRun?: boolean;
31
+ /** On a dry-run, the resolved field values that WOULD be written to the processed record — the write-back preview. */
32
+ previewFields?: Record<string, unknown>;
33
+ /** On a dry-run with a child mapping, the resolved child values that WOULD be created. */
34
+ previewChild?: Record<string, unknown>;
29
35
  }
30
36
  /**
31
37
  * Applies an {@link OutputMappingConfig} against a work result. Single-primary-key entities only
32
38
  * (composite keys throw a clear error). Field/child values are resolved from the result via the
33
39
  * shared resolver, so `"$.path"` reads `result.path`.
40
+ *
41
+ * **Dry-run** (`dryRun: true`): the mapped values are still resolved and the target entity/field
42
+ * metadata is still validated, but NO entity is saved and NO child is created — the would-be values
43
+ * are returned in `previewFields` / `previewChild` so a dry-run preview can show exactly what an apply
44
+ * would write. This is what lets a dry-run of any wrapped work type (Action / Agent / Infer / ML Model)
45
+ * compute its effect without mutating data, mirroring the `FieldRulesProcessor` dry-run preview.
34
46
  */
35
47
  export declare function applyOutputMapping(opts: {
36
48
  outputMapping: OutputMappingConfig;
@@ -38,5 +50,7 @@ export declare function applyOutputMapping(opts: {
38
50
  record: RecordRef;
39
51
  contextUser: UserInfo;
40
52
  provider?: IMetadataProvider;
53
+ /** When true, compute + validate the mapping but do NOT save anything (returns a preview instead). */
54
+ dryRun?: boolean;
41
55
  }): Promise<WriteBackResult>;
42
56
  //# sourceMappingURL=writeBack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"writeBack.d.ts","sourceRoot":"","sources":["../src/writeBack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA4B,iBAAiB,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEvG,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAEtE,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAChC,2HAA2H;IAC3H,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,uDAAuD;IACvD,WAAW,CAAC,EAAE;QACV,gCAAgC;QAChC,MAAM,EAAE,MAAM,CAAC;QACf,uEAAuE;QACvE,WAAW,EAAE,MAAM,CAAC;QACpB,4CAA4C;QAC5C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACL;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC5B,0DAA0D;IAC1D,aAAa,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC3C,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAChC,GAAG,OAAO,CAAC,eAAe,CAAC,CA+C3B"}
1
+ {"version":3,"file":"writeBack.d.ts","sourceRoot":"","sources":["../src/writeBack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA4B,iBAAiB,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEvG,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAEtE,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAChC,2HAA2H;IAC3H,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,uDAAuD;IACvD,WAAW,CAAC,EAAE;QACV,gCAAgC;QAChC,MAAM,EAAE,MAAM,CAAC;QACf,uEAAuE;QACvE,WAAW,EAAE,MAAM,CAAC;QACpB,4CAA4C;QAC5C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACL;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC5B,+FAA+F;IAC/F,aAAa,EAAE,OAAO,CAAC;IACvB,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4GAA4G;IAC5G,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sHAAsH;IACtH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC3C,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,sGAAsG;IACtG,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmE3B"}
package/dist/writeBack.js CHANGED
@@ -10,12 +10,21 @@ import { resolveMappingRef } from '@memberjunction/global';
10
10
  * Applies an {@link OutputMappingConfig} against a work result. Single-primary-key entities only
11
11
  * (composite keys throw a clear error). Field/child values are resolved from the result via the
12
12
  * shared resolver, so `"$.path"` reads `result.path`.
13
+ *
14
+ * **Dry-run** (`dryRun: true`): the mapped values are still resolved and the target entity/field
15
+ * metadata is still validated, but NO entity is saved and NO child is created — the would-be values
16
+ * are returned in `previewFields` / `previewChild` so a dry-run preview can show exactly what an apply
17
+ * would write. This is what lets a dry-run of any wrapped work type (Action / Agent / Infer / ML Model)
18
+ * compute its effect without mutating data, mirroring the `FieldRulesProcessor` dry-run preview.
13
19
  */
14
20
  export async function applyOutputMapping(opts) {
15
- const { outputMapping, result, record, contextUser } = opts;
21
+ const { outputMapping, result, record, contextUser, dryRun } = opts;
16
22
  const provider = opts.provider ?? Metadata.Provider;
17
23
  const sources = { $: result, record: record.Record ?? {} };
18
24
  const out = { updatedRecord: false };
25
+ if (dryRun) {
26
+ out.dryRun = true;
27
+ }
19
28
  // 1) Update fields on the processed record.
20
29
  if (outputMapping.fields && Object.keys(outputMapping.fields).length > 0) {
21
30
  const entity = provider.EntityByID(record.EntityID);
@@ -25,34 +34,53 @@ export async function applyOutputMapping(opts) {
25
34
  if (entity.PrimaryKeys.length !== 1) {
26
35
  throw new Error(`applyOutputMapping: write-back currently supports single-primary-key entities only ('${entity.Name}')`);
27
36
  }
28
- const obj = await provider.GetEntityObject(entity.Name, contextUser);
29
- const loaded = await obj.InnerLoad(CompositeKey.FromKeyValuePair(entity.FirstPrimaryKey.Name, record.RecordID));
30
- if (!loaded) {
31
- throw new Error(`applyOutputMapping: record '${record.RecordID}' of '${entity.Name}' not found`);
32
- }
37
+ // Resolve the mapped values once — shared by the dry-run preview and the real apply.
38
+ const resolved = {};
33
39
  for (const [field, ref] of Object.entries(outputMapping.fields)) {
34
- // Dynamic, config-driven field names — the legitimate use of Set() (no compile-time property).
35
- obj.Set(field, resolveMappingRef(ref, sources));
40
+ resolved[field] = resolveMappingRef(ref, sources);
36
41
  }
37
- const saved = await obj.Save();
38
- if (!saved) {
39
- throw new Error(`applyOutputMapping: failed updating '${entity.Name}' record '${record.RecordID}': ${obj.LatestResult?.CompleteMessage ?? 'unknown error'}`);
42
+ if (dryRun) {
43
+ // Compute-only: surface what an apply WOULD write, persist nothing.
44
+ out.previewFields = resolved;
45
+ }
46
+ else {
47
+ const obj = await provider.GetEntityObject(entity.Name, contextUser);
48
+ const loaded = await obj.InnerLoad(CompositeKey.FromKeyValuePair(entity.FirstPrimaryKey.Name, record.RecordID));
49
+ if (!loaded) {
50
+ throw new Error(`applyOutputMapping: record '${record.RecordID}' of '${entity.Name}' not found`);
51
+ }
52
+ for (const [field, value] of Object.entries(resolved)) {
53
+ // Dynamic, config-driven field names — the legitimate use of Set() (no compile-time property).
54
+ obj.Set(field, value);
55
+ }
56
+ const saved = await obj.Save();
57
+ if (!saved) {
58
+ throw new Error(`applyOutputMapping: failed updating '${entity.Name}' record '${record.RecordID}': ${obj.LatestResult?.CompleteMessage ?? 'unknown error'}`);
59
+ }
60
+ out.updatedRecord = true;
40
61
  }
41
- out.updatedRecord = true;
42
62
  }
43
63
  // 2) Create a child record.
44
64
  if (outputMapping.childRecord) {
45
- const child = await provider.GetEntityObject(outputMapping.childRecord.entity, contextUser);
46
- child.NewRecord();
47
- child.Set(outputMapping.childRecord.parentField, record.RecordID);
65
+ const childMap = { [outputMapping.childRecord.parentField]: record.RecordID };
48
66
  for (const [field, ref] of Object.entries(outputMapping.childRecord.map)) {
49
- child.Set(field, resolveMappingRef(ref, sources));
67
+ childMap[field] = resolveMappingRef(ref, sources);
68
+ }
69
+ if (dryRun) {
70
+ out.previewChild = childMap;
50
71
  }
51
- const saved = await child.Save();
52
- if (!saved) {
53
- throw new Error(`applyOutputMapping: failed creating '${outputMapping.childRecord.entity}' child: ${child.LatestResult?.CompleteMessage ?? 'unknown error'}`);
72
+ else {
73
+ const child = await provider.GetEntityObject(outputMapping.childRecord.entity, contextUser);
74
+ child.NewRecord();
75
+ for (const [field, value] of Object.entries(childMap)) {
76
+ child.Set(field, value);
77
+ }
78
+ const saved = await child.Save();
79
+ if (!saved) {
80
+ throw new Error(`applyOutputMapping: failed creating '${outputMapping.childRecord.entity}' child: ${child.LatestResult?.CompleteMessage ?? 'unknown error'}`);
81
+ }
82
+ out.createdChildID = child.FirstPrimaryKey?.Value != null ? String(child.FirstPrimaryKey.Value) : undefined;
54
83
  }
55
- out.createdChildID = child.FirstPrimaryKey?.Value != null ? String(child.FirstPrimaryKey.Value) : undefined;
56
84
  }
57
85
  return out;
58
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"writeBack.js","sourceRoot":"","sources":["../src/writeBack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writeBack.js","sourceRoot":"","sources":["../src/writeBack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/record-set-processor",
3
3
  "type": "module",
4
- "version": "5.42.0",
4
+ "version": "5.44.0",
5
5
  "description": "MemberJunction: Record Set Processor - server engine that batches, rate-limits, resumes, and audits processing of a record set through a pluggable source/processor/tracker pipeline.",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -17,16 +17,18 @@
17
17
  "author": "MemberJunction.com",
18
18
  "license": "ISC",
19
19
  "dependencies": {
20
- "@memberjunction/core": "5.42.0",
21
- "@memberjunction/global": "5.42.0",
22
- "@memberjunction/core-entities": "5.42.0",
23
- "@memberjunction/record-set-processor-base": "5.42.0",
24
- "@memberjunction/actions": "5.42.0",
25
- "@memberjunction/actions-base": "5.42.0",
26
- "@memberjunction/ai-agents": "5.42.0",
27
- "@memberjunction/aiengine": "5.42.0",
28
- "@memberjunction/ai-prompts": "5.42.0",
29
- "@memberjunction/ai-core-plus": "5.42.0"
20
+ "@memberjunction/core": "5.44.0",
21
+ "@memberjunction/global": "5.44.0",
22
+ "@memberjunction/core-entities": "5.44.0",
23
+ "@memberjunction/field-rules-transforms": "5.44.0",
24
+ "@memberjunction/record-set-processor-base": "5.44.0",
25
+ "@memberjunction/actions": "5.44.0",
26
+ "@memberjunction/actions-base": "5.44.0",
27
+ "@memberjunction/ai-agents": "5.44.0",
28
+ "@memberjunction/aiengine": "5.44.0",
29
+ "@memberjunction/ai-prompts": "5.44.0",
30
+ "@memberjunction/ai-core-plus": "5.44.0",
31
+ "@memberjunction/templates": "5.44.0"
30
32
  },
31
33
  "devDependencies": {
32
34
  "@types/node": "24.10.11",