diff --git a/package.json b/package.json
index 017ae8d755e9b..6c44c34996c64 100644
--- a/package.json
+++ b/package.json
@@ -351,6 +351,7 @@
"@types/mustache": "^0.8.31",
"@types/node": "^10.12.27",
"@types/node-forge": "^0.9.0",
+ "@types/normalize-path": "^3.0.0",
"@types/numeral": "^0.0.26",
"@types/opn": "^5.1.0",
"@types/pegjs": "^0.10.1",
diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/index.ts b/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/index.ts
index 66fa55479f3b9..817c4796562e8 100644
--- a/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/index.ts
+++ b/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/index.ts
@@ -17,6 +17,7 @@
* under the License.
*/
+import './legacy/styles.scss';
import { fooLibFn } from '../../foo/public/index';
export * from './lib';
export { fooLibFn };
diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss
new file mode 100644
index 0000000000000..e71a2d485a2f8
--- /dev/null
+++ b/packages/kbn-optimizer/src/__fixtures__/mock_repo/plugins/bar/public/legacy/styles.scss
@@ -0,0 +1,4 @@
+body {
+ width: $globalStyleConstant;
+ background-image: url("ui/icon.svg");
+}
diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg
new file mode 100644
index 0000000000000..ae7d5b958bbad
--- /dev/null
+++ b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_styling_constants.scss b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_styling_constants.scss
new file mode 100644
index 0000000000000..83995ca65211b
--- /dev/null
+++ b/packages/kbn-optimizer/src/__fixtures__/mock_repo/src/legacy/ui/public/styles/_styling_constants.scss
@@ -0,0 +1 @@
+$globalStyleConstant: 10;
diff --git a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap
index 706f79978beee..1a974d3e81092 100644
--- a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap
+++ b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap
@@ -5,553 +5,56 @@ OptimizerConfig {
"bundles": Array [
Bundle {
"cache": BundleCache {
- "path": /plugins/bar/target/public/.kbn-optimizer-cache,
+ "path": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/target/public/.kbn-optimizer-cache,
"state": undefined,
},
- "contextDir": /plugins/bar,
+ "contextDir": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar,
"entry": "./public/index",
"id": "bar",
- "outputDir": /plugins/bar/target/public,
- "sourceRoot": ,
+ "outputDir": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/target/public,
+ "sourceRoot": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo,
"type": "plugin",
},
Bundle {
"cache": BundleCache {
- "path": /plugins/foo/target/public/.kbn-optimizer-cache,
+ "path": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/target/public/.kbn-optimizer-cache,
"state": undefined,
},
- "contextDir": /plugins/foo,
+ "contextDir": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo,
"entry": "./public/index",
"id": "foo",
- "outputDir": /plugins/foo/target/public,
- "sourceRoot": ,
+ "outputDir": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/target/public,
+ "sourceRoot": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo,
"type": "plugin",
},
],
"cache": true,
- "dist": false,
+ "dist": true,
"inspectWorkers": false,
"maxWorkerCount": 1,
"plugins": Array [
Object {
- "directory": /plugins/bar,
+ "directory": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar,
"id": "bar",
"isUiPlugin": true,
},
Object {
- "directory": /plugins/baz,
+ "directory": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/baz,
"id": "baz",
"isUiPlugin": false,
},
Object {
- "directory": /plugins/foo,
+ "directory": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo,
"id": "foo",
"isUiPlugin": true,
},
],
"profileWebpack": false,
- "repoRoot": ,
+ "repoRoot": /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo,
"watch": false,
}
`;
-exports[`builds expected bundles, saves bundle counts to metadata: bar bundle 1`] = `
-"var __kbnBundles__ = typeof __kbnBundles__ === \\"object\\" ? __kbnBundles__ : {}; __kbnBundles__[\\"plugin/bar\\"] =
-/******/ (function(modules) { // webpackBootstrap
-/******/ // The module cache
-/******/ var installedModules = {};
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/
-/******/ // Check if module is in cache
-/******/ if(installedModules[moduleId]) {
-/******/ return installedModules[moduleId].exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = installedModules[moduleId] = {
-/******/ i: moduleId,
-/******/ l: false,
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ // Flag the module as loaded
-/******/ module.l = true;
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/******/
-/******/ // expose the modules object (__webpack_modules__)
-/******/ __webpack_require__.m = modules;
-/******/
-/******/ // expose the module cache
-/******/ __webpack_require__.c = installedModules;
-/******/
-/******/ // define getter function for harmony exports
-/******/ __webpack_require__.d = function(exports, name, getter) {
-/******/ if(!__webpack_require__.o(exports, name)) {
-/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ }
-/******/ };
-/******/
-/******/ // define __esModule on exports
-/******/ __webpack_require__.r = function(exports) {
-/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ }
-/******/ Object.defineProperty(exports, '__esModule', { value: true });
-/******/ };
-/******/
-/******/ // create a fake namespace object
-/******/ // mode & 1: value is a module id, require it
-/******/ // mode & 2: merge all properties of value into the ns
-/******/ // mode & 4: return value when already ns object
-/******/ // mode & 8|1: behave like require
-/******/ __webpack_require__.t = function(value, mode) {
-/******/ if(mode & 1) value = __webpack_require__(value);
-/******/ if(mode & 8) return value;
-/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ var ns = Object.create(null);
-/******/ __webpack_require__.r(ns);
-/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ return ns;
-/******/ };
-/******/
-/******/ // getDefaultExport function for compatibility with non-harmony modules
-/******/ __webpack_require__.n = function(module) {
-/******/ var getter = module && module.__esModule ?
-/******/ function getDefault() { return module['default']; } :
-/******/ function getModuleExports() { return module; };
-/******/ __webpack_require__.d(getter, 'a', getter);
-/******/ return getter;
-/******/ };
-/******/
-/******/ // Object.prototype.hasOwnProperty.call
-/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ // __webpack_public_path__
-/******/ __webpack_require__.p = \\"__REPLACE_WITH_PUBLIC_PATH__\\";
-/******/
-/******/
-/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = \\"./public/index.ts\\");
-/******/ })
-/************************************************************************/
-/******/ ({
+exports[`builds expected bundles, saves bundle counts to metadata: bar bundle 1`] = `"var __kbnBundles__=typeof __kbnBundles__===\\"object\\"?__kbnBundles__:{};__kbnBundles__[\\"plugin/bar\\"]=function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{enumerable:true,get:getter})}};__webpack_require__.r=function(exports){if(typeof Symbol!==\\"undefined\\"&&Symbol.toStringTag){Object.defineProperty(exports,Symbol.toStringTag,{value:\\"Module\\"})}Object.defineProperty(exports,\\"__esModule\\",{value:true})};__webpack_require__.t=function(value,mode){if(mode&1)value=__webpack_require__(value);if(mode&8)return value;if(mode&4&&typeof value===\\"object\\"&&value&&value.__esModule)return value;var ns=Object.create(null);__webpack_require__.r(ns);Object.defineProperty(ns,\\"default\\",{enumerable:true,value:value});if(mode&2&&typeof value!=\\"string\\")for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module[\\"default\\"]}:function getModuleExports(){return module};__webpack_require__.d(getter,\\"a\\",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p=\\"__REPLACE_WITH_PUBLIC_PATH__\\";return __webpack_require__(__webpack_require__.s=4)}([function(module,exports,__webpack_require__){\\"use strict\\";var isOldIE=function isOldIE(){var memo;return function memorize(){if(typeof memo===\\"undefined\\"){memo=Boolean(window&&document&&document.all&&!window.atob)}return memo}}();var getTarget=function getTarget(){var memo={};return function memorize(target){if(typeof memo[target]===\\"undefined\\"){var styleTarget=document.querySelector(target);if(window.HTMLIFrameElement&&styleTarget instanceof window.HTMLIFrameElement){try{styleTarget=styleTarget.contentDocument.head}catch(e){styleTarget=null}}memo[target]=styleTarget}return memo[target]}}();var stylesInDom=[];function getIndexByIdentifier(identifier){var result=-1;for(var i=0;i {
await del(TMP_DIR);
@@ -50,20 +50,25 @@ it('builds expected bundles, saves bundle counts to metadata', async () => {
repoRoot: MOCK_REPO_DIR,
pluginScanDirs: [Path.resolve(MOCK_REPO_DIR, 'plugins')],
maxWorkerCount: 1,
+ dist: true,
});
expect(config).toMatchSnapshot('OptimizerConfig');
- const msgs = await runOptimizer(config)
- .pipe(
- tap(state => {
- if (state.event?.type === 'worker stdio') {
- // eslint-disable-next-line no-console
- console.log('worker', state.event.stream, state.event.chunk.toString('utf8'));
+ const log = new ToolingLog({
+ level: 'error',
+ writeTo: {
+ write(chunk) {
+ if (chunk.endsWith('\n')) {
+ chunk = chunk.slice(0, -1);
}
- }),
- toArray()
- )
+ // eslint-disable-next-line no-console
+ console.error(chunk);
+ },
+ },
+ });
+ const msgs = await runOptimizer(config)
+ .pipe(logOptimizerState(log, config), toArray())
.toPromise();
const assert = (statement: string, truth: boolean, altStates?: OptimizerUpdate[]) => {
@@ -132,23 +137,31 @@ it('builds expected bundles, saves bundle counts to metadata', async () => {
expect(foo.cache.getModuleCount()).toBe(3);
expect(foo.cache.getReferencedFiles()).toMatchInlineSnapshot(`
Array [
- /plugins/foo/public/ext.ts,
- /plugins/foo/public/index.ts,
- /plugins/foo/public/lib.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/public/ext.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/public/index.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/public/lib.ts,
]
`);
const bar = config.bundles.find(b => b.id === 'bar')!;
expect(bar).toBeTruthy();
bar.cache.refresh();
- expect(bar.cache.getModuleCount()).toBe(5);
+ expect(bar.cache.getModuleCount()).toBe(
+ // code + styles + style/css-loader runtime
+ 14
+ );
+
expect(bar.cache.getReferencedFiles()).toMatchInlineSnapshot(`
Array [
- /plugins/foo/public/ext.ts,
- /plugins/foo/public/index.ts,
- /plugins/foo/public/lib.ts,
- /plugins/bar/public/index.ts,
- /plugins/bar/public/lib.ts,
+ /node_modules/css-loader/package.json,
+ /node_modules/style-loader/package.json,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/public/index.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/public/legacy/styles.scss,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/bar/public/lib.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/public/ext.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/public/index.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/plugins/foo/public/lib.ts,
+ /packages/kbn-optimizer/src/__fixtures__/__tmp__/mock_repo/src/legacy/ui/public/icon.svg,
]
`);
});
@@ -158,6 +171,7 @@ it('uses cache on second run and exist cleanly', async () => {
repoRoot: MOCK_REPO_DIR,
pluginScanDirs: [Path.resolve(MOCK_REPO_DIR, 'plugins')],
maxWorkerCount: 1,
+ dist: true,
});
const msgs = await runOptimizer(config)
diff --git a/packages/kbn-optimizer/src/worker/__snapshots__/parse_path.test.ts.snap b/packages/kbn-optimizer/src/worker/__snapshots__/parse_path.test.ts.snap
new file mode 100644
index 0000000000000..2973ac116d6bd
--- /dev/null
+++ b/packages/kbn-optimizer/src/worker/__snapshots__/parse_path.test.ts.snap
@@ -0,0 +1,156 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`parseDirPath() parses / 1`] = `
+Object {
+ "dirs": Array [],
+ "filename": undefined,
+ "root": "/",
+}
+`;
+
+exports[`parseDirPath() parses /foo 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ ],
+ "filename": undefined,
+ "root": "/",
+}
+`;
+
+exports[`parseDirPath() parses /foo/bar/baz 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ "baz",
+ ],
+ "filename": undefined,
+ "root": "/",
+}
+`;
+
+exports[`parseDirPath() parses /foo/bar/baz/ 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ "baz",
+ ],
+ "filename": undefined,
+ "root": "/",
+}
+`;
+
+exports[`parseDirPath() parses c:\\ 1`] = `
+Object {
+ "dirs": Array [],
+ "filename": undefined,
+ "root": "c:",
+}
+`;
+
+exports[`parseDirPath() parses c:\\foo 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ ],
+ "filename": undefined,
+ "root": "c:",
+}
+`;
+
+exports[`parseDirPath() parses c:\\foo\\bar\\baz 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ "baz",
+ ],
+ "filename": undefined,
+ "root": "c:",
+}
+`;
+
+exports[`parseDirPath() parses c:\\foo\\bar\\baz\\ 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ "baz",
+ ],
+ "filename": undefined,
+ "root": "c:",
+}
+`;
+
+exports[`parseFilePath() parses /foo 1`] = `
+Object {
+ "dirs": Array [],
+ "filename": "foo",
+ "root": "/",
+}
+`;
+
+exports[`parseFilePath() parses /foo/bar/baz 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ ],
+ "filename": "baz",
+ "root": "/",
+}
+`;
+
+exports[`parseFilePath() parses /foo/bar/baz.json 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ ],
+ "filename": "baz.json",
+ "root": "/",
+}
+`;
+
+exports[`parseFilePath() parses c:/foo/bar/baz.json 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ ],
+ "filename": "baz.json",
+ "root": "c:",
+}
+`;
+
+exports[`parseFilePath() parses c:\\foo 1`] = `
+Object {
+ "dirs": Array [],
+ "filename": "foo",
+ "root": "c:",
+}
+`;
+
+exports[`parseFilePath() parses c:\\foo\\bar\\baz 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ ],
+ "filename": "baz",
+ "root": "c:",
+}
+`;
+
+exports[`parseFilePath() parses c:\\foo\\bar\\baz.json 1`] = `
+Object {
+ "dirs": Array [
+ "foo",
+ "bar",
+ ],
+ "filename": "baz.json",
+ "root": "c:",
+}
+`;
diff --git a/typings/normalize_path/index.d.ts b/packages/kbn-optimizer/src/worker/parse_path.test.ts
similarity index 57%
rename from typings/normalize_path/index.d.ts
rename to packages/kbn-optimizer/src/worker/parse_path.test.ts
index 31e064ca63d90..72197e8c8fb07 100644
--- a/typings/normalize_path/index.d.ts
+++ b/packages/kbn-optimizer/src/worker/parse_path.test.ts
@@ -17,8 +17,20 @@
* under the License.
*/
-declare function NormalizePath(path: string, stripTrailing?: boolean): string;
+import { parseFilePath, parseDirPath } from './parse_path';
-declare module 'normalize-path' {
- export = NormalizePath;
-}
+const DIRS = ['/', '/foo/bar/baz/', 'c:\\', 'c:\\foo\\bar\\baz\\'];
+const AMBIGUOUS = ['/foo', '/foo/bar/baz', 'c:\\foo', 'c:\\foo\\bar\\baz'];
+const FILES = ['/foo/bar/baz.json', 'c:/foo/bar/baz.json', 'c:\\foo\\bar\\baz.json'];
+
+describe('parseFilePath()', () => {
+ it.each([...FILES, ...AMBIGUOUS])('parses %s', path => {
+ expect(parseFilePath(path)).toMatchSnapshot();
+ });
+});
+
+describe('parseDirPath()', () => {
+ it.each([...DIRS, ...AMBIGUOUS])('parses %s', path => {
+ expect(parseDirPath(path)).toMatchSnapshot();
+ });
+});
diff --git a/packages/kbn-optimizer/src/worker/parse_path.ts b/packages/kbn-optimizer/src/worker/parse_path.ts
new file mode 100644
index 0000000000000..88152df55b84f
--- /dev/null
+++ b/packages/kbn-optimizer/src/worker/parse_path.ts
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+import normalizePath from 'normalize-path';
+
+/**
+ * Parse an absolute path, supporting normalized paths from webpack,
+ * into a list of directories and root
+ */
+export function parseDirPath(path: string) {
+ const filePath = parseFilePath(path);
+ return {
+ ...filePath,
+ dirs: [...filePath.dirs, ...(filePath.filename ? [filePath.filename] : [])],
+ filename: undefined,
+ };
+}
+
+export function parseFilePath(path: string) {
+ const normalized = normalizePath(path);
+ const [root, ...others] = normalized.split('/');
+ return {
+ root: root === '' ? '/' : root,
+ dirs: others.slice(0, -1),
+ filename: others[others.length - 1] || undefined,
+ };
+}
diff --git a/packages/kbn-optimizer/src/worker/run_compilers.ts b/packages/kbn-optimizer/src/worker/run_compilers.ts
index 7dcce8a0fae8d..7a8097fd2b2c7 100644
--- a/packages/kbn-optimizer/src/worker/run_compilers.ts
+++ b/packages/kbn-optimizer/src/worker/run_compilers.ts
@@ -27,9 +27,10 @@ import webpack, { Stats } from 'webpack';
import * as Rx from 'rxjs';
import { mergeMap, map, mapTo, takeUntil } from 'rxjs/operators';
-import { CompilerMsgs, CompilerMsg, maybeMap, Bundle, WorkerConfig } from '../common';
+import { CompilerMsgs, CompilerMsg, maybeMap, Bundle, WorkerConfig, ascending } from '../common';
import { getWebpackConfig } from './webpack.config';
import { isFailureStats, failedStatsToErrorMessage } from './webpack_helpers';
+import { parseFilePath } from './parse_path';
import {
isExternalModule,
isNormalModule,
@@ -108,20 +109,19 @@ const observeCompiler = (
for (const module of normalModules) {
const path = getModulePath(module);
+ const parsedPath = parseFilePath(path);
- const parsedPath = Path.parse(path);
- const dirSegments = parsedPath.dir.split(Path.sep);
- if (!dirSegments.includes('node_modules')) {
+ if (!parsedPath.dirs.includes('node_modules')) {
referencedFiles.add(path);
continue;
}
- const nmIndex = dirSegments.lastIndexOf('node_modules');
- const isScoped = dirSegments[nmIndex + 1].startsWith('@');
+ const nmIndex = parsedPath.dirs.lastIndexOf('node_modules');
+ const isScoped = parsedPath.dirs[nmIndex + 1].startsWith('@');
referencedFiles.add(
Path.join(
parsedPath.root,
- ...dirSegments.slice(0, nmIndex + 1 + (isScoped ? 2 : 1)),
+ ...parsedPath.dirs.slice(0, nmIndex + 1 + (isScoped ? 2 : 1)),
'package.json'
)
);
@@ -146,7 +146,7 @@ const observeCompiler = (
optimizerCacheKey: workerConfig.optimizerCacheKey,
cacheKey: bundle.createCacheKey(files, mtimes),
moduleCount: normalModules.length,
- files,
+ files: files.sort(ascending(f => f)),
});
return compilerMsgs.compilerSuccess({
diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts
index f7fa32870c428..9493ea612d9f5 100644
--- a/packages/kbn-optimizer/src/worker/webpack.config.ts
+++ b/packages/kbn-optimizer/src/worker/webpack.config.ts
@@ -30,6 +30,7 @@ import { CleanWebpackPlugin } from 'clean-webpack-plugin';
import * as SharedDeps from '@kbn/ui-shared-deps';
import { Bundle, WorkerConfig } from '../common';
+import { parseDirPath } from './parse_path';
const PUBLIC_PATH_PLACEHOLDER = '__REPLACE_WITH_PUBLIC_PATH__';
const BABEL_PRESET_PATH = require.resolve('@kbn/babel-preset/webpack_preset');
@@ -133,7 +134,7 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) {
}
// manually force ui/* urls in legacy styles to resolve to ui/legacy/public
- if (uri.startsWith('ui/') && base.split(Path.sep).includes('legacy')) {
+ if (uri.startsWith('ui/') && parseDirPath(base).dirs.includes('legacy')) {
return Path.resolve(
worker.repoRoot,
'src/legacy/ui/public',
@@ -148,7 +149,9 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) {
{
loader: 'sass-loader',
options: {
- sourceMap: !worker.dist,
+ // must always be enabled as long as we're using the `resolve-url-loader` to
+ // rewrite `ui/*` urls. They're dropped by subsequent loaders though
+ sourceMap: true,
prependData(loaderContext: webpack.loader.LoaderContext) {
return `@import ${stringifyRequest(
loaderContext,
diff --git a/yarn.lock b/yarn.lock
index d45aa6d704afd..fc6d6eb2df796 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5715,6 +5715,11 @@
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+"@types/normalize-path@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-path/-/normalize-path-3.0.0.tgz#bb5c46cab77b93350b4cf8d7ff1153f47189ae31"
+ integrity sha512-Nd8y/5t/7CRakPYiyPzr/IAfYusy1FkcZYFEAcoMZkwpJv2n4Wm+olW+e7xBdHEXhOnWdG9ddbar0gqZWS4x5Q==
+
"@types/numeral@^0.0.25":
version "0.0.25"
resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.25.tgz#b6f55062827a4787fe4ab151cf3412a468e65271"