diff --git a/.eslintrc.js b/.eslintrc.js index 6791d2f18d9c5..019f93d91b555 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -156,6 +156,21 @@ module.exports = { ], allowSameFolder: true, }, + { + from: ['src/legacy/ui/**/*', 'ui/**/*'], + target: [ + 'src/legacy/core_plugins/**/public/np_ready/**/*', + 'src/legacy/core_plugins/**/server/np_ready/**/*', + 'x-pack/legacy/plugins/**/public/np_ready/**/*', + 'x-pack/legacy/plugins/**/server/np_ready/**/*', + ], + allowSameFolder: true, + errorMessage: + 'NP-ready code should not import from /src/legacy/ui/** folder. ' + + 'Instead of importing from /src/legacy/ui/** deeply within a np_ready folder, ' + + 'import those things once at the top level of your plugin and pass those down, just ' + + 'like you pass down `core` and `plugins` objects.', + }, ], }, ], diff --git a/packages/kbn-eslint-plugin-eslint/rules/__tests__/no_restricted_paths.js b/packages/kbn-eslint-plugin-eslint/rules/__tests__/no_restricted_paths.js index 11f01a1777ab6..c821aafb09285 100644 --- a/packages/kbn-eslint-plugin-eslint/rules/__tests__/no_restricted_paths.js +++ b/packages/kbn-eslint-plugin-eslint/rules/__tests__/no_restricted_paths.js @@ -295,5 +295,79 @@ ruleTester.run('@kbn/eslint/no-restricted-paths', rule, { }, ], }, + + { + // Does not allow to import deeply within Core, using "src/core/..." Webpack alias. + code: 'const d = require("src/core/server/saved_objects")', + filename: path.join(__dirname, './files/no_restricted_paths/client/a.js'), + options: [ + { + basePath: __dirname, + zones: [ + { + target: 'files/no_restricted_paths/**/*', + from: 'src/core/server/**/*', + }, + ], + }, + ], + errors: [ + { + message: 'Unexpected path "src/core/server/saved_objects" imported in restricted zone.', + line: 1, + column: 19, + }, + ], + }, + + { + // Does not allow to import "ui/kfetch". + code: 'const d = require("ui/kfetch")', + filename: path.join(__dirname, './files/no_restricted_paths/client/a.js'), + options: [ + { + basePath: __dirname, + zones: [ + { + from: ['src/legacy/ui/**/*', 'ui/**/*'], + target: 'files/no_restricted_paths/**/*', + allowSameFolder: true, + }, + ], + }, + ], + errors: [ + { + message: 'Unexpected path "ui/kfetch" imported in restricted zone.', + line: 1, + column: 19, + }, + ], + }, + + { + // Does not allow to import deeply "ui/kfetch/public/index". + code: 'const d = require("ui/kfetch/public/index")', + filename: path.join(__dirname, './files/no_restricted_paths/client/a.js'), + options: [ + { + basePath: __dirname, + zones: [ + { + from: ['src/legacy/ui/**/*', 'ui/**/*'], + target: 'files/no_restricted_paths/**/*', + allowSameFolder: true, + }, + ], + }, + ], + errors: [ + { + message: 'Unexpected path "ui/kfetch/public/index" imported in restricted zone.', + line: 1, + column: 19, + }, + ], + }, ], }); diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_restricted_paths.js b/packages/kbn-eslint-plugin-eslint/rules/no_restricted_paths.js index 4248544c2ea5c..9074c35d27c7e 100644 --- a/packages/kbn-eslint-plugin-eslint/rules/no_restricted_paths.js +++ b/packages/kbn-eslint-plugin-eslint/rules/no_restricted_paths.js @@ -97,15 +97,16 @@ module.exports = { } function checkForRestrictedImportPath(importPath, node) { - const absoluteImportPath = resolve(importPath, context); - if (!absoluteImportPath) return; + const absoluteImportPath = importPath[0] === '.' ? resolve(importPath, context) : undefined; const currentFilename = context.getFilename(); - for (const { target, from, allowSameFolder } of zones) { + for (const { target, from, allowSameFolder, errorMessage = '' } of zones) { const srcFilePath = resolve(currentFilename, context); const relativeSrcFile = path.relative(basePath, srcFilePath); - const relativeImportFile = path.relative(basePath, absoluteImportPath); + const relativeImportFile = absoluteImportPath + ? path.relative(basePath, absoluteImportPath) + : importPath; if ( !mm([relativeSrcFile], target).length || @@ -116,7 +117,9 @@ module.exports = { context.report({ node, - message: `Unexpected path "${importPath}" imported in restricted zone.`, + message: `Unexpected path "${importPath}" imported in restricted zone.${ + errorMessage ? ' ' + errorMessage : '' + }`, }); } } diff --git a/src/dev/mocha/run_mocha_cli.js b/src/dev/mocha/run_mocha_cli.js index 299a910127d40..d2bb9ef9e0182 100644 --- a/src/dev/mocha/run_mocha_cli.js +++ b/src/dev/mocha/run_mocha_cli.js @@ -74,6 +74,7 @@ export function runMochaCli() { 'packages/elastic-datemath/test/**/*.js', 'packages/kbn-dev-utils/src/**/__tests__/**/*.js', 'packages/kbn-es-query/src/**/__tests__/**/*.js', + 'packages/kbn-eslint-plugin-eslint/**/__tests__/**/*.js', 'tasks/**/__tests__/**/*.js', ], { cwd: resolve(__dirname, '../../..'), diff --git a/src/legacy/core_plugins/dashboard_embeddable_container/public/shim/index.ts b/src/legacy/core_plugins/dashboard_embeddable_container/public/shim/index.ts index 7868ce7f06cf2..fa81a30db3744 100644 --- a/src/legacy/core_plugins/dashboard_embeddable_container/public/shim/index.ts +++ b/src/legacy/core_plugins/dashboard_embeddable_container/public/shim/index.ts @@ -18,6 +18,7 @@ */ import { PluginInitializerContext } from 'kibana/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { npSetup, npStart } from 'ui/new_platform'; import { embeddablePlugin } from '../../../embeddable_api/public'; import { Plugin } from './plugin'; diff --git a/src/legacy/core_plugins/embeddable_api/public/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx b/src/legacy/core_plugins/embeddable_api/public/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx index 1683f05c1d6b7..42fca6c721b0c 100644 --- a/src/legacy/core_plugins/embeddable_api/public/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx +++ b/src/legacy/core_plugins/embeddable_api/public/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx @@ -38,6 +38,7 @@ import { EuiText, } from '@elastic/eui'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SavedObjectAttributes } from 'src/core/server/saved_objects'; import { EmbeddableFactoryNotFoundError } from '../../../../embeddables/embeddable_factory_not_found_error'; import { IContainer } from '../../../../containers'; diff --git a/src/legacy/ui/public/chrome/api/badge.test.ts b/src/legacy/ui/public/chrome/api/badge.test.ts index 02fc1e39d397c..6a19afb609f8a 100644 --- a/src/legacy/ui/public/chrome/api/badge.test.ts +++ b/src/legacy/ui/public/chrome/api/badge.test.ts @@ -19,6 +19,7 @@ import * as Rx from 'rxjs'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBadge } from 'src/core/public/chrome'; import { newPlatformChrome } from './badge.test.mocks'; import { initChromeBadgeApi } from './badge'; diff --git a/x-pack/legacy/plugins/beats_management/server/lib/adapters/database/__tests__/kibana.ts b/x-pack/legacy/plugins/beats_management/server/lib/adapters/database/__tests__/kibana.ts index 58e4488647d5b..e3587afb72717 100644 --- a/x-pack/legacy/plugins/beats_management/server/lib/adapters/database/__tests__/kibana.ts +++ b/x-pack/legacy/plugins/beats_management/server/lib/adapters/database/__tests__/kibana.ts @@ -7,6 +7,7 @@ // @ts-ignore import { createEsTestCluster } from '@kbn/test'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { Root } from 'src/core/server/root'; // @ts-ignore import * as kbnTestServer from '../../../../../../../../../src/test_utils/kbn_server'; diff --git a/x-pack/legacy/plugins/code/server/__tests__/multi_node.ts b/x-pack/legacy/plugins/code/server/__tests__/multi_node.ts index 8036f39409196..549a10a2d32f5 100644 --- a/x-pack/legacy/plugins/code/server/__tests__/multi_node.ts +++ b/x-pack/legacy/plugins/code/server/__tests__/multi_node.ts @@ -6,6 +6,7 @@ import getPort from 'get-port'; import { resolve } from 'path'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { Root } from 'src/core/server/root'; import { diff --git a/x-pack/legacy/plugins/encrypted_saved_objects/server/plugin.ts b/x-pack/legacy/plugins/encrypted_saved_objects/server/plugin.ts index 0117e0a878848..ad38ca0f7a881 100644 --- a/x-pack/legacy/plugins/encrypted_saved_objects/server/plugin.ts +++ b/x-pack/legacy/plugins/encrypted_saved_objects/server/plugin.ts @@ -6,6 +6,7 @@ import crypto from 'crypto'; import { Legacy, Server } from 'kibana'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SavedObjectsRepository } from 'src/core/server/saved_objects/service'; import { SavedObjectsBaseOptions, SavedObject, SavedObjectAttributes } from 'src/core/server'; import { diff --git a/x-pack/legacy/plugins/spaces/server/routes/api/__fixtures__/create_test_handler.ts b/x-pack/legacy/plugins/spaces/server/routes/api/__fixtures__/create_test_handler.ts index f84194160971d..0e90e2c47118c 100644 --- a/x-pack/legacy/plugins/spaces/server/routes/api/__fixtures__/create_test_handler.ts +++ b/x-pack/legacy/plugins/spaces/server/routes/api/__fixtures__/create_test_handler.ts @@ -8,6 +8,7 @@ import * as Rx from 'rxjs'; import { Server } from 'hapi'; import { Legacy } from 'kibana'; import { KibanaConfig } from 'src/legacy/server/kbn_server'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { httpServiceMock, elasticsearchServiceMock } from 'src/core/server/mocks'; import { createOptionalPlugin } from '../../../../../../server/lib/optional_plugin'; import { SpacesClient } from '../../../lib/spaces_client'; diff --git a/x-pack/legacy/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts b/x-pack/legacy/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts index 8c01db82a7075..3a9b11a57f070 100644 --- a/x-pack/legacy/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts +++ b/x-pack/legacy/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts @@ -5,6 +5,7 @@ */ import { set } from 'lodash'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SavedObjectsRepository } from 'src/core/server/saved_objects/service/lib/repository'; import { UPGRADE_ASSISTANT_DOC_ID,