@memberjunction/global 5.41.0 → 5.43.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/README.md +89 -0
- package/dist/KeyedSerialTaskQueue.d.ts +60 -0
- package/dist/KeyedSerialTaskQueue.d.ts.map +1 -0
- package/dist/KeyedSerialTaskQueue.js +76 -0
- package/dist/KeyedSerialTaskQueue.js.map +1 -0
- package/dist/SafeExpressionEvaluator.d.ts +5 -0
- package/dist/SafeExpressionEvaluator.d.ts.map +1 -1
- package/dist/SafeExpressionEvaluator.js +26 -11
- package/dist/SafeExpressionEvaluator.js.map +1 -1
- package/dist/__tests__/FieldRulesEvaluator.test.d.ts +2 -0
- package/dist/__tests__/FieldRulesEvaluator.test.d.ts.map +1 -0
- package/dist/__tests__/FieldRulesEvaluator.test.js +167 -0
- package/dist/__tests__/FieldRulesEvaluator.test.js.map +1 -0
- package/dist/__tests__/KeyedSerialTaskQueue.test.d.ts +2 -0
- package/dist/__tests__/KeyedSerialTaskQueue.test.d.ts.map +1 -0
- package/dist/__tests__/KeyedSerialTaskQueue.test.js +91 -0
- package/dist/__tests__/KeyedSerialTaskQueue.test.js.map +1 -0
- package/dist/__tests__/UUIDCompliance.test.js +2 -0
- package/dist/__tests__/UUIDCompliance.test.js.map +1 -1
- package/dist/__tests__/valueMapping.test.d.ts +6 -0
- package/dist/__tests__/valueMapping.test.d.ts.map +1 -0
- package/dist/__tests__/valueMapping.test.js +68 -0
- package/dist/__tests__/valueMapping.test.js.map +1 -0
- package/dist/fieldRules/FieldRulesEvaluator.d.ts +34 -0
- package/dist/fieldRules/FieldRulesEvaluator.d.ts.map +1 -0
- package/dist/fieldRules/FieldRulesEvaluator.js +130 -0
- package/dist/fieldRules/FieldRulesEvaluator.js.map +1 -0
- package/dist/fieldRules/FieldTransformEngine.d.ts +44 -0
- package/dist/fieldRules/FieldTransformEngine.d.ts.map +1 -0
- package/dist/fieldRules/FieldTransformEngine.js +189 -0
- package/dist/fieldRules/FieldTransformEngine.js.map +1 -0
- package/dist/fieldRules/index.d.ts +6 -0
- package/dist/fieldRules/index.d.ts.map +1 -0
- package/dist/fieldRules/index.js +6 -0
- package/dist/fieldRules/index.js.map +1 -0
- package/dist/fieldRules/rules.d.ts +135 -0
- package/dist/fieldRules/rules.d.ts.map +1 -0
- package/dist/fieldRules/rules.js +2 -0
- package/dist/fieldRules/rules.js.map +1 -0
- package/dist/fieldRules/transformRegistry.d.ts +22 -0
- package/dist/fieldRules/transformRegistry.d.ts.map +1 -0
- package/dist/fieldRules/transformRegistry.js +33 -0
- package/dist/fieldRules/transformRegistry.js.map +1 -0
- package/dist/fieldRules/transforms.d.ts +102 -0
- package/dist/fieldRules/transforms.d.ts.map +1 -0
- package/dist/fieldRules/transforms.js +8 -0
- package/dist/fieldRules/transforms.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/valueMapping.d.ts +33 -0
- package/dist/valueMapping.d.ts.map +1 -0
- package/dist/valueMapping.js +104 -0
- package/dist/valueMapping.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { KeyedSerialTaskQueue } from '../KeyedSerialTaskQueue.js';
|
|
3
|
+
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
4
|
+
describe('KeyedSerialTaskQueue', () => {
|
|
5
|
+
it('serializes tasks for the same key in enqueue order', async () => {
|
|
6
|
+
const q = new KeyedSerialTaskQueue();
|
|
7
|
+
const key = {};
|
|
8
|
+
const order = [];
|
|
9
|
+
q.enqueue(key, async () => { await delay(20); order.push(1); });
|
|
10
|
+
q.enqueue(key, async () => { await delay(5); order.push(2); });
|
|
11
|
+
q.enqueue(key, async () => { order.push(3); });
|
|
12
|
+
await q.flush();
|
|
13
|
+
expect(order).toEqual([1, 2, 3]);
|
|
14
|
+
});
|
|
15
|
+
it('runs tasks for different keys concurrently', async () => {
|
|
16
|
+
const q = new KeyedSerialTaskQueue();
|
|
17
|
+
const order = [];
|
|
18
|
+
q.enqueue({}, async () => { await delay(30); order.push('slow'); });
|
|
19
|
+
q.enqueue({}, async () => { order.push('fast'); });
|
|
20
|
+
await q.flush();
|
|
21
|
+
// Different keys → concurrent → the fast one finishes first despite enqueuing second.
|
|
22
|
+
expect(order).toEqual(['fast', 'slow']);
|
|
23
|
+
});
|
|
24
|
+
it('is fire-and-forget — a thrown task resolves undefined, never rejects', async () => {
|
|
25
|
+
const q = new KeyedSerialTaskQueue();
|
|
26
|
+
await expect(q.enqueue({}, async () => { throw new Error('boom'); })).resolves.toBeUndefined();
|
|
27
|
+
});
|
|
28
|
+
it('resolves the task value on success and undefined on isOk-falsy', async () => {
|
|
29
|
+
const q = new KeyedSerialTaskQueue();
|
|
30
|
+
await expect(q.enqueue({}, async () => 'val', { isOk: () => true })).resolves.toBe('val');
|
|
31
|
+
await expect(q.enqueue({}, async () => false, { isOk: (v) => v === true })).resolves.toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
it('flush reports failures (reject OR isOk-falsy) and rejections (threw) + routes to onError', async () => {
|
|
34
|
+
const errors = [];
|
|
35
|
+
const q = new KeyedSerialTaskQueue({ onError: (e) => errors.push(e) });
|
|
36
|
+
q.enqueue({}, async () => 'ok');
|
|
37
|
+
q.enqueue({}, async () => { throw new Error('boom'); });
|
|
38
|
+
q.enqueue({}, async () => false, { isOk: (v) => v === true });
|
|
39
|
+
const res = await q.flush();
|
|
40
|
+
expect(res).toEqual({ failures: 2, rejections: 1 });
|
|
41
|
+
expect(errors.length).toBe(2);
|
|
42
|
+
});
|
|
43
|
+
it('drains on re-flush — a second flush only counts tasks enqueued after the first', async () => {
|
|
44
|
+
const q = new KeyedSerialTaskQueue();
|
|
45
|
+
q.enqueue({}, async () => { throw new Error('a'); });
|
|
46
|
+
expect(await q.flush()).toEqual({ failures: 1, rejections: 1 });
|
|
47
|
+
q.enqueue({}, async () => 'ok');
|
|
48
|
+
expect(await q.flush()).toEqual({ failures: 0, rejections: 0 });
|
|
49
|
+
});
|
|
50
|
+
it('flush with nothing pending resolves to zero counts', async () => {
|
|
51
|
+
const q = new KeyedSerialTaskQueue();
|
|
52
|
+
expect(await q.flush()).toEqual({ failures: 0, rejections: 0 });
|
|
53
|
+
});
|
|
54
|
+
it('a failed task does not break the chain for its key', async () => {
|
|
55
|
+
const q = new KeyedSerialTaskQueue();
|
|
56
|
+
const key = {};
|
|
57
|
+
const order = [];
|
|
58
|
+
q.enqueue(key, async () => { throw new Error('boom'); });
|
|
59
|
+
q.enqueue(key, async () => { order.push(2); });
|
|
60
|
+
await q.flush();
|
|
61
|
+
expect(order).toEqual([2]);
|
|
62
|
+
});
|
|
63
|
+
it('passes the label to onError', async () => {
|
|
64
|
+
const seen = [];
|
|
65
|
+
const q = new KeyedSerialTaskQueue({ onError: (_e, label) => seen.push(label) });
|
|
66
|
+
q.enqueue({}, async () => { throw new Error('boom'); }, { label: 'my-task' });
|
|
67
|
+
await q.flush();
|
|
68
|
+
expect(seen).toEqual(['my-task']);
|
|
69
|
+
});
|
|
70
|
+
it('flush awaits tasks enqueued before it began, not ones enqueued after', async () => {
|
|
71
|
+
const q = new KeyedSerialTaskQueue();
|
|
72
|
+
const done = [];
|
|
73
|
+
q.enqueue({}, async () => { done.push('first'); }); // fast — in the flush snapshot
|
|
74
|
+
const flushed = q.flush(); // snapshots only 'first'
|
|
75
|
+
q.enqueue({}, async () => { await delay(30); done.push('second'); }); // slow, after flush began
|
|
76
|
+
await flushed;
|
|
77
|
+
expect(done).toEqual(['first']); // flush awaited only 'first'; 'second' is still running
|
|
78
|
+
await q.flush(); // next window awaits 'second'
|
|
79
|
+
expect(done).toEqual(['first', 'second']);
|
|
80
|
+
});
|
|
81
|
+
it('is self-bounding — many settled tasks do not accumulate (flush still awaits in-flight)', async () => {
|
|
82
|
+
const q = new KeyedSerialTaskQueue();
|
|
83
|
+
for (let i = 0; i < 50; i++) {
|
|
84
|
+
q.enqueue({}, async () => { });
|
|
85
|
+
}
|
|
86
|
+
// All settle; a flush after they've drained reports zero and resolves promptly.
|
|
87
|
+
await delay(5);
|
|
88
|
+
expect(await q.flush()).toEqual({ failures: 0, rejections: 0 });
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=KeyedSerialTaskQueue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyedSerialTaskQueue.test.js","sourceRoot":"","sources":["../../src/__tests__/KeyedSerialTaskQueue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,8 @@ const KNOWN_EXCEPTIONS = {
|
|
|
53
53
|
// Add file paths (relative to packages/) and the reason they're excepted
|
|
54
54
|
// Example: 'SomePackage/src/file.ts': ['Uses numeric IDs, not UUIDs'],
|
|
55
55
|
'Angular/Explorer/dashboards/src/Integration/components/mapping-workspace/mapping-workspace.component.ts': ['LocalID is a local string identifier (e.g. "pending-1"), not a UUID'],
|
|
56
|
+
'Angular/Explorer/explorer-core/src/lib/resource-wrappers/livekit-room-resource.component.ts': ['Voice .ID is a provider-native voice slug (e.g. "echo"), not a UUID — RealtimeVoiceOption.ID'],
|
|
57
|
+
'Angular/Generic/mj-livekit-room/src/lib/mj-livekit-room.component.ts': ['Voice .ID is a provider-native voice slug (e.g. "echo"), not a UUID — RealtimeVoiceOption.ID'],
|
|
56
58
|
};
|
|
57
59
|
/** Normalize a path to forward slashes so EXCLUDE_PATTERNS and KNOWN_EXCEPTIONS lookups
|
|
58
60
|
* work identically on Windows and Unix. Without this, `\generated\` on Windows
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UUIDCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY;AAEzE,oEAAoE;AACpE,MAAM,aAAa,GAAG;IAClB,qDAAqD,EAAM,sDAAsD;IACjH,iBAAiB,EAA2C,qBAAqB;IACjF,qDAAqD,EAAM,kBAAkB;IAC7E,iBAAiB,EAA2C,qBAAqB;IACjF,yBAAyB,EAAoC,6CAA6C;CAC7G,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,gBAAgB,GAAG;IACrB,cAAc;IACd,UAAU;IACV,eAAe;IACf,aAAa;IACb,aAAa;IACb,WAAW;IACX,gBAAgB,EAAY,qBAAqB;IACjD,OAAO,EAAqB,8BAA8B;IAC1D,UAAU,EAAkB,yBAAyB;IACrD,QAAQ,EAAoB,mBAAmB;IAC/C,qBAAqB;CACxB,CAAC;AAEF;;yDAEyD;AACzD,MAAM,gBAAgB,GAA6B;IAC/C,yEAAyE;IACzE,uEAAuE;IACvE,yGAAyG,EAAE,CAAC,qEAAqE,CAAC;
|
|
1
|
+
{"version":3,"file":"UUIDCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valueMapping.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/valueMapping.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the generic value-mapping resolver (getValueAtPath / resolveMappingRef /
|
|
3
|
+
* resolveValueMapping) genericized from the Flow Agent input-mapping mechanism.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { getValueAtPath, resolveMappingRef, resolveValueMapping } from '../valueMapping.js';
|
|
7
|
+
describe('getValueAtPath', () => {
|
|
8
|
+
const obj = { a: { b: { c: 42 } }, items: [{ name: 'x' }, { name: 'y' }] };
|
|
9
|
+
it('reads nested dot paths', () => {
|
|
10
|
+
expect(getValueAtPath(obj, 'a.b.c')).toBe(42);
|
|
11
|
+
});
|
|
12
|
+
it('reads array-indexed paths', () => {
|
|
13
|
+
expect(getValueAtPath(obj, 'items[1].name')).toBe('y');
|
|
14
|
+
});
|
|
15
|
+
it('returns the root for an empty path', () => {
|
|
16
|
+
expect(getValueAtPath(obj, '')).toBe(obj);
|
|
17
|
+
});
|
|
18
|
+
it('returns undefined for missing segments / out-of-range indexes', () => {
|
|
19
|
+
expect(getValueAtPath(obj, 'a.x.y')).toBeUndefined();
|
|
20
|
+
expect(getValueAtPath(obj, 'items[5].name')).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('resolveMappingRef', () => {
|
|
24
|
+
const sources = { record: { Name: 'Ada', Tier: 3 }, context: { apiKey: 'k' }, $: { satisfaction: 'High' } };
|
|
25
|
+
it('resolves a static literal', () => {
|
|
26
|
+
expect(resolveMappingRef('static:today', sources)).toBe('today');
|
|
27
|
+
});
|
|
28
|
+
it('resolves a source.path reference', () => {
|
|
29
|
+
expect(resolveMappingRef('record.Name', sources)).toBe('Ada');
|
|
30
|
+
expect(resolveMappingRef('context.apiKey', sources)).toBe('k');
|
|
31
|
+
});
|
|
32
|
+
it('matches the source name case-insensitively', () => {
|
|
33
|
+
expect(resolveMappingRef('Record.Tier', sources)).toBe(3);
|
|
34
|
+
});
|
|
35
|
+
it('supports the $ result source for output reads', () => {
|
|
36
|
+
expect(resolveMappingRef('$.satisfaction', sources)).toBe('High');
|
|
37
|
+
});
|
|
38
|
+
it('resolves a bare source name to the whole source value (scalar sources)', () => {
|
|
39
|
+
expect(resolveMappingRef('record', sources)).toEqual({ Name: 'Ada', Tier: 3 });
|
|
40
|
+
expect(resolveMappingRef('record', { record: 'scalar' })).toBe('scalar');
|
|
41
|
+
});
|
|
42
|
+
it('treats an unrecognized prefix or plain string as a literal', () => {
|
|
43
|
+
expect(resolveMappingRef('Hello.World', sources)).toBe('Hello.World');
|
|
44
|
+
expect(resolveMappingRef('plain', sources)).toBe('plain');
|
|
45
|
+
});
|
|
46
|
+
it('returns missing source paths as undefined', () => {
|
|
47
|
+
expect(resolveMappingRef('record.Missing', sources)).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
it('passes non-string refs through unchanged', () => {
|
|
50
|
+
expect(resolveMappingRef(7, sources)).toBe(7);
|
|
51
|
+
expect(resolveMappingRef(true, sources)).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('resolveValueMapping', () => {
|
|
55
|
+
const sources = { record: { Name: 'Ada', Email: 'ada@x.io' } };
|
|
56
|
+
it('resolves a flat object mapping', () => {
|
|
57
|
+
const result = resolveValueMapping({ name: 'record.Name', label: 'static:Customer' }, sources);
|
|
58
|
+
expect(result).toEqual({ name: 'Ada', label: 'Customer' });
|
|
59
|
+
});
|
|
60
|
+
it('resolves nested objects and arrays recursively', () => {
|
|
61
|
+
const result = resolveValueMapping({ who: { primary: 'record.Name' }, tags: ['static:a', 'record.Email'] }, sources);
|
|
62
|
+
expect(result).toEqual({ who: { primary: 'Ada' }, tags: ['a', 'ada@x.io'] });
|
|
63
|
+
});
|
|
64
|
+
it('preserves primitives', () => {
|
|
65
|
+
expect(resolveValueMapping(5, sources)).toBe(5);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=valueMapping.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valueMapping.test.js","sourceRoot":"","sources":["../../src/__tests__/valueMapping.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEzF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAE3E,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC;IAE5G,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtE,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;IAE/D,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,mBAAmB,CAC9B,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,EACvE,OAAO,CACV,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EntityDocumentResolver, FieldChange, FieldRuleSet, LookupResolver, PromptResolver } from './rules.js';
|
|
2
|
+
/** Options for an evaluator instance. */
|
|
3
|
+
export interface FieldRulesEvaluatorOptions {
|
|
4
|
+
/** Resolver for `lookup` sources. Omit if no rule uses a lookup (a lookup rule then errors). */
|
|
5
|
+
LookupResolver?: LookupResolver;
|
|
6
|
+
/** Resolver for `prompt` sources. Omit if no rule uses a prompt (a prompt rule then errors). */
|
|
7
|
+
PromptResolver?: PromptResolver;
|
|
8
|
+
/** Resolver for `entityDocument` sources. Omit if no rule renders one (such a rule then errors). */
|
|
9
|
+
EntityDocumentResolver?: EntityDocumentResolver;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Computes the field changes a {@link FieldRuleSet} would make to a record — WITHOUT mutating anything.
|
|
13
|
+
*
|
|
14
|
+
* Returning a list of {@link FieldChange} (old → new per rule) is what makes a dry-run preview possible:
|
|
15
|
+
* the caller decides whether to apply. Conditions are evaluated with the safe expression evaluator;
|
|
16
|
+
* value formulas + the transform pipeline run through the shared {@link FieldTransformEngine}; entity
|
|
17
|
+
* lookups go through the injected resolver. The engine never touches a database itself.
|
|
18
|
+
*/
|
|
19
|
+
export declare class FieldRulesEvaluator {
|
|
20
|
+
private readonly transforms;
|
|
21
|
+
private readonly conditions;
|
|
22
|
+
private readonly lookupResolver?;
|
|
23
|
+
private readonly promptResolver?;
|
|
24
|
+
private readonly entityDocumentResolver?;
|
|
25
|
+
constructor(options?: FieldRulesEvaluatorOptions);
|
|
26
|
+
/** Computes one {@link FieldChange} per rule for a record (a row of field name → current value). */
|
|
27
|
+
ComputeChanges(record: Record<string, unknown>, ruleSet: FieldRuleSet): Promise<FieldChange[]>;
|
|
28
|
+
private evaluateRule;
|
|
29
|
+
private checkCondition;
|
|
30
|
+
private resolveSource;
|
|
31
|
+
private equal;
|
|
32
|
+
private message;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=FieldRulesEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldRulesEvaluator.d.ts","sourceRoot":"","sources":["../../src/fieldRules/FieldRulesEvaluator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,sBAAsB,EACtB,WAAW,EAEX,YAAY,EAEZ,cAAc,EACd,cAAc,EACjB,MAAM,SAAS,CAAC;AAEjB,yCAAyC;AACzC,MAAM,WAAW,0BAA0B;IACvC,gGAAgG;IAChG,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gGAAgG;IAChG,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,oGAAoG;IACpG,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACnD;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAyB;gBAErD,OAAO,CAAC,EAAE,0BAA0B;IAMhD,oGAAoG;IACvF,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAQ7F,YAAY;IAoC1B,OAAO,CAAC,cAAc;YAWR,aAAa;IA6C3B,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,OAAO;CAGlB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { SafeExpressionEvaluator } from '../SafeExpressionEvaluator.js';
|
|
2
|
+
import { FieldTransformEngine } from './FieldTransformEngine.js';
|
|
3
|
+
/**
|
|
4
|
+
* Computes the field changes a {@link FieldRuleSet} would make to a record — WITHOUT mutating anything.
|
|
5
|
+
*
|
|
6
|
+
* Returning a list of {@link FieldChange} (old → new per rule) is what makes a dry-run preview possible:
|
|
7
|
+
* the caller decides whether to apply. Conditions are evaluated with the safe expression evaluator;
|
|
8
|
+
* value formulas + the transform pipeline run through the shared {@link FieldTransformEngine}; entity
|
|
9
|
+
* lookups go through the injected resolver. The engine never touches a database itself.
|
|
10
|
+
*/
|
|
11
|
+
export class FieldRulesEvaluator {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.transforms = new FieldTransformEngine();
|
|
14
|
+
this.conditions = new SafeExpressionEvaluator();
|
|
15
|
+
this.lookupResolver = options?.LookupResolver;
|
|
16
|
+
this.promptResolver = options?.PromptResolver;
|
|
17
|
+
this.entityDocumentResolver = options?.EntityDocumentResolver;
|
|
18
|
+
}
|
|
19
|
+
/** Computes one {@link FieldChange} per rule for a record (a row of field name → current value). */
|
|
20
|
+
async ComputeChanges(record, ruleSet) {
|
|
21
|
+
const changes = [];
|
|
22
|
+
for (const rule of ruleSet.Rules) {
|
|
23
|
+
changes.push(await this.evaluateRule(record, rule));
|
|
24
|
+
}
|
|
25
|
+
return changes;
|
|
26
|
+
}
|
|
27
|
+
async evaluateRule(record, rule) {
|
|
28
|
+
const oldValue = record[rule.TargetField];
|
|
29
|
+
const unchanged = (extra) => ({
|
|
30
|
+
Field: rule.TargetField, OldValue: oldValue, NewValue: oldValue, Changed: false, Applied: false, ...extra,
|
|
31
|
+
});
|
|
32
|
+
const condition = this.checkCondition(record, rule);
|
|
33
|
+
if (condition.error)
|
|
34
|
+
return unchanged({ Error: condition.error });
|
|
35
|
+
if (!condition.passed)
|
|
36
|
+
return unchanged({ SkipReason: 'condition evaluated false' });
|
|
37
|
+
let value;
|
|
38
|
+
try {
|
|
39
|
+
value = await this.resolveSource(record, rule.Source);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return unchanged({ Error: `source: ${this.message(err)}` });
|
|
43
|
+
}
|
|
44
|
+
if (rule.Transforms?.length) {
|
|
45
|
+
try {
|
|
46
|
+
const result = this.transforms.ExecutePipeline(value, record, rule.Transforms);
|
|
47
|
+
if (result.Skipped)
|
|
48
|
+
return unchanged({ SkipReason: 'transform skipped the field' });
|
|
49
|
+
value = result.Value;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return unchanged({ Error: `transform: ${this.message(err)}` });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
Field: rule.TargetField,
|
|
57
|
+
OldValue: oldValue,
|
|
58
|
+
NewValue: value,
|
|
59
|
+
Changed: !this.equal(oldValue, value),
|
|
60
|
+
Applied: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
checkCondition(record, rule) {
|
|
64
|
+
if (!rule.Condition) {
|
|
65
|
+
return { passed: true };
|
|
66
|
+
}
|
|
67
|
+
const result = this.conditions.evaluate(rule.Condition, record);
|
|
68
|
+
if (!result.success) {
|
|
69
|
+
return { passed: false, error: `condition: ${result.error ?? 'invalid expression'}` };
|
|
70
|
+
}
|
|
71
|
+
return { passed: result.value === true };
|
|
72
|
+
}
|
|
73
|
+
async resolveSource(record, source) {
|
|
74
|
+
switch (source.Kind) {
|
|
75
|
+
case 'static':
|
|
76
|
+
return source.Value;
|
|
77
|
+
case 'field':
|
|
78
|
+
return record[source.Field];
|
|
79
|
+
case 'formula':
|
|
80
|
+
return this.transforms.Evaluate(source.Expression, undefined, record);
|
|
81
|
+
case 'lookup': {
|
|
82
|
+
if (!this.lookupResolver) {
|
|
83
|
+
throw new Error('a lookup rule was used but no LookupResolver was provided');
|
|
84
|
+
}
|
|
85
|
+
const matchValue = await this.resolveSource(record, source.Lookup.MatchValue);
|
|
86
|
+
const resolved = await this.lookupResolver({
|
|
87
|
+
Entity: source.Lookup.Entity,
|
|
88
|
+
MatchField: source.Lookup.MatchField,
|
|
89
|
+
MatchValue: matchValue,
|
|
90
|
+
ReturnField: source.Lookup.ReturnField,
|
|
91
|
+
});
|
|
92
|
+
return resolved === undefined ? (source.Lookup.Default ?? null) : resolved;
|
|
93
|
+
}
|
|
94
|
+
case 'prompt': {
|
|
95
|
+
if (!this.promptResolver) {
|
|
96
|
+
throw new Error('a prompt rule was used but no PromptResolver was provided');
|
|
97
|
+
}
|
|
98
|
+
// By default hand the WHOLE record to the prompt; otherwise resolve each shaped Data entry
|
|
99
|
+
// through the same source machinery (so Data values can be fields, formulas, statics, …).
|
|
100
|
+
let data = record;
|
|
101
|
+
if (source.Prompt.Data) {
|
|
102
|
+
data = {};
|
|
103
|
+
for (const [key, valueSource] of Object.entries(source.Prompt.Data)) {
|
|
104
|
+
data[key] = await this.resolveSource(record, valueSource);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return this.promptResolver({ PromptID: source.Prompt.PromptID, Data: data });
|
|
108
|
+
}
|
|
109
|
+
case 'entityDocument': {
|
|
110
|
+
if (!this.entityDocumentResolver) {
|
|
111
|
+
throw new Error('an entityDocument rule was used but no EntityDocumentResolver was provided');
|
|
112
|
+
}
|
|
113
|
+
return this.entityDocumentResolver({ EntityDocumentID: source.EntityDocument?.EntityDocumentID, Record: record });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
equal(a, b) {
|
|
118
|
+
if (a === b)
|
|
119
|
+
return true;
|
|
120
|
+
if (a instanceof Date && b instanceof Date)
|
|
121
|
+
return a.getTime() === b.getTime();
|
|
122
|
+
if (a == null && b == null)
|
|
123
|
+
return true;
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
message(err) {
|
|
127
|
+
return err instanceof Error ? err.message : String(err);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=FieldRulesEvaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldRulesEvaluator.js","sourceRoot":"","sources":["../../src/fieldRules/FieldRulesEvaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { TransformStep, TransformStepResult } from './transforms.js';
|
|
2
|
+
/** Signature of a compiled custom/formula expression: `(value, fields) => result`. */
|
|
3
|
+
export type CompiledExpression = (value: unknown, fields: Record<string, unknown>) => unknown;
|
|
4
|
+
/**
|
|
5
|
+
* Framework-agnostic engine that runs a field-value transform pipeline over a single `(value, fields)`
|
|
6
|
+
* pair. Lifted from the MemberJunction integration field-mapping engine so the integration sync AND the
|
|
7
|
+
* rules-based bulk-update processor share one implementation of every transform type.
|
|
8
|
+
*
|
|
9
|
+
* Holds an LRU cache of compiled custom/formula expressions (an identical expression compiles once, not
|
|
10
|
+
* once per record). A failed compile is cached as the `Error` it threw and re-thrown from cache, so a
|
|
11
|
+
* malformed expression is compiled exactly once across a whole batch.
|
|
12
|
+
*/
|
|
13
|
+
export declare class FieldTransformEngine {
|
|
14
|
+
private readonly compiledExpressionCache;
|
|
15
|
+
/**
|
|
16
|
+
* Runs `value` through every step of `steps`, returning the final value (or `Skipped` when an
|
|
17
|
+
* OnError='Skip' step drops the field). `fields` is the full record, available to combine/custom steps.
|
|
18
|
+
*/
|
|
19
|
+
ExecutePipeline(value: unknown, fields: Record<string, unknown>, steps: TransformStep[]): TransformStepResult;
|
|
20
|
+
/**
|
|
21
|
+
* Executes a single transform step, applying the configured transformation and handling errors
|
|
22
|
+
* according to the step's OnError strategy (default 'Null' — grace: null the field, keep going).
|
|
23
|
+
*/
|
|
24
|
+
ExecuteStep(step: TransformStep, value: unknown, fields: Record<string, unknown>): TransformStepResult;
|
|
25
|
+
/**
|
|
26
|
+
* Evaluates a value-producing expression against the record. Reuses the compiled-expression cache.
|
|
27
|
+
* The expression sees the current field value as `value` and all record fields as `fields`
|
|
28
|
+
* (e.g. `fields.FirstName + ' ' + fields.LastName`).
|
|
29
|
+
*/
|
|
30
|
+
Evaluate(expression: string, value: unknown, fields: Record<string, unknown>): unknown;
|
|
31
|
+
private dispatch;
|
|
32
|
+
private handleError;
|
|
33
|
+
private applyDirect;
|
|
34
|
+
private applyRegex;
|
|
35
|
+
private applySplit;
|
|
36
|
+
private applyCombine;
|
|
37
|
+
private applyLookup;
|
|
38
|
+
private applyFormat;
|
|
39
|
+
private applyCoerce;
|
|
40
|
+
private applySubstring;
|
|
41
|
+
private getCompiled;
|
|
42
|
+
private compile;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=FieldTransformEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldTransformEngine.d.ts","sourceRoot":"","sources":["../../src/fieldRules/FieldTransformEngine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,aAAa,EAEb,mBAAmB,EAUtB,MAAM,cAAc,CAAC;AAEtB,sFAAsF;AACtF,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;AAE9F;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAwD;IAEhG;;;OAGG;IACI,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,mBAAmB;IAYpH;;;OAGG;IACI,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB;IAS7G;;;;OAIG;IACI,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAI7F,OAAO,CAAC,QAAQ;IAoChB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,OAAO;CAQlB"}
|