* Initial App Search in Kibana plugin work - Initializes a new platform plugin that ships out of the box w/ x-pack - Contains a very basic front-end that shows AS engines, error states, or a Setup Guide - Contains a very basic server that remotely calls the AS internal engines API and returns results * Update URL casing to match Kibana best practices - URL casing appears to be snake_casing, but kibana.json casing appears to be camelCase * Register App Search plugin in Home Feature Catalogue * Add custom App Search in Kibana logo - I haven't had much success in surfacing a SVG file via a server-side endpoint/URL, but then I realized EuiIcon supports passing in a ReactElement directly. Woo! * Fix appSearch.host config setting to be optional - instead of crashing folks on load * Rename plugin to Enterprise Search - per product decision, URL should be enterprise_search/app_search and Workplace Search should also eventually live here - reorganize folder structure in anticipation for another workplace_search plugin/codebase living alongside app_search - rename app.tsx/main.tsx to a standard top-level index.tsx (which will contain top-level routes/state) - rename AS->ES files/vars where applicable - TODO: React Router * Set up React Router URL structure * Convert showSetupGuide action/flag to a React Router link - remove showSetupGuide flag - add a new shared helper component for combining EuiButton/EuiLink with React Router behavior (https://github.com/elastic/eui/blob/master/wiki/react-router.md#react-router-51) * Implement Kibana Chrome breadcrumbs - create shared helper (WS will presumably also want this) for generating EUI breadcrumb objects with React Router links+click behavior - create React component that calls chrome.setBreadcrumbs on page mount - clean up type definitions - move app-wide props to IAppSearchProps and update most pages/views to simply import it instead of calling their own definitions * Added server unit tests (#2) * Added unit test for server * PR Feedback * Refactor top-level Kibana props to a global context state - rather them passing them around verbosely as props, the components that need them should be able to call the useContext hook + Remove IAppSearchProps in favor of IKibanaContext + Also rename `appSearchUrl` to `enterpriseSearchUrl`, since this context will contained shared/Kibana-wide values/actions useful to both AS and WS * Added unit tests for public (#4) * application.test.ts * Added Unit Test for EngineOverviewHeader * Added Unit Test for generate_breadcrumbs * Added Unit Test for set_breadcrumb.tsx * Added a unit test for link_events - Also changed link_events.tsx to link_events.ts since it's just TS, no React - Modified letBrowserHandleEvent so it will still return a false boolean when target is blank * Betterize these tests Co-Authored-By: Constance <constancecchen@users.noreply.github.com> Co-authored-by: Constance <constancecchen@users.noreply.github.com> * Add UI telemetry tracking to AS in Kibana (#5) * Set up Telemetry usageCollection, savedObjects, route, & shared helper - The Kibana UsageCollection plugin handles collecting our telemetry UI data (views, clicks, errors, etc.) and pushing it to elastic's telemetry servers - That data is stored in incremented in Kibana's savedObjects lib/plugin (as well as mapped) - When an end-user hits a certain view or action, the shared helper will ping the app search telemetry route which increments the savedObject store * Update client-side views/links to new shared telemetry helper * Write tests for new telemetry files * Implement remaining unit tests (#7) * Write tests for React Router+EUI helper components * Update generate_breadcrumbs test - add test suite for generateBreadcrumb() itself (in order to cover a missing branch) - minor lint fixes - remove unnecessary import from set_breadcrumbs test * Write test for get_username util + update test to return a more consistent falsey value (null) * Add test for SetupGuide * [Refactor] Pull out various Kibana context mocks into separate files - I'm creating a reusable useContext mock for shallow()ed enzyme components + add more documentation comments + examples * Write tests for empty state components + test new usecontext shallow mock * Empty state components: Add extra getUserName branch test * Write test for app search index/routes * Write tests for engine overview table + fix bonus bug * Write Engine Overview tests + Update EngineOverview logic to account for issues found during tests :) - Move http to async/await syntax instead of promise syntax (works better with existing HttpServiceMock jest.fn()s) - hasValidData wasn't strict enough in type checking/object nest checking and was causing the app itself to crash (no bueno) * Refactor EngineOverviewHeader test to use shallow + to full coverage - missed adding this test during telemetry work - switching to shallow and beforeAll reduces the test time from 5s to 4s! * [Refactor] Pull out React Router history mocks into a test util helper + minor refactors/updates * Add small tests to increase branch coverage - mostly testing fallbacks or removing fallbacks in favor of strict type interface - these are slightly obsessive so I'd also be fine ditching them if they aren't terribly valuable * Address larger tech debt/TODOs (#8) * Fix optional chaining TODO - turns out my local Prettier wasn't up to date, completely my bad * Fix constants TODO - adds a common folder/architecture for others to use in the future * Remove TODO for eslint-disable-line and specify lint rule being skipped - hopefully that's OK for review, I can't think of any other way to sanely do this without re-architecting the entire file or DDoSing our API * Add server-side logging to route dependencies + add basic example of error catching/logging to Telemetry route + [extra] refactor mockResponseFactory name to something slightly easier to read * Move more Engines Overview API logic/logging to server-side - handle data validation in the server-side - wrap server-side API in a try/catch to account for fetch issues - more correctly return 2xx/4xx statuses and more correctly deal with those responses in the front-end - Add server info/error/debug logs (addresses TODO) - Update tests + minor refactors/cleanup - remove expectResponseToBe200With helper (since we're now returning multiple response types) and instead make mockResponse var name more readable - one-line header auth - update tests with example error logs - update schema validation for `type` to be an enum of `indexed`/`meta` (more accurately reflecting API) * Per telemetry team feedback, rename usageCollection telemetry mapping name to simpler 'app_search' - since their mapping already nests under 'kibana.plugins' - note: I left the savedObjects name with the '_telemetry' suffix, as there very well may be a use case for top-level generic 'app_search' saved objects * Update Setup Guide installation instructions (#9) Co-authored-by: Chris Cressman <chris@chriscressman.com> * [Refactor] DRY out route test helper * [Refactor] Rename public/test_utils to public/__mocks__ - to better follow/use jest setups and for .mock.ts suffixes * Add platinum licensing check to Meta Engines table/call (#11) * Licensing plugin setup * Add LicensingContext setup * Update EngineOverview to not hit meta engines API on platinum license * Add Jest test helpers for future shallow/context use * Update plugin to use new Kibana nav + URL update (#12) * Update new nav categories to add Enterprise Search + update plugin to use new category - per @johnbarrierwilson and Matt Riley, Enterprise Search should be under Kibana and above Observability - Run `node scripts/check_published_api_changes.js --accept` since this new category affects public API * [URL UPDATE] Change '/app/enterprise_search/app_search' to '/app/app_search' - This needs to be done because App Search and Workplace search *have* to be registered as separate plugins to have 2 distinct nav links - Currently Kibana doesn't support nested app names (see: https://github.com/elastic/kibana/issues/59190) but potentially will in the future - To support this change, we need to update applications/index.tsx to NOT handle '/app/enterprise_search' level routing, but instead accept an async imported app component (e.g. AppSearch, WorkplaceSearch). - AppSearch should now treat its router as root '/' instead of '/app_search' - (Addl) Per Josh Dover's recommendation, switch to `<Router history={params.history}>` from `<BrowserRouter basename={params.appBasePath}>` since they're deprecating appBasePath * Update breadcrumbs helper to account for new URLs - Remove path for Enterprise Search breadcrumb, since '/app/enterprise_search' will not link anywhere meaningful for the foreseeable future, so the Enterprise Search root should not go anywhere - Update App Search helper to go to root path, per new React Router setup Test changes: - Mock custom basepath for App Search tests - Swap enterpriseSearchBreadcrumbs and appSearchBreadcrumbs test order (since the latter overrides the default mock) * Add create_first_engine_button telemetry tracking to EmptyState * Switch plugin URLs back to /app/enterprise_search/app_search Now that https://github.com/elastic/kibana/pull/66455 has been merged in 🎉 * Add i18n formatted messages / translations (#13) * Add i18n provider and formatted/i18n translated messages * Update tests to account for new I18nProvider context + FormattedMessage components - Add new mountWithContext helper that provides all contexts+providers used in top-level app - Add new shallowWithIntl helper for shallow() components that dive into FormattedMessage * Format i18n dates and numbers + update some mock tests to not throw react-intl invalid date messages * Update EngineOverviewHeader to disable button on prop * Address review feedback (#14) * Fix Prettier linting issues * Escape App Search API endpoint URLs - per PR feedback - querystring should automatically encodeURIComponent / escape query param strings * Update server plugin.ts to use getStartServices() rather than storing local references from start() - Per feedback: https://github.com/elastic/kibana/blob/master/src/core/CONVENTIONS.md#applications - Note: savedObjects.registerType needs to be outside of getStartServices, or an error is thrown - Side update to registerTelemetryUsageCollector to simplify args - Update/fix tests to account for changes * E2E testing (#6) * Wired up basics for E2E testing * Added version with App Search * Updated naming * Switched configuration around * Added concept of 'fixtures' * Figured out how to log in as the enterprise_search user * Refactored to use an App Search service * Added some real tests * Added a README * Cleanup * More cleanup * Error handling + README updatre * Removed unnecessary files * Apply suggestions from code review Co-authored-by: Constance <constancecchen@users.noreply.github.com> * Update x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_table.tsx Co-authored-by: Constance <constancecchen@users.noreply.github.com> * PR feedback - updated README * Additional lint fixes Co-authored-by: Constance <constancecchen@users.noreply.github.com> * Add README and CODEOWNERS (#15) * Add plugin README and CODEOWNERS * Fix Typescript errors (#16) * Fix public mocks * Fix empty states types * Fix engine table component errors * Fix engine overview component errors * Fix setup guide component errors - SetBreadcrumbs will be fixed in a separate commit * Fix App Search index errors * Fix engine overview header component errors * Fix applications context index errors * Fix kibana breadcrumb helper errors * Fix license helper errors * ❗ Refactor React Router EUI link/button helpers - in order to fix typescript errors - this changes the component logic significantly to a react render prop, so that the Link and Button components can have different types - however, end behavior should still remain the same * Fix telemetry helper errors * Minor unused var cleanup in plugin files * Fix telemetry collector/savedobjects errors * Fix MockRouter type errors and add IRouteDependencies export - routes will use IRouteDependencies in the next few commits * Fix engines route errors * Fix telemetry route errors * Remove any type from source code - thanks to Scotty for the inspiration * Add eslint rules for Enterprise Search plugin - Add checks for type any, but only on non-test files - Disable react-hooks/exhaustive-deps, since we're already disabling it in a few files and other plugins also have it turned off * Cover uncovered lines in engines_table and telemetry tests * Fixed TS warnings in E2E tests (#17) * Feedback: Convert static CSS values to EUI variables where possible * Feedback: Flatten nested CSS where possible - Prefer setting CSS class overrides on individual EUI components, not on a top-level page + Change CSS class casing from kebab-case to camelCase to better match EUI/Kibana + Remove unnecessary .euiPageContentHeader margin-bottom override by changing the panelPaddingSize of euiPageContent + Decrease engine overview table padding on mobile * Refactor out components shared with Workplace Search (#18) * Move getUserName helper to shared - in preparation for Workplace Search plugin also using this helper * Move Setup Guide layout to a shared component * Setup Guide: add extra props for standard/native auth links Note: It's possible this commit may be unnecessary if we can publish shared Enterprise Search security mode docs * Update copy per feedback from copy team * Address various telemetry issues - saved objects: removing indexing per #43673 - add schema and generate json per #64942 - move definitions over to collectors since saved objects is mostly empty at this point, and schema throws an error when it imports an obj instead of being defined inline - istanbul ignore saved_objects file since it doesn't have anything meaningful to test but was affecting code coverage * Disable plugin access if a normal user does not have access to App Search (#19) * Set up new server security dependency and configs * Set up access capabilities * Set up checkAccess helper/caller * Remove NoUserState component from the public UI - Since this is now being handled by checkAccess / normal users should never see the plugin at all if they don't have an account/access, the component is no longer needed * Update server routes to account for new changes - Remove login redirect catch from routes, since the access helper should now handle that for most users by disabling the plugin (superusers will see a generic cannot connect/error screen) - Refactor out new config values to a shared mock * Refactor Enterprise Search http call to hit/return new internal API endpoint + pull out the http call to a separate library for upcoming public URL work (so that other files can call it directly as well) * [Discussion] Increase timeout but add another warning timeout for slow servers - per recommendation/convo with Brandon * Register feature control * Remove no_as_account from UI telemetry - since we're no longer tracking that in the UI * Address PR feedback - isSuperUser check * Public URL support for Elastic Cloud (#21) * Add server-side public URL route - Per feedback from Kibana platform team, it's not possible to pass info from server/ to public/ without a HTTP call :[ * Update MockRouter for routes without any payload/params * Add client-side helper for calling the new public URL API + API seems to return a URL a trailing slash, which we need to omit * Update public/plugin.ts to check and set a public URL - relies on this.hasCheckedPublicUrl to only make the call once per page load instead of on every page nav * Fix failing feature control tests - Split up scenario cases as needed - Add plugin as an exception alongside ML & Monitoring * Address PR feedback - version: kibana - copy edits - Sass vars - code cleanup * Casing feedback: change all plugin registration IDs from snake_case to camelCase - note: current remainng snake_case exceptions are telemetry keys - file names and api endpoints are snake_case per conventions * Misc security feedback - remove set - remove unnecessary capabilities registration - telemetry namespace agnostic * Security feedback: add warn logging to telemetry collector see https://github.com/elastic/kibana/pull/66922#discussion_r451215760 - add if statement - pass log dependency around (this is kinda medium, should maybe refactor) - update tests - move test file comment to the right file (was meant for telemetry route file) * Address feedback from Pierre - Remove unnecessary ServerConfigType - Remove unnecessary uiCapabilities - Move registerTelemetryRoute / SavedObjectsServiceStart workaround - Remove unnecessary license optional chaining * PR feedback Address type/typos * Fix telemetry API call returning 415 on Chrome - I can't even?? I swear charset=utf-8 fixed the same error a few weeks ago * Fix failing tests * Update Enterprise Search functional tests (without host) to run on CI - Fix incorrect navigateToApp slug (hadn't realized this was a URL, not an ID) - Update without_host_configured tests to run without API key - Update README * Address PR feedback from Pierre - remove unnecessary authz? - remove unnecessary content-type json headers - add loggingSystemMock.collect(mockLogger).error assertion - reconstrcut new MockRouter on beforeEach for better sandboxing - fix incorrect describe()s -should be it() - pull out reusable mockDependencies helper (renamed/extended from mockConfig) for tests that don't particularly use config/log but still want to pass type definitions - Fix comment copy Co-authored-by: Jason Stoltzfus <jastoltz24@gmail.com> Co-authored-by: Chris Cressman <chris@chriscressman.com> Co-authored-by: scottybollinger <scotty.bollinger@elastic.co> Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
1074 lines
34 KiB
JavaScript
1074 lines
34 KiB
JavaScript
/*
|
|
* Licensed to Elasticsearch B.V. under one or more contributor
|
|
* license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright
|
|
* ownership. Elasticsearch B.V. licenses this file to you under
|
|
* the Apache License, Version 2.0 (the "License"); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
const { readdirSync } = require('fs');
|
|
const { resolve } = require('path');
|
|
|
|
const APACHE_2_0_LICENSE_HEADER = `
|
|
/*
|
|
* Licensed to Elasticsearch B.V. under one or more contributor
|
|
* license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright
|
|
* ownership. Elasticsearch B.V. licenses this file to you under
|
|
* the Apache License, Version 2.0 (the "License"); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
`;
|
|
|
|
const ELASTIC_LICENSE_HEADER = `
|
|
/*
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
* or more contributor license agreements. Licensed under the Elastic License;
|
|
* you may not use this file except in compliance with the Elastic License.
|
|
*/
|
|
`;
|
|
|
|
const allMochaRulesOff = {};
|
|
Object.keys(require('eslint-plugin-mocha').rules).forEach((k) => {
|
|
allMochaRulesOff['mocha/' + k] = 'off';
|
|
});
|
|
|
|
module.exports = {
|
|
root: true,
|
|
|
|
extends: ['@elastic/eslint-config-kibana', 'plugin:@elastic/eui/recommended'],
|
|
|
|
overrides: [
|
|
/**
|
|
* Temporarily disable some react rules for specific plugins, remove in separate PRs
|
|
*/
|
|
{
|
|
files: ['packages/kbn-ui-framework/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'jsx-a11y/no-onchange': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['src/plugins/es_ui_shared/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['src/plugins/kibana_react/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/rules-of-hooks': 'off',
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['src/plugins/kibana_utils/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/canvas/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'jsx-a11y/click-events-have-key-events': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/cross_cluster_replication/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'jsx-a11y/click-events-have-key-events': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/legacy/plugins/index_management/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
'react-hooks/rules-of-hooks': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/lens/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/ml/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/legacy/plugins/snapshot_restore/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that require Apache 2.0 headers, settings
|
|
* are overridden below for files that require Elastic
|
|
* Licence headers
|
|
*/
|
|
{
|
|
files: ['**/*.{js,mjs,ts,tsx}', '!plugins/**/*'],
|
|
rules: {
|
|
'@kbn/eslint/require-license-header': [
|
|
'error',
|
|
{
|
|
license: APACHE_2_0_LICENSE_HEADER,
|
|
},
|
|
],
|
|
'@kbn/eslint/disallow-license-headers': [
|
|
'error',
|
|
{
|
|
licenses: [ELASTIC_LICENSE_HEADER],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* New Platform client-side
|
|
*/
|
|
{
|
|
files: ['{src,x-pack}/plugins/*/public/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'import/no-commonjs': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that require Elastic license headers instead of Apache 2.0 header
|
|
*/
|
|
{
|
|
files: ['x-pack/**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'@kbn/eslint/require-license-header': [
|
|
'error',
|
|
{
|
|
license: ELASTIC_LICENSE_HEADER,
|
|
},
|
|
],
|
|
'@kbn/eslint/disallow-license-headers': [
|
|
'error',
|
|
{
|
|
licenses: [APACHE_2_0_LICENSE_HEADER],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Restricted paths
|
|
*/
|
|
{
|
|
files: ['**/*.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'@kbn/eslint/no-restricted-paths': [
|
|
'error',
|
|
{
|
|
basePath: __dirname,
|
|
zones: [
|
|
{
|
|
target: ['(src|x-pack)/**/*', '!src/core/**/*'],
|
|
from: ['src/core/utils/**/*'],
|
|
errorMessage: `Plugins may only import from src/core/server and src/core/public.`,
|
|
},
|
|
{
|
|
target: [
|
|
'(src|x-pack)/plugins/*/server/**/*',
|
|
'!x-pack/plugins/apm/**/*', // https://github.com/elastic/kibana/issues/67210
|
|
],
|
|
from: ['(src|x-pack)/plugins/*/public/**/*'],
|
|
errorMessage: `Server code can not import from public, use a common directory.`,
|
|
},
|
|
{
|
|
target: ['(src|x-pack)/plugins/*/common/**/*'],
|
|
from: ['(src|x-pack)/plugins/*/(server|public)/**/*'],
|
|
errorMessage: `Common code can not import from server or public, use a common directory.`,
|
|
},
|
|
{
|
|
target: [
|
|
'(src|x-pack)/legacy/**/*',
|
|
'(src|x-pack)/plugins/**/(public|server)/**/*',
|
|
'examples/**/*',
|
|
],
|
|
from: [
|
|
'src/core/public/**/*',
|
|
'!src/core/public/index.ts', // relative import
|
|
'!src/core/public/mocks{,.ts}',
|
|
'!src/core/server/types{,.ts}',
|
|
'!src/core/public/utils/**/*',
|
|
'!src/core/public/*.test.mocks{,.ts}',
|
|
|
|
'src/core/server/**/*',
|
|
'!src/core/server/index.ts', // relative import
|
|
'!src/core/server/mocks{,.ts}',
|
|
'!src/core/server/types{,.ts}',
|
|
'!src/core/server/test_utils{,.ts}',
|
|
// for absolute imports until fixed in
|
|
// https://github.com/elastic/kibana/issues/36096
|
|
'!src/core/server/*.test.mocks{,.ts}',
|
|
|
|
'target/types/**',
|
|
],
|
|
allowSameFolder: true,
|
|
errorMessage:
|
|
'Plugins may only import from top-level public and server modules in core.',
|
|
},
|
|
{
|
|
target: [
|
|
'(src|x-pack)/legacy/**/*',
|
|
'(src|x-pack)/plugins/**/(public|server)/**/*',
|
|
'examples/**/*',
|
|
'!(src|x-pack)/**/*.test.*',
|
|
'!(x-pack/)?test/**/*',
|
|
// next folder contains legacy browser tests which can't be migrated to jest
|
|
// which import np files
|
|
'!src/legacy/core_plugins/kibana/public/__tests__/**/*',
|
|
],
|
|
from: [
|
|
'(src|x-pack)/plugins/**/(public|server)/**/*',
|
|
'!(src|x-pack)/plugins/**/(public|server)/mocks/index.{js,mjs,ts}',
|
|
'!(src|x-pack)/plugins/**/(public|server)/(index|mocks).{js,mjs,ts,tsx}',
|
|
],
|
|
allowSameFolder: true,
|
|
errorMessage: 'Plugins may only import from top-level public and server modules.',
|
|
},
|
|
{
|
|
target: [
|
|
'(src|x-pack)/plugins/**/*',
|
|
'!(src|x-pack)/plugins/**/server/**/*',
|
|
|
|
'src/legacy/core_plugins/**/*',
|
|
'!src/legacy/core_plugins/**/server/**/*',
|
|
'!src/legacy/core_plugins/**/index.{js,mjs,ts,tsx}',
|
|
|
|
'x-pack/legacy/plugins/**/*',
|
|
'!x-pack/legacy/plugins/**/server/**/*',
|
|
'!x-pack/legacy/plugins/**/index.{js,mjs,ts,tsx}',
|
|
|
|
'examples/**/*',
|
|
'!examples/**/server/**/*',
|
|
],
|
|
from: [
|
|
'src/core/server',
|
|
'src/core/server/**/*',
|
|
'(src|x-pack)/plugins/*/server/**/*',
|
|
'examples/**/server/**/*',
|
|
// TODO: Remove the 'joi' eslint rule once IE11 support is dropped
|
|
'joi',
|
|
],
|
|
errorMessage:
|
|
'Server modules cannot be imported into client modules or shared modules.',
|
|
},
|
|
{
|
|
target: ['src/**/*'],
|
|
from: ['x-pack/**/*'],
|
|
errorMessage: 'OSS cannot import x-pack files.',
|
|
},
|
|
{
|
|
target: ['src/core/**/*'],
|
|
from: [
|
|
'plugins/**/*',
|
|
'src/plugins/**/*',
|
|
'src/legacy/core_plugins/**/*',
|
|
'src/legacy/ui/**/*',
|
|
],
|
|
errorMessage: 'The core cannot depend on any plugins.',
|
|
},
|
|
{
|
|
target: ['(src|x-pack)/plugins/*/public/**/*'],
|
|
from: ['ui/**/*', 'uiExports/**/*'],
|
|
errorMessage: 'Plugins cannot import legacy UI code.',
|
|
},
|
|
{
|
|
from: ['src/legacy/ui/**/*', 'ui/**/*'],
|
|
target: [
|
|
'test/plugin_functional/plugins/**/public/np_ready/**/*',
|
|
'test/plugin_functional/plugins/**/server/np_ready/**/*',
|
|
'src/legacy/core_plugins/**/public/np_ready/**/*',
|
|
'src/legacy/core_plugins/vis_type_*/public/**/*',
|
|
'!src/legacy/core_plugins/vis_type_*/public/legacy*',
|
|
'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.',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Allow default exports
|
|
*/
|
|
{
|
|
files: [
|
|
'x-pack/test/apm_api_integration/**/*.ts',
|
|
'x-pack/test/functional/apps/**/*.js',
|
|
'x-pack/plugins/apm/**/*.js',
|
|
'test/*/config.ts',
|
|
'test/*/config_open.ts',
|
|
'test/*/{tests,test_suites,apis,apps}/**/*',
|
|
'test/visual_regression/tests/**/*',
|
|
'x-pack/test/*/{tests,test_suites,apis,apps}/**/*',
|
|
'x-pack/test/*/*config.*ts',
|
|
'x-pack/test/saved_object_api_integration/*/apis/**/*',
|
|
'x-pack/test/ui_capabilities/*/tests/**/*',
|
|
],
|
|
rules: {
|
|
'import/no-default-export': 'off',
|
|
'import/no-named-as-default': 'off',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that are allowed to import webpack-specific stuff
|
|
*/
|
|
{
|
|
files: [
|
|
'**/public/**/*.js',
|
|
'**/webpackShims/**/*.js',
|
|
'packages/kbn-ui-framework/doc_site/src/**/*.js',
|
|
'src/fixtures/**/*.js', // TODO: this directory needs to be more obviously "public" (or go away)
|
|
],
|
|
settings: {
|
|
// instructs import/no-extraneous-dependencies to treat certain modules
|
|
// as core modules, even if they aren't listed in package.json
|
|
'import/core-modules': ['plugins', 'legacy/ui', 'uiExports'],
|
|
|
|
'import/resolver': {
|
|
'@kbn/eslint-import-resolver-kibana': {
|
|
forceNode: false,
|
|
rootPackageName: 'kibana',
|
|
kibanaPath: '.',
|
|
pluginMap: readdirSync(resolve(__dirname, 'x-pack/legacy/plugins')).reduce(
|
|
(acc, name) => {
|
|
if (!name.startsWith('_')) {
|
|
acc[name] = `x-pack/legacy/plugins/${name}`;
|
|
}
|
|
return acc;
|
|
},
|
|
{}
|
|
),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that ARE NOT allowed to use devDependencies
|
|
*/
|
|
{
|
|
files: [
|
|
'packages/kbn-ui-framework/**/*.js',
|
|
'x-pack/**/*.js',
|
|
'packages/kbn-interpreter/**/*.js',
|
|
],
|
|
rules: {
|
|
'import/no-extraneous-dependencies': [
|
|
'error',
|
|
{
|
|
devDependencies: false,
|
|
peerDependencies: true,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that ARE allowed to use devDependencies
|
|
*/
|
|
{
|
|
files: [
|
|
'packages/kbn-ui-framework/**/*.test.js',
|
|
'packages/kbn-ui-framework/doc_site/**/*.js',
|
|
'packages/kbn-ui-framework/generator-kui/**/*.js',
|
|
'packages/kbn-ui-framework/Gruntfile.js',
|
|
'packages/kbn-es/src/**/*.js',
|
|
'packages/kbn-interpreter/tasks/**/*.js',
|
|
'packages/kbn-interpreter/src/plugin/**/*.js',
|
|
'x-pack/{dev-tools,tasks,scripts,test,build_chromium}/**/*.js',
|
|
'x-pack/**/{__tests__,__test__,__jest__,__fixtures__,__mocks__}/**/*.js',
|
|
'x-pack/**/*.test.js',
|
|
'x-pack/test_utils/**/*',
|
|
'x-pack/gulpfile.js',
|
|
'x-pack/plugins/apm/public/utils/testHelpers.js',
|
|
],
|
|
rules: {
|
|
'import/no-extraneous-dependencies': [
|
|
'error',
|
|
{
|
|
devDependencies: true,
|
|
peerDependencies: true,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that run BEFORE node version check
|
|
*/
|
|
{
|
|
files: ['scripts/**/*.js', 'src/setup_node_env/**/*.js'],
|
|
rules: {
|
|
'import/no-commonjs': 'off',
|
|
'prefer-object-spread/prefer-object-spread': 'off',
|
|
'no-var': 'off',
|
|
'prefer-const': 'off',
|
|
'prefer-destructuring': 'off',
|
|
'no-restricted-syntax': [
|
|
'error',
|
|
'ImportDeclaration',
|
|
'ExportNamedDeclaration',
|
|
'ExportDefaultDeclaration',
|
|
'ExportAllDeclaration',
|
|
'ArrowFunctionExpression',
|
|
'AwaitExpression',
|
|
'ClassDeclaration',
|
|
'RestElement',
|
|
'SpreadElement',
|
|
'YieldExpression',
|
|
'VariableDeclaration[kind="const"]',
|
|
'VariableDeclaration[kind="let"]',
|
|
'VariableDeclarator[id.type="ArrayPattern"]',
|
|
'VariableDeclarator[id.type="ObjectPattern"]',
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that run in the browser with only node-level transpilation
|
|
*/
|
|
{
|
|
files: [
|
|
'test/functional/services/lib/web_element_wrapper/scroll_into_view_if_necessary.js',
|
|
'src/legacy/ui/ui_render/bootstrap/kbn_bundles_loader_source.js',
|
|
'**/browser_exec_scripts/**/*.js',
|
|
],
|
|
rules: {
|
|
'prefer-object-spread/prefer-object-spread': 'off',
|
|
'no-var': 'off',
|
|
'prefer-const': 'off',
|
|
'prefer-destructuring': 'off',
|
|
'no-restricted-syntax': [
|
|
'error',
|
|
'ArrowFunctionExpression',
|
|
'AwaitExpression',
|
|
'ClassDeclaration',
|
|
'ImportDeclaration',
|
|
'RestElement',
|
|
'SpreadElement',
|
|
'YieldExpression',
|
|
'VariableDeclaration[kind="const"]',
|
|
'VariableDeclaration[kind="let"]',
|
|
'VariableDeclarator[id.type="ArrayPattern"]',
|
|
'VariableDeclarator[id.type="ObjectPattern"]',
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Files that run AFTER node version check
|
|
* and are not also transpiled with babel
|
|
*/
|
|
{
|
|
files: [
|
|
'.eslintrc.js',
|
|
'**/webpackShims/**/*.js',
|
|
'packages/kbn-plugin-generator/**/*.js',
|
|
'packages/kbn-eslint-import-resolver-kibana/**/*.js',
|
|
'packages/kbn-eslint-plugin-eslint/**/*',
|
|
'x-pack/gulpfile.js',
|
|
'x-pack/dev-tools/mocha/setup_mocha.js',
|
|
'x-pack/scripts/*.js',
|
|
],
|
|
excludedFiles: ['**/integration_tests/**/*'],
|
|
rules: {
|
|
'import/no-commonjs': 'off',
|
|
'prefer-object-spread/prefer-object-spread': 'off',
|
|
'no-restricted-syntax': [
|
|
'error',
|
|
'ImportDeclaration',
|
|
'ExportNamedDeclaration',
|
|
'ExportDefaultDeclaration',
|
|
'ExportAllDeclaration',
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Jest specific rules
|
|
*/
|
|
{
|
|
files: ['**/*.test.{js,mjs,ts,tsx}'],
|
|
rules: {
|
|
'jest/valid-describe': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Harden specific rules
|
|
*/
|
|
{
|
|
files: ['test/harden/*.js'],
|
|
rules: allMochaRulesOff,
|
|
},
|
|
|
|
/**
|
|
* APM overrides
|
|
*/
|
|
{
|
|
files: ['x-pack/plugins/apm/**/*.js'],
|
|
rules: {
|
|
'no-unused-vars': ['error', { ignoreRestSiblings: true }],
|
|
'no-console': ['warn', { allow: ['error'] }],
|
|
},
|
|
},
|
|
{
|
|
plugins: ['react-hooks'],
|
|
files: ['x-pack/plugins/apm/**/*.{ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/rules-of-hooks': 'error', // Checks rules of Hooks
|
|
'react-hooks/exhaustive-deps': ['error', { additionalHooks: '^useFetcher$' }],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* GIS overrides
|
|
*/
|
|
{
|
|
files: ['x-pack/legacy/plugins/maps/**/*.js'],
|
|
rules: {
|
|
'react/prefer-stateless-function': [0, { ignorePureComponents: false }],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* ML overrides
|
|
*/
|
|
{
|
|
files: ['x-pack/plugins/ml/**/*.js'],
|
|
rules: {
|
|
'no-shadow': 'error',
|
|
'import/no-extraneous-dependencies': [
|
|
'error',
|
|
{
|
|
packageDir: './x-pack',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Security Solution overrides
|
|
*/
|
|
{
|
|
// front end and common typescript and javascript files only
|
|
files: [
|
|
'x-pack/plugins/security_solution/public/**/*.{js,mjs,ts,tsx}',
|
|
'x-pack/plugins/security_solution/common/**/*.{js,mjs,ts,tsx}',
|
|
],
|
|
rules: {
|
|
'import/no-nodejs-modules': 'error',
|
|
'no-restricted-imports': [
|
|
'error',
|
|
{
|
|
// prevents UI code from importing server side code and then webpack including it when doing builds
|
|
patterns: ['**/server/*'],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
// typescript only for front and back end
|
|
files: ['x-pack/{,legacy/}plugins/security_solution/**/*.{ts,tsx}'],
|
|
rules: {
|
|
// This will be turned on after bug fixes are complete
|
|
// '@typescript-eslint/explicit-member-accessibility': 'warn',
|
|
'@typescript-eslint/no-this-alias': 'error',
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
'@typescript-eslint/no-useless-constructor': 'error',
|
|
// This will be turned on after bug fixes are complete
|
|
// '@typescript-eslint/no-object-literal-type-assertion': 'warn',
|
|
'@typescript-eslint/unified-signatures': 'error',
|
|
|
|
// eventually we want this to be a warn and then an error since this is a recommended linter rule
|
|
// for now, keeping it commented out to avoid too much IDE noise until the other linter issues
|
|
// are fixed in the next release or two
|
|
// '@typescript-eslint/explicit-function-return-type': 'warn',
|
|
|
|
// these rules cannot be turned on and tested at the moment until this issue is resolved:
|
|
// https://github.com/prettier/prettier-eslint/issues/201
|
|
// '@typescript-eslint/await-thenable': 'error',
|
|
// '@typescript-eslint/no-non-null-assertion': 'error'
|
|
// '@typescript-eslint/no-unnecessary-type-assertion': 'error',
|
|
// '@typescript-eslint/no-unused-vars': 'error',
|
|
// '@typescript-eslint/prefer-includes': 'error',
|
|
// '@typescript-eslint/prefer-string-starts-ends-with': 'error',
|
|
// '@typescript-eslint/promise-function-async': 'error',
|
|
// '@typescript-eslint/prefer-regexp-exec': 'error',
|
|
// '@typescript-eslint/promise-function-async': 'error',
|
|
// '@typescript-eslint/require-array-sort-compare': 'error',
|
|
// '@typescript-eslint/restrict-plus-operands': 'error',
|
|
// '@typescript-eslint/unbound-method': 'error',
|
|
},
|
|
},
|
|
// {
|
|
// // will introduced after the other warns are fixed
|
|
// // typescript and javascript for front end react performance
|
|
// files: ['x-pack/plugins/security_solution/public/**/!(*.test).{js,mjs,ts,tsx}'],
|
|
// plugins: ['react-perf'],
|
|
// rules: {
|
|
// // 'react-perf/jsx-no-new-object-as-prop': 'error',
|
|
// // 'react-perf/jsx-no-new-array-as-prop': 'error',
|
|
// // 'react-perf/jsx-no-new-function-as-prop': 'error',
|
|
// // 'react/jsx-no-bind': 'error',
|
|
// },
|
|
// },
|
|
{
|
|
// typescript and javascript for front and back end
|
|
files: ['x-pack/{,legacy/}plugins/security_solution/**/*.{js,mjs,ts,tsx}'],
|
|
plugins: ['eslint-plugin-node', 'react'],
|
|
env: {
|
|
mocha: true,
|
|
jest: true,
|
|
},
|
|
rules: {
|
|
'accessor-pairs': 'error',
|
|
'array-callback-return': 'error',
|
|
'no-array-constructor': 'error',
|
|
complexity: 'warn',
|
|
// This will be turned on after bug fixes are mostly completed
|
|
// 'consistent-return': 'warn',
|
|
// This will be turned on after bug fixes are mostly completed
|
|
// 'func-style': ['warn', 'expression'],
|
|
// These will be turned on after bug fixes are mostly completed and we can
|
|
// run a fix-lint
|
|
/*
|
|
'import/order': [
|
|
'warn',
|
|
{
|
|
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
|
|
'newlines-between': 'always',
|
|
},
|
|
],
|
|
*/
|
|
'node/no-deprecated-api': 'error',
|
|
'no-bitwise': 'error',
|
|
'no-continue': 'error',
|
|
'no-dupe-keys': 'error',
|
|
'no-duplicate-case': 'error',
|
|
'no-duplicate-imports': 'error',
|
|
'no-empty-character-class': 'error',
|
|
'no-empty-pattern': 'error',
|
|
'no-ex-assign': 'error',
|
|
'no-extend-native': 'error',
|
|
'no-extra-bind': 'error',
|
|
'no-extra-boolean-cast': 'error',
|
|
'no-extra-label': 'error',
|
|
'no-func-assign': 'error',
|
|
'no-implicit-globals': 'error',
|
|
'no-implied-eval': 'error',
|
|
'no-invalid-regexp': 'error',
|
|
'no-inner-declarations': 'error',
|
|
'no-lone-blocks': 'error',
|
|
'no-multi-assign': 'error',
|
|
'no-misleading-character-class': 'error',
|
|
'no-new-symbol': 'error',
|
|
'no-obj-calls': 'error',
|
|
'no-param-reassign': 'error',
|
|
'no-process-exit': 'error',
|
|
'no-prototype-builtins': 'error',
|
|
'no-return-await': 'error',
|
|
'no-self-compare': 'error',
|
|
'no-shadow-restricted-names': 'error',
|
|
'no-sparse-arrays': 'error',
|
|
'no-this-before-super': 'error',
|
|
'no-undef': 'error',
|
|
'no-unreachable': 'error',
|
|
'no-unsafe-finally': 'error',
|
|
'no-useless-call': 'error',
|
|
'no-useless-catch': 'error',
|
|
'no-useless-concat': 'error',
|
|
'no-useless-computed-key': 'error',
|
|
// This will be turned on after bug fixes are mostly complete
|
|
// 'no-useless-escape': 'warn',
|
|
'no-useless-rename': 'error',
|
|
'no-useless-return': 'error',
|
|
// This will be turned on after bug fixers are mostly complete
|
|
// 'no-void': 'warn',
|
|
'one-var-declaration-per-line': 'error',
|
|
'prefer-object-spread': 'error',
|
|
'prefer-promise-reject-errors': 'error',
|
|
'prefer-rest-params': 'error',
|
|
'prefer-spread': 'error',
|
|
'prefer-template': 'error',
|
|
'react/boolean-prop-naming': 'error',
|
|
'react/button-has-type': 'error',
|
|
'react/display-name': 'error',
|
|
'react/forbid-dom-props': 'error',
|
|
'react/no-access-state-in-setstate': 'error',
|
|
'react/no-children-prop': 'error',
|
|
'react/no-danger-with-children': 'error',
|
|
'react/no-deprecated': 'error',
|
|
'react/no-did-mount-set-state': 'error',
|
|
// Re-enable once we have better options per this issue:
|
|
// https://github.com/airbnb/javascript/issues/1875
|
|
// 'react/no-did-update-set-state': 'error',
|
|
'react/no-direct-mutation-state': 'error',
|
|
'react/no-find-dom-node': 'error',
|
|
'react/no-redundant-should-component-update': 'error',
|
|
'react/no-render-return-value': 'error',
|
|
'react/no-typos': 'error',
|
|
'react/no-string-refs': 'error',
|
|
'react/no-this-in-sfc': 'error',
|
|
'react/no-unescaped-entities': 'error',
|
|
'react/no-unsafe': 'error',
|
|
'react/no-unused-prop-types': 'error',
|
|
'react/no-unused-state': 'error',
|
|
// will introduced after the other warns are fixed
|
|
// 'react/sort-comp': 'error',
|
|
'react/void-dom-elements-no-children': 'error',
|
|
'react/jsx-no-comment-textnodes': 'error',
|
|
'react/jsx-no-literals': 'error',
|
|
'react/jsx-no-target-blank': 'error',
|
|
'react/jsx-fragments': 'error',
|
|
'react/jsx-sort-default-props': 'error',
|
|
'require-atomic-updates': 'error',
|
|
'symbol-description': 'error',
|
|
'vars-on-top': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Lists overrides
|
|
*/
|
|
{
|
|
// front end and common typescript and javascript files only
|
|
files: [
|
|
'x-pack/plugins/lists/public/**/*.{js,mjs,ts,tsx}',
|
|
'x-pack/plugins/lists/common/**/*.{js,mjs,ts,tsx}',
|
|
],
|
|
rules: {
|
|
'import/no-nodejs-modules': 'error',
|
|
'no-restricted-imports': [
|
|
'error',
|
|
{
|
|
// prevents UI code from importing server side code and then webpack including it when doing builds
|
|
patterns: ['**/server/*'],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
// typescript and javascript for front and back end
|
|
files: ['x-pack/plugins/lists/**/*.{js,mjs,ts,tsx}'],
|
|
plugins: ['eslint-plugin-node'],
|
|
env: {
|
|
mocha: true,
|
|
jest: true,
|
|
},
|
|
rules: {
|
|
'accessor-pairs': 'error',
|
|
'array-callback-return': 'error',
|
|
'no-array-constructor': 'error',
|
|
complexity: 'error',
|
|
'consistent-return': 'error',
|
|
'func-style': ['error', 'expression'],
|
|
'import/order': [
|
|
'error',
|
|
{
|
|
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
|
|
'newlines-between': 'always',
|
|
},
|
|
],
|
|
'sort-imports': [
|
|
'error',
|
|
{
|
|
ignoreDeclarationSort: true,
|
|
},
|
|
],
|
|
'node/no-deprecated-api': 'error',
|
|
'no-bitwise': 'error',
|
|
'no-continue': 'error',
|
|
'no-dupe-keys': 'error',
|
|
'no-duplicate-case': 'error',
|
|
'no-duplicate-imports': 'error',
|
|
'no-empty-character-class': 'error',
|
|
'no-empty-pattern': 'error',
|
|
'no-ex-assign': 'error',
|
|
'no-extend-native': 'error',
|
|
'no-extra-bind': 'error',
|
|
'no-extra-boolean-cast': 'error',
|
|
'no-extra-label': 'error',
|
|
'no-func-assign': 'error',
|
|
'no-implicit-globals': 'error',
|
|
'no-implied-eval': 'error',
|
|
'no-invalid-regexp': 'error',
|
|
'no-inner-declarations': 'error',
|
|
'no-lone-blocks': 'error',
|
|
'no-multi-assign': 'error',
|
|
'no-misleading-character-class': 'error',
|
|
'no-new-symbol': 'error',
|
|
'no-obj-calls': 'error',
|
|
'no-param-reassign': ['error', { props: true }],
|
|
'no-process-exit': 'error',
|
|
'no-prototype-builtins': 'error',
|
|
'no-return-await': 'error',
|
|
'no-self-compare': 'error',
|
|
'no-shadow-restricted-names': 'error',
|
|
'no-sparse-arrays': 'error',
|
|
'no-this-before-super': 'error',
|
|
'no-undef': 'error',
|
|
'no-unreachable': 'error',
|
|
'no-unsafe-finally': 'error',
|
|
'no-useless-call': 'error',
|
|
'no-useless-catch': 'error',
|
|
'no-useless-concat': 'error',
|
|
'no-useless-computed-key': 'error',
|
|
'no-useless-escape': 'error',
|
|
'no-useless-rename': 'error',
|
|
'no-useless-return': 'error',
|
|
'no-void': 'error',
|
|
'one-var-declaration-per-line': 'error',
|
|
'prefer-object-spread': 'error',
|
|
'prefer-promise-reject-errors': 'error',
|
|
'prefer-rest-params': 'error',
|
|
'prefer-spread': 'error',
|
|
'prefer-template': 'error',
|
|
'require-atomic-updates': 'error',
|
|
'symbol-description': 'error',
|
|
'vars-on-top': 'error',
|
|
'@typescript-eslint/explicit-member-accessibility': 'error',
|
|
'@typescript-eslint/no-this-alias': 'error',
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
'@typescript-eslint/no-useless-constructor': 'error',
|
|
'@typescript-eslint/unified-signatures': 'error',
|
|
'@typescript-eslint/explicit-function-return-type': 'error',
|
|
'@typescript-eslint/no-non-null-assertion': 'error',
|
|
'@typescript-eslint/no-unused-vars': 'error',
|
|
'no-template-curly-in-string': 'error',
|
|
'sort-keys': 'error',
|
|
'prefer-destructuring': 'error',
|
|
},
|
|
},
|
|
/**
|
|
* Alerting Services overrides
|
|
*/
|
|
{
|
|
// typescript only for front and back end
|
|
files: [
|
|
'x-pack/{,legacy/}plugins/{alerts,alerting_builtins,actions,task_manager,event_log}/**/*.{ts,tsx}',
|
|
],
|
|
rules: {
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Lens overrides
|
|
*/
|
|
{
|
|
files: ['x-pack/plugins/lens/**/*.{ts,tsx}'],
|
|
rules: {
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Enterprise Search overrides
|
|
*/
|
|
{
|
|
files: ['x-pack/plugins/enterprise_search/**/*.{ts,tsx}'],
|
|
excludedFiles: ['x-pack/plugins/enterprise_search/**/*.{test,mock}.{ts,tsx}'],
|
|
rules: {
|
|
'react-hooks/exhaustive-deps': 'off',
|
|
'@typescript-eslint/no-explicit-any': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* disable jsx-a11y for kbn-ui-framework
|
|
*/
|
|
{
|
|
files: ['packages/kbn-ui-framework/**/*.js'],
|
|
rules: {
|
|
'jsx-a11y/click-events-have-key-events': 'off',
|
|
'jsx-a11y/anchor-has-content': 'off',
|
|
'jsx-a11y/tabindex-no-positive': 'off',
|
|
'jsx-a11y/label-has-associated-control': 'off',
|
|
'jsx-a11y/aria-role': 'off',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Canvas overrides
|
|
*/
|
|
{
|
|
files: ['x-pack/plugins/canvas/**/*.js'],
|
|
rules: {
|
|
radix: 'error',
|
|
|
|
// module importing
|
|
'import/order': [
|
|
'error',
|
|
{
|
|
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
|
|
},
|
|
],
|
|
'import/extensions': ['error', 'never', { json: 'always', less: 'always', svg: 'always' }],
|
|
|
|
// react
|
|
'react/no-did-mount-set-state': 'error',
|
|
'react/no-did-update-set-state': 'error',
|
|
'react/no-multi-comp': ['error', { ignoreStateless: true }],
|
|
'react/self-closing-comp': 'error',
|
|
'react/sort-comp': 'error',
|
|
'react/jsx-boolean-value': 'error',
|
|
'react/no-unescaped-entities': ['error', { forbid: ['>', '}'] }],
|
|
'react/forbid-elements': [
|
|
'error',
|
|
{
|
|
forbid: [
|
|
{
|
|
element: 'EuiConfirmModal',
|
|
message: 'Use <ConfirmModal> instead',
|
|
},
|
|
{
|
|
element: 'EuiPopover',
|
|
message: 'Use <Popover> instead',
|
|
},
|
|
{
|
|
element: 'EuiIconTip',
|
|
message: 'Use <TooltipIcon> instead',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
files: [
|
|
'x-pack/plugins/canvas/gulpfile.js',
|
|
'x-pack/plugins/canvas/scripts/*.js',
|
|
'x-pack/plugins/canvas/tasks/*.js',
|
|
'x-pack/plugins/canvas/tasks/**/*.js',
|
|
'x-pack/plugins/canvas/__tests__/**/*.js',
|
|
'x-pack/plugins/canvas/**/{__tests__,__test__,__jest__,__fixtures__,__mocks__}/**/*.js',
|
|
],
|
|
rules: {
|
|
'import/no-extraneous-dependencies': [
|
|
'error',
|
|
{
|
|
devDependencies: true,
|
|
peerDependencies: true,
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/canvas/canvas_plugin_src/**/*.js'],
|
|
globals: { canvas: true, $: true },
|
|
rules: {
|
|
'import/no-unresolved': [
|
|
'error',
|
|
{
|
|
ignore: ['!!raw-loader.+.svg$'],
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/canvas/public/**/*.js'],
|
|
env: {
|
|
browser: true,
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/canvas/canvas_plugin_src/lib/flot-charts/**/*.js'],
|
|
env: {
|
|
jquery: true,
|
|
},
|
|
},
|
|
{
|
|
files: ['x-pack/plugins/monitoring/public/lib/jquery_flot/**/*.js'],
|
|
env: {
|
|
jquery: true,
|
|
},
|
|
},
|
|
|
|
/**
|
|
* TSVB overrides
|
|
*/
|
|
{
|
|
files: [
|
|
'src/plugins/vis_type_timeseries/**/*.{js,mjs,ts,tsx}',
|
|
'src/legacy/core_plugins/vis_type_timeseries/**/*.{js,mjs,ts,tsx}',
|
|
],
|
|
rules: {
|
|
'import/no-default-export': 'error',
|
|
},
|
|
},
|
|
|
|
/**
|
|
* Prettier disables all conflicting rules, listing as last override so it takes precedence
|
|
*/
|
|
{
|
|
files: ['**/*'],
|
|
rules: {
|
|
...require('eslint-config-prettier').rules,
|
|
...require('eslint-config-prettier/react').rules,
|
|
...require('eslint-config-prettier/@typescript-eslint').rules,
|
|
},
|
|
},
|
|
|
|
{
|
|
files: [
|
|
// platform-team owned code
|
|
'src/core/**',
|
|
'x-pack/plugins/features/**',
|
|
'x-pack/plugins/licensing/**',
|
|
'x-pack/plugins/global_search/**',
|
|
'x-pack/plugins/cloud/**',
|
|
'packages/kbn-config-schema',
|
|
'src/plugins/status_page/**',
|
|
'src/plugins/saved_objects_management/**',
|
|
],
|
|
rules: {
|
|
'@typescript-eslint/prefer-ts-expect-error': 'error',
|
|
},
|
|
},
|
|
],
|
|
};
|