From d511e80b0100233cef319437fe4caaef0888f7ef Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 20 Mar 2024 23:03:09 -0400 Subject: [PATCH] chore: new payload/no-relative-monorepo-imports eslint rule --- .../no-relative-monorepo-imports.js | 28 +++++++++++++++++++ packages/eslint-plugin-payload/index.js | 1 + test/.eslintrc.cjs | 9 +++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/eslint-plugin-payload/customRules/no-relative-monorepo-imports.js diff --git a/packages/eslint-plugin-payload/customRules/no-relative-monorepo-imports.js b/packages/eslint-plugin-payload/customRules/no-relative-monorepo-imports.js new file mode 100644 index 0000000000..b4b8ce0418 --- /dev/null +++ b/packages/eslint-plugin-payload/customRules/no-relative-monorepo-imports.js @@ -0,0 +1,28 @@ +module.exports = { + meta: { + type: 'problem', + docs: { + description: 'Disallow imports from relative monorepo packages/*/src', + category: 'Best Practices', + recommended: true, + }, + schema: [], + }, + create: function (context) { + return { + ImportDeclaration(node) { + const importPath = node.source.value + + // Match imports starting with any number of "../" followed by "packages/" + const regex = /^(\.\.\/)*packages\/[^/]+\/src/ + + if (regex.test(importPath)) { + context.report({ + node: node.source, + message: 'Import from relative "packages/*/src" is not allowed', + }) + } + }, + } + }, +} diff --git a/packages/eslint-plugin-payload/index.js b/packages/eslint-plugin-payload/index.js index a3ea88a6d6..7b1c6a8f22 100644 --- a/packages/eslint-plugin-payload/index.js +++ b/packages/eslint-plugin-payload/index.js @@ -2,5 +2,6 @@ module.exports = { rules: { 'no-non-retryable-assertions': require('./customRules/no-non-retryable-assertions'), + 'no-relative-monorepo-imports': require('./customRules/no-relative-monorepo-imports'), }, } diff --git a/test/.eslintrc.cjs b/test/.eslintrc.cjs index 90a0f18cd4..4e6eb6a2cb 100644 --- a/test/.eslintrc.cjs +++ b/test/.eslintrc.cjs @@ -5,6 +5,10 @@ module.exports = { project: ['./tsconfig.eslint.json'], tsconfigRootDir: __dirname, }, + plugins: ['payload'], + rules: { + 'payload/no-relative-monorepo-imports': 'error', + }, overrides: [ { extends: ['plugin:@typescript-eslint/disable-type-checked'], @@ -26,6 +30,7 @@ module.exports = { { files: ['**/*.ts'], rules: { + 'payload/no-relative-monorepo-imports': 'error', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-use-before-define': 'off', // turn the @typescript-eslint/unbound-method rule off *only* for test files. See https://typescript-eslint.io/rules/unbound-method/#when-not-to-use-it @@ -37,6 +42,7 @@ module.exports = { { files: ['**/*.int.spec.ts', '**/int.spec.ts'], rules: { + 'payload/no-relative-monorepo-imports': 'error', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-use-before-define': 'off', @@ -45,9 +51,9 @@ module.exports = { }, { extends: ['plugin:playwright/recommended'], - plugins: ['payload'], files: ['**/*.e2e.spec.ts', '**/e2e.spec.ts', 'helpers.ts'], rules: { + 'payload/no-relative-monorepo-imports': 'error', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-use-before-define': 'off', 'jest/consistent-test-it': 'off', @@ -63,6 +69,7 @@ module.exports = { { files: ['*.e2e.ts'], rules: { + 'payload/no-relative-monorepo-imports': 'error', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-use-before-define': 'off', 'jest/expect-expect': 'off',