eslint-plugin-wdio 7.17.3 → 7.17.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/README.md CHANGED
@@ -22,15 +22,23 @@ npm install eslint-plugin-wdio --save-dev
22
22
 
23
23
  This plugin export a recommended configuration that enforce good practices.
24
24
 
25
- To enable this configuration use the extends property in your .eslintrc config file:
25
+ To enable this configuration use the extends property in your `.eslintrc` config file:
26
26
 
27
27
  ```json
28
28
  {
29
- "plugins": [
30
- "wdio"
31
- ],
32
- "extends": "plugin:wdio/recommended"
29
+ "extends": [
30
+ "eslint:recommended",
31
+ "plugin:wdio/recommended"
32
+ ]
33
33
  }
34
34
  ```
35
35
 
36
36
  See [ESLint documentation](https://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information about extending configuration files.
37
+
38
+ ## List of supported rules
39
+
40
+ | Rule | Description |
41
+ | :--- | :--- |
42
+ | [wdio/await-expect](docs/rules/await-expect.md) | `expect` calls must be prefixed with an `await` |
43
+ | [wdio/no-debug](docs/rules/no-debug.md) | Don't allow `browser.debug()` statements |
44
+ | [wdio/no-pause](docs/rules/no-pause.md) | Don't allow `browser.pause(<number>)` statements |
@@ -0,0 +1,2 @@
1
+ export declare const MATCHERS: string[];
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,UAgCpB,CAAA"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MATCHERS = void 0;
4
+ exports.MATCHERS = [
5
+ 'toHaveTitle',
6
+ 'toHaveTitleContaining',
7
+ 'toHaveUrl',
8
+ 'toHaveUrlContaining',
9
+ 'toBeClickable',
10
+ 'toBeDisabled',
11
+ 'toBeDisplayed',
12
+ 'toBeDisplayedInViewport',
13
+ 'toBeEnabled',
14
+ 'toBeExisting',
15
+ 'toBeFocused',
16
+ 'toBeSelected',
17
+ 'toHaveAttribute',
18
+ 'toHaveAttributeContaining',
19
+ 'toHaveChildren',
20
+ 'toHaveElementClass',
21
+ 'toHaveElementClassContaining',
22
+ 'toHaveElementProperty',
23
+ 'toHaveHref',
24
+ 'toHaveHrefContaining',
25
+ 'toHaveId',
26
+ 'toHaveStyle',
27
+ 'toHaveText',
28
+ 'toHaveTextContaining',
29
+ 'toHaveValue',
30
+ 'toHaveValueContaining',
31
+ 'toBeElementsArrayOfSize',
32
+ 'toBeRequested',
33
+ 'toBeRequestedTimes',
34
+ 'toBeRequestedWith',
35
+ 'toBeRequestedWithResponse'
36
+ ];
package/build/index.d.ts CHANGED
@@ -13,7 +13,11 @@ declare const configs: {
13
13
  expect: boolean;
14
14
  multiremotebrowser: boolean;
15
15
  };
16
- rules: {};
16
+ rules: {
17
+ 'await-expect': import("eslint").Rule.RuleModule;
18
+ 'no-debug': import("eslint").Rule.RuleModule;
19
+ 'no-pause': import("eslint").Rule.RuleModule;
20
+ };
17
21
  };
18
22
  };
19
23
  export { rules, configs, };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,KAAK;;;;CAIV,CAAA;AAED,QAAA,MAAM,OAAO;;;;;;;;;;;;CAYZ,CAAA;AAED,OAAO,EACH,KAAK,EACL,OAAO,GACV,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,KAAK;;;;CAIV,CAAA;AAED,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;CAYZ,CAAA;AAED,OAAO,EACH,KAAK,EACL,OAAO,GACV,CAAA"}
package/build/index.js CHANGED
@@ -23,8 +23,7 @@ const configs = {
23
23
  expect: false,
24
24
  multiremotebrowser: false,
25
25
  },
26
- rules: {}
26
+ rules
27
27
  }
28
28
  };
29
29
  exports.configs = configs;
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0VBQThDO0FBQzlDLGdFQUEwQztBQUMxQyxnRUFBMEM7QUFFMUMsTUFBTSxLQUFLLEdBQUc7SUFDVixjQUFjLEVBQUcsc0JBQVc7SUFDNUIsVUFBVSxFQUFPLGtCQUFPO0lBQ3hCLFVBQVUsRUFBTyxrQkFBTztDQUMzQixDQUFBO0FBaUJHLHNCQUFLO0FBZlQsTUFBTSxPQUFPLEdBQUc7SUFDWixXQUFXLEVBQUU7UUFDVCxPQUFPLEVBQUU7WUFDTCxDQUFDLEVBQW9CLEtBQUs7WUFDMUIsRUFBRSxFQUFtQixLQUFLO1lBQzFCLE9BQU8sRUFBYyxLQUFLO1lBQzFCLE1BQU0sRUFBZSxLQUFLO1lBQzFCLE1BQU0sRUFBZSxLQUFLO1lBQzFCLGtCQUFrQixFQUFHLEtBQUs7U0FDN0I7UUFDRCxLQUFLLEVBQUcsRUFBRTtLQUNiO0NBQ0osQ0FBQTtBQUlHLDBCQUFPIn0=
@@ -1,4 +1,4 @@
1
- import { Rule } from 'eslint';
1
+ import type { Rule } from 'eslint';
2
2
  declare const rule: Rule.RuleModule;
3
3
  export default rule;
4
4
  //# sourceMappingURL=await-expect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"await-expect.d.ts","sourceRoot":"","sources":["../../lib/rules/await-expect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAO7B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA+BhB,CAAA;AAED,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"await-expect.d.ts","sourceRoot":"","sources":["../../src/rules/await-expect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAKlC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA8ChB,CAAA;AAED,eAAe,IAAI,CAAA"}
@@ -1,14 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const path_1 = __importDefault(require("path"));
7
- const glob_1 = __importDefault(require("glob"));
8
- // Get all the matches in the expect-webdriverio package based on filenames
9
- const expectPath = require.resolve('expect-webdriverio');
10
- const matchesGlob = path_1.default.resolve(expectPath, '../../lib/matchers/**');
11
- const matchers = glob_1.default.sync(matchesGlob, { nodir: true, }).map(file => path_1.default.basename(file).replace(/(\.js|\.ts)/, ''));
3
+ const constants_1 = require("../constants");
12
4
  const rule = {
13
5
  meta: {
14
6
  type: 'problem',
@@ -25,20 +17,30 @@ const rule = {
25
17
  },
26
18
  create: function (context) {
27
19
  return {
28
- MemberExpression(node) {
29
- var _a, _b, _c, _d, _e, _f;
30
- const object = (_b = (_a = node.object) === null || _a === void 0 ? void 0 : _a.callee) === null || _b === void 0 ? void 0 : _b.name;
31
- const property = (_c = node.property) === null || _c === void 0 ? void 0 : _c.name;
32
- const parentType = (_f = (_e = (_d = node === null || node === void 0 ? void 0 : node.parent) === null || _d === void 0 ? void 0 : _d.parent) === null || _e === void 0 ? void 0 : _e.type) !== null && _f !== void 0 ? _f : false;
33
- if (object === 'expect' && matchers.includes(property) && parentType !== 'AwaitExpression') {
34
- context.report({
35
- node,
36
- messageId: 'missingAwait',
37
- });
20
+ CallExpression(node) {
21
+ /**
22
+ * validate we have an expect statement that
23
+ * calls some of the WebdriverIO matchers
24
+ */
25
+ if (node.callee.type !== 'MemberExpression' ||
26
+ node.callee.object.type !== 'CallExpression' ||
27
+ node.callee.object.callee.name !== 'expect' ||
28
+ !constants_1.MATCHERS.includes(node.callee.property.name)) {
29
+ return;
30
+ }
31
+ /**
32
+ * fail rule if:
33
+ */
34
+ if (
35
+ /**
36
+ * expect is called without an `await` and as part of an
37
+ * expression
38
+ */
39
+ node.parent.type === 'ExpressionStatement') {
40
+ context.report({ node, messageId: 'missingAwait' });
38
41
  }
39
42
  }
40
43
  };
41
44
  }
42
45
  };
43
46
  exports.default = rule;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdhaXQtZXhwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3J1bGVzL2F3YWl0LWV4cGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdEQUF1QjtBQUN2QixnREFBdUI7QUFHdkIsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxHQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtBQUN6RCxNQUFNLFdBQVcsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFBO0FBQ3JFLE1BQU0sUUFBUSxHQUFNLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFFekgsTUFBTSxJQUFJLEdBQW9CO0lBQzFCLElBQUksRUFBRztRQUNILElBQUksRUFBRyxTQUFTO1FBQ2hCLElBQUksRUFBRztZQUNILFdBQVcsRUFBRyxvQ0FBb0M7WUFDbEQsUUFBUSxFQUFNLGlCQUFpQjtZQUMvQixHQUFHLEVBQVcsdUZBQXVGO1lBQ3JHLFdBQVcsRUFBRyxLQUFLO1NBQ3RCO1FBQ0QsUUFBUSxFQUFHO1lBQ1AsWUFBWSxFQUFHLDBDQUEwQztTQUM1RDtRQUNELGNBQWMsRUFBRyxJQUFJO0tBQ3hCO0lBRUQsTUFBTSxFQUFHLFVBQVMsT0FBeUI7UUFDdkMsT0FBTztZQUNILGdCQUFnQixDQUFDLElBQVM7O2dCQUN0QixNQUFNLE1BQU0sR0FBTyxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsTUFBTSwwQ0FBRSxJQUFJLENBQUE7Z0JBQzVDLE1BQU0sUUFBUSxHQUFLLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsSUFBSSxDQUFBO2dCQUN0QyxNQUFNLFVBQVUsR0FBRyxNQUFBLE1BQUEsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSwwQ0FBRSxNQUFNLDBDQUFFLElBQUksbUNBQUksS0FBSyxDQUFBO2dCQUV0RCxJQUFJLE1BQU0sS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLEtBQUssaUJBQWlCLEVBQUU7b0JBQ3hGLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ1gsSUFBSTt3QkFDSixTQUFTLEVBQUcsY0FBYztxQkFDN0IsQ0FBQyxDQUFBO2lCQUNMO1lBQ0wsQ0FBQztTQUNKLENBQUE7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQUVELGtCQUFlLElBQUksQ0FBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"no-debug.d.ts","sourceRoot":"","sources":["../../lib/rules/no-debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG7B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA4BhB,CAAA;AAED,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"no-debug.d.ts","sourceRoot":"","sources":["../../src/rules/no-debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG7B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAyBhB,CAAA;AAED,eAAe,IAAI,CAAA"}
@@ -20,14 +20,10 @@ const rule = {
20
20
  return {
21
21
  CallExpression(node) {
22
22
  if ((0, helpers_1.isCommand)(node, 'debug')) {
23
- context.report({
24
- node,
25
- messageId: 'unexpectedDebug'
26
- });
23
+ context.report({ node, messageId: 'unexpectedDebug' });
27
24
  }
28
25
  }
29
26
  };
30
27
  }
31
28
  };
32
29
  exports.default = rule;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcnVsZXMvbm8tZGVidWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSw4Q0FBNEM7QUFFNUMsTUFBTSxJQUFJLEdBQW9CO0lBQzFCLElBQUksRUFBRztRQUNILElBQUksRUFBRyxTQUFTO1FBQ2hCLElBQUksRUFBRztZQUNILFdBQVcsRUFBRyxtQ0FBbUM7WUFDakQsUUFBUSxFQUFNLGlCQUFpQjtZQUMvQixHQUFHLEVBQVcsbUZBQW1GO1lBQ2pHLFdBQVcsRUFBRyxLQUFLO1NBQ3RCO1FBQ0QsUUFBUSxFQUFHO1lBQ1AsZUFBZSxFQUFHLHdDQUF3QztTQUM3RDtRQUNELGNBQWMsRUFBRyxJQUFJO1FBQ3JCLE1BQU0sRUFBRyxFQUFFO0tBQ2Q7SUFFRCxNQUFNLEVBQUcsVUFBUyxPQUF5QjtRQUN2QyxPQUFPO1lBQ0gsY0FBYyxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxJQUFBLG1CQUFTLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNYLElBQUk7d0JBQ0osU0FBUyxFQUFHLGlCQUFpQjtxQkFDaEMsQ0FBQyxDQUFBO2lCQUNMO1lBQ0wsQ0FBQztTQUNKLENBQUE7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQUVELGtCQUFlLElBQUksQ0FBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"no-pause.d.ts","sourceRoot":"","sources":["../../lib/rules/no-pause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG7B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA4BhB,CAAA;AAED,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"no-pause.d.ts","sourceRoot":"","sources":["../../src/rules/no-pause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG7B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UAyBhB,CAAA;AAED,eAAe,IAAI,CAAA"}
@@ -20,14 +20,10 @@ const rule = {
20
20
  return {
21
21
  CallExpression(node) {
22
22
  if ((0, helpers_1.isCommand)(node, 'pause')) {
23
- context.report({
24
- node,
25
- messageId: 'unexpectedPause'
26
- });
23
+ context.report({ node, messageId: 'unexpectedPause' });
27
24
  }
28
25
  }
29
26
  };
30
27
  }
31
28
  };
32
29
  exports.default = rule;
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tcGF1c2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcnVsZXMvbm8tcGF1c2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSw4Q0FBNEM7QUFFNUMsTUFBTSxJQUFJLEdBQW9CO0lBQzFCLElBQUksRUFBRztRQUNILElBQUksRUFBRyxTQUFTO1FBQ2hCLElBQUksRUFBRztZQUNILFdBQVcsRUFBRyxtQ0FBbUM7WUFDakQsUUFBUSxFQUFNLGlCQUFpQjtZQUMvQixHQUFHLEVBQVcsbUZBQW1GO1lBQ2pHLFdBQVcsRUFBRyxLQUFLO1NBQ3RCO1FBQ0QsUUFBUSxFQUFHO1lBQ1AsZUFBZSxFQUFHLHdDQUF3QztTQUM3RDtRQUNELGNBQWMsRUFBRyxJQUFJO1FBQ3JCLE1BQU0sRUFBRyxFQUFFO0tBQ2Q7SUFFRCxNQUFNLEVBQUcsVUFBUyxPQUF5QjtRQUN2QyxPQUFPO1lBQ0gsY0FBYyxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxJQUFBLG1CQUFTLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNYLElBQUk7d0JBQ0osU0FBUyxFQUFHLGlCQUFpQjtxQkFDaEMsQ0FBQyxDQUFBO2lCQUNMO1lBQ0wsQ0FBQztTQUNKLENBQUE7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQUVELGtCQUFlLElBQUksQ0FBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/utils/helpers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,eAAwB,GAAG,WAAW,OAAO,GAAG,OAAO,KAAG,OAQ/E,CAAA"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,eAAwB,GAAG,WAAW,OAAO,GAAG,OAAO,KAAG,OAQ/E,CAAA"}
@@ -10,4 +10,3 @@ const isCommand = function (expression, command) {
10
10
  ((_b = callee === null || callee === void 0 ? void 0 : callee.property) === null || _b === void 0 ? void 0 : _b.name) === command);
11
11
  };
12
12
  exports.isCommand = isCommand;
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwyREFBMkQ7OztBQUVwRCxNQUFNLFNBQVMsR0FBRyxVQUFTLFVBQWUsRUFBRSxPQUEwQjs7SUFDekUsTUFBTSxNQUFNLEdBQUcsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLE1BQU0sQ0FBQTtJQUVqQyxPQUFPLENBQ0gsTUFBTTtRQUNOLENBQUEsTUFBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSwwQ0FBRSxJQUFJLE1BQUssU0FBUztRQUNsQyxDQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFFBQVEsMENBQUUsSUFBSSxNQUFLLE9BQU8sQ0FDckMsQ0FBQTtBQUNMLENBQUMsQ0FBQTtBQVJZLFFBQUEsU0FBUyxhQVFyQiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-wdio",
3
- "version": "7.17.3",
3
+ "version": "7.17.4",
4
4
  "description": "Eslint rules for WebdriverIO",
5
5
  "author": "Christian Bromann <christian@saucelabs.com>",
6
6
  "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/eslint-plugin-wdio",
@@ -23,9 +23,9 @@
23
23
  "bugs": {
24
24
  "url": "https://github.com/webdriverio/webdriverio/issues"
25
25
  },
26
- "dependencies": {
27
- "expect-webdriverio": "^3.1.4",
28
- "glob": "^7.2.0"
26
+ "devDependencies": {
27
+ "@types/estree": "^0.0.51",
28
+ "eslint": "^8.10.0"
29
29
  },
30
- "gitHead": "2bcb589dbdd10ca181f301a269b4dd158faab257"
30
+ "gitHead": "7243b24766d60a8b4c7d92aec757238c96590172"
31
31
  }
@@ -0,0 +1,33 @@
1
+ export const MATCHERS = [
2
+ 'toHaveTitle',
3
+ 'toHaveTitleContaining',
4
+ 'toHaveUrl',
5
+ 'toHaveUrlContaining',
6
+ 'toBeClickable',
7
+ 'toBeDisabled',
8
+ 'toBeDisplayed',
9
+ 'toBeDisplayedInViewport',
10
+ 'toBeEnabled',
11
+ 'toBeExisting',
12
+ 'toBeFocused',
13
+ 'toBeSelected',
14
+ 'toHaveAttribute',
15
+ 'toHaveAttributeContaining',
16
+ 'toHaveChildren',
17
+ 'toHaveElementClass',
18
+ 'toHaveElementClassContaining',
19
+ 'toHaveElementProperty',
20
+ 'toHaveHref',
21
+ 'toHaveHrefContaining',
22
+ 'toHaveId',
23
+ 'toHaveStyle',
24
+ 'toHaveText',
25
+ 'toHaveTextContaining',
26
+ 'toHaveValue',
27
+ 'toHaveValueContaining',
28
+ 'toBeElementsArrayOfSize',
29
+ 'toBeRequested',
30
+ 'toBeRequestedTimes',
31
+ 'toBeRequestedWith',
32
+ 'toBeRequestedWithResponse'
33
+ ]
package/src/index.ts ADDED
@@ -0,0 +1,28 @@
1
+ import awaitExpect from './rules/await-expect'
2
+ import noDebug from './rules/no-debug'
3
+ import noPause from './rules/no-pause'
4
+
5
+ const rules = {
6
+ 'await-expect' : awaitExpect,
7
+ 'no-debug' : noDebug,
8
+ 'no-pause' : noPause
9
+ }
10
+
11
+ const configs = {
12
+ recommended: {
13
+ globals: {
14
+ $ : false,
15
+ $$ : false,
16
+ browser : false,
17
+ driver : false,
18
+ expect : false,
19
+ multiremotebrowser : false,
20
+ },
21
+ rules
22
+ }
23
+ }
24
+
25
+ export {
26
+ rules,
27
+ configs,
28
+ }
@@ -0,0 +1,54 @@
1
+ import type { Rule } from 'eslint'
2
+ import type { Identifier } from 'estree'
3
+
4
+ import { MATCHERS } from '../constants'
5
+
6
+ const rule: Rule.RuleModule = {
7
+ meta: {
8
+ type: 'problem',
9
+ docs: {
10
+ description: 'expect must be prefixed with await',
11
+ category: 'Possible Errors',
12
+ url: 'https://github.com/webdriverio/packages/eslint-plugin-wdio/docs/rules/await-expect.md',
13
+ recommended: false,
14
+ },
15
+ messages: {
16
+ missingAwait: 'Missing await before an expect statement'
17
+ },
18
+ hasSuggestions: true
19
+ },
20
+
21
+ create: function (context: Rule.RuleContext): Rule.RuleListener {
22
+ return {
23
+ CallExpression(node): void {
24
+ /**
25
+ * validate we have an expect statement that
26
+ * calls some of the WebdriverIO matchers
27
+ */
28
+ if (
29
+ node.callee.type !== 'MemberExpression' ||
30
+ node.callee.object.type !== 'CallExpression' ||
31
+ (node.callee.object.callee as Identifier).name !== 'expect' ||
32
+ !MATCHERS.includes((node.callee.property as Identifier).name)
33
+ ) {
34
+ return
35
+ }
36
+
37
+ /**
38
+ * fail rule if:
39
+ */
40
+ if (
41
+ /**
42
+ * expect is called without an `await` and as part of an
43
+ * expression
44
+ */
45
+ node.parent.type === 'ExpressionStatement'
46
+ ) {
47
+ context.report({ node, messageId: 'missingAwait' })
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ export default rule
@@ -0,0 +1,31 @@
1
+ import { Rule } from 'eslint'
2
+ import { isCommand } from '../utils/helpers'
3
+
4
+ const rule: Rule.RuleModule = {
5
+ meta: {
6
+ type: 'problem',
7
+ docs: {
8
+ description: 'Disallow browser.debug() in tests',
9
+ category: 'Possible Errors',
10
+ url: 'https://github.com/webdriverio/packages/eslint-plugin-wdio/docs/rules/no-debug.md',
11
+ recommended: false,
12
+ },
13
+ messages: {
14
+ unexpectedDebug: 'Unexpected browser.debug() not allowed'
15
+ },
16
+ hasSuggestions: true,
17
+ schema: [],
18
+ },
19
+
20
+ create: function (context: Rule.RuleContext): Rule.RuleListener {
21
+ return {
22
+ CallExpression(node): void {
23
+ if (isCommand(node, 'debug')) {
24
+ context.report({ node, messageId: 'unexpectedDebug' })
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ export default rule
@@ -0,0 +1,31 @@
1
+ import { Rule } from 'eslint'
2
+ import { isCommand } from '../utils/helpers'
3
+
4
+ const rule: Rule.RuleModule = {
5
+ meta: {
6
+ type: 'problem',
7
+ docs: {
8
+ description: 'Disallow browser.pause() in tests',
9
+ category: 'Possible Errors',
10
+ url: 'https://github.com/webdriverio/packages/eslint-plugin-wdio/docs/rules/no-pause.md',
11
+ recommended: false,
12
+ },
13
+ messages: {
14
+ unexpectedPause: 'Unexpected browser.pause() not allowed'
15
+ },
16
+ hasSuggestions: true,
17
+ schema: [],
18
+ },
19
+
20
+ create: function (context: Rule.RuleContext): Rule.RuleListener {
21
+ return {
22
+ CallExpression(node): void {
23
+ if (isCommand(node, 'pause')) {
24
+ context.report({ node, messageId: 'unexpectedPause' })
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ export default rule
@@ -0,0 +1,12 @@
1
+ // import type { TSESTree } from '@typescript-eslint/utils'
2
+
3
+ export const isCommand = function(expression: any, command: 'pause' | 'debug'): boolean {
4
+ const callee = expression?.callee
5
+
6
+ return (
7
+ callee &&
8
+ callee?.object?.name === 'browser' &&
9
+ callee?.property?.name === command
10
+ )
11
+ }
12
+