@segment/destination-subscriptions 2.2.0-2.2.0-alpha.81.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 ADDED
@@ -0,0 +1,31 @@
1
+ # @segment/destination-subscriptions
2
+
3
+ Validate event payloads against an action's subscription AST.
4
+
5
+ ## License
6
+
7
+ MIT License
8
+
9
+ Copyright (c) 2022 Segment
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+
29
+ ## Contributing
30
+
31
+ All third party contributors acknowledge that any contributions they provide will be made under the same open source license that the open source project is provided under.
@@ -0,0 +1,3 @@
1
+ import { Subscription } from './types';
2
+ declare const generateFql: (ast: Subscription) => string;
3
+ export default generateFql;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const stringifyValue = (value) => {
4
+ if (typeof value === 'boolean' || typeof value === 'number') {
5
+ return String(value);
6
+ }
7
+ return `"${value}"`;
8
+ };
9
+ const fqlExpression = (name, operator, value) => {
10
+ switch (operator) {
11
+ case 'contains':
12
+ return `contains(${name}, ${stringifyValue(value)})`;
13
+ case 'not_contains':
14
+ return `!contains(${name}, ${stringifyValue(value)})`;
15
+ case 'exists':
16
+ return `${name} != null`;
17
+ case 'not_exists':
18
+ return `${name} = null`;
19
+ case 'is_true':
20
+ return `${name} = true`;
21
+ case 'is_false':
22
+ return `${name} = false`;
23
+ case 'starts_with':
24
+ return `match(${name}, "${String(value)}*")`;
25
+ case 'not_starts_with':
26
+ return `!match(${name}, "${String(value)}*")`;
27
+ case 'ends_with':
28
+ return `match(${name}, "*${String(value)}")`;
29
+ case 'not_ends_with':
30
+ return `!match(${name}, "*${String(value)}")`;
31
+ case '<':
32
+ case '>':
33
+ case '<=':
34
+ case '>=':
35
+ return `${name} ${operator} ${Number(value)}`;
36
+ default:
37
+ return `${name} ${operator} ${stringifyValue(value)}`;
38
+ }
39
+ };
40
+ const stringifyGroupNode = (node) => {
41
+ return node.children
42
+ .map((childNode) => {
43
+ if (childNode.type === 'group') {
44
+ return `(${stringifyGroupNode(childNode)})`;
45
+ }
46
+ return stringifyChildNode(childNode);
47
+ })
48
+ .join(` ${node.operator} `);
49
+ };
50
+ const stringifyChildNode = (node) => {
51
+ let result = '';
52
+ switch (node.type) {
53
+ case 'name':
54
+ case 'userId':
55
+ case 'event': {
56
+ result += fqlExpression(node.type, node.operator, node.value);
57
+ break;
58
+ }
59
+ case 'event-type': {
60
+ result += fqlExpression('type', node.operator, node.value);
61
+ break;
62
+ }
63
+ case 'event-property': {
64
+ result += fqlExpression(`properties.${node.name}`, node.operator, node.value);
65
+ break;
66
+ }
67
+ case 'event-trait': {
68
+ result += fqlExpression(`traits.${node.name}`, node.operator, node.value);
69
+ break;
70
+ }
71
+ case 'event-context': {
72
+ result += fqlExpression(`context.${node.name}`, node.operator, node.value);
73
+ break;
74
+ }
75
+ default:
76
+ throw new Error('Unknown condition type');
77
+ }
78
+ return result;
79
+ };
80
+ const numberOfParens = (string) => {
81
+ let parens = 0;
82
+ for (const char of string.split('')) {
83
+ if (char === '(' || char === ')') {
84
+ parens++;
85
+ }
86
+ }
87
+ return parens;
88
+ };
89
+ const generateFql = (ast) => {
90
+ if (ast.error) {
91
+ throw ast.error;
92
+ }
93
+ const fql = stringifyGroupNode(ast);
94
+ if (fql.startsWith('(') && fql.endsWith(')') && numberOfParens(fql) === 2) {
95
+ return fql.slice(1, -1);
96
+ }
97
+ return fql;
98
+ };
99
+ exports.default = generateFql;
100
+ //# sourceMappingURL=generate-fql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-fql.js","sourceRoot":"","sources":["../../src/generate-fql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function get<T = unknown, Default = unknown>(object: any, path: string | string[], defValue?: Default): T | undefined | Default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.get = void 0;
4
+ function get(object, path, defValue) {
5
+ if (!path)
6
+ return defValue;
7
+ const pathArray = Array.isArray(path)
8
+ ? path
9
+ : path.match(/([^[.\]])+/g);
10
+ const value = pathArray.reduce((previousObject, key) => previousObject && previousObject[key], object);
11
+ return typeof value === 'undefined' ? defValue : value;
12
+ }
13
+ exports.get = get;
14
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/get.ts"],"names":[],"mappings":";;;AAIA,SAAgB,GAAG,CAElB,MAAW,EACX,IAAuB,EACvB,QAAkB;IAGlB,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAA;IAI1B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,CAAC,CAAC,IAAI;QACN,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAc,CAAA;IAG1C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAE7B,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,CAAC,cAAc,IAAI,cAAc,CAAC,GAAG,CAAC,EAC9D,MAAM,CACN,CAAA;IACD,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAA;AACvD,CAAC;AAtBD,kBAsBC"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { default as validate } from './validate';
3
+ export { default as generateFql } from './generate-fql';
4
+ export { default as parseFql } from './parse-fql';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.parseFql = exports.generateFql = exports.validate = void 0;
17
+ __exportStar(require("./types"), exports);
18
+ var validate_1 = require("./validate");
19
+ Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return __importDefault(validate_1).default; } });
20
+ var generate_fql_1 = require("./generate-fql");
21
+ Object.defineProperty(exports, "generateFql", { enumerable: true, get: function () { return __importDefault(generate_fql_1).default; } });
22
+ var parse_fql_1 = require("./parse-fql");
23
+ Object.defineProperty(exports, "parseFql", { enumerable: true, get: function () { return __importDefault(parse_fql_1).default; } });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,uCAAgD;AAAvC,qHAAA,OAAO,OAAY;AAC5B,+CAAuD;AAA9C,4HAAA,OAAO,OAAe;AAC/B,yCAAiD;AAAxC,sHAAA,OAAO,OAAY"}
@@ -0,0 +1,3 @@
1
+ import { Subscription } from './types';
2
+ declare const parseFql: (fql: string) => Subscription;
3
+ export default parseFql;
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fql_ts_1 = require("@segment/fql-ts");
4
+ const tokenToConditionType = {
5
+ type: 'event-type',
6
+ event: 'event',
7
+ name: 'name',
8
+ userId: 'userId',
9
+ context: 'event-context',
10
+ properties: 'event-property',
11
+ traits: 'event-trait'
12
+ };
13
+ const getTokenValue = (token) => {
14
+ if (token.type === 'string') {
15
+ return token.value.replace(/^"/, '').replace(/"$/, '');
16
+ }
17
+ if (token.type === 'number') {
18
+ return Number(token.value);
19
+ }
20
+ if (token.type === 'ident' && ['true', 'false'].includes(token.value)) {
21
+ return token.value === 'true';
22
+ }
23
+ return String(token.value);
24
+ };
25
+ const isFqlFunction = (token) => {
26
+ return token.type === 'ident' && ['contains', 'match'].includes(token.value);
27
+ };
28
+ const parseFqlFunction = (name, nodes, tokens, { negate } = { negate: false }) => {
29
+ if (name === 'contains') {
30
+ tokens.shift();
31
+ const nameToken = tokens.shift();
32
+ if (!nameToken) {
33
+ throw new Error('contains() is missing a 1st argument');
34
+ }
35
+ tokens.shift();
36
+ const valueToken = tokens.shift();
37
+ if (!valueToken) {
38
+ throw new Error('contains() is missing a 2nd argument');
39
+ }
40
+ tokens.shift();
41
+ if (['event', 'name', 'userId'].includes(nameToken.value)) {
42
+ nodes.push({
43
+ type: nameToken.value,
44
+ operator: negate ? 'not_contains' : 'contains',
45
+ value: String(getTokenValue(valueToken))
46
+ });
47
+ }
48
+ if (/^(properties)/.test(nameToken.value)) {
49
+ nodes.push({
50
+ type: 'event-property',
51
+ name: nameToken.value.replace(/^(properties)\./, ''),
52
+ operator: negate ? 'not_contains' : 'contains',
53
+ value: String(getTokenValue(valueToken))
54
+ });
55
+ }
56
+ if (/^(traits)/.test(nameToken.value)) {
57
+ nodes.push({
58
+ type: 'event-trait',
59
+ name: nameToken.value.replace(/^(traits)\./, ''),
60
+ operator: negate ? 'not_contains' : 'contains',
61
+ value: String(getTokenValue(valueToken))
62
+ });
63
+ }
64
+ if (/^(context)/.test(nameToken.value)) {
65
+ nodes.push({
66
+ type: 'event-context',
67
+ name: nameToken.value.replace(/^(context)\./, ''),
68
+ operator: negate ? 'not_contains' : 'contains',
69
+ value: String(getTokenValue(valueToken))
70
+ });
71
+ }
72
+ }
73
+ if (name === 'match') {
74
+ tokens.shift();
75
+ const nameToken = tokens.shift();
76
+ if (!nameToken) {
77
+ throw new Error('match() is missing a 1st argument');
78
+ }
79
+ tokens.shift();
80
+ const valueToken = tokens.shift();
81
+ if (!valueToken) {
82
+ throw new Error('match() is missing a 2nd argument');
83
+ }
84
+ tokens.shift();
85
+ let operator;
86
+ let value;
87
+ if (valueToken.value.endsWith('*"')) {
88
+ operator = negate ? 'not_starts_with' : 'starts_with';
89
+ value = String(getTokenValue(valueToken)).slice(0, -1);
90
+ }
91
+ else {
92
+ operator = negate ? 'not_ends_with' : 'ends_with';
93
+ value = String(getTokenValue(valueToken)).slice(1);
94
+ }
95
+ if (['event', 'name', 'userId'].includes(nameToken.value)) {
96
+ nodes.push({
97
+ type: nameToken.value,
98
+ operator,
99
+ value
100
+ });
101
+ }
102
+ if (/^(properties)/.test(nameToken.value)) {
103
+ nodes.push({
104
+ type: 'event-property',
105
+ name: nameToken.value.replace(/^(properties)\./, ''),
106
+ operator,
107
+ value
108
+ });
109
+ }
110
+ if (/^(traits)/.test(nameToken.value)) {
111
+ nodes.push({
112
+ type: 'event-trait',
113
+ name: nameToken.value.replace(/^(traits)\./, ''),
114
+ operator,
115
+ value
116
+ });
117
+ }
118
+ if (/^(context)/.test(nameToken.value)) {
119
+ nodes.push({
120
+ type: 'event-context',
121
+ name: nameToken.value.replace(/^(context)\./, ''),
122
+ operator,
123
+ value
124
+ });
125
+ }
126
+ }
127
+ };
128
+ const parse = (tokens) => {
129
+ var _a;
130
+ const nodes = [];
131
+ let operator = 'and';
132
+ let token = tokens.shift();
133
+ while (token && token.type !== 'eos') {
134
+ if (token.type === 'ident') {
135
+ const [tokenStart] = ((_a = token.value) !== null && _a !== void 0 ? _a : '').split('.');
136
+ const conditionType = tokenToConditionType[tokenStart];
137
+ if (conditionType) {
138
+ const operatorToken = tokens.shift();
139
+ if (!operatorToken) {
140
+ throw new Error('Operator token is missing');
141
+ }
142
+ const valueToken = tokens.shift();
143
+ if (!valueToken) {
144
+ throw new Error('Value token is missing');
145
+ }
146
+ const isTrue = operatorToken.value === '=' && valueToken.value === 'true';
147
+ const isFalse = operatorToken.value === '=' && valueToken.value === 'false';
148
+ const isExists = operatorToken.value === '!=' && valueToken.value === 'null';
149
+ const isNotExists = operatorToken.value === '=' && valueToken.value === 'null';
150
+ if (conditionType === 'event') {
151
+ nodes.push({
152
+ type: 'event',
153
+ operator: operatorToken.value,
154
+ value: String(getTokenValue(valueToken))
155
+ });
156
+ }
157
+ else if (conditionType === 'event-type') {
158
+ nodes.push({
159
+ type: 'event-type',
160
+ operator: operatorToken.value,
161
+ value: String(getTokenValue(valueToken))
162
+ });
163
+ }
164
+ else if (conditionType === 'name') {
165
+ if (isExists) {
166
+ nodes.push({
167
+ type: 'name',
168
+ operator: 'exists'
169
+ });
170
+ }
171
+ else if (isNotExists) {
172
+ nodes.push({
173
+ type: 'name',
174
+ operator: 'not_exists'
175
+ });
176
+ }
177
+ else {
178
+ nodes.push({
179
+ type: 'name',
180
+ operator: operatorToken.value,
181
+ value: String(getTokenValue(valueToken))
182
+ });
183
+ }
184
+ }
185
+ else if (conditionType === 'userId') {
186
+ if (isExists) {
187
+ nodes.push({
188
+ type: 'userId',
189
+ operator: 'exists'
190
+ });
191
+ }
192
+ else if (isNotExists) {
193
+ nodes.push({
194
+ type: 'userId',
195
+ operator: 'not_exists'
196
+ });
197
+ }
198
+ else if (isTrue) {
199
+ nodes.push({
200
+ type: 'userId',
201
+ operator: 'is_true'
202
+ });
203
+ }
204
+ else if (isFalse) {
205
+ nodes.push({
206
+ type: 'userId',
207
+ operator: 'is_false'
208
+ });
209
+ }
210
+ else {
211
+ nodes.push({
212
+ type: 'userId',
213
+ operator: operatorToken.value,
214
+ value: String(getTokenValue(valueToken))
215
+ });
216
+ }
217
+ }
218
+ else if (conditionType === 'event-property') {
219
+ if (isExists) {
220
+ nodes.push({
221
+ type: 'event-property',
222
+ name: token.value.replace(/^(properties)\./, ''),
223
+ operator: 'exists'
224
+ });
225
+ }
226
+ else if (isNotExists) {
227
+ nodes.push({
228
+ type: 'event-property',
229
+ name: token.value.replace(/^(properties)\./, ''),
230
+ operator: 'not_exists'
231
+ });
232
+ }
233
+ else if (isTrue) {
234
+ nodes.push({
235
+ type: 'event-property',
236
+ name: token.value.replace(/^(properties)\./, ''),
237
+ operator: 'is_true'
238
+ });
239
+ }
240
+ else if (isFalse) {
241
+ nodes.push({
242
+ type: 'event-property',
243
+ name: token.value.replace(/^(properties)\./, ''),
244
+ operator: 'is_false'
245
+ });
246
+ }
247
+ else {
248
+ nodes.push({
249
+ type: 'event-property',
250
+ name: token.value.replace(/^(properties)\./, ''),
251
+ operator: operatorToken.value,
252
+ value: getTokenValue(valueToken)
253
+ });
254
+ }
255
+ }
256
+ else if (conditionType === 'event-trait') {
257
+ if (isExists) {
258
+ nodes.push({
259
+ type: 'event-trait',
260
+ name: token.value.replace(/^(traits)\./, ''),
261
+ operator: 'exists'
262
+ });
263
+ }
264
+ else if (isNotExists) {
265
+ nodes.push({
266
+ type: 'event-trait',
267
+ name: token.value.replace(/^(traits)\./, ''),
268
+ operator: 'not_exists'
269
+ });
270
+ }
271
+ else if (isTrue) {
272
+ nodes.push({
273
+ type: 'event-trait',
274
+ name: token.value.replace(/^(traits)\./, ''),
275
+ operator: 'is_true'
276
+ });
277
+ }
278
+ else if (isFalse) {
279
+ nodes.push({
280
+ type: 'event-trait',
281
+ name: token.value.replace(/^(traits)\./, ''),
282
+ operator: 'is_false'
283
+ });
284
+ }
285
+ else {
286
+ nodes.push({
287
+ type: 'event-trait',
288
+ name: token.value.replace(/^(traits)\./, ''),
289
+ operator: operatorToken.value,
290
+ value: getTokenValue(valueToken)
291
+ });
292
+ }
293
+ }
294
+ else if (conditionType === 'event-context') {
295
+ if (isExists) {
296
+ nodes.push({
297
+ type: 'event-context',
298
+ name: token.value.replace(/^(context)\./, ''),
299
+ operator: 'exists'
300
+ });
301
+ }
302
+ else if (isNotExists) {
303
+ nodes.push({
304
+ type: 'event-context',
305
+ name: token.value.replace(/^(context)\./, ''),
306
+ operator: 'not_exists'
307
+ });
308
+ }
309
+ else if (isTrue) {
310
+ nodes.push({
311
+ type: 'event-context',
312
+ name: token.value.replace(/^(context)\./, ''),
313
+ operator: 'is_true'
314
+ });
315
+ }
316
+ else if (isFalse) {
317
+ nodes.push({
318
+ type: 'event-context',
319
+ name: token.value.replace(/^(context)\./, ''),
320
+ operator: 'is_false'
321
+ });
322
+ }
323
+ else {
324
+ nodes.push({
325
+ type: 'event-context',
326
+ name: token.value.replace(/^(context)\./, ''),
327
+ operator: operatorToken.value,
328
+ value: getTokenValue(valueToken)
329
+ });
330
+ }
331
+ }
332
+ }
333
+ if (isFqlFunction(token)) {
334
+ parseFqlFunction(token.value, nodes, tokens);
335
+ }
336
+ }
337
+ if (token.type === 'operator' && token.value === '!') {
338
+ if (isFqlFunction(tokens[0])) {
339
+ const name = tokens[0].value;
340
+ tokens.shift();
341
+ parseFqlFunction(name, nodes, tokens, { negate: true });
342
+ }
343
+ }
344
+ if (token.type === 'parenleft') {
345
+ const groupTokens = [];
346
+ let groupToken = tokens.shift();
347
+ while (groupToken.type !== 'parenright') {
348
+ groupTokens.push(groupToken);
349
+ groupToken = tokens.shift();
350
+ }
351
+ groupTokens.push({ type: fql_ts_1.types.EOS, value: 'eos' });
352
+ nodes.push(parse(groupTokens));
353
+ }
354
+ if (token.type === 'conditional') {
355
+ operator = token.value;
356
+ }
357
+ token = tokens.shift();
358
+ }
359
+ if (nodes.length > 1) {
360
+ return {
361
+ type: 'group',
362
+ operator: operator,
363
+ children: nodes
364
+ };
365
+ }
366
+ return nodes[0];
367
+ };
368
+ const normalize = (tokens) => {
369
+ const normalizedTokens = [];
370
+ let index = 0;
371
+ while (tokens[index]) {
372
+ const last = normalizedTokens[normalizedTokens.length - 1];
373
+ const current = tokens[index];
374
+ const next = tokens[index + 1];
375
+ if ((last === null || last === void 0 ? void 0 : last.type) === 'ident' && current.type === 'dot' && (next === null || next === void 0 ? void 0 : next.type) === 'ident') {
376
+ const previous = normalizedTokens.pop();
377
+ normalizedTokens.push({
378
+ type: fql_ts_1.types.Ident,
379
+ value: `${previous === null || previous === void 0 ? void 0 : previous.value}${current.value}${next.value}`
380
+ });
381
+ index += 2;
382
+ }
383
+ else {
384
+ normalizedTokens.push(tokens[index]);
385
+ index++;
386
+ }
387
+ }
388
+ return normalizedTokens;
389
+ };
390
+ const parseFql = (fql) => {
391
+ try {
392
+ const ast = parse(normalize(fql_ts_1.lex(fql).tokens));
393
+ if (ast.type !== 'group') {
394
+ return {
395
+ type: 'group',
396
+ operator: 'and',
397
+ children: [ast]
398
+ };
399
+ }
400
+ return ast;
401
+ }
402
+ catch (error) {
403
+ const err = error instanceof Error ? error : new Error(`Error while parsing ${fql}`);
404
+ return {
405
+ error: err
406
+ };
407
+ }
408
+ };
409
+ exports.default = parseFql;
410
+ //# sourceMappingURL=parse-fql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-fql.js","sourceRoot":"","sources":["../../src/parse-fql.ts"],"names":[],"mappings":"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"}