mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
chore: 🤖 forbid import from ui/** (#40537)
* chore: 🤖 forbid importing from ui/** from within shims * chore: 🤖 allow importing platfrom in dashboard embeddable sihm * chore: 🤖 use np_ready folder, improve rule * chore: 🤖 update ESLint error message * feat: 🎸 improve eslint plugin rule * test: 💍 add tests for restricted paths linter rule * test: 💍 add ESLint package to CI testing suite * chore: 🤖 fix linter errors
This commit is contained in:
parent
dc17fdc5c9
commit
8f0de3abdb
12 changed files with 106 additions and 5 deletions
15
.eslintrc.js
15
.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.',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
|
|
@ -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 : ''
|
||||
}`,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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, '../../..'),
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue