@memberjunction/actions-base 6.1.0-edge.0 → 6.1.0-edge.2

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,4 +1,5 @@
1
1
  import { BaseEngine, IMetadataProvider, UserInfo } from "@memberjunction/core";
2
+ import { EntityChangeContext } from './EntityChangeContext.js';
2
3
  import { MJActionCategoryEntity, MJActionEntity, MJActionExecutionLogEntity, MJActionFilterEntity, MJActionLibraryEntity, MJActionParamEntity, MJActionResultCodeEntity, MJEntityActionEntity, MJEntityActionParamEntity } from "@memberjunction/core-entities";
3
4
  import { MJActionEntityExtended } from "./MJActionEntityExtended.js";
4
5
  export declare class ActionLibrary {
@@ -243,6 +244,28 @@ export declare class RunActionParams<TContext = any> {
243
244
  * Optional, the input and output parameters as defined in the metadata for the action.
244
245
  */
245
246
  Params: ActionParam[];
247
+ /**
248
+ * What changed about the record, when this run was dispatched by an entity action.
249
+ *
250
+ * Present only on the entity-action path — a directly invoked action has no record transition to
251
+ * describe. This is what makes a *transition* filter possible ("when Status becomes Approved"),
252
+ * as opposed to a state filter over current values, which was all a filter could see before.
253
+ */
254
+ EntityChange?: EntityChangeContext;
255
+ /**
256
+ * When set, replaces *executing* the action — after validation and filters have passed.
257
+ *
258
+ * The seam durable dispatch hangs on. Submitting the work before this point would hand it over
259
+ * without the scope check and without the binding's filters ever running, so a scoped durable
260
+ * trigger would fire for every record and a filtered one on every save. Deferring *here* means
261
+ * the two paths share one gate: whatever decides an inline run should happen decides a durable
262
+ * one should be submitted.
263
+ *
264
+ * **Returning `null` declines the deferral** and the action executes normally. That is what makes
265
+ * the fallback free: a handoff that could not be completed becomes an ordinary run rather than
266
+ * requiring the deferral to reimplement execution.
267
+ */
268
+ DeferExecution?: (params: RunActionParams) => Promise<ActionResultSimple | null>;
246
269
  /**
247
270
  * Optional context object that provides runtime-specific information to the action.
248
271
  * This context is separate from the action parameters and is not stored in the database.
@@ -1 +1 @@
1
- {"version":3,"file":"ActionEngine-Base.d.ts","sourceRoot":"","sources":["../src/ActionEngine-Base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionEngine-Base.d.ts","sourceRoot":"","sources":["../src/ActionEngine-Base.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionEngine-Base.js","sourceRoot":"","sources":["../src/ActionEngine-Base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionEngine-Base.js","sourceRoot":"","sources":["../src/ActionEngine-Base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @fileoverview The seam that lets an `After*` entity action run durably.
3
+ *
4
+ * **Why a seam and not a call.** After-hooks are dispatched by `GenericDatabaseProvider`, which sits
5
+ * near the bottom of the dependency graph — every consumer of the entity layer loads it. The durable
6
+ * substrate (`@memberjunction/task-graph`) sits well above it, holding the dispatcher, the claim
7
+ * protocol and the entity layer itself. Importing one from the other would invert the graph and drag
8
+ * durable execution into every context that merely saves a record, including DB-less unit tests. So
9
+ * the provider depends on this interface, the host registers an implementation at boot, and a host
10
+ * that registers nothing simply keeps today's inline behaviour.
11
+ *
12
+ * **Why durability is opt-in.** It costs a Task row per dispatch, a dispatcher hop of latency, and
13
+ * it persists the action's parameters at rest. Charging every After* binding on every installation
14
+ * for that would be a large, silent change to systems that never asked for it — so
15
+ * `EntityAction.RunMode` defaults to `Inline` and an operator opts a binding in.
16
+ *
17
+ * @module @memberjunction/actions-base
18
+ */
19
+ import { UserInfo } from '@memberjunction/core';
20
+ import { BaseSingleton } from '@memberjunction/global';
21
+ /** One durable dispatch: which binding, on which record, with what already-redacted inputs. */
22
+ export type DurableEntityActionRequest = {
23
+ /** The `MJ: Entity Actions` binding that fired. */
24
+ EntityActionID: string;
25
+ /** The action it dispatches to — resolved here so the submitter needs no metadata lookup. */
26
+ ActionID: string;
27
+ /** Human-readable name of that action, used for the task's name. */
28
+ ActionName: string;
29
+ /** The entity whose save fired this. */
30
+ EntityID: string;
31
+ /** Name of that entity, for a task description a person can read. */
32
+ EntityName: string;
33
+ /** The record, in MJ's canonical serialized form (`ToConcatenatedString()`). */
34
+ RecordID: string;
35
+ /** Which lifecycle event fired — `AfterCreate` / `AfterUpdate` / `AfterDelete`. */
36
+ InvocationType: string;
37
+ /**
38
+ * The action's input parameters, **already redacted**.
39
+ *
40
+ * Typed as JSON-safe rather than as `ActionParam[]` deliberately: `Task.InputPayload` is
41
+ * persistent, user-visible storage, and the #3408 §5.7 invariant is that no path writes a raw
42
+ * `ActionParam[]` there. Taking the redacted shape at the boundary is what makes violating it
43
+ * require changing this type rather than forgetting a call.
44
+ */
45
+ RedactedParams: Record<string, unknown>;
46
+ ContextUser: UserInfo;
47
+ };
48
+ /** What came of a durable submission. */
49
+ export type DurableEntityActionSubmission = {
50
+ Success: boolean;
51
+ /** The parent task row representing the graph, when one was created. */
52
+ ParentTaskID?: string;
53
+ ErrorMessage?: string;
54
+ };
55
+ /**
56
+ * Submits one entity-action dispatch as durable work.
57
+ *
58
+ * Implemented by the host over `TaskGraphService.Submit` — per D14, "run this action durably with
59
+ * retry" is a single-node durable graph, not a new queue.
60
+ */
61
+ export type DurableEntityActionSubmitter = {
62
+ Submit(request: DurableEntityActionRequest): Promise<DurableEntityActionSubmission>;
63
+ };
64
+ /**
65
+ * Where the host registers its submitter, and where the dispatch path looks for one.
66
+ *
67
+ * A `BaseSingleton` rather than a module-level variable because bundlers duplicate modules across
68
+ * execution paths: a plain `let` would give the registering host and the reading provider two
69
+ * different slots, and durability would appear configured while every dispatch silently ran inline.
70
+ */
71
+ export declare class DurableEntityActionRegistry extends BaseSingleton<DurableEntityActionRegistry> {
72
+ private _submitter;
73
+ protected constructor();
74
+ static get Instance(): DurableEntityActionRegistry;
75
+ /** Registers the host's durable submitter. Called once at boot. */
76
+ Register(submitter: DurableEntityActionSubmitter): void;
77
+ /**
78
+ * The registered submitter, or null on a host that has none.
79
+ *
80
+ * Null is an ordinary answer, not an error: a CLI, a test, or a client-side provider has no
81
+ * dispatcher to hand work to. What the caller must NOT do with a null is skip the work — see
82
+ * {@link DurableDispatchOutcome}.
83
+ */
84
+ get Submitter(): DurableEntityActionSubmitter | null;
85
+ /** Clears the registration. Exists for tests, which must not leak a submitter across cases. */
86
+ Clear(): void;
87
+ }
88
+ /** What a dispatch path did with a binding that asked for durability. */
89
+ export type DurableDispatchOutcome =
90
+ /** Handed to the durable substrate; the caller must not also run it. */
91
+ {
92
+ Kind: 'Submitted';
93
+ ParentTaskID?: string;
94
+ }
95
+ /**
96
+ * Not submitted — no submitter registered, or submission failed. The caller **runs it inline**.
97
+ *
98
+ * Falling back rather than dropping is the whole posture: `RunMode='Durable'` asks for the work
99
+ * to be harder to lose, so refusing to run it when the durable path is unavailable would make
100
+ * the opt-in *less* reliable than leaving it off. The reason travels so the fallback is visible
101
+ * in logs rather than looking like a binding that was never durable.
102
+ */
103
+ | {
104
+ Kind: 'RunInline';
105
+ Reason: string;
106
+ };
107
+ //# sourceMappingURL=DurableEntityActionSubmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableEntityActionSubmitter.d.ts","sourceRoot":"","sources":["../src/DurableEntityActionSubmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,+FAA+F;AAC/F,MAAM,MAAM,0BAA0B,GAAG;IACrC,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,WAAW,EAAE,QAAQ,CAAC;CACzB,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,6BAA6B,GAAG;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACvC,MAAM,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;CACvF,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,2BAA4B,SAAQ,aAAa,CAAC,2BAA2B,CAAC;IACvF,OAAO,CAAC,UAAU,CAA6C;IAE/D,SAAS;IAET,WAAkB,QAAQ,IAAI,2BAA2B,CAExD;IAED,mEAAmE;IAC5D,QAAQ,CAAC,SAAS,EAAE,4BAA4B,GAAG,IAAI;IAI9D;;;;;;OAMG;IACH,IAAW,SAAS,IAAI,4BAA4B,GAAG,IAAI,CAE1D;IAED,+FAA+F;IACxF,KAAK,IAAI,IAAI;CAGvB;AAED,yEAAyE;AACzE,MAAM,MAAM,sBAAsB;AAC9B,wEAAwE;AACtE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;AAC9C;;;;;;;GAOG;GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { BaseSingleton } from '@memberjunction/global';
2
+ /**
3
+ * Where the host registers its submitter, and where the dispatch path looks for one.
4
+ *
5
+ * A `BaseSingleton` rather than a module-level variable because bundlers duplicate modules across
6
+ * execution paths: a plain `let` would give the registering host and the reading provider two
7
+ * different slots, and durability would appear configured while every dispatch silently ran inline.
8
+ */
9
+ export class DurableEntityActionRegistry extends BaseSingleton {
10
+ constructor() {
11
+ super();
12
+ this._submitter = null;
13
+ }
14
+ static get Instance() {
15
+ return super.getInstance('DurableEntityActionRegistry');
16
+ }
17
+ /** Registers the host's durable submitter. Called once at boot. */
18
+ Register(submitter) {
19
+ this._submitter = submitter;
20
+ }
21
+ /**
22
+ * The registered submitter, or null on a host that has none.
23
+ *
24
+ * Null is an ordinary answer, not an error: a CLI, a test, or a client-side provider has no
25
+ * dispatcher to hand work to. What the caller must NOT do with a null is skip the work — see
26
+ * {@link DurableDispatchOutcome}.
27
+ */
28
+ get Submitter() {
29
+ return this._submitter;
30
+ }
31
+ /** Clears the registration. Exists for tests, which must not leak a submitter across cases. */
32
+ Clear() {
33
+ this._submitter = null;
34
+ }
35
+ }
36
+ //# sourceMappingURL=DurableEntityActionSubmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableEntityActionSubmitter.js","sourceRoot":"","sources":["../src/DurableEntityActionSubmitter.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgDvD;;;;;;GAMG;AACH,MAAM,OAAO,2BAA4B,SAAQ,aAA0C;IAGvF;QAA0B,KAAK,EAAE,CAAC;QAF1B,eAAU,GAAwC,IAAI,CAAC;IAE5B,CAAC;IAE7B,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,CAA8B,6BAA6B,CAAC,CAAC;IACzF,CAAC;IAED,mEAAmE;IAC5D,QAAQ,CAAC,SAAuC;QACnD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,+FAA+F;IACxF,KAAK;QACR,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IAC3B,CAAC;CACJ"}
@@ -1,6 +1,7 @@
1
1
  import { BaseEngine, BaseEntity, IMetadataProvider, UserInfo } from "@memberjunction/core";
2
2
  import { MJActionExecutionLogEntity, MJActionResultCodeEntity, MJEntityActionFilterEntity, MJEntityActionInvocationEntity, MJEntityActionInvocationTypeEntity, MJEntityActionParamEntity } from "@memberjunction/core-entities";
3
3
  import { ActionParam, AIDirective, RunActionParams } from "./ActionEngine-Base.js";
4
+ import { EntityChangeContext } from "./EntityChangeContext.js";
4
5
  import { MJEntityActionEntityExtended } from "./MJEntityActionEntityExtended.js";
5
6
  /**
6
7
  * Parameters type for invoking an entity action
@@ -30,6 +31,17 @@ export declare class EntityActionInvocationParams {
30
31
  * If the invocation type is list-oriented, this parameter will be needed
31
32
  */
32
33
  ListID?: string;
34
+ /**
35
+ * What changed about the record, for filters that need both sides of the save.
36
+ *
37
+ * Captured by the dispatcher at the moment the lifecycle event fires, **not** read from the entity
38
+ * later: `After*` dispatch is fire-and-forget, and by the time an action's filter runs the entity
39
+ * has been reloaded from the save's returned row and its `OldValue`s reset. A filter reading the
40
+ * live entity would see before-values identical to after-values and conclude nothing changed.
41
+ *
42
+ * Absent on invocations with no save behind them (a View or List fan-out, a direct call).
43
+ */
44
+ EntityChange?: EntityChangeContext;
33
45
  }
34
46
  /**
35
47
  * Class that has the result of a complete action execution, returned by the Run method of the ActionEngine.
@@ -1 +1 @@
1
- {"version":3,"file":"EntityActionEngine-Base.d.ts","sourceRoot":"","sources":["../src/EntityActionEngine-Base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityActionEngine-Base.d.ts","sourceRoot":"","sources":["../src/EntityActionEngine-Base.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityActionEngine-Base.js","sourceRoot":"","sources":["../src/EntityActionEngine-Base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityActionEngine-Base.js","sourceRoot":"","sources":["../src/EntityActionEngine-Base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqE,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKpD,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAEtG;;GAEG;AACH,MAAM,OAAO,4BAA4B;CAwCxC;AAGD;;GAEG;AACH,MAAM,OAAO,kBAAkB;CAqC7B;AAEF;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,UAAkC;IAA9E;;QAMI,8DAA8D;QACtD,mBAAc,GAAmC,EAAE,CAAC;QACpD,wBAAmB,GAAgC,EAAE,CAAC;QACtD,iCAA4B,GAAyC,EAAE,CAAC;QACxE,yBAAoB,GAAiC,EAAE,CAAC;QACxD,6BAAwB,GAAqC,EAAE,CAAC;IAkJ5E,CAAC;IA5JU,MAAM,KAAK,QAAQ;QACtB,OAAO,KAAK,CAAC,WAAW,CAAyB,wBAAwB,CAAC,CAAC;IAC/E,CAAC;IAUD;;;;;OAKG;IACI,KAAK,CAAC,MAAM,CAAC,eAAwB,KAAK,EAAE,WAAsB,EAAE,QAA4B;QACnG,MAAM,OAAO,GAAwC;YACjD;gBACI,UAAU,EAAE,oCAAoC;gBAChD,YAAY,EAAE,8BAA8B;gBAC5C,UAAU,EAAE,IAAI;aACnB;YACD;gBACI,UAAU,EAAE,2BAA2B;gBACvC,YAAY,EAAE,sBAAsB;gBACpC,UAAU,EAAE,IAAI;aACnB;YACD;gBACI,UAAU,EAAE,+BAA+B;gBAC3C,YAAY,EAAE,0BAA0B;gBACxC,UAAU,EAAE,IAAI;aACnB;YACD;gBACI,UAAU,EAAE,oBAAoB,EAAE,0IAA0I;gBAC5K,YAAY,EAAE,gBAAgB;gBAC9B,UAAU,EAAE,IAAI;aACnB;YACD;gBACI,UAAU,EAAE,0BAA0B;gBACtC,YAAY,EAAE,qBAAqB;gBACnC,UAAU,EAAE,IAAI;aACnB;SACJ,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAGD;;OAEG;IACH,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,4BAA4B,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACI,sBAAsB,CAAC,UAAkB,EAAE,MAA0C;QACxF,OAAO,IAAI,CAAC,cAAc,CACtB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CACzI,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACO,cAAc,CAAC,aAA6C;QAClE,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YACzD,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,aAAa,CACtB,aAA6C,EAC7C,OAAsC;QAEtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,qBAAqB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC9G,CAAC;QACF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CAAC,QAAgB;QACxC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClG,CAAC;IAED;;;;;;OAMG;IACI,uCAAuC,CAAC,UAAkB,EAAE,cAAsB,EAAE,MAA0C;QACjI,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtE,2DAA2D;QAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YAC9J,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @fileoverview What changed about a record, in the shape a filter can reason about.
3
+ *
4
+ * **This is the contract transition filters were missing.** An entity action bound to `AfterUpdate`
5
+ * has always been able to see the record's *current* state and nothing else — so "when an invoice
6
+ * crosses 90 days" or "when Status becomes Approved" were unexpressible, and the workflow layer had
7
+ * to refuse a `filter` outright rather than accept one it could not honor. Deciding those questions
8
+ * needs the values on *both* sides of the save, which `BaseEntity` has tracked all along on each
9
+ * `EntityField` — it was simply never carried to the place filters run.
10
+ *
11
+ * Deliberately a plain data shape rather than the live entity: a filter runs against a snapshot of
12
+ * what happened, and handing it a mutable `BaseEntity` would let a predicate quietly alter the record
13
+ * it was asked to judge.
14
+ *
15
+ * @module @memberjunction/actions-base
16
+ */
17
+ /** The before/after picture of one save, as seen by a filter. */
18
+ export type EntityChangeContext = {
19
+ /**
20
+ * Field values as they were when the record was loaded. Empty on a create — there is no "before".
21
+ */
22
+ OldValues: Readonly<Record<string, unknown>>;
23
+ /** Field values as they are now. */
24
+ NewValues: Readonly<Record<string, unknown>>;
25
+ /**
26
+ * Names of fields whose value actually differs.
27
+ *
28
+ * Computed from a value comparison rather than from the dirty flag: a field can be assigned its
29
+ * existing value and still read as dirty, and a filter that fired on that would be reporting a
30
+ * change that did not happen.
31
+ */
32
+ ChangedFields: readonly string[];
33
+ /** True when the record is being created, so every field is "new" and none of them changed. */
34
+ IsCreate: boolean;
35
+ };
36
+ /** True when `fieldName` is among the fields that changed. Case-insensitive, as field names are. */
37
+ export declare function DidFieldChange(change: EntityChangeContext | undefined, fieldName: string): boolean;
38
+ /**
39
+ * True when `fieldName` changed AND its new value equals `value`.
40
+ *
41
+ * The equality is deliberately loose — a filter's configured value arrives as a string from
42
+ * metadata, while the field may hold a number, boolean or date. Comparing raw would make
43
+ * `Status = 1` never match a numeric 1, which is the kind of silent no-match that leaves someone
44
+ * convinced their automation is broken rather than misconfigured.
45
+ */
46
+ export declare function DidFieldChangeToValue(change: EntityChangeContext | undefined, fieldName: string, value: unknown): boolean;
47
+ /** Reads a field from a values bag case-insensitively. */
48
+ export declare function ReadFieldValue(values: Readonly<Record<string, unknown>>, fieldName: string): unknown;
49
+ /**
50
+ * Compares a field value to a configured one across the string boundary metadata forces.
51
+ *
52
+ * Null and undefined are treated as the same absence — a filter author writing "when Owner becomes
53
+ * empty" should not have to know which one the provider produced.
54
+ */
55
+ export declare function LooseEquals(actual: unknown, expected: unknown): boolean;
56
+ /** The minimum of a `BaseEntity` this builder needs — kept structural so this module stays free of
57
+ * a dependency on the entity layer, which would invert the package graph. */
58
+ export type ChangeTrackedEntity = {
59
+ IsSaved: boolean;
60
+ Fields: ReadonlyArray<{
61
+ Name: string;
62
+ Value: unknown;
63
+ OldValue: unknown;
64
+ }>;
65
+ };
66
+ /**
67
+ * Builds the before/after picture from an entity about to be, or just, saved.
68
+ *
69
+ * Reads `EntityField.OldValue`, which `BaseEntity` has populated since the record was loaded — no
70
+ * new tracking, just carrying what already exists to where filters run.
71
+ *
72
+ * `IsSaved === false` means a create, and a create has no "before": every field is reported as new
73
+ * and `ChangedFields` is empty. Saying a field "changed" on insert would make a transition filter
74
+ * fire on creation, which is the opposite of what "when Status BECOMES Approved" asks for — that
75
+ * record's status did not become anything, it started that way.
76
+ */
77
+ export declare function BuildEntityChangeContext(entity: ChangeTrackedEntity): EntityChangeContext;
78
+ /**
79
+ * Wraps a filter expression as the body of an `ActionFilter.Code`.
80
+ *
81
+ * Two different authoring surfaces reach this: a workflow's `WorkflowEntityEventTrigger.filter` and
82
+ * a Record Process's `OnChangeFilter`. Both mean the same thing — "only fire when this is true of
83
+ * the change" — so both compile to one shape rather than each inventing its own dialect, and a user
84
+ * who learns one has learned the other.
85
+ *
86
+ * It also lives on both sides of the check/store divide: the validator compiles the result to prove
87
+ * it parses, and the reconciler persists exactly that string. Anything less than a shared function
88
+ * admits the failure where a spec validates and then fails closed forever at runtime.
89
+ *
90
+ * The shorthands are destructured from the context rather than injected as separate function
91
+ * arguments, so an author's expression sees exactly the names the field's documentation promises
92
+ * and nothing else leaks in.
93
+ */
94
+ export declare function BuildChangeFilterCode(filter: string): string;
95
+ /**
96
+ * Whether a filter expression parses.
97
+ *
98
+ * Compiles but never invokes, so nothing in the expression can run here. `EvalError` is treated as
99
+ * "cannot tell" rather than "invalid": under a Content-Security-Policy that forbids `new Function`,
100
+ * every filter would otherwise be reported as broken in the browser while working perfectly on the
101
+ * server that actually evaluates it.
102
+ */
103
+ export declare function IsChangeFilterParseable(filter: string): {
104
+ Parseable: boolean;
105
+ Message?: string;
106
+ };
107
+ //# sourceMappingURL=EntityChangeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityChangeContext.d.ts","sourceRoot":"","sources":["../src/EntityChangeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,iEAAiE;AACjE,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;OAEG;IACH,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7C,oCAAoC;IACpC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7C;;;;;;OAMG;IACH,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjC,+FAA+F;IAC/F,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAMlG;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,mBAAmB,GAAG,SAAS,EACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACf,OAAO,CAMT;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAIpG;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAmBvE;AASD;8EAC8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC9E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAqBzF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO5D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAQhG"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * @fileoverview What changed about a record, in the shape a filter can reason about.
3
+ *
4
+ * **This is the contract transition filters were missing.** An entity action bound to `AfterUpdate`
5
+ * has always been able to see the record's *current* state and nothing else — so "when an invoice
6
+ * crosses 90 days" or "when Status becomes Approved" were unexpressible, and the workflow layer had
7
+ * to refuse a `filter` outright rather than accept one it could not honor. Deciding those questions
8
+ * needs the values on *both* sides of the save, which `BaseEntity` has tracked all along on each
9
+ * `EntityField` — it was simply never carried to the place filters run.
10
+ *
11
+ * Deliberately a plain data shape rather than the live entity: a filter runs against a snapshot of
12
+ * what happened, and handing it a mutable `BaseEntity` would let a predicate quietly alter the record
13
+ * it was asked to judge.
14
+ *
15
+ * @module @memberjunction/actions-base
16
+ */
17
+ /** True when `fieldName` is among the fields that changed. Case-insensitive, as field names are. */
18
+ export function DidFieldChange(change, fieldName) {
19
+ if (!change || !fieldName) {
20
+ return false;
21
+ }
22
+ const wanted = fieldName.trim().toLowerCase();
23
+ return change.ChangedFields.some((f) => f.toLowerCase() === wanted);
24
+ }
25
+ /**
26
+ * True when `fieldName` changed AND its new value equals `value`.
27
+ *
28
+ * The equality is deliberately loose — a filter's configured value arrives as a string from
29
+ * metadata, while the field may hold a number, boolean or date. Comparing raw would make
30
+ * `Status = 1` never match a numeric 1, which is the kind of silent no-match that leaves someone
31
+ * convinced their automation is broken rather than misconfigured.
32
+ */
33
+ export function DidFieldChangeToValue(change, fieldName, value) {
34
+ if (!DidFieldChange(change, fieldName)) {
35
+ return false;
36
+ }
37
+ const actual = ReadFieldValue(change.NewValues, fieldName);
38
+ return LooseEquals(actual, value);
39
+ }
40
+ /** Reads a field from a values bag case-insensitively. */
41
+ export function ReadFieldValue(values, fieldName) {
42
+ const wanted = fieldName.trim().toLowerCase();
43
+ const key = Object.keys(values).find((k) => k.toLowerCase() === wanted);
44
+ return key === undefined ? undefined : values[key];
45
+ }
46
+ /**
47
+ * Compares a field value to a configured one across the string boundary metadata forces.
48
+ *
49
+ * Null and undefined are treated as the same absence — a filter author writing "when Owner becomes
50
+ * empty" should not have to know which one the provider produced.
51
+ */
52
+ export function LooseEquals(actual, expected) {
53
+ if (actual === expected) {
54
+ return true;
55
+ }
56
+ if (actual == null && expected == null) {
57
+ return true;
58
+ }
59
+ if (actual == null || expected == null) {
60
+ return false;
61
+ }
62
+ if (actual instanceof Date || expected instanceof Date) {
63
+ const a = actual instanceof Date ? actual.getTime() : new Date(String(actual)).getTime();
64
+ const b = expected instanceof Date ? expected.getTime() : new Date(String(expected)).getTime();
65
+ return !Number.isNaN(a) && !Number.isNaN(b) && a === b;
66
+ }
67
+ if (typeof actual === 'boolean' || typeof expected === 'boolean') {
68
+ return ToBool(actual) === ToBool(expected);
69
+ }
70
+ return String(actual).trim().toLowerCase() === String(expected).trim().toLowerCase();
71
+ }
72
+ /** Interprets the several ways a boolean arrives from metadata or a database. */
73
+ function ToBool(v) {
74
+ if (typeof v === 'boolean')
75
+ return v;
76
+ const s = String(v).trim().toLowerCase();
77
+ return s === 'true' || s === '1' || s === 'yes';
78
+ }
79
+ /**
80
+ * Builds the before/after picture from an entity about to be, or just, saved.
81
+ *
82
+ * Reads `EntityField.OldValue`, which `BaseEntity` has populated since the record was loaded — no
83
+ * new tracking, just carrying what already exists to where filters run.
84
+ *
85
+ * `IsSaved === false` means a create, and a create has no "before": every field is reported as new
86
+ * and `ChangedFields` is empty. Saying a field "changed" on insert would make a transition filter
87
+ * fire on creation, which is the opposite of what "when Status BECOMES Approved" asks for — that
88
+ * record's status did not become anything, it started that way.
89
+ */
90
+ export function BuildEntityChangeContext(entity) {
91
+ const oldValues = {};
92
+ const newValues = {};
93
+ const changed = [];
94
+ const isCreate = !entity.IsSaved;
95
+ for (const f of entity.Fields) {
96
+ newValues[f.Name] = f.Value;
97
+ if (isCreate) {
98
+ continue;
99
+ }
100
+ oldValues[f.Name] = f.OldValue;
101
+ // Compared by value rather than by the dirty flag: assigning a field its existing value
102
+ // still marks it dirty, and a filter firing on that would report a change that never
103
+ // happened.
104
+ if (!LooseEquals(f.OldValue, f.Value)) {
105
+ changed.push(f.Name);
106
+ }
107
+ }
108
+ return { OldValues: oldValues, NewValues: newValues, ChangedFields: changed, IsCreate: isCreate };
109
+ }
110
+ /**
111
+ * Wraps a filter expression as the body of an `ActionFilter.Code`.
112
+ *
113
+ * Two different authoring surfaces reach this: a workflow's `WorkflowEntityEventTrigger.filter` and
114
+ * a Record Process's `OnChangeFilter`. Both mean the same thing — "only fire when this is true of
115
+ * the change" — so both compile to one shape rather than each inventing its own dialect, and a user
116
+ * who learns one has learned the other.
117
+ *
118
+ * It also lives on both sides of the check/store divide: the validator compiles the result to prove
119
+ * it parses, and the reconciler persists exactly that string. Anything less than a shared function
120
+ * admits the failure where a spec validates and then fails closed forever at runtime.
121
+ *
122
+ * The shorthands are destructured from the context rather than injected as separate function
123
+ * arguments, so an author's expression sees exactly the names the field's documentation promises
124
+ * and nothing else leaks in.
125
+ */
126
+ export function BuildChangeFilterCode(filter) {
127
+ return [
128
+ '// Generated from a change-filter expression. Edit the definition that owns this row,',
129
+ '// not the row itself — re-saving the owner overwrites this code.',
130
+ 'const { OldValues, NewValues, DidFieldChange, DidFieldChangeToValue } = ActionFilterContext;',
131
+ `return (${filter.trim()});`,
132
+ ].join('\n');
133
+ }
134
+ /**
135
+ * Whether a filter expression parses.
136
+ *
137
+ * Compiles but never invokes, so nothing in the expression can run here. `EvalError` is treated as
138
+ * "cannot tell" rather than "invalid": under a Content-Security-Policy that forbids `new Function`,
139
+ * every filter would otherwise be reported as broken in the browser while working perfectly on the
140
+ * server that actually evaluates it.
141
+ */
142
+ export function IsChangeFilterParseable(filter) {
143
+ try {
144
+ new Function('ActionFilterContext', BuildChangeFilterCode(filter));
145
+ return { Parseable: true };
146
+ }
147
+ catch (e) {
148
+ if (e instanceof EvalError)
149
+ return { Parseable: true };
150
+ return { Parseable: false, Message: e instanceof Error ? e.message : String(e) };
151
+ }
152
+ }
153
+ //# sourceMappingURL=EntityChangeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityChangeContext.js","sourceRoot":"","sources":["../src/EntityChangeContext.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { MJActionEntity, MJActionLibraryEntity, MJActionParamEntity, MJActionResultCodeEntity } from "@memberjunction/core-entities";
1
+ import { MJActionEntity } from "@memberjunction/core-entities";
2
2
  export declare class MJActionEntityExtended extends MJActionEntity {
3
3
  /**
4
4
  * Returns true if this action is a core MemberJunction framework action, false otherwise.
@@ -8,14 +8,5 @@ export declare class MJActionEntityExtended extends MJActionEntity {
8
8
  * Generates a programatically friendly name for the name of the Action.
9
9
  */
10
10
  get ProgrammaticName(): string;
11
- private _resultCodes;
12
- /**
13
- * Provides a list of possible result codes for this action.
14
- */
15
- get ResultCodes(): MJActionResultCodeEntity[];
16
- private _params;
17
- get Params(): MJActionParamEntity[];
18
- private _libs;
19
- get Libraries(): MJActionLibraryEntity[];
20
11
  }
21
12
  //# sourceMappingURL=MJActionEntityExtended.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MJActionEntityExtended.d.ts","sourceRoot":"","sources":["../src/MJActionEntityExtended.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAIrI,qBACa,sBAAuB,SAAQ,cAAc;IACtD;;OAEG;IACH,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED;;OAEG;IACH,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,OAAO,CAAC,YAAY,CAAoC;IACxD;;OAEG;IACH,IAAW,WAAW,IAAI,wBAAwB,EAAE,CAMnD;IAED,OAAO,CAAC,OAAO,CAA+B;IAC9C,IAAW,MAAM,IAAI,mBAAmB,EAAE,CAMzC;IAED,OAAO,CAAC,KAAK,CAAiC;IAC9C,IAAW,SAAS,IAAI,qBAAqB,EAAE,CAM9C;CAGJ"}
1
+ {"version":3,"file":"MJActionEntityExtended.d.ts","sourceRoot":"","sources":["../src/MJActionEntityExtended.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,qBACa,sBAAuB,SAAQ,cAAc;IACtD;;OAEG;IACH,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED;;OAEG;IACH,IAAW,gBAAgB,IAAI,MAAM,CAEpC;CAaJ"}
@@ -6,15 +6,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { BaseEntity, CodeNameFromString } from "@memberjunction/core";
8
8
  import { MJActionEntity } from "@memberjunction/core-entities";
9
- import { RegisterClass, UUIDsEqual } from "@memberjunction/global";
9
+ import { RegisterClass } from "@memberjunction/global";
10
10
  import { ActionEngineBase } from "./ActionEngine-Base.js";
11
11
  let MJActionEntityExtended = class MJActionEntityExtended extends MJActionEntity {
12
- constructor() {
13
- super(...arguments);
14
- this._resultCodes = null;
15
- this._params = null;
16
- this._libs = null;
17
- }
18
12
  /**
19
13
  * Returns true if this action is a core MemberJunction framework action, false otherwise.
20
14
  */
@@ -27,30 +21,6 @@ let MJActionEntityExtended = class MJActionEntityExtended extends MJActionEntity
27
21
  get ProgrammaticName() {
28
22
  return CodeNameFromString(this.Name);
29
23
  }
30
- /**
31
- * Provides a list of possible result codes for this action.
32
- */
33
- get ResultCodes() {
34
- if (!this._resultCodes) {
35
- // load the result codes
36
- this._resultCodes = ActionEngineBase.Instance.ActionResultCodes.filter(c => UUIDsEqual(c.ActionID, this.ID));
37
- }
38
- return this._resultCodes;
39
- }
40
- get Params() {
41
- if (!this._params) {
42
- // load the inputs
43
- this._params = ActionEngineBase.Instance.ActionParams.filter(i => UUIDsEqual(i.ActionID, this.ID));
44
- }
45
- return this._params;
46
- }
47
- get Libraries() {
48
- if (!this._libs) {
49
- // load the inputs
50
- this._libs = ActionEngineBase.Instance.ActionLibraries.filter(l => UUIDsEqual(l.ActionID, this.ID));
51
- }
52
- return this._libs;
53
- }
54
24
  };
55
25
  MJActionEntityExtended = __decorate([
56
26
  RegisterClass(BaseEntity, 'MJ: Actions') // high priority make sure this class is used ahead of other things
@@ -1 +1 @@
1
- {"version":3,"file":"MJActionEntityExtended.js","sourceRoot":"","sources":["../src/MJActionEntityExtended.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAwE,MAAM,+BAA+B,CAAC;AACrI,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGhD,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,cAAc;IAAnD;;QAeK,iBAAY,GAA+B,IAAI,CAAC;QAYhD,YAAO,GAA0B,IAAI,CAAC;QAStC,UAAK,GAA4B,IAAI,CAAC;IAUlD,CAAC;IA7CG;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAGD;;OAEG;IACH,IAAW,WAAW;QAClB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,wBAAwB;YACxB,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAGD,IAAW,MAAM;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,kBAAkB;YAClB,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAGD,IAAW,SAAS;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,kBAAkB;YAClB,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;CAGJ,CAAA;AA9CY,sBAAsB;IADlC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,mEAAmE;GAChG,sBAAsB,CA8ClC"}
1
+ {"version":3,"file":"MJActionEntityExtended.js","sourceRoot":"","sources":["../src/MJActionEntityExtended.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGhD,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,cAAc;IACtD;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACvB,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CAaJ,CAAA;AA1BY,sBAAsB;IADlC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,mEAAmE;GAChG,sBAAsB,CA0BlC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EntityChangeContext.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityChangeContext.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/EntityChangeContext.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Tests for the change contract that makes transition filters possible.
3
+ *
4
+ * The distinction this whole module exists to draw is **state vs transition**: "Status is Approved"
5
+ * is true on every save after the approval, while "Status became Approved" is true exactly once.
6
+ * Every test here is really about keeping that line sharp, because the failure mode on the wrong
7
+ * side of it is a workflow that runs an agent on every subsequent save of the record — expensive,
8
+ * and invisible until someone reads a bill.
9
+ */
10
+ import { describe, it, expect } from 'vitest';
11
+ import { BuildEntityChangeContext, DidFieldChange, DidFieldChangeToValue, LooseEquals, ReadFieldValue, } from '../EntityChangeContext.js';
12
+ /** A stand-in for the parts of BaseEntity the builder reads. */
13
+ const entity = (IsSaved, fields) => ({ IsSaved, Fields: fields });
14
+ describe('BuildEntityChangeContext', () => {
15
+ it('reports only the fields whose value actually differs', () => {
16
+ const change = BuildEntityChangeContext(entity(true, [
17
+ { Name: 'Status', Value: 'Approved', OldValue: 'Pending' },
18
+ { Name: 'Amount', Value: 100, OldValue: 100 },
19
+ ]));
20
+ expect(change.ChangedFields).toEqual(['Status']);
21
+ });
22
+ it('does NOT report a field re-assigned its existing value', () => {
23
+ // The dirty flag would say yes here — assigning a field its current value still marks it
24
+ // dirty — and a filter firing on that reports a change that did not happen.
25
+ const change = BuildEntityChangeContext(entity(true, [
26
+ { Name: 'Status', Value: 'Approved', OldValue: 'Approved' },
27
+ ]));
28
+ expect(change.ChangedFields).toEqual([]);
29
+ });
30
+ it('treats a create as having no before, so nothing "changed"', () => {
31
+ // A record whose Status started at Approved did not BECOME approved. Saying otherwise would
32
+ // fire every "when Status becomes X" trigger on every insert.
33
+ const change = BuildEntityChangeContext(entity(false, [
34
+ { Name: 'Status', Value: 'Approved', OldValue: null },
35
+ ]));
36
+ expect(change.IsCreate).toBe(true);
37
+ expect(change.ChangedFields).toEqual([]);
38
+ expect(change.OldValues).toEqual({});
39
+ expect(change.NewValues).toEqual({ Status: 'Approved' });
40
+ });
41
+ it('carries both sides for an update', () => {
42
+ const change = BuildEntityChangeContext(entity(true, [
43
+ { Name: 'Status', Value: 'Approved', OldValue: 'Pending' },
44
+ ]));
45
+ expect(change.OldValues).toEqual({ Status: 'Pending' });
46
+ expect(change.NewValues).toEqual({ Status: 'Approved' });
47
+ });
48
+ it('counts a transition into null as a change', () => {
49
+ const change = BuildEntityChangeContext(entity(true, [
50
+ { Name: 'OwnerID', Value: null, OldValue: 'user-1' },
51
+ ]));
52
+ expect(change.ChangedFields).toEqual(['OwnerID']);
53
+ });
54
+ it('does not count null becoming undefined — both are absence', () => {
55
+ const change = BuildEntityChangeContext(entity(true, [
56
+ { Name: 'OwnerID', Value: undefined, OldValue: null },
57
+ ]));
58
+ expect(change.ChangedFields).toEqual([]);
59
+ });
60
+ });
61
+ describe('DidFieldChange', () => {
62
+ const change = BuildEntityChangeContext(entity(true, [
63
+ { Name: 'Status', Value: 'Approved', OldValue: 'Pending' },
64
+ ]));
65
+ it('matches regardless of case, as field names do everywhere else in MJ', () => {
66
+ expect(DidFieldChange(change, 'status')).toBe(true);
67
+ expect(DidFieldChange(change, ' Status ')).toBe(true);
68
+ });
69
+ it('is false for a field that did not change', () => {
70
+ expect(DidFieldChange(change, 'Amount')).toBe(false);
71
+ });
72
+ it('is false when there is no change context at all', () => {
73
+ // A direct invocation or a View fan-out has no save behind it. "I cannot tell" must read as
74
+ // false, because filters gate execution — the alternative is firing on a question nobody
75
+ // could answer.
76
+ expect(DidFieldChange(undefined, 'Status')).toBe(false);
77
+ });
78
+ });
79
+ describe('DidFieldChangeToValue', () => {
80
+ const toApproved = BuildEntityChangeContext(entity(true, [
81
+ { Name: 'Status', Value: 'Approved', OldValue: 'Pending' },
82
+ ]));
83
+ it('is true only when the field changed AND landed on the value', () => {
84
+ expect(DidFieldChangeToValue(toApproved, 'Status', 'Approved')).toBe(true);
85
+ expect(DidFieldChangeToValue(toApproved, 'Status', 'Rejected')).toBe(false);
86
+ });
87
+ it('is false when the field already held the value — that is state, not transition', () => {
88
+ const stillApproved = BuildEntityChangeContext(entity(true, [
89
+ { Name: 'Status', Value: 'Approved', OldValue: 'Approved' },
90
+ ]));
91
+ expect(DidFieldChangeToValue(stillApproved, 'Status', 'Approved')).toBe(false);
92
+ });
93
+ it('is false on a create, even though the new value matches', () => {
94
+ const created = BuildEntityChangeContext(entity(false, [
95
+ { Name: 'Status', Value: 'Approved', OldValue: null },
96
+ ]));
97
+ expect(DidFieldChangeToValue(created, 'Status', 'Approved')).toBe(false);
98
+ });
99
+ });
100
+ describe('LooseEquals — comparing across the string boundary metadata forces', () => {
101
+ it('matches a number against its string form', () => {
102
+ // A filter's configured value arrives as text; the field holds a number. Comparing strictly
103
+ // would make the filter silently never match, which reads as "my automation is broken".
104
+ expect(LooseEquals(1, '1')).toBe(true);
105
+ });
106
+ it('matches booleans written the several ways a database produces them', () => {
107
+ expect(LooseEquals(true, 'true')).toBe(true);
108
+ expect(LooseEquals(true, 1)).toBe(true);
109
+ expect(LooseEquals(false, '0')).toBe(true);
110
+ expect(LooseEquals(true, 'no')).toBe(false);
111
+ });
112
+ it('matches dates against their serialized form', () => {
113
+ const d = new Date('2026-01-01T00:00:00.000Z');
114
+ expect(LooseEquals(d, '2026-01-01T00:00:00.000Z')).toBe(true);
115
+ });
116
+ it('treats null and undefined as the same absence', () => {
117
+ expect(LooseEquals(null, undefined)).toBe(true);
118
+ expect(LooseEquals(null, '')).toBe(false);
119
+ });
120
+ it('ignores surrounding whitespace and case for strings', () => {
121
+ expect(LooseEquals(' Approved ', 'approved')).toBe(true);
122
+ });
123
+ });
124
+ describe('ReadFieldValue', () => {
125
+ it('reads case-insensitively', () => {
126
+ expect(ReadFieldValue({ Status: 'Approved' }, 'status')).toBe('Approved');
127
+ });
128
+ it('returns undefined for a field the record does not have', () => {
129
+ expect(ReadFieldValue({ Status: 'Approved' }, 'Nope')).toBeUndefined();
130
+ });
131
+ });
132
+ //# sourceMappingURL=EntityChangeContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityChangeContext.test.js","sourceRoot":"","sources":["../../src/__tests__/EntityChangeContext.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './ActionEngine-Base.js';
2
+ export * from './DurableEntityActionSubmitter.js';
3
+ export * from './EntityChangeContext.js';
2
4
  export * from './ParamRedaction.js';
3
5
  export * from './EntityActionScopeResolver.js';
4
6
  export * from './MJActionEntityExtended.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './ActionEngine-Base.js';
2
+ export * from './DurableEntityActionSubmitter.js';
3
+ export * from './EntityChangeContext.js';
2
4
  export * from './ParamRedaction.js';
3
5
  export * from './EntityActionScopeResolver.js';
4
6
  export * from './MJActionEntityExtended.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAG/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/actions-base",
3
3
  "type": "module",
4
- "version": "6.1.0-edge.0",
4
+ "version": "6.1.0-edge.2",
5
5
  "description": "Base Classes for MemberJunction Actions. This library is used on both server and network nodes.",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -15,10 +15,10 @@
15
15
  "typescript": "^5.9.3"
16
16
  },
17
17
  "dependencies": {
18
- "@memberjunction/code-execution": "6.1.0-edge.0",
19
- "@memberjunction/core": "6.1.0-edge.0",
20
- "@memberjunction/core-entities": "6.1.0-edge.0",
21
- "@memberjunction/global": "6.1.0-edge.0",
18
+ "@memberjunction/code-execution": "6.1.0-edge.2",
19
+ "@memberjunction/core": "6.1.0-edge.2",
20
+ "@memberjunction/core-entities": "6.1.0-edge.2",
21
+ "@memberjunction/global": "6.1.0-edge.2",
22
22
  "zod": "^3.25.0"
23
23
  },
24
24
  "repository": {