@perforce-perfecto/scriptless-helpers 1.73.4 → 1.74.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perforce-perfecto/scriptless-helpers",
3
- "version": "1.73.4",
3
+ "version": "1.74.1",
4
4
  "type": "commonjs",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -4,10 +4,15 @@ type UserFunctionRule = {
4
4
  scriptKey: string;
5
5
  };
6
6
  export declare class UserFunctionHelper extends ScriptlessHelper {
7
+ private readonly MAX_PATTERN_LENGTH;
8
+ private readonly TOKEN;
7
9
  resolveScript(webdriverSession: {
8
10
  capabilities: {
9
11
  platform: string;
10
12
  };
11
13
  }, rules: UserFunctionRule[]): string;
14
+ private ruleMatches;
15
+ private evaluateAdvExpr;
16
+ private evaluateTerm;
12
17
  }
13
18
  export {};
@@ -3,6 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UserFunctionHelper = void 0;
4
4
  const scriptless_helper_1 = require("../types/scriptless-helper");
5
5
  class UserFunctionHelper extends scriptless_helper_1.ScriptlessHelper {
6
+ constructor() {
7
+ super(...arguments);
8
+ // Caps regex input size; does not on its own prevent catastrophic backtracking.
9
+ this.MAX_PATTERN_LENGTH = 200;
10
+ // Matches a complete term (field:value or field:/regex/) or an AND/OR separator.
11
+ // Regex literals are consumed atomically, so AND/OR keywords inside a pattern
12
+ // are never mistaken for separators.
13
+ this.TOKEN = /([^:\s]+:(?:\/(?:[^/\\]|\\.)*\/|\S+))|\s+(AND|OR)\s+/g;
14
+ }
6
15
  resolveScript(webdriverSession, rules) {
7
16
  const platform = JSON.parse(webdriverSession.capabilities.platform || '{}');
8
17
  const mobileInfo = platform.mobileInfo || {};
@@ -14,27 +23,67 @@ class UserFunctionHelper extends scriptless_helper_1.ScriptlessHelper {
14
23
  manufacturer: mobileInfo.manufacturer,
15
24
  model: mobileInfo.model
16
25
  };
17
- let resolvedScript;
18
26
  for (const rule of rules) {
19
- const ruleMatches = Object.entries(rule.conditions).every(([col, val]) => {
20
- if (!val)
21
- return true;
22
- const deviceVal = deviceProps[col];
23
- if (deviceVal == null)
24
- return true;
25
- return typeof deviceVal === 'string' && typeof val === 'string'
26
- ? deviceVal.toLowerCase() === val.toLowerCase()
27
- : deviceVal === val;
28
- });
29
- if (ruleMatches) {
30
- resolvedScript = rule.scriptKey;
31
- break;
27
+ if (this.ruleMatches(rule.conditions, deviceProps)) {
28
+ return rule.scriptKey;
32
29
  }
33
30
  }
34
- if (!resolvedScript) {
35
- throw new Error('No matching user function rule found for the current device.');
31
+ throw new Error('No matching user function rule found for the current device.');
32
+ }
33
+ ruleMatches(conditions, deviceProps) {
34
+ return Object.entries(conditions).every(([col, val]) => {
35
+ if (!val)
36
+ return true;
37
+ if (col === 'adv_expr')
38
+ return this.evaluateAdvExpr(val, deviceProps);
39
+ const deviceVal = deviceProps[col];
40
+ if (deviceVal == null)
41
+ return true;
42
+ if (typeof deviceVal !== 'string')
43
+ return false;
44
+ return deviceVal.toLowerCase() === val.toLowerCase();
45
+ });
46
+ }
47
+ evaluateAdvExpr(expr, deviceProps) {
48
+ if (typeof expr !== 'string')
49
+ return false;
50
+ // Build OR groups of AND terms (AND binds tighter than OR). Each TOKEN match
51
+ // is either a term or an OR separator; AND between terms is implicit.
52
+ const orGroups = [[]];
53
+ for (const match of expr.matchAll(this.TOKEN)) {
54
+ if (match[2] === 'OR')
55
+ orGroups.push([]);
56
+ else if (match[1])
57
+ orGroups[orGroups.length - 1].push(match[1]);
58
+ }
59
+ return orGroups.some((group) => group.length > 0 &&
60
+ group.every((term) => this.evaluateTerm(term, deviceProps)));
61
+ }
62
+ evaluateTerm(term, deviceProps) {
63
+ const colon = term.indexOf(':');
64
+ if (colon <= 0)
65
+ return false;
66
+ const field = term.slice(0, colon);
67
+ const value = term.slice(colon + 1);
68
+ if (!field || !value)
69
+ return false;
70
+ const deviceVal = deviceProps[field];
71
+ if (deviceVal == null)
72
+ return true;
73
+ if (typeof deviceVal !== 'string')
74
+ return false;
75
+ if (value.startsWith('/') && value.endsWith('/')) {
76
+ const pattern = value.slice(1, -1);
77
+ if (!pattern || pattern.length > this.MAX_PATTERN_LENGTH)
78
+ return false;
79
+ try {
80
+ return new RegExp(pattern).test(deviceVal);
81
+ }
82
+ catch (_a) {
83
+ return false;
84
+ }
36
85
  }
37
- return resolvedScript;
86
+ return deviceVal.toLowerCase() === value.toLowerCase();
38
87
  }
39
88
  }
40
89
  exports.UserFunctionHelper = UserFunctionHelper;
@@ -1 +1 @@
1
- {"version":3,"file":"user-function-helper.js","sourceRoot":"","sources":["../../../../../libs/execution-helpers-public/src/lib/user-function-helper.ts"],"names":[],"mappings":";;;AAAA,kEAA8D;AAO9D,MAAa,kBAAmB,SAAQ,oCAAgB;IACtD,aAAa,CACX,gBAAwD,EACxD,KAAyB;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7C,MAAM,WAAW,GAA4B;YAC3C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;QAEF,IAAI,cAAkC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CACvD,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC;gBACtB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,SAAS,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC;gBACnC,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAC7D,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE;oBAC/C,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC;YACxB,CAAC,CACF,CAAC;YACF,IAAI,WAAW,EAAE,CAAC;gBAChB,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;gBAChC,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;AAxCD,gDAwCC"}
1
+ {"version":3,"file":"user-function-helper.js","sourceRoot":"","sources":["../../../../../libs/execution-helpers-public/src/lib/user-function-helper.ts"],"names":[],"mappings":"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"}