2023-10-17 08:30:04 +00:00
|
|
|
const {readdirSync} = require('fs');
|
|
|
|
const {join} = require('path');
|
|
|
|
|
2023-08-29 19:41:29 +00:00
|
|
|
const rulesDirPlugin = require('eslint-plugin-rulesdir');
|
2023-10-17 08:30:04 +00:00
|
|
|
|
2023-08-29 19:41:29 +00:00
|
|
|
rulesDirPlugin.RULES_DIR = 'tools/eslint/lib';
|
|
|
|
|
2023-10-17 08:30:04 +00:00
|
|
|
function getThirdPartyPackages() {
|
|
|
|
return readdirSync(join(__dirname, 'packages/puppeteer-core/third_party'), {
|
|
|
|
withFileTypes: true,
|
|
|
|
})
|
|
|
|
.filter(dirent => {
|
|
|
|
return dirent.isDirectory();
|
|
|
|
})
|
|
|
|
.map(({name}) => {
|
|
|
|
return {
|
|
|
|
name,
|
|
|
|
message: `Import \`${name}\` from the vendored location: third_party/${name}/index.js`,
|
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-06-11 08:32:59 +00:00
|
|
|
module.exports = {
|
2020-10-12 09:30:35 +00:00
|
|
|
root: true,
|
|
|
|
env: {
|
|
|
|
node: true,
|
|
|
|
es6: true,
|
|
|
|
},
|
2017-06-11 08:32:59 +00:00
|
|
|
|
2020-10-12 09:30:35 +00:00
|
|
|
parser: '@typescript-eslint/parser',
|
2020-04-09 05:56:25 +00:00
|
|
|
|
2022-06-14 11:16:21 +00:00
|
|
|
plugins: ['mocha', '@typescript-eslint', 'import'],
|
2020-05-07 10:54:55 +00:00
|
|
|
|
2023-09-21 20:22:38 +00:00
|
|
|
extends: ['plugin:prettier/recommended', 'plugin:import/typescript'],
|
|
|
|
|
|
|
|
settings: {
|
|
|
|
'import/resolver': {
|
|
|
|
typescript: true,
|
|
|
|
},
|
|
|
|
},
|
2017-06-11 08:32:59 +00:00
|
|
|
|
2020-10-12 09:30:35 +00:00
|
|
|
rules: {
|
2022-06-14 11:55:35 +00:00
|
|
|
// Brackets keep code readable.
|
2023-04-26 09:53:02 +00:00
|
|
|
curly: ['error', 'all'],
|
2022-06-15 10:42:21 +00:00
|
|
|
// Brackets keep code readable and `return` intentions clear.
|
|
|
|
'arrow-body-style': ['error', 'always'],
|
2020-10-12 09:30:35 +00:00
|
|
|
// Error if files are not formatted with Prettier correctly.
|
2023-04-26 09:53:02 +00:00
|
|
|
'prettier/prettier': 'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
// syntax preferences
|
|
|
|
'spaced-comment': [
|
2023-04-26 09:53:02 +00:00
|
|
|
'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
'always',
|
|
|
|
{
|
|
|
|
markers: ['*'],
|
|
|
|
},
|
|
|
|
],
|
2023-04-26 09:53:02 +00:00
|
|
|
eqeqeq: ['error'],
|
2020-10-12 09:30:35 +00:00
|
|
|
'accessor-pairs': [
|
2023-04-26 09:53:02 +00:00
|
|
|
'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
{
|
|
|
|
getWithoutSet: false,
|
|
|
|
setWithoutGet: false,
|
|
|
|
},
|
|
|
|
],
|
2023-04-26 09:53:02 +00:00
|
|
|
'new-parens': 'error',
|
|
|
|
'func-call-spacing': 'error',
|
|
|
|
'prefer-const': 'error',
|
2017-06-11 08:32:59 +00:00
|
|
|
|
2020-10-12 09:30:35 +00:00
|
|
|
'max-len': [
|
2023-04-26 09:53:02 +00:00
|
|
|
'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
{
|
|
|
|
/* this setting doesn't impact things as we use Prettier to format
|
|
|
|
* our code and hence dictate the line length.
|
|
|
|
* Prettier aims for 80 but sometimes makes the decision to go just
|
|
|
|
* over 80 chars as it decides that's better than wrapping. ESLint's
|
|
|
|
* rule defaults to 80 but therefore conflicts with Prettier. So we
|
|
|
|
* set it to something far higher than Prettier would allow to avoid
|
|
|
|
* it causing issues and conflicting with Prettier.
|
|
|
|
*/
|
|
|
|
code: 200,
|
|
|
|
comments: 90,
|
|
|
|
ignoreTemplateLiterals: true,
|
|
|
|
ignoreUrls: true,
|
|
|
|
ignoreStrings: true,
|
|
|
|
ignoreRegExpLiterals: true,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
// anti-patterns
|
2023-04-26 09:53:02 +00:00
|
|
|
'no-var': 'error',
|
|
|
|
'no-with': 'error',
|
|
|
|
'no-multi-str': 'error',
|
|
|
|
'no-caller': 'error',
|
|
|
|
'no-implied-eval': 'error',
|
|
|
|
'no-labels': 'error',
|
|
|
|
'no-new-object': 'error',
|
|
|
|
'no-octal-escape': 'error',
|
|
|
|
'no-self-compare': 'error',
|
|
|
|
'no-shadow-restricted-names': 'error',
|
|
|
|
'no-cond-assign': 'error',
|
|
|
|
'no-debugger': 'error',
|
|
|
|
'no-dupe-keys': 'error',
|
|
|
|
'no-duplicate-case': 'error',
|
|
|
|
'no-empty-character-class': 'error',
|
|
|
|
'no-unreachable': 'error',
|
|
|
|
'no-unsafe-negation': 'error',
|
|
|
|
radix: 'error',
|
|
|
|
'valid-typeof': 'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
'no-unused-vars': [
|
2023-04-26 09:53:02 +00:00
|
|
|
'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
{
|
|
|
|
args: 'none',
|
|
|
|
vars: 'local',
|
|
|
|
varsIgnorePattern:
|
|
|
|
'([fx]?describe|[fx]?it|beforeAll|beforeEach|afterAll|afterEach)',
|
|
|
|
},
|
|
|
|
],
|
2023-04-26 09:53:02 +00:00
|
|
|
'no-implicit-globals': ['error'],
|
2017-06-11 08:32:59 +00:00
|
|
|
|
2020-10-12 09:30:35 +00:00
|
|
|
// es2015 features
|
2023-04-26 09:53:02 +00:00
|
|
|
'require-yield': 'error',
|
|
|
|
'template-curly-spacing': ['error', 'never'],
|
2020-04-28 13:16:28 +00:00
|
|
|
|
2020-10-12 09:30:35 +00:00
|
|
|
// ensure we don't have any it.only or describe.only in prod
|
|
|
|
'mocha/no-exclusive-tests': 'error',
|
2020-07-08 15:03:16 +00:00
|
|
|
|
2023-02-15 23:09:31 +00:00
|
|
|
'import/order': [
|
|
|
|
'error',
|
|
|
|
{
|
|
|
|
'newlines-between': 'always',
|
|
|
|
alphabetize: {order: 'asc', caseInsensitive: true},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
|
2023-10-23 12:06:41 +00:00
|
|
|
'import/no-cycle': [
|
|
|
|
'warn',
|
|
|
|
{maxDepth: Infinity, allowUnsafeDynamicCyclicDependency: true},
|
|
|
|
],
|
2023-09-21 20:22:38 +00:00
|
|
|
|
2022-06-13 09:16:25 +00:00
|
|
|
'no-restricted-syntax': [
|
|
|
|
'error',
|
|
|
|
// Don't allow underscored declarations on camelCased variables/properties.
|
|
|
|
// ...RESTRICTED_UNDERSCORED_IDENTIFIERS,
|
|
|
|
],
|
2020-10-12 09:30:35 +00:00
|
|
|
},
|
|
|
|
overrides: [
|
|
|
|
{
|
|
|
|
files: ['*.ts'],
|
2023-04-26 09:53:02 +00:00
|
|
|
parserOptions: {
|
|
|
|
allowAutomaticSingleRunInference: true,
|
|
|
|
project: './tsconfig.base.json',
|
|
|
|
},
|
2020-10-12 09:30:35 +00:00
|
|
|
extends: [
|
|
|
|
'plugin:@typescript-eslint/eslint-recommended',
|
|
|
|
'plugin:@typescript-eslint/recommended',
|
2023-07-17 08:52:54 +00:00
|
|
|
'plugin:@typescript-eslint/stylistic',
|
2020-10-12 09:30:35 +00:00
|
|
|
],
|
2023-08-29 19:41:29 +00:00
|
|
|
plugins: ['eslint-plugin-tsdoc', 'rulesdir'],
|
2020-10-12 09:30:35 +00:00
|
|
|
rules: {
|
2022-08-12 12:15:26 +00:00
|
|
|
// Keeps comments formatted.
|
2023-08-29 19:41:29 +00:00
|
|
|
'rulesdir/prettier-comments': 'error',
|
|
|
|
// Enforces clean up of used resources.
|
2023-08-30 10:02:59 +00:00
|
|
|
'rulesdir/use-using': 'error',
|
2022-06-14 11:55:35 +00:00
|
|
|
// Brackets keep code readable.
|
2023-04-26 09:53:02 +00:00
|
|
|
curly: ['error', 'all'],
|
2022-06-15 10:42:21 +00:00
|
|
|
// Brackets keep code readable and `return` intentions clear.
|
|
|
|
'arrow-body-style': ['error', 'always'],
|
2022-06-01 09:11:09 +00:00
|
|
|
// Error if comments do not adhere to `tsdoc`.
|
2023-04-26 09:53:02 +00:00
|
|
|
'tsdoc/syntax': 'error',
|
2022-07-06 07:05:37 +00:00
|
|
|
// Keeps array types simple only when they are simple for readability.
|
|
|
|
'@typescript-eslint/array-type': ['error', {default: 'array-simple'}],
|
2023-04-26 09:53:02 +00:00
|
|
|
'no-unused-vars': 'off',
|
2022-05-25 13:34:11 +00:00
|
|
|
'@typescript-eslint/no-unused-vars': [
|
|
|
|
'error',
|
2023-09-21 19:21:12 +00:00
|
|
|
{argsIgnorePattern: '^_', varsIgnorePattern: '^_'},
|
2022-05-25 13:34:11 +00:00
|
|
|
],
|
2023-04-26 09:53:02 +00:00
|
|
|
'func-call-spacing': 'off',
|
|
|
|
'@typescript-eslint/func-call-spacing': 'error',
|
|
|
|
semi: 'off',
|
|
|
|
'@typescript-eslint/semi': 'error',
|
|
|
|
'@typescript-eslint/no-empty-function': 'off',
|
|
|
|
'@typescript-eslint/no-use-before-define': 'off',
|
2020-10-12 09:30:35 +00:00
|
|
|
// We have to use any on some types so the warning isn't valuable.
|
2023-04-26 09:53:02 +00:00
|
|
|
'@typescript-eslint/no-explicit-any': 'off',
|
2020-10-12 09:30:35 +00:00
|
|
|
// We don't require explicit return types on basic functions or
|
|
|
|
// dummy functions in tests, for example
|
2023-04-26 09:53:02 +00:00
|
|
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
2022-05-25 13:34:11 +00:00
|
|
|
// We allow non-null assertions if the value was asserted using `assert` API.
|
2023-04-26 09:53:02 +00:00
|
|
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
2020-10-12 09:30:35 +00:00
|
|
|
/**
|
|
|
|
* This is the default options (as per
|
2021-09-14 15:02:39 +00:00
|
|
|
* https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/docs/rules/ban-types.md),
|
2020-10-12 09:30:35 +00:00
|
|
|
*
|
|
|
|
* Unfortunately there's no way to
|
|
|
|
*/
|
|
|
|
'@typescript-eslint/ban-types': [
|
|
|
|
'error',
|
|
|
|
{
|
|
|
|
extendDefaults: true,
|
|
|
|
types: {
|
|
|
|
/*
|
|
|
|
* Puppeteer's API accepts generic functions in many places so it's
|
|
|
|
* not a useful linting rule to ban the `Function` type. This turns off
|
|
|
|
* the banning of the `Function` type which is a default rule.
|
|
|
|
*/
|
|
|
|
Function: false,
|
2020-07-22 11:14:35 +00:00
|
|
|
},
|
2020-10-12 09:30:35 +00:00
|
|
|
},
|
|
|
|
],
|
2021-05-12 16:43:05 +00:00
|
|
|
// By default this is a warning but we want it to error.
|
2023-04-26 09:53:02 +00:00
|
|
|
'@typescript-eslint/explicit-module-boundary-types': 'error',
|
2022-06-13 09:16:25 +00:00
|
|
|
'no-restricted-syntax': [
|
|
|
|
'error',
|
|
|
|
{
|
|
|
|
// Never use `require` in TypeScript since they are transpiled out.
|
|
|
|
selector: "CallExpression[callee.name='require']",
|
|
|
|
message: '`require` statements are not allowed. Use `import`.',
|
|
|
|
},
|
2023-05-31 21:36:19 +00:00
|
|
|
{
|
|
|
|
// We need this as NodeJS will run until all the timers have resolved
|
|
|
|
message: 'Use method `Deferred.race()` instead.',
|
|
|
|
selector:
|
|
|
|
'MemberExpression[object.name="Promise"][property.name="race"]',
|
|
|
|
},
|
2023-06-01 19:51:16 +00:00
|
|
|
{
|
|
|
|
message:
|
|
|
|
'Deferred `valueOrThrow` should not be called in `Deferred.race()` pass deferred directly',
|
|
|
|
selector:
|
|
|
|
'CallExpression[callee.object.name="Deferred"][callee.property.name="race"] > ArrayExpression > CallExpression[callee.property.name="valueOrThrow"]',
|
|
|
|
},
|
2022-06-13 09:16:25 +00:00
|
|
|
],
|
2023-04-26 09:53:02 +00:00
|
|
|
'@typescript-eslint/no-floating-promises': [
|
|
|
|
'error',
|
|
|
|
{ignoreVoid: true, ignoreIIFE: true},
|
|
|
|
],
|
2023-07-17 08:52:54 +00:00
|
|
|
'@typescript-eslint/prefer-ts-expect-error': 'error',
|
2023-09-01 07:49:33 +00:00
|
|
|
// This is more performant; see https://v8.dev/blog/fast-async.
|
|
|
|
'@typescript-eslint/return-await': ['error', 'always'],
|
2023-09-15 11:00:20 +00:00
|
|
|
// This optimizes the dependency tracking for type-only files.
|
2023-09-26 16:24:24 +00:00
|
|
|
'@typescript-eslint/consistent-type-imports': 'error',
|
|
|
|
// So type-only exports get elided.
|
|
|
|
'@typescript-eslint/consistent-type-exports': 'error',
|
|
|
|
// Don't want to trigger unintended side-effects.
|
|
|
|
'@typescript-eslint/no-import-type-side-effects': 'error',
|
2020-10-12 09:30:35 +00:00
|
|
|
},
|
2023-08-24 12:42:51 +00:00
|
|
|
overrides: [
|
2023-10-17 08:30:04 +00:00
|
|
|
{
|
|
|
|
files: 'packages/puppeteer-core/src/**/*.ts',
|
|
|
|
rules: {
|
|
|
|
'no-restricted-imports': [
|
|
|
|
'error',
|
|
|
|
{
|
|
|
|
patterns: ['*Events', '*.test.js'],
|
|
|
|
paths: [...getThirdPartyPackages()],
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
2023-08-24 12:42:51 +00:00
|
|
|
{
|
|
|
|
files: [
|
|
|
|
'packages/puppeteer-core/src/**/*.test.ts',
|
2023-09-22 08:57:18 +00:00
|
|
|
'tools/mocha-runner/src/test.ts',
|
2023-08-24 12:42:51 +00:00
|
|
|
],
|
|
|
|
rules: {
|
|
|
|
// With the Node.js test runner, `describe` and `it` are technically
|
|
|
|
// promises, but we don't need to await them.
|
|
|
|
'@typescript-eslint/no-floating-promises': 'off',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
2020-10-12 09:30:35 +00:00
|
|
|
},
|
|
|
|
],
|
2017-06-11 08:32:59 +00:00
|
|
|
};
|