@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.
- package/dist/RecordProcessExecutor.d.ts +31 -4
- package/dist/RecordProcessExecutor.d.ts.map +1 -1
- package/dist/RecordProcessExecutor.js +74 -9
- package/dist/RecordProcessExecutor.js.map +1 -1
- package/dist/RecordSetProcessor.d.ts.map +1 -1
- package/dist/RecordSetProcessor.js +1 -0
- package/dist/RecordSetProcessor.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/operations/RecordProcessControlOperations.d.ts +12 -40
- package/dist/operations/RecordProcessControlOperations.d.ts.map +1 -1
- package/dist/operations/RecordProcessControlOperations.js +40 -40
- package/dist/operations/RecordProcessControlOperations.js.map +1 -1
- package/dist/operations/RecordProcessGetRunStatusOperation.d.ts +4 -19
- package/dist/operations/RecordProcessGetRunStatusOperation.d.ts.map +1 -1
- package/dist/operations/RecordProcessGetRunStatusOperation.js +8 -10
- package/dist/operations/RecordProcessGetRunStatusOperation.js.map +1 -1
- package/dist/processors/FieldRulesProcessor.d.ts +44 -0
- package/dist/processors/FieldRulesProcessor.d.ts.map +1 -0
- package/dist/processors/FieldRulesProcessor.js +130 -0
- package/dist/processors/FieldRulesProcessor.js.map +1 -0
- package/dist/processors/WriteBackProcessor.d.ts +5 -1
- package/dist/processors/WriteBackProcessor.d.ts.map +1 -1
- package/dist/processors/WriteBackProcessor.js +6 -1
- package/dist/processors/WriteBackProcessor.js.map +1 -1
- package/dist/trackers/GenericProcessRunTracker.d.ts +7 -0
- package/dist/trackers/GenericProcessRunTracker.d.ts.map +1 -1
- package/dist/trackers/GenericProcessRunTracker.js +19 -6
- package/dist/trackers/GenericProcessRunTracker.js.map +1 -1
- package/dist/writeBack.d.ts +16 -2
- package/dist/writeBack.d.ts.map +1 -1
- package/dist/writeBack.js +48 -20
- package/dist/writeBack.js.map +1 -1
- 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;
|
|
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;
|
|
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
|
|
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,
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAqB,QAAQ,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"GenericProcessRunTracker.js","sourceRoot":"","sources":["../../src/trackers/GenericProcessRunTracker.ts"],"names":[],"mappings":"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"}
|
package/dist/writeBack.d.ts
CHANGED
|
@@ -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
|
package/dist/writeBack.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
-
|
|
29
|
-
const
|
|
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
|
-
|
|
35
|
-
obj.Set(field, resolveMappingRef(ref, sources));
|
|
40
|
+
resolved[field] = resolveMappingRef(ref, sources);
|
|
36
41
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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
|
-
|
|
67
|
+
childMap[field] = resolveMappingRef(ref, sources);
|
|
68
|
+
}
|
|
69
|
+
if (dryRun) {
|
|
70
|
+
out.previewChild = childMap;
|
|
50
71
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
}
|
package/dist/writeBack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeBack.js","sourceRoot":"","sources":["../src/writeBack.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAc,YAAY,EAAqB,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
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.
|
|
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.
|
|
21
|
-
"@memberjunction/global": "5.
|
|
22
|
-
"@memberjunction/core-entities": "5.
|
|
23
|
-
"@memberjunction/
|
|
24
|
-
"@memberjunction/
|
|
25
|
-
"@memberjunction/actions
|
|
26
|
-
"@memberjunction/
|
|
27
|
-
"@memberjunction/
|
|
28
|
-
"@memberjunction/
|
|
29
|
-
"@memberjunction/ai-
|
|
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",
|