mirror of
https://github.com/elastic/kibana.git
synced 2025-04-25 02:09:32 -04:00
[eslint-import-resolver-kibana] bring in repo as package (#17665)
* [eslint-import-resolver-kibana] bring in repo as package * [eslint-import-resolver] enable prettier
This commit is contained in:
parent
7fed7b62f2
commit
4f2a19bd9b
12 changed files with 2807 additions and 12 deletions
|
@ -6,7 +6,7 @@ module.exports = {
|
||||||
|
|
||||||
settings: {
|
settings: {
|
||||||
'import/resolver': {
|
'import/resolver': {
|
||||||
'@elastic/eslint-import-resolver-kibana': {
|
'@kbn/eslint-import-resolver-kibana': {
|
||||||
rootPackageName: 'kibana',
|
rootPackageName: 'kibana',
|
||||||
kibanaPath: '.',
|
kibanaPath: '.',
|
||||||
},
|
},
|
||||||
|
@ -22,6 +22,7 @@ module.exports = {
|
||||||
'packages/kbn-es/**/*',
|
'packages/kbn-es/**/*',
|
||||||
'packages/kbn-datemath/**/*.js',
|
'packages/kbn-datemath/**/*.js',
|
||||||
'packages/kbn-plugin-generator/**/*',
|
'packages/kbn-plugin-generator/**/*',
|
||||||
|
'packages/kbn-eslint-import-resolver-kibana/**/*',
|
||||||
],
|
],
|
||||||
plugins: ['prettier'],
|
plugins: ['prettier'],
|
||||||
rules: Object.assign(
|
rules: Object.assign(
|
||||||
|
|
|
@ -218,9 +218,9 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@elastic/eslint-config-kibana": "link:packages/eslint-config-kibana",
|
"@elastic/eslint-config-kibana": "link:packages/eslint-config-kibana",
|
||||||
"@elastic/eslint-import-resolver-kibana": "1.0.0",
|
|
||||||
"@elastic/eslint-plugin-kibana-custom": "link:packages/eslint-plugin-kibana-custom",
|
"@elastic/eslint-plugin-kibana-custom": "link:packages/eslint-plugin-kibana-custom",
|
||||||
"@kbn/es": "link:packages/kbn-es",
|
"@kbn/es": "link:packages/kbn-es",
|
||||||
|
"@kbn/eslint-import-resolver-kibana": "link:packages/kbn-eslint-import-resolver-kibana",
|
||||||
"@kbn/plugin-generator": "link:packages/kbn-plugin-generator",
|
"@kbn/plugin-generator": "link:packages/kbn-plugin-generator",
|
||||||
"angular-mocks": "1.4.7",
|
"angular-mocks": "1.4.7",
|
||||||
"babel-eslint": "8.1.2",
|
"babel-eslint": "8.1.2",
|
||||||
|
|
54
packages/kbn-eslint-import-resolver-kibana/README.md
Executable file
54
packages/kbn-eslint-import-resolver-kibana/README.md
Executable file
|
@ -0,0 +1,54 @@
|
||||||
|
# @elastic/eslint-import-resolver-kibana
|
||||||
|
|
||||||
|
Resolver for Kibana imports, meant to be used with [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Specify this resolver with the `import/resolver` setting in your eslint config file:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
# .eslintrc.yml
|
||||||
|
settings:
|
||||||
|
import/resolver: "@kbn/eslint-import-resolver-kibana"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Settings
|
||||||
|
|
||||||
|
***NOTE:*** All relative paths are resolved as relative to the project root, which is determined by walking up from the first linted file and looking for a `package.json` file. If your project has multiple `package.json` files then make sure to specify the `rootPackageName` setting.
|
||||||
|
|
||||||
|
Property | Default | Description
|
||||||
|
-------- | ------- | -----------
|
||||||
|
rootPackageName | `null` | The `"name"` property of the root `package.json` file. If your project has multiple `package.json` files then specify this setting to tell the resolver which `package.json` file sits at the root of your project.
|
||||||
|
pluginPaths | `[]` if `rootPackageName` is set, otherwise `[.]` | Array of relative paths which contain a Kibana plugin. Plugins must contain a `package.json` file to be valid.
|
||||||
|
pluginDirs | `[]` | Array of relative paths pointing to directories which contain Kibana plugins. Plugins must contain a `package.json` file to be valid.
|
||||||
|
|
||||||
|
## Settings Usage
|
||||||
|
To specify additional config add a `:` after the resolver name and specify the argument as key-value pairs:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
# .eslintrc.yml
|
||||||
|
settings:
|
||||||
|
import/resolver:
|
||||||
|
"@kbn/eslint-import-resolver-kibana":
|
||||||
|
# if your project has multiple package.json files
|
||||||
|
rootPackageName: my-project
|
||||||
|
|
||||||
|
# if your project stores plugin source in sub directories you can specify
|
||||||
|
# those directories via `pluginPaths`.
|
||||||
|
pluginPaths:
|
||||||
|
- ./plugin-one
|
||||||
|
- ./plugin-two
|
||||||
|
|
||||||
|
# if all of your plugins have the same parent directory you can specify
|
||||||
|
# that directory and we will look for plugins there
|
||||||
|
pluginDirs:
|
||||||
|
- ./kibana-plugins
|
||||||
|
```
|
||||||
|
|
||||||
|
See [the resolvers docs](https://github.com/benmosher/eslint-plugin-import#resolvers) or the [resolver spec](https://github.com/benmosher/eslint-plugin-import/blob/master/resolvers/README.md#resolvesource-file-config---found-boolean-path-string-) for more details.
|
||||||
|
|
||||||
|
## Debugging
|
||||||
|
|
||||||
|
For debugging output from this resolver, run your linter with `DEBUG=eslint-plugin-import:resolver:kibana`.
|
||||||
|
|
||||||
|
This resolver defers to [*eslint-import-resolver-node*](https://www.npmjs.com/package/eslint-import-resolver-node) and [*eslint-import-resolver-webpack*](https://www.npmjs.com/package/eslint-import-resolver-webpack) for all of it's actual resolution logic. To get debugging output from all resolvers use `DEBUG=eslint-plugin-import:resolver:*`.
|
29
packages/kbn-eslint-import-resolver-kibana/index.js
Executable file
29
packages/kbn-eslint-import-resolver-kibana/index.js
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
const webpackResolver = require('eslint-import-resolver-webpack');
|
||||||
|
const nodeResolver = require('eslint-import-resolver-node');
|
||||||
|
const getProjectRoot = require('./lib/get_project_root');
|
||||||
|
const getWebpackConfig = require('./lib/get_webpack_config');
|
||||||
|
|
||||||
|
// cache expensive resolution results
|
||||||
|
let projectRoot;
|
||||||
|
let webpackConfig;
|
||||||
|
|
||||||
|
exports.resolve = function resolveKibanaPath(source, file, config) {
|
||||||
|
const settings = config || {};
|
||||||
|
|
||||||
|
// try to resolve with the node resolver first
|
||||||
|
const resolvedWithNode = nodeResolver.resolve(source, file, config);
|
||||||
|
if (resolvedWithNode && resolvedWithNode.found) {
|
||||||
|
return resolvedWithNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fall back to the webpack resolver
|
||||||
|
projectRoot = projectRoot || getProjectRoot(file, settings);
|
||||||
|
webpackConfig =
|
||||||
|
webpackConfig || getWebpackConfig(source, projectRoot, settings);
|
||||||
|
return webpackResolver.resolve(source, file, {
|
||||||
|
config: webpackConfig,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// use version 2 of the resolver interface, https://github.com/benmosher/eslint-plugin-import/blob/master/resolvers/README.md#interfaceversion--number
|
||||||
|
exports.interfaceVersion = 2;
|
3
packages/kbn-eslint-import-resolver-kibana/lib/debug.js
Executable file
3
packages/kbn-eslint-import-resolver-kibana/lib/debug.js
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
const debug = require('debug')('eslint-plugin-import:resolver:kibana');
|
||||||
|
|
||||||
|
module.exports = debug;
|
27
packages/kbn-eslint-import-resolver-kibana/lib/get_kibana_path.js
Executable file
27
packages/kbn-eslint-import-resolver-kibana/lib/get_kibana_path.js
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
const { resolve } = require('path');
|
||||||
|
const debug = require('./debug');
|
||||||
|
|
||||||
|
const DEFAULT_PLUGIN_PATH = '../../kibana';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Resolves the path to Kibana, either from default setting or config
|
||||||
|
*/
|
||||||
|
module.exports = function getKibanaPath(config, projectRoot) {
|
||||||
|
const inConfig = config != null && config.kibanaPath;
|
||||||
|
|
||||||
|
// We only allow `.` in the config as we need it for Kibana itself
|
||||||
|
if (inConfig && config.kibanaPath !== '.') {
|
||||||
|
throw new Error(
|
||||||
|
'The `kibanaPath` option has been removed from `eslint-import-resolver-kibana`. ' +
|
||||||
|
'During development your plugin must live in `../kibana-extra/{pluginName}` ' +
|
||||||
|
'relative to the Kibana folder to work with this package.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const kibanaPath = inConfig
|
||||||
|
? resolve(projectRoot, config.kibanaPath)
|
||||||
|
: resolve(projectRoot, DEFAULT_PLUGIN_PATH);
|
||||||
|
|
||||||
|
debug(`Resolved Kibana path: ${kibanaPath}`);
|
||||||
|
return kibanaPath;
|
||||||
|
};
|
35
packages/kbn-eslint-import-resolver-kibana/lib/get_plugins.js
Executable file
35
packages/kbn-eslint-import-resolver-kibana/lib/get_plugins.js
Executable file
|
@ -0,0 +1,35 @@
|
||||||
|
const { dirname, resolve } = require('path');
|
||||||
|
const glob = require('glob-all');
|
||||||
|
|
||||||
|
module.exports = function getPlugins(config, kibanaPath, projectRoot) {
|
||||||
|
const resolveToRoot = path => resolve(projectRoot, path);
|
||||||
|
|
||||||
|
const pluginDirs = [
|
||||||
|
...(config.pluginDirs || []).map(resolveToRoot),
|
||||||
|
resolve(kibanaPath, 'plugins'),
|
||||||
|
resolve(kibanaPath, 'src/core_plugins'),
|
||||||
|
];
|
||||||
|
|
||||||
|
const pluginPaths = [
|
||||||
|
...(config.pluginPaths || []).map(resolveToRoot),
|
||||||
|
|
||||||
|
// when the rootPackageName is specified we assume that the root of the project
|
||||||
|
// is not a plugin, so don't include it automatically
|
||||||
|
...(config.rootPackageName ? [] : [projectRoot]),
|
||||||
|
];
|
||||||
|
|
||||||
|
const globPatterns = [
|
||||||
|
...pluginDirs.map(dir => resolve(dir, '*/package.json')),
|
||||||
|
...pluginPaths.map(path => resolve(path, 'package.json')),
|
||||||
|
];
|
||||||
|
|
||||||
|
return glob.sync(globPatterns).map(pkgJsonPath => {
|
||||||
|
const path = dirname(pkgJsonPath);
|
||||||
|
const pkg = require(pkgJsonPath);
|
||||||
|
return {
|
||||||
|
name: pkg.name,
|
||||||
|
directory: path,
|
||||||
|
publicDirectory: resolve(path, 'public'),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
52
packages/kbn-eslint-import-resolver-kibana/lib/get_project_root.js
Executable file
52
packages/kbn-eslint-import-resolver-kibana/lib/get_project_root.js
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
const { dirname, resolve, parse } = require('path');
|
||||||
|
const { accessSync, readFileSync } = require('fs');
|
||||||
|
const debug = require('./debug');
|
||||||
|
|
||||||
|
function getConfig(config) {
|
||||||
|
const defaults = {
|
||||||
|
projectRoot: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!config || !config['@elastic/eslint-import-resolver-kibana'])
|
||||||
|
return defaults;
|
||||||
|
return Object.assign(
|
||||||
|
defaults,
|
||||||
|
config['@elastic/eslint-import-resolver-kibana']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRootPackageDir(dirRoot, dir, rootPackageName) {
|
||||||
|
if (dirRoot === dir) return null;
|
||||||
|
const pkgFile = resolve(dir, 'package.json');
|
||||||
|
|
||||||
|
try {
|
||||||
|
accessSync(pkgFile);
|
||||||
|
|
||||||
|
// if rootPackageName is not provided, stop when package.json is found
|
||||||
|
if (!rootPackageName) return dir;
|
||||||
|
|
||||||
|
// if rootPackageName is provided, check for match
|
||||||
|
const { name, config } = JSON.parse(readFileSync(pkgFile));
|
||||||
|
const { projectRoot } = getConfig(config);
|
||||||
|
|
||||||
|
if (projectRoot && name === rootPackageName) return dir;
|
||||||
|
|
||||||
|
// recurse until a matching package.json is found
|
||||||
|
return getRootPackageDir(dirRoot, dirname(dir), rootPackageName);
|
||||||
|
} catch (e) {
|
||||||
|
if (e.code === 'ENOENT')
|
||||||
|
return getRootPackageDir(dirRoot, dirname(dir), rootPackageName);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function getProjectRoot(file, config) {
|
||||||
|
const { root, dir } = parse(resolve(file));
|
||||||
|
const { rootPackageName } = config;
|
||||||
|
|
||||||
|
const projectRoot = getRootPackageDir(root, dir, rootPackageName);
|
||||||
|
if (projectRoot === null) throw new Error('Failed to find plugin root');
|
||||||
|
|
||||||
|
debug(`Resolved project root: ${projectRoot}`);
|
||||||
|
return projectRoot;
|
||||||
|
};
|
50
packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js
Executable file
50
packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js
Executable file
|
@ -0,0 +1,50 @@
|
||||||
|
const { resolve } = require('path');
|
||||||
|
const debug = require('./debug');
|
||||||
|
|
||||||
|
const getKibanaPath = require('./get_kibana_path');
|
||||||
|
const getPlugins = require('./get_plugins');
|
||||||
|
|
||||||
|
module.exports = function getWebpackConfig(source, projectRoot, config) {
|
||||||
|
const kibanaPath = getKibanaPath(config, projectRoot);
|
||||||
|
const fromKibana = (...path) => resolve(kibanaPath, ...path);
|
||||||
|
|
||||||
|
const alias = {
|
||||||
|
// Kibana defaults https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/ui/ui_bundler_env.js#L30-L36
|
||||||
|
ui: fromKibana('src/ui/public'),
|
||||||
|
ui_framework: fromKibana('ui_framework'),
|
||||||
|
test_harness: fromKibana('src/test_harness/public'),
|
||||||
|
querystring: 'querystring-browser',
|
||||||
|
moment$: fromKibana('webpackShims/moment'),
|
||||||
|
'moment-timezone$': fromKibana('webpackShims/moment-timezone'),
|
||||||
|
|
||||||
|
// Dev defaults for test bundle https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/core_plugins/tests_bundle/index.js#L73-L78
|
||||||
|
ng_mock$: fromKibana('src/core_plugins/dev_mode/public/ng_mock'),
|
||||||
|
'angular-mocks$': fromKibana(
|
||||||
|
'src/core_plugins/tests_bundle/webpackShims/angular-mocks.js'
|
||||||
|
),
|
||||||
|
fixtures: fromKibana('src/fixtures'),
|
||||||
|
test_utils: fromKibana('src/test_utils/public'),
|
||||||
|
};
|
||||||
|
|
||||||
|
getPlugins(config, kibanaPath, projectRoot).forEach(plugin => {
|
||||||
|
alias[`plugins/${plugin.name}`] = plugin.publicDirectory;
|
||||||
|
});
|
||||||
|
|
||||||
|
debug('Webpack resolved aliases', alias);
|
||||||
|
|
||||||
|
return {
|
||||||
|
context: kibanaPath,
|
||||||
|
resolve: {
|
||||||
|
extensions: ['.js', '.json'],
|
||||||
|
mainFields: ['browser', 'main'],
|
||||||
|
modules: [
|
||||||
|
'webpackShims',
|
||||||
|
'node_modules',
|
||||||
|
fromKibana('webpackShims'),
|
||||||
|
fromKibana('node_modules'),
|
||||||
|
],
|
||||||
|
alias,
|
||||||
|
unsafeCache: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
19
packages/kbn-eslint-import-resolver-kibana/package.json
Executable file
19
packages/kbn-eslint-import-resolver-kibana/package.json
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "@kbn/eslint-import-resolver-kibana",
|
||||||
|
"description": "eslint-plugin-import resolver for Kibana",
|
||||||
|
"private": true,
|
||||||
|
"version": "2.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/elastic/kibana/tree/master/packages/kbn-eslint-import-resolver-kibana"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^2.6.6",
|
||||||
|
"eslint-import-resolver-node": "^0.3.0",
|
||||||
|
"eslint-import-resolver-webpack": "^0.8.1",
|
||||||
|
"glob-all": "^3.1.0",
|
||||||
|
"webpack": "3.6.0"
|
||||||
|
}
|
||||||
|
}
|
2531
packages/kbn-eslint-import-resolver-kibana/yarn.lock
Normal file
2531
packages/kbn-eslint-import-resolver-kibana/yarn.lock
Normal file
File diff suppressed because it is too large
Load diff
14
yarn.lock
14
yarn.lock
|
@ -73,16 +73,6 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
"@elastic/eslint-import-resolver-kibana@1.0.0":
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@elastic/eslint-import-resolver-kibana/-/eslint-import-resolver-kibana-1.0.0.tgz#01f0bff6c399626a0f63afd31933fedfffd05d94"
|
|
||||||
dependencies:
|
|
||||||
debug "^2.6.6"
|
|
||||||
eslint-import-resolver-node "^0.3.0"
|
|
||||||
eslint-import-resolver-webpack "^0.8.1"
|
|
||||||
glob-all "^3.1.0"
|
|
||||||
webpack "3.6.0"
|
|
||||||
|
|
||||||
"@elastic/eslint-plugin-kibana-custom@link:packages/eslint-plugin-kibana-custom":
|
"@elastic/eslint-plugin-kibana-custom@link:packages/eslint-plugin-kibana-custom":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -140,6 +130,10 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
|
"@kbn/eslint-import-resolver-kibana@link:packages/kbn-eslint-import-resolver-kibana":
|
||||||
|
version "0.0.0"
|
||||||
|
uid ""
|
||||||
|
|
||||||
"@kbn/plugin-generator@link:packages/kbn-plugin-generator":
|
"@kbn/plugin-generator@link:packages/kbn-plugin-generator":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue