Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[POC] rewrite imports to @kbn/src and others #40451

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
"url": "http://github.com/elastic/kibana/issues"
},
"kibana": {
"rootImports": {
"@kbn/src": "./src",
"@kbn/types": "./target/types",
"@kbn/x-pack": "./x-pack"
},
"clean": {
"extraPatterns": [
"build",
Expand Down
9 changes: 9 additions & 0 deletions packages/kbn-babel-preset/common_preset.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
* under the License.
*/

const { dirname } = require('path');

const REPO_ROOT = dirname(require.resolve('../../package.json'));
const kibanaPkgJson = require('../../package.json');

module.exports = {
presets: [require.resolve('@babel/preset-typescript'), require.resolve('@babel/preset-react')],
plugins: [
Expand All @@ -30,6 +35,10 @@ module.exports = {
//
// See https://github.com/babel/proposals/issues/12 for progress
require.resolve('@babel/plugin-proposal-class-properties'),
[require.resolve('babel-plugin-module-resolver'), {
root: REPO_ROOT,
alias: kibanaPkgJson.kibana.rootImports
}],
],
overrides: [
{
Expand Down
1 change: 1 addition & 0 deletions packages/kbn-babel-preset/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"@babel/preset-typescript": "7.3.3",
"@kbn/elastic-idx": "1.0.0",
"babel-plugin-add-module-exports": "1.0.2",
"babel-plugin-module-resolver": "3.2.0",
"babel-plugin-transform-define": "1.3.1",
"babel-plugin-typescript-strip-namespaces": "1.1.1"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,14 @@
* under the License.
*/

const { join, dirname, extname } = require('path');
const { join, dirname, extname, resolve, relative } = require('path');

const webpackResolver = require('eslint-import-resolver-webpack');
const nodeResolver = require('eslint-import-resolver-node');

const REPO_ROOT = dirname(require.resolve('../../package.json'));
const kbnPkgJson = require('../../package.json');

const {
getKibanaPath,
getProjectRoot,
Expand All @@ -32,6 +35,11 @@ const {
resolveWebpackAlias,
} = require('./lib');

const ROOT_IMPORTS = Object.entries(kbnPkgJson.kibana.rootImports).map(([from, to]) => ({
from,
to: resolve(REPO_ROOT, to),
}));

// cache context, it shouldn't change
let context;
function initContext(file, config) {
Expand Down Expand Up @@ -68,8 +76,17 @@ function tryNodeResolver(importRequest, file, config) {

exports.resolve = function resolveKibanaPath(importRequest, file, config) {
config = config || {};
let forceNode = config.forceNode;

const rootImport = ROOT_IMPORTS.find(
i => importRequest === i.from || importRequest.startsWith(i.from + '/')
);
if (rootImport) {
importRequest = resolve(rootImport.to, relative(rootImport.from, importRequest));
forceNode = true;
}

if (config.forceNode) {
if (forceNode) {
return tryNodeResolver(importRequest, file, config);
}

Expand Down
52 changes: 37 additions & 15 deletions packages/kbn-pm/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2541,12 +2541,15 @@ const commands = {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; });
/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19);
/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(33);
/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34);
/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(35);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(19);
/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33);
/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20);
/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34);
/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(35);
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
Expand All @@ -2570,24 +2573,26 @@ __webpack_require__.r(__webpack_exports__);





const BootstrapCommand = {
description: 'Install dependencies and crosslink projects',
name: 'bootstrap',

async run(projects, projectGraph, {
options
}) {
const batchedProjectsByWorkspace = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_4__["topologicallyBatchProjects"])(projects, projectGraph, {
const batchedProjectsByWorkspace = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_6__["topologicallyBatchProjects"])(projects, projectGraph, {
batchByWorkspace: true
});
const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_4__["topologicallyBatchProjects"])(projects, projectGraph);
const batchedProjects = Object(_utils_projects__WEBPACK_IMPORTED_MODULE_6__["topologicallyBatchProjects"])(projects, projectGraph);
const extraArgs = [...(options['frozen-lockfile'] === true ? ['--frozen-lockfile'] : []), ...(options['prefer-offline'] === true ? ['--prefer-offline'] : [])];
_utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nRunning installs in topological order:'));
_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a.bold('\nRunning installs in topological order:'));

for (const batch of batchedProjectsByWorkspace) {
for (const project of batch) {
if (project.isWorkspaceProject) {
_utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(`Skipping workspace project: ${project.name}`);
_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(`Skipping workspace project: ${project.name}`);
continue;
}

Expand All @@ -2599,22 +2604,35 @@ const BootstrapCommand = {
}
}

_utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nInstalls completed, linking package executables:\n'));
await Object(_utils_link_project_executables__WEBPACK_IMPORTED_MODULE_1__["linkProjectExecutables"])(projects, projectGraph);
_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a.bold('\nInstalls completed, linking package executables:\n'));
await Object(_utils_link_project_executables__WEBPACK_IMPORTED_MODULE_2__["linkProjectExecutables"])(projects, projectGraph);
/**
* At the end of the bootstrapping process we call all `kbn:bootstrap` scripts
* in the list of projects. We do this because some projects need to be
* transpiled before they can be used. Ideally we shouldn't do this unless we
* have to, as it will slow down the bootstrapping process.
*/

_utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.bold('\nLinking executables completed, running `kbn:bootstrap` scripts\n'));
await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_3__["parallelizeBatches"])(batchedProjects, async pkg => {
_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a.bold('\nLinking executables completed, running `kbn:bootstrap` scripts\n'));
await Object(_utils_parallelize__WEBPACK_IMPORTED_MODULE_5__["parallelizeBatches"])(batchedProjects, async pkg => {
if (pkg.hasScript('kbn:bootstrap')) {
await pkg.runScriptStreaming('kbn:bootstrap');
}
});
_utils_log__WEBPACK_IMPORTED_MODULE_2__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_0___default.a.green.bold('\nBootstrapping completed!\n'));
_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a.bold('\nLinking root imports:\n'));

for (const project of projects.values()) {
for (const [request, actual] of Object.entries(project.getRootImports())) {
const dest = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(project.nodeModulesLocation, request);
const src = Object(path__WEBPACK_IMPORTED_MODULE_0__["resolve"])(project.path, actual);
await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["mkdirp"])(Object(path__WEBPACK_IMPORTED_MODULE_0__["dirname"])(dest));
await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["createSymlink"])(src, dest, 'exec');
await Object(_utils_fs__WEBPACK_IMPORTED_MODULE_4__["chmod"])(dest, '755');
_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a`{dim [${project.name}]} ${request} -> {dim ${actual}}`);
}
}

_utils_log__WEBPACK_IMPORTED_MODULE_3__["log"].write(chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green.bold('\nBootstrapping completed!\n'));
}

};
Expand Down Expand Up @@ -8023,6 +8041,10 @@ class Project {
return this.json.kibana && this.json.kibana.clean || {};
}

getRootImports() {
return this.json.kibana && this.json.kibana.rootImports || {};
}

hasScript(name) {
return name in this.scripts;
}
Expand Down
16 changes: 16 additions & 0 deletions packages/kbn-pm/src/commands/bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@
* under the License.
*/

import { resolve, dirname } from 'path';

import chalk from 'chalk';

import { linkProjectExecutables } from '../utils/link_project_executables';
import { log } from '../utils/log';
import { createSymlink, chmod, mkdirp } from '../utils/fs';
import { parallelizeBatches } from '../utils/parallelize';
import { topologicallyBatchProjects } from '../utils/projects';
import { ICommand } from './';
Expand Down Expand Up @@ -71,6 +74,19 @@ export const BootstrapCommand: ICommand = {
}
});

log.write(chalk.bold('\nLinking root imports:\n'));
for (const project of projects.values()) {
for (const [request, actual] of Object.entries(project.getRootImports())) {
const dest = resolve(project.nodeModulesLocation, request);
const src = resolve(project.path, actual);

await mkdirp(dirname(dest));
await createSymlink(src, dest, 'exec');
await chmod(dest, '755');
log.write(chalk`{dim [${project.name}]} ${request} -> {dim ${actual}}`);
}
}

log.write(chalk.green.bold('\nBootstrapping completed!\n'));
},
};
4 changes: 4 additions & 0 deletions packages/kbn-pm/src/utils/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@ export class Project {
return (this.json.kibana && this.json.kibana.clean) || {};
}

public getRootImports(): { [key: string]: string } {
return (this.json.kibana && this.json.kibana.rootImports) || {};
}

public hasScript(name: string) {
return name in this.scripts;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

import { MINUTE, HOUR, DAY, WEEK, MONTH, YEAR } from '../../public/crud_app/services';
import { INDEX_PATTERN_ILLEGAL_CHARACTERS_VISIBLE } from '../../../../../../src/legacy/ui/public/index_patterns';
import { INDEX_PATTERN_ILLEGAL_CHARACTERS_VISIBLE } from '@kbn/src/legacy/ui/public/index_patterns';
import { setupEnvironment, pageHelpers } from './helpers';

jest.mock('ui/index_patterns', () => {
Expand Down
23 changes: 21 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6465,6 +6465,17 @@ [email protected]:
resolved "https://registry.yarnpkg.com/babel-plugin-mock-imports/-/babel-plugin-mock-imports-1.0.1.tgz#1476ed4de911347d344fc81caab4beced80804b1"
integrity sha512-Nu4unCGKeqOfLlfnLPnv/pEHancdAGTqFqyArZ27gsKIiKxeZvMr87IHB8BxhMu3Bfc8fA8bx7hWt32aZbEwpQ==

[email protected]:
version "3.2.0"
resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7"
integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==
dependencies:
find-babel-config "^1.1.0"
glob "^7.1.2"
pkg-up "^2.0.0"
reselect "^3.0.1"
resolve "^1.4.0"

babel-plugin-named-asset-import@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.1.tgz#5ec13ec446d0a1e5bb6c57a1f94c9cdedb0c50d6"
Expand Down Expand Up @@ -12623,6 +12634,14 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"

find-babel-config@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
dependencies:
json5 "^0.5.1"
path-exists "^3.0.0"

find-cache-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d"
Expand Down Expand Up @@ -17376,7 +17395,7 @@ [email protected], json3@^3.3.2:
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=

json5@^0.5.0:
json5@^0.5.0, json5@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
Expand Down Expand Up @@ -24467,7 +24486,7 @@ resolve@^1.10.1, resolve@^1.11.0:
dependencies:
path-parse "^1.0.6"

resolve@^1.11.1:
resolve@^1.11.1, resolve@^1.4.0:
version "1.11.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e"
integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==
Expand Down