@adtrackify/at-service-common 3.19.3 → 3.19.4
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/cjs/__tests__/clients/acuity-client.spec.js +0 -10
- package/dist/cjs/__tests__/clients/acuity-client.spec.js.map +1 -1
- package/dist/cjs/__tests__/libs/custom-measure-formula/custom-measure-formula-utils.spec.js +143 -0
- package/dist/cjs/__tests__/libs/custom-measure-formula/custom-measure-formula-utils.spec.js.map +1 -0
- package/dist/cjs/__tests__/services/acuity-api-service.spec.js +0 -20
- package/dist/cjs/__tests__/services/acuity-api-service.spec.js.map +1 -1
- package/dist/cjs/clients/third-party/acuity-client.d.ts +0 -1
- package/dist/cjs/clients/third-party/acuity-client.js +0 -6
- package/dist/cjs/clients/third-party/acuity-client.js.map +1 -1
- package/dist/cjs/libs/custom-measure-formula/custom-measure-formula-types.d.ts +47 -0
- package/dist/cjs/libs/custom-measure-formula/custom-measure-formula-types.js +26 -0
- package/dist/cjs/libs/custom-measure-formula/custom-measure-formula-types.js.map +1 -0
- package/dist/cjs/libs/custom-measure-formula/custom-measure-formula-utils.d.ts +7 -0
- package/dist/cjs/libs/custom-measure-formula/custom-measure-formula-utils.js +200 -0
- package/dist/cjs/libs/custom-measure-formula/custom-measure-formula-utils.js.map +1 -0
- package/dist/cjs/libs/custom-measure-formula/index.d.ts +2 -0
- package/dist/cjs/libs/custom-measure-formula/index.js +19 -0
- package/dist/cjs/libs/custom-measure-formula/index.js.map +1 -0
- package/dist/cjs/libs/index.d.ts +1 -0
- package/dist/cjs/libs/index.js +1 -0
- package/dist/cjs/libs/index.js.map +1 -1
- package/dist/cjs/services/acuity-api-service.d.ts +0 -1
- package/dist/cjs/services/acuity-api-service.js +0 -19
- package/dist/cjs/services/acuity-api-service.js.map +1 -1
- package/dist/cjs/services/db/custom-measures-db-service.d.ts +14 -0
- package/dist/cjs/services/db/custom-measures-db-service.js +49 -0
- package/dist/cjs/services/db/custom-measures-db-service.js.map +1 -0
- package/dist/cjs/services/db/index.d.ts +1 -1
- package/dist/cjs/services/db/index.js +1 -1
- package/dist/cjs/services/db/index.js.map +1 -1
- package/dist/cjs/services/db/purchased-contacts-db-service.d.ts +2 -16
- package/dist/cjs/services/db/purchased-contacts-db-service.js +1 -10
- package/dist/cjs/services/db/purchased-contacts-db-service.js.map +1 -1
- package/dist/esm/__tests__/clients/acuity-client.spec.js +0 -10
- package/dist/esm/__tests__/clients/acuity-client.spec.js.map +1 -1
- package/dist/esm/__tests__/libs/custom-measure-formula/custom-measure-formula-utils.spec.js +141 -0
- package/dist/esm/__tests__/libs/custom-measure-formula/custom-measure-formula-utils.spec.js.map +1 -0
- package/dist/esm/__tests__/services/acuity-api-service.spec.js +0 -20
- package/dist/esm/__tests__/services/acuity-api-service.spec.js.map +1 -1
- package/dist/esm/clients/third-party/acuity-client.d.ts +0 -1
- package/dist/esm/clients/third-party/acuity-client.js +0 -6
- package/dist/esm/clients/third-party/acuity-client.js.map +1 -1
- package/dist/esm/libs/custom-measure-formula/custom-measure-formula-types.d.ts +47 -0
- package/dist/esm/libs/custom-measure-formula/custom-measure-formula-types.js +23 -0
- package/dist/esm/libs/custom-measure-formula/custom-measure-formula-types.js.map +1 -0
- package/dist/esm/libs/custom-measure-formula/custom-measure-formula-utils.d.ts +7 -0
- package/dist/esm/libs/custom-measure-formula/custom-measure-formula-utils.js +191 -0
- package/dist/esm/libs/custom-measure-formula/custom-measure-formula-utils.js.map +1 -0
- package/dist/esm/libs/custom-measure-formula/index.d.ts +2 -0
- package/dist/esm/libs/custom-measure-formula/index.js +3 -0
- package/dist/esm/libs/custom-measure-formula/index.js.map +1 -0
- package/dist/esm/libs/index.d.ts +1 -0
- package/dist/esm/libs/index.js +1 -0
- package/dist/esm/libs/index.js.map +1 -1
- package/dist/esm/services/acuity-api-service.d.ts +0 -1
- package/dist/esm/services/acuity-api-service.js +0 -19
- package/dist/esm/services/acuity-api-service.js.map +1 -1
- package/dist/esm/services/db/custom-measures-db-service.d.ts +14 -0
- package/dist/esm/services/db/custom-measures-db-service.js +45 -0
- package/dist/esm/services/db/custom-measures-db-service.js.map +1 -0
- package/dist/esm/services/db/index.d.ts +1 -1
- package/dist/esm/services/db/index.js +1 -1
- package/dist/esm/services/db/index.js.map +1 -1
- package/dist/esm/services/db/purchased-contacts-db-service.d.ts +2 -16
- package/dist/esm/services/db/purchased-contacts-db-service.js +1 -10
- package/dist/esm/services/db/purchased-contacts-db-service.js.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/__tests__/db/contact-enrichments-db-service.spec.js +0 -66
- package/dist/cjs/__tests__/db/contact-enrichments-db-service.spec.js.map +0 -1
- package/dist/cjs/services/db/contact-enrichments-db-service.d.ts +0 -16
- package/dist/cjs/services/db/contact-enrichments-db-service.js +0 -71
- package/dist/cjs/services/db/contact-enrichments-db-service.js.map +0 -1
- package/dist/esm/__tests__/db/contact-enrichments-db-service.spec.js +0 -64
- package/dist/esm/__tests__/db/contact-enrichments-db-service.spec.js.map +0 -1
- package/dist/esm/services/db/contact-enrichments-db-service.d.ts +0 -16
- package/dist/esm/services/db/contact-enrichments-db-service.js +0 -67
- package/dist/esm/services/db/contact-enrichments-db-service.js.map +0 -1
- /package/dist/cjs/__tests__/{db/contact-enrichments-db-service.spec.d.ts → libs/custom-measure-formula/custom-measure-formula-utils.spec.d.ts} +0 -0
- /package/dist/esm/__tests__/{db/contact-enrichments-db-service.spec.d.ts → libs/custom-measure-formula/custom-measure-formula-utils.spec.d.ts} +0 -0
|
@@ -24,16 +24,6 @@ describe('AcuityClient', () => {
|
|
|
24
24
|
expect(config.headers.Authorization).toContain('MD5HASH');
|
|
25
25
|
expect(response).toEqual({ status: 200, data: { identities: [{ id: 1 }] } });
|
|
26
26
|
});
|
|
27
|
-
it('requests byEmail with the template id, a url-encoded email, and a bearer auth header', async () => {
|
|
28
|
-
mockGet.mockResolvedValue({ status: 200, data: { identities: [{ id: 1 }] } });
|
|
29
|
-
const client = new acuity_client_1.AcuityClient('KEY_ID', 'SECRET');
|
|
30
|
-
const response = await client.getContactsByEmail('a+b@x.com');
|
|
31
|
-
expect(mockGet).toHaveBeenCalledTimes(1);
|
|
32
|
-
const [url, config] = mockGet.mock.calls[0];
|
|
33
|
-
expect(url).toBe('/v2/identities/byEmail?email=a%2Bb%40x.com&template=1701523581');
|
|
34
|
-
expect(config.headers.Authorization).toMatch(/^Bearer KEY_ID/);
|
|
35
|
-
expect(response).toEqual({ status: 200, data: { identities: [{ id: 1 }] } });
|
|
36
|
-
});
|
|
37
27
|
it('passes a non-200 response through without throwing', async () => {
|
|
38
28
|
mockGet.mockResolvedValue({ status: 500, data: undefined });
|
|
39
29
|
const client = new acuity_client_1.AcuityClient('KEY_ID', 'SECRET');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acuity-client.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/clients/acuity-client.spec.ts"],"names":[],"mappings":";;AAGA,mDAAyD;AAEzD,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;CACtD,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;CAC1C,CAAC,CAAC,CAAC;AAEJ,2EAAuE;AAGvE,MAAM,OAAO,GAAI,0BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAgB,CAAC;AAEvF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAI,4BAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"acuity-client.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/clients/acuity-client.spec.ts"],"names":[],"mappings":";;AAGA,mDAAyD;AAEzD,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;CACtD,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;CAC1C,CAAC,CAAC,CAAC;AAEJ,2EAAuE;AAGvE,MAAM,OAAO,GAAI,0BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAgB,CAAC;AAEvF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAI,4BAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,OAAO,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,4BAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEzD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_js_1 = require("../../../libs/custom-measure-formula/index.js");
|
|
4
|
+
const SAMPLE_ULID = '01ARZ3NDEKTSV4RRFFQ69G5FAV';
|
|
5
|
+
describe('custom measure formula utils', () => {
|
|
6
|
+
describe('isCustomMeasureId', () => {
|
|
7
|
+
it('should detect bare-ULID custom measure ids and reject native dotted ids', () => {
|
|
8
|
+
expect((0, index_js_1.isCustomMeasureId)(SAMPLE_ULID)).toBe(true);
|
|
9
|
+
expect((0, index_js_1.isCustomMeasureId)('orders.net_revenue')).toBe(false);
|
|
10
|
+
expect((0, index_js_1.isCustomMeasureId)('channel.spend')).toBe(false);
|
|
11
|
+
expect((0, index_js_1.isCustomMeasureId)('custom.1234')).toBe(false);
|
|
12
|
+
expect((0, index_js_1.isCustomMeasureId)(SAMPLE_ULID.toLowerCase())).toBe(false);
|
|
13
|
+
expect((0, index_js_1.isCustomMeasureId)(undefined)).toBe(false);
|
|
14
|
+
expect((0, index_js_1.isCustomMeasureId)('')).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('tokenizeFormula', () => {
|
|
18
|
+
it('should tokenize measures, numbers, operators and parens', () => {
|
|
19
|
+
const tokens = (0, index_js_1.tokenizeFormula)('(orders.net_revenue - channel.spend) / channel.spend * 100');
|
|
20
|
+
expect(tokens.map((t) => t.type)).toEqual([
|
|
21
|
+
'lparen',
|
|
22
|
+
'measure',
|
|
23
|
+
'operator',
|
|
24
|
+
'measure',
|
|
25
|
+
'rparen',
|
|
26
|
+
'operator',
|
|
27
|
+
'measure',
|
|
28
|
+
'operator',
|
|
29
|
+
'number',
|
|
30
|
+
]);
|
|
31
|
+
expect(tokens[1].value).toBe('orders.net_revenue');
|
|
32
|
+
expect(tokens[8].value).toBe('100');
|
|
33
|
+
});
|
|
34
|
+
it('should tokenize decimal numbers and dotted measures ending in digits', () => {
|
|
35
|
+
const tokens = (0, index_js_1.tokenizeFormula)('orders.cm3 * 0.3');
|
|
36
|
+
expect(tokens.map((t) => t.value)).toEqual(['orders.cm3', '*', '0.3']);
|
|
37
|
+
});
|
|
38
|
+
it('should reject invalid characters', () => {
|
|
39
|
+
expect(() => (0, index_js_1.tokenizeFormula)('orders.revenue & 2')).toThrow(/Invalid character/);
|
|
40
|
+
});
|
|
41
|
+
it('should reject non-dotted identifiers', () => {
|
|
42
|
+
expect(() => (0, index_js_1.tokenizeFormula)('revenue + 1')).toThrow(/Invalid measure reference/);
|
|
43
|
+
});
|
|
44
|
+
it('should reject malformed numbers', () => {
|
|
45
|
+
expect(() => (0, index_js_1.tokenizeFormula)('1.2.3 + orders.count')).toThrow(/Invalid number/);
|
|
46
|
+
});
|
|
47
|
+
it('should reject an empty formula', () => {
|
|
48
|
+
expect(() => (0, index_js_1.tokenizeFormula)(' ')).toThrow(/empty/);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('parseFormula', () => {
|
|
52
|
+
it('should honour operator precedence', () => {
|
|
53
|
+
const ast = (0, index_js_1.parseFormula)('orders.a + orders.b * orders.c');
|
|
54
|
+
expect(ast).toEqual({
|
|
55
|
+
type: 'binary',
|
|
56
|
+
operator: '+',
|
|
57
|
+
left: { type: 'measure', measure: 'orders.a' },
|
|
58
|
+
right: {
|
|
59
|
+
type: 'binary',
|
|
60
|
+
operator: '*',
|
|
61
|
+
left: { type: 'measure', measure: 'orders.b' },
|
|
62
|
+
right: { type: 'measure', measure: 'orders.c' },
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
it('should honour parentheses and unary minus', () => {
|
|
67
|
+
const ast = (0, index_js_1.parseFormula)('-(orders.a - orders.b)');
|
|
68
|
+
expect(ast).toEqual({
|
|
69
|
+
type: 'unary',
|
|
70
|
+
operator: '-',
|
|
71
|
+
operand: {
|
|
72
|
+
type: 'binary',
|
|
73
|
+
operator: '-',
|
|
74
|
+
left: { type: 'measure', measure: 'orders.a' },
|
|
75
|
+
right: { type: 'measure', measure: 'orders.b' },
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('should reject unbalanced parentheses', () => {
|
|
80
|
+
expect(() => (0, index_js_1.parseFormula)('(orders.a + orders.b')).toThrow(/Unbalanced parentheses/);
|
|
81
|
+
});
|
|
82
|
+
it('should reject trailing operators', () => {
|
|
83
|
+
expect(() => (0, index_js_1.parseFormula)('orders.a +')).toThrow(/Unexpected end of formula/);
|
|
84
|
+
});
|
|
85
|
+
it('should reject dangling tokens', () => {
|
|
86
|
+
expect(() => (0, index_js_1.parseFormula)('orders.a orders.b')).toThrow(/Unexpected token/);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('collectFormulaMeasures', () => {
|
|
90
|
+
it('should return unique measures in order', () => {
|
|
91
|
+
const ast = (0, index_js_1.parseFormula)('(orders.net_revenue - channel.spend) / channel.spend');
|
|
92
|
+
expect((0, index_js_1.collectFormulaMeasures)(ast)).toEqual(['orders.net_revenue', 'channel.spend']);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('evaluateFormulaAst', () => {
|
|
96
|
+
const values = new Map([
|
|
97
|
+
['orders.net_revenue', 1000],
|
|
98
|
+
['channel.spend', 250],
|
|
99
|
+
['orders.count', 0],
|
|
100
|
+
]);
|
|
101
|
+
it('should evaluate a ratio with percentage scaling', () => {
|
|
102
|
+
const ast = (0, index_js_1.parseFormula)('(orders.net_revenue - channel.spend) / channel.spend * 100');
|
|
103
|
+
expect((0, index_js_1.evaluateFormulaAst)(ast, values)).toBe(300);
|
|
104
|
+
});
|
|
105
|
+
it('should return 0 on division by zero (matches SQL nullif semantics)', () => {
|
|
106
|
+
const ast = (0, index_js_1.parseFormula)('orders.net_revenue / orders.count');
|
|
107
|
+
expect((0, index_js_1.evaluateFormulaAst)(ast, values)).toBe(0);
|
|
108
|
+
});
|
|
109
|
+
it('should treat a missing operand as 0 (matches SQL COALESCE semantics)', () => {
|
|
110
|
+
const ast = (0, index_js_1.parseFormula)('orders.net_revenue - orders.unknown');
|
|
111
|
+
expect((0, index_js_1.evaluateFormulaAst)(ast, values)).toBe(1000);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('validateFormula', () => {
|
|
115
|
+
const knownOperands = new Set(['orders.net_revenue', 'channel.spend', 'orders.count']);
|
|
116
|
+
it('should accept a valid formula', () => {
|
|
117
|
+
const result = (0, index_js_1.validateFormula)('(orders.net_revenue - channel.spend) / channel.spend * 100', { knownOperands });
|
|
118
|
+
expect(result.valid).toBe(true);
|
|
119
|
+
expect(result.errors).toEqual([]);
|
|
120
|
+
expect(result.ast).toBeDefined();
|
|
121
|
+
});
|
|
122
|
+
it('should reject an unknown operand', () => {
|
|
123
|
+
const result = (0, index_js_1.validateFormula)('orders.net_revenue / orders.mystery', { knownOperands });
|
|
124
|
+
expect(result.valid).toBe(false);
|
|
125
|
+
expect(result.errors[0]).toMatch(/Unknown or unsupported measure/);
|
|
126
|
+
});
|
|
127
|
+
it('should reject a pure-constant formula', () => {
|
|
128
|
+
const result = (0, index_js_1.validateFormula)('1 + 2', { knownOperands });
|
|
129
|
+
expect(result.valid).toBe(false);
|
|
130
|
+
expect(result.errors[0]).toMatch(/at least one measure/);
|
|
131
|
+
});
|
|
132
|
+
it('should surface syntax errors', () => {
|
|
133
|
+
const result = (0, index_js_1.validateFormula)('(orders.count + ', { knownOperands });
|
|
134
|
+
expect(result.valid).toBe(false);
|
|
135
|
+
expect(result.errors.length).toBe(1);
|
|
136
|
+
});
|
|
137
|
+
it('should run syntactic-only when no operand predicate is supplied', () => {
|
|
138
|
+
const result = (0, index_js_1.validateFormula)('orders.net_revenue / channel.spend');
|
|
139
|
+
expect(result.valid).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=custom-measure-formula-utils.spec.js.map
|
package/dist/cjs/__tests__/libs/custom-measure-formula/custom-measure-formula-utils.spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-measure-formula-utils.spec.js","sourceRoot":"","sources":["../../../../../src/__tests__/libs/custom-measure-formula/custom-measure-formula-utils.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const mockGetContactsByMd5 = jest.fn();
|
|
4
|
-
const mockGetContactsByEmail = jest.fn();
|
|
5
4
|
jest.mock('../../clients/third-party/acuity-client', () => ({
|
|
6
5
|
AcuityClient: jest.fn().mockImplementation(() => ({
|
|
7
6
|
getContactsByMd5: mockGetContactsByMd5,
|
|
8
|
-
getContactsByEmail: mockGetContactsByEmail,
|
|
9
7
|
})),
|
|
10
8
|
}));
|
|
11
9
|
jest.mock('../../helpers/logging-helper', () => ({
|
|
@@ -36,24 +34,6 @@ describe('AcuityApiService', () => {
|
|
|
36
34
|
expect(result).toBeNull();
|
|
37
35
|
});
|
|
38
36
|
});
|
|
39
|
-
describe('getAcuityContactsByEmail', () => {
|
|
40
|
-
it('returns the response data on a 200', async () => {
|
|
41
|
-
mockGetContactsByEmail.mockResolvedValue({ status: 200, data: { identities: [{ id: 1 }] } });
|
|
42
|
-
const result = await service.getAcuityContactsByEmail('pixel', 'identity', 'a@x.com', DESTINATION);
|
|
43
|
-
expect(mockGetContactsByEmail).toHaveBeenCalledWith('a@x.com');
|
|
44
|
-
expect(result).toEqual({ identities: [{ id: 1 }] });
|
|
45
|
-
});
|
|
46
|
-
it('returns null on a non-200 response', async () => {
|
|
47
|
-
mockGetContactsByEmail.mockResolvedValue({ status: 404, data: undefined });
|
|
48
|
-
const result = await service.getAcuityContactsByEmail('pixel', 'identity', 'a@x.com', DESTINATION);
|
|
49
|
-
expect(result).toBeNull();
|
|
50
|
-
});
|
|
51
|
-
it('returns null when the client throws', async () => {
|
|
52
|
-
mockGetContactsByEmail.mockRejectedValue(new Error('network'));
|
|
53
|
-
const result = await service.getAcuityContactsByEmail('pixel', 'identity', 'a@x.com', DESTINATION);
|
|
54
|
-
expect(result).toBeNull();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
37
|
describe('getAcuityContactsByMd5Batch', () => {
|
|
58
38
|
it('aggregates 200 identities keyed by md5 and skips non-200 hashes', async () => {
|
|
59
39
|
mockGetContactsByMd5
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acuity-api-service.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/services/acuity-api-service.spec.ts"],"names":[],"mappings":";;AAKA,MAAM,oBAAoB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"acuity-api-service.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/services/acuity-api-service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,5 @@ export declare class AcuityClient {
|
|
|
5
5
|
private AA_SECRET;
|
|
6
6
|
constructor(acuityKeyId: string, acuitySecret: string);
|
|
7
7
|
getContactsByMd5: (md5Hash: string) => Promise<ApiResponse<AcuityContactResponse>>;
|
|
8
|
-
getContactsByEmail: (email: string) => Promise<ApiResponse<AcuityContactResponse>>;
|
|
9
8
|
private generateAuthorization;
|
|
10
9
|
}
|
|
@@ -25,12 +25,6 @@ class AcuityClient {
|
|
|
25
25
|
});
|
|
26
26
|
return response;
|
|
27
27
|
};
|
|
28
|
-
getContactsByEmail = async (email) => {
|
|
29
|
-
const response = await client.get(`/v2/identities/byEmail?email=${encodeURIComponent(email)}&template=${AA_TEMPLATE_ID}`, {
|
|
30
|
-
headers: { Authorization: this.generateAuthorization() },
|
|
31
|
-
});
|
|
32
|
-
return response;
|
|
33
|
-
};
|
|
34
28
|
generateAuthorization = () => {
|
|
35
29
|
const now = Date.now().toString(36);
|
|
36
30
|
const hash = (0, crypto_1.generateMd5Hash)(`${now}${this.AA_SECRET}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acuity-client.js","sourceRoot":"","sources":["../../../../src/clients/third-party/acuity-client.ts"],"names":[],"mappings":";;;AAAA,wCAA8C;AAE9C,8CAAoD;AAGpD,MAAM,UAAU,GAAG,gCAAgC,CAAC;AACpD,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,MAAM,GAAG,IAAA,0BAAgB,EAAC;IAC9B,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE;QACP,MAAM,EAAE,kBAAkB;QAC1B,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAC;AAEH,MAAa,YAAY;IACf,SAAS,CAAS;IAClB,SAAS,CAAS;IAE1B,YAAY,WAAmB,EAAE,YAAoB;QACnD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;IAChC,CAAC;IAEM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAA+C,EAAE;QAC/F,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,OAAO,aAAa,cAAc,EAAE,EAAE;YAClG,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,qBAAqB,EAAE,EAAE;SACzD,CAAC,CAAC;QACH,OAAO,QAA8C,CAAC;IACxD,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"acuity-client.js","sourceRoot":"","sources":["../../../../src/clients/third-party/acuity-client.ts"],"names":[],"mappings":";;;AAAA,wCAA8C;AAE9C,8CAAoD;AAGpD,MAAM,UAAU,GAAG,gCAAgC,CAAC;AACpD,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,MAAM,GAAG,IAAA,0BAAgB,EAAC;IAC9B,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE;QACP,MAAM,EAAE,kBAAkB;QAC1B,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAC;AAEH,MAAa,YAAY;IACf,SAAS,CAAS;IAClB,SAAS,CAAS;IAE1B,YAAY,WAAmB,EAAE,YAAoB;QACnD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;IAChC,CAAC;IAEM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAA+C,EAAE;QAC/F,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,OAAO,aAAa,cAAc,EAAE,EAAE;YAClG,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,qBAAqB,EAAE,EAAE;SACzD,CAAC,CAAC;QACH,OAAO,QAA8C,CAAC;IACxD,CAAC,CAAC;IAEM,qBAAqB,GAAG,GAAW,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAA,wBAAe,EAAC,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACxD,OAAO,UAAU,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;IACjD,CAAC,CAAC;CACH;AArBD,oCAqBC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare enum FORMULA_OPERATOR {
|
|
2
|
+
ADD = "+",
|
|
3
|
+
SUBTRACT = "-",
|
|
4
|
+
MULTIPLY = "*",
|
|
5
|
+
DIVIDE = "/"
|
|
6
|
+
}
|
|
7
|
+
export declare enum FORMULA_TOKEN_TYPE {
|
|
8
|
+
NUMBER = "number",
|
|
9
|
+
MEASURE = "measure",
|
|
10
|
+
OPERATOR = "operator",
|
|
11
|
+
LPAREN = "lparen",
|
|
12
|
+
RPAREN = "rparen"
|
|
13
|
+
}
|
|
14
|
+
export declare enum FORMULA_NODE_TYPE {
|
|
15
|
+
NUMBER = "number",
|
|
16
|
+
MEASURE = "measure",
|
|
17
|
+
UNARY = "unary",
|
|
18
|
+
BINARY = "binary"
|
|
19
|
+
}
|
|
20
|
+
export interface FormulaToken {
|
|
21
|
+
type: FORMULA_TOKEN_TYPE;
|
|
22
|
+
value: string;
|
|
23
|
+
}
|
|
24
|
+
export type FormulaAst = {
|
|
25
|
+
type: FORMULA_NODE_TYPE.NUMBER;
|
|
26
|
+
value: number;
|
|
27
|
+
} | {
|
|
28
|
+
type: FORMULA_NODE_TYPE.MEASURE;
|
|
29
|
+
measure: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: FORMULA_NODE_TYPE.UNARY;
|
|
32
|
+
operator: FORMULA_OPERATOR.SUBTRACT;
|
|
33
|
+
operand: FormulaAst;
|
|
34
|
+
} | {
|
|
35
|
+
type: FORMULA_NODE_TYPE.BINARY;
|
|
36
|
+
operator: FORMULA_OPERATOR;
|
|
37
|
+
left: FormulaAst;
|
|
38
|
+
right: FormulaAst;
|
|
39
|
+
};
|
|
40
|
+
export interface FormulaValidationOptions {
|
|
41
|
+
knownOperands?: ReadonlySet<string>;
|
|
42
|
+
}
|
|
43
|
+
export interface FormulaValidationResult {
|
|
44
|
+
valid: boolean;
|
|
45
|
+
errors: string[];
|
|
46
|
+
ast?: FormulaAst;
|
|
47
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FORMULA_NODE_TYPE = exports.FORMULA_TOKEN_TYPE = exports.FORMULA_OPERATOR = void 0;
|
|
4
|
+
var FORMULA_OPERATOR;
|
|
5
|
+
(function (FORMULA_OPERATOR) {
|
|
6
|
+
FORMULA_OPERATOR["ADD"] = "+";
|
|
7
|
+
FORMULA_OPERATOR["SUBTRACT"] = "-";
|
|
8
|
+
FORMULA_OPERATOR["MULTIPLY"] = "*";
|
|
9
|
+
FORMULA_OPERATOR["DIVIDE"] = "/";
|
|
10
|
+
})(FORMULA_OPERATOR = exports.FORMULA_OPERATOR || (exports.FORMULA_OPERATOR = {}));
|
|
11
|
+
var FORMULA_TOKEN_TYPE;
|
|
12
|
+
(function (FORMULA_TOKEN_TYPE) {
|
|
13
|
+
FORMULA_TOKEN_TYPE["NUMBER"] = "number";
|
|
14
|
+
FORMULA_TOKEN_TYPE["MEASURE"] = "measure";
|
|
15
|
+
FORMULA_TOKEN_TYPE["OPERATOR"] = "operator";
|
|
16
|
+
FORMULA_TOKEN_TYPE["LPAREN"] = "lparen";
|
|
17
|
+
FORMULA_TOKEN_TYPE["RPAREN"] = "rparen";
|
|
18
|
+
})(FORMULA_TOKEN_TYPE = exports.FORMULA_TOKEN_TYPE || (exports.FORMULA_TOKEN_TYPE = {}));
|
|
19
|
+
var FORMULA_NODE_TYPE;
|
|
20
|
+
(function (FORMULA_NODE_TYPE) {
|
|
21
|
+
FORMULA_NODE_TYPE["NUMBER"] = "number";
|
|
22
|
+
FORMULA_NODE_TYPE["MEASURE"] = "measure";
|
|
23
|
+
FORMULA_NODE_TYPE["UNARY"] = "unary";
|
|
24
|
+
FORMULA_NODE_TYPE["BINARY"] = "binary";
|
|
25
|
+
})(FORMULA_NODE_TYPE = exports.FORMULA_NODE_TYPE || (exports.FORMULA_NODE_TYPE = {}));
|
|
26
|
+
//# sourceMappingURL=custom-measure-formula-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-measure-formula-types.js","sourceRoot":"","sources":["../../../../src/libs/custom-measure-formula/custom-measure-formula-types.ts"],"names":[],"mappings":";;;AAGA,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,6BAAS,CAAA;IACT,kCAAc,CAAA;IACd,kCAAc,CAAA;IACd,gCAAY,CAAA;AACd,CAAC,EALW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAK3B;AAED,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,uCAAiB,CAAA;IACjB,yCAAmB,CAAA;IACnB,2CAAqB,CAAA;IACrB,uCAAiB,CAAA;IACjB,uCAAiB,CAAA;AACnB,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AAED,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,sCAAiB,CAAA;IACjB,wCAAmB,CAAA;IACnB,oCAAe,CAAA;IACf,sCAAiB,CAAA;AACnB,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FormulaAst, FormulaToken, FormulaValidationOptions, FormulaValidationResult } from './custom-measure-formula-types.js';
|
|
2
|
+
export declare const isCustomMeasureId: (id?: string) => boolean;
|
|
3
|
+
export declare const tokenizeFormula: (formula: string) => FormulaToken[];
|
|
4
|
+
export declare const parseFormula: (formula: string) => FormulaAst;
|
|
5
|
+
export declare const collectFormulaMeasures: (ast: FormulaAst) => string[];
|
|
6
|
+
export declare const evaluateFormulaAst: (ast: FormulaAst, operandValues: ReadonlyMap<string, number | null | undefined>) => number;
|
|
7
|
+
export declare const validateFormula: (formula: string, options?: FormulaValidationOptions) => FormulaValidationResult;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateFormula = exports.evaluateFormulaAst = exports.collectFormulaMeasures = exports.parseFormula = exports.tokenizeFormula = exports.isCustomMeasureId = void 0;
|
|
4
|
+
const custom_measure_formula_types_js_1 = require("./custom-measure-formula-types.js");
|
|
5
|
+
const ULID_PATTERN = /^[0-9A-HJKMNP-TV-Z]{26}$/;
|
|
6
|
+
const NUMBER_PATTERN = /^[0-9]+(\.[0-9]+)?$/;
|
|
7
|
+
const MEASURE_PATTERN = /^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$/;
|
|
8
|
+
const ALLOWED_CHARS_PATTERN = /[^a-z0-9_.+\-*/()\s]/;
|
|
9
|
+
const isCustomMeasureId = (id) => {
|
|
10
|
+
return !!id && ULID_PATTERN.test(id);
|
|
11
|
+
};
|
|
12
|
+
exports.isCustomMeasureId = isCustomMeasureId;
|
|
13
|
+
const tokenizeFormula = (formula) => {
|
|
14
|
+
if (!formula || formula.trim().length === 0) {
|
|
15
|
+
throw new Error('Formula is empty');
|
|
16
|
+
}
|
|
17
|
+
const invalidChar = formula.match(ALLOWED_CHARS_PATTERN);
|
|
18
|
+
if (invalidChar) {
|
|
19
|
+
throw new Error(`Invalid character in formula: '${invalidChar[0]}'`);
|
|
20
|
+
}
|
|
21
|
+
const tokens = [];
|
|
22
|
+
let i = 0;
|
|
23
|
+
while (i < formula.length) {
|
|
24
|
+
const char = formula[i];
|
|
25
|
+
if (/\s/.test(char)) {
|
|
26
|
+
i += 1;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (char === '(' || char === ')') {
|
|
30
|
+
tokens.push({ type: char === '(' ? custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.LPAREN : custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.RPAREN, value: char });
|
|
31
|
+
i += 1;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (char === '+' || char === '-' || char === '*' || char === '/') {
|
|
35
|
+
tokens.push({ type: custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.OPERATOR, value: char });
|
|
36
|
+
i += 1;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (char >= '0' && char <= '9') {
|
|
40
|
+
let value = '';
|
|
41
|
+
while (i < formula.length && /[0-9.]/.test(formula[i])) {
|
|
42
|
+
value += formula[i];
|
|
43
|
+
i += 1;
|
|
44
|
+
}
|
|
45
|
+
if (!NUMBER_PATTERN.test(value)) {
|
|
46
|
+
throw new Error(`Invalid number in formula: '${value}'`);
|
|
47
|
+
}
|
|
48
|
+
tokens.push({ type: custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.NUMBER, value });
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (char >= 'a' && char <= 'z') {
|
|
52
|
+
let value = '';
|
|
53
|
+
while (i < formula.length && /[a-z0-9_.]/.test(formula[i])) {
|
|
54
|
+
value += formula[i];
|
|
55
|
+
i += 1;
|
|
56
|
+
}
|
|
57
|
+
if (!MEASURE_PATTERN.test(value)) {
|
|
58
|
+
throw new Error(`Invalid measure reference in formula: '${value}'`);
|
|
59
|
+
}
|
|
60
|
+
tokens.push({ type: custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.MEASURE, value });
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`Invalid character in formula: '${char}'`);
|
|
64
|
+
}
|
|
65
|
+
return tokens;
|
|
66
|
+
};
|
|
67
|
+
exports.tokenizeFormula = tokenizeFormula;
|
|
68
|
+
const parseFormula = (formula) => {
|
|
69
|
+
const tokens = (0, exports.tokenizeFormula)(formula);
|
|
70
|
+
let pos = 0;
|
|
71
|
+
const peek = () => tokens[pos];
|
|
72
|
+
const parseExpression = () => {
|
|
73
|
+
let left = parseTerm();
|
|
74
|
+
while (peek()?.type === custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.OPERATOR && (peek()?.value === '+' || peek()?.value === '-')) {
|
|
75
|
+
const operator = tokens[pos].value;
|
|
76
|
+
pos += 1;
|
|
77
|
+
const right = parseTerm();
|
|
78
|
+
left = { type: custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.BINARY, operator, left, right };
|
|
79
|
+
}
|
|
80
|
+
return left;
|
|
81
|
+
};
|
|
82
|
+
const parseTerm = () => {
|
|
83
|
+
let left = parseFactor();
|
|
84
|
+
while (peek()?.type === custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.OPERATOR && (peek()?.value === '*' || peek()?.value === '/')) {
|
|
85
|
+
const operator = tokens[pos].value;
|
|
86
|
+
pos += 1;
|
|
87
|
+
const right = parseFactor();
|
|
88
|
+
left = { type: custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.BINARY, operator, left, right };
|
|
89
|
+
}
|
|
90
|
+
return left;
|
|
91
|
+
};
|
|
92
|
+
const parseFactor = () => {
|
|
93
|
+
const token = peek();
|
|
94
|
+
if (!token) {
|
|
95
|
+
throw new Error('Unexpected end of formula');
|
|
96
|
+
}
|
|
97
|
+
if (token.type === custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.OPERATOR && token.value === '-') {
|
|
98
|
+
pos += 1;
|
|
99
|
+
return { type: custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.UNARY, operator: custom_measure_formula_types_js_1.FORMULA_OPERATOR.SUBTRACT, operand: parseFactor() };
|
|
100
|
+
}
|
|
101
|
+
if (token.type === custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.NUMBER) {
|
|
102
|
+
pos += 1;
|
|
103
|
+
return { type: custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.NUMBER, value: Number(token.value) };
|
|
104
|
+
}
|
|
105
|
+
if (token.type === custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.MEASURE) {
|
|
106
|
+
pos += 1;
|
|
107
|
+
return { type: custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.MEASURE, measure: token.value };
|
|
108
|
+
}
|
|
109
|
+
if (token.type === custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.LPAREN) {
|
|
110
|
+
pos += 1;
|
|
111
|
+
const expression = parseExpression();
|
|
112
|
+
if (peek()?.type !== custom_measure_formula_types_js_1.FORMULA_TOKEN_TYPE.RPAREN) {
|
|
113
|
+
throw new Error('Unbalanced parentheses in formula');
|
|
114
|
+
}
|
|
115
|
+
pos += 1;
|
|
116
|
+
return expression;
|
|
117
|
+
}
|
|
118
|
+
throw new Error(`Unexpected token in formula: '${token.value}'`);
|
|
119
|
+
};
|
|
120
|
+
const ast = parseExpression();
|
|
121
|
+
if (pos !== tokens.length) {
|
|
122
|
+
throw new Error(`Unexpected token in formula: '${tokens[pos].value}'`);
|
|
123
|
+
}
|
|
124
|
+
return ast;
|
|
125
|
+
};
|
|
126
|
+
exports.parseFormula = parseFormula;
|
|
127
|
+
const collectFormulaMeasures = (ast) => {
|
|
128
|
+
const measures = [];
|
|
129
|
+
const walk = (node) => {
|
|
130
|
+
switch (node.type) {
|
|
131
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.MEASURE:
|
|
132
|
+
if (!measures.includes(node.measure)) {
|
|
133
|
+
measures.push(node.measure);
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.UNARY:
|
|
137
|
+
walk(node.operand);
|
|
138
|
+
break;
|
|
139
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.BINARY:
|
|
140
|
+
walk(node.left);
|
|
141
|
+
walk(node.right);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
walk(ast);
|
|
146
|
+
return measures;
|
|
147
|
+
};
|
|
148
|
+
exports.collectFormulaMeasures = collectFormulaMeasures;
|
|
149
|
+
const evaluateFormulaAst = (ast, operandValues) => {
|
|
150
|
+
switch (ast.type) {
|
|
151
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.NUMBER:
|
|
152
|
+
return ast.value;
|
|
153
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.MEASURE: {
|
|
154
|
+
const value = Number(operandValues.get(ast.measure));
|
|
155
|
+
return Number.isFinite(value) ? value : 0;
|
|
156
|
+
}
|
|
157
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.UNARY:
|
|
158
|
+
return -(0, exports.evaluateFormulaAst)(ast.operand, operandValues);
|
|
159
|
+
case custom_measure_formula_types_js_1.FORMULA_NODE_TYPE.BINARY: {
|
|
160
|
+
const left = (0, exports.evaluateFormulaAst)(ast.left, operandValues);
|
|
161
|
+
const right = (0, exports.evaluateFormulaAst)(ast.right, operandValues);
|
|
162
|
+
switch (ast.operator) {
|
|
163
|
+
case custom_measure_formula_types_js_1.FORMULA_OPERATOR.ADD:
|
|
164
|
+
return left + right;
|
|
165
|
+
case custom_measure_formula_types_js_1.FORMULA_OPERATOR.SUBTRACT:
|
|
166
|
+
return left - right;
|
|
167
|
+
case custom_measure_formula_types_js_1.FORMULA_OPERATOR.MULTIPLY:
|
|
168
|
+
return left * right;
|
|
169
|
+
case custom_measure_formula_types_js_1.FORMULA_OPERATOR.DIVIDE:
|
|
170
|
+
return right === 0 ? 0 : left / right;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
exports.evaluateFormulaAst = evaluateFormulaAst;
|
|
176
|
+
const validateFormula = (formula, options) => {
|
|
177
|
+
let ast;
|
|
178
|
+
try {
|
|
179
|
+
ast = (0, exports.parseFormula)(formula);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return { valid: false, errors: [error.message] };
|
|
183
|
+
}
|
|
184
|
+
const errors = [];
|
|
185
|
+
const measures = (0, exports.collectFormulaMeasures)(ast);
|
|
186
|
+
if (measures.length === 0) {
|
|
187
|
+
errors.push('Formula must reference at least one measure');
|
|
188
|
+
}
|
|
189
|
+
measures.forEach((measure) => {
|
|
190
|
+
if ((0, exports.isCustomMeasureId)(measure)) {
|
|
191
|
+
errors.push(`Custom measures cannot reference another custom measure: '${measure}'`);
|
|
192
|
+
}
|
|
193
|
+
else if (options?.knownOperands && !options.knownOperands.has(measure)) {
|
|
194
|
+
errors.push(`Unknown or unsupported measure: '${measure}'`);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
return errors.length > 0 ? { valid: false, errors } : { valid: true, errors: [], ast };
|
|
198
|
+
};
|
|
199
|
+
exports.validateFormula = validateFormula;
|
|
200
|
+
//# sourceMappingURL=custom-measure-formula-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-measure-formula-utils.js","sourceRoot":"","sources":["../../../../src/libs/custom-measure-formula/custom-measure-formula-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./custom-measure-formula-types.js"), exports);
|
|
18
|
+
__exportStar(require("./custom-measure-formula-utils.js"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/custom-measure-formula/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oEAAkD;AAClD,oEAAkD"}
|
package/dist/cjs/libs/index.d.ts
CHANGED
package/dist/cjs/libs/index.js
CHANGED
|
@@ -33,4 +33,5 @@ __exportStar(require("./domain.js"), exports);
|
|
|
33
33
|
__exportStar(require("./emails.js"), exports);
|
|
34
34
|
__exportStar(require("./contacts.js"), exports);
|
|
35
35
|
__exportStar(require("./api-router/index.js"), exports);
|
|
36
|
+
__exportStar(require("./custom-measure-formula/index.js"), exports);
|
|
36
37
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/libs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,8CAA4B;AAC5B,6CAA2B;AAC3B,kDAAgC;AAChC,yDAAuC;AACvC,2CAAyB;AACzB,6DAA2C;AAC3C,uDAAqC;AACrC,mDAAiC;AACjC,2CAAyB;AACzB,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B;AAC7B,+CAA6B;AAC7B,8CAA4B;AAC5B,8CAA4B;AAC5B,8CAA4B;AAC5B,gDAA8B;AAC9B,wDAAsC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/libs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,8CAA4B;AAC5B,6CAA2B;AAC3B,kDAAgC;AAChC,yDAAuC;AACvC,2CAAyB;AACzB,6DAA2C;AAC3C,uDAAqC;AACrC,mDAAiC;AACjC,2CAAyB;AACzB,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B;AAC7B,+CAA6B;AAC7B,8CAA4B;AAC5B,8CAA4B;AAC5B,8CAA4B;AAC5B,gDAA8B;AAC9B,wDAAsC;AACtC,oEAAkD"}
|
|
@@ -4,6 +4,5 @@ export declare class AcuityApiService {
|
|
|
4
4
|
private acuityClient;
|
|
5
5
|
constructor(acuityKeyId: string, acuitySecret: string);
|
|
6
6
|
getAcuityContactsByMd5: (pixelId: string, identityId: string, md5Hash: string, contactAcquisitionIntegration: Destination) => Promise<AcuityContactResponse | null>;
|
|
7
|
-
getAcuityContactsByEmail: (pixelId: string, identityId: string, email: string, contactAcquisitionIntegration: Destination) => Promise<AcuityContactResponse | null>;
|
|
8
7
|
getAcuityContactsByMd5Batch: (pixelId: string, identityId: string, md5Hashes: string[], contactAcquisitionIntegration: Destination) => Promise<AcuityBatchContactResponse | null>;
|
|
9
8
|
}
|