diff --git a/packages/node/src/executors/build/build.impl.spec.ts b/packages/node/src/executors/build/build.impl.spec.ts index c995918aa7..3a074e87fb 100644 --- a/packages/node/src/executors/build/build.impl.spec.ts +++ b/packages/node/src/executors/build/build.impl.spec.ts @@ -6,11 +6,10 @@ import buildExecutor from './build.impl'; import { BuildNodeBuilderOptions } from '../../utils/types'; jest.mock('tsconfig-paths-webpack-plugin'); -jest.mock('@nrwl/workspace/src/utilities/run-webpack', () => ({ +jest.mock('../../utils/run-webpack', () => ({ runWebpack: jest.fn(), })); -import { runWebpack } from '@nrwl/workspace/src/utilities/run-webpack'; -import objectContaining = jasmine.objectContaining; +import { runWebpack } from '../../utils/run-webpack'; describe('Node Build Executor', () => { let context: ExecutorContext; diff --git a/packages/node/src/executors/build/build.impl.ts b/packages/node/src/executors/build/build.impl.ts index 4b63b38ae8..ca86b25eb2 100644 --- a/packages/node/src/executors/build/build.impl.ts +++ b/packages/node/src/executors/build/build.impl.ts @@ -1,4 +1,3 @@ -import * as webpack from 'webpack'; import 'dotenv/config'; import { ExecutorContext } from '@nrwl/devkit'; @@ -8,7 +7,6 @@ import { checkDependentProjectsHaveBeenBuilt, createTmpTsConfig, } from '@nrwl/workspace/src/utilities/buildable-libs-utils'; -import { runWebpack } from '@nrwl/workspace/src/utilities/run-webpack'; import { map, tap } from 'rxjs/operators'; import { eachValueFrom } from 'rxjs-for-await'; @@ -19,6 +17,7 @@ import { OUT_FILENAME } from '../../utils/config'; import { BuildNodeBuilderOptions } from '../../utils/types'; import { normalizeBuildOptions } from '../../utils/normalize'; import { generatePackageJson } from '../../utils/generate-package-json'; +import { runWebpack } from '../../utils/run-webpack'; export type NodeBuildEvent = { outfile: string; diff --git a/packages/node/src/utils/run-webpack.ts b/packages/node/src/utils/run-webpack.ts new file mode 100644 index 0000000000..f958a98555 --- /dev/null +++ b/packages/node/src/utils/run-webpack.ts @@ -0,0 +1,33 @@ +import * as webpack from 'webpack'; +import { Observable } from 'rxjs'; + +export function runWebpack(config: webpack.Configuration): Observable { + return new Observable((subscriber) => { + // Passing `watch` option here will result in a warning due to missing callback. + // We manually call `.watch` or `.run` later so this option isn't needed here. + const { watch, ...normalizedConfig } = config; + const webpackCompiler = webpack(normalizedConfig); + + const callback = (err: Error, stats: webpack.Stats) => { + if (err) { + subscriber.error(err); + } + subscriber.next(stats); + }; + + if (config.watch) { + const watchOptions = config.watchOptions || {}; + const watching = webpackCompiler.watch(watchOptions, callback); + + return () => watching.close(() => subscriber.complete()); + } else { + webpackCompiler.run((err, stats) => { + callback(err, stats); + webpackCompiler.close((closeErr) => { + if (closeErr) subscriber.error(closeErr); + subscriber.complete(); + }); + }); + } + }); +} diff --git a/packages/web/src/executors/build/build.impl.ts b/packages/web/src/executors/build/build.impl.ts index 7b74ef5190..a1c53ff7d1 100644 --- a/packages/web/src/executors/build/build.impl.ts +++ b/packages/web/src/executors/build/build.impl.ts @@ -1,6 +1,5 @@ import type { ExecutorContext } from '@nrwl/devkit'; import type { Configuration, Stats } from 'webpack'; -import * as webpack from 'webpack'; import { from, of } from 'rxjs'; import { bufferCount, mergeScan, switchMap, tap } from 'rxjs/operators'; import { eachValueFrom } from 'rxjs-for-await'; @@ -14,10 +13,6 @@ import { checkDependentProjectsHaveBeenBuilt, createTmpTsConfig, } from '@nrwl/workspace/src/utilities/buildable-libs-utils'; -import { - getEmittedFiles, - runWebpack, -} from '@nrwl/workspace/src/utilities/run-webpack'; import { readTsConfig } from '@nrwl/workspace/src/utilities/typescript'; import { writeIndexHtml } from '../../utils/third-party/cli-files/utilities/index-file/write-index-html'; @@ -29,6 +24,7 @@ import { getWebConfig } from '../../utils/web.config'; import type { BuildBuilderOptions } from '../../utils/types'; import { deleteOutputDir } from '../../utils/delete-output-dir'; import type { ExtraEntryPoint } from '../../utils/third-party/browser/schema'; +import { getEmittedFiles, runWebpack } from '../../utils/run-webpack'; export interface WebBuildBuilderOptions extends BuildBuilderOptions { index: string; diff --git a/packages/web/src/executors/dev-server/dev-server.impl.ts b/packages/web/src/executors/dev-server/dev-server.impl.ts index 0d26a6b852..3c98941c3c 100644 --- a/packages/web/src/executors/dev-server/dev-server.impl.ts +++ b/packages/web/src/executors/dev-server/dev-server.impl.ts @@ -9,10 +9,6 @@ import { import { eachValueFrom } from 'rxjs-for-await'; import { map, tap } from 'rxjs/operators'; import * as WebpackDevServer from 'webpack-dev-server'; -import { - getEmittedFiles, - runWebpackDevServer, -} from '@nrwl/workspace/src/utilities/run-webpack'; import { normalizeWebBuildOptions } from '../../utils/normalize'; import { WebBuildBuilderOptions } from '../build/build.impl'; @@ -22,6 +18,7 @@ import { createTmpTsConfig, } from '@nrwl/workspace/src/utilities/buildable-libs-utils'; import { readCachedProjectGraph } from '@nrwl/workspace/src/core/project-graph'; +import { getEmittedFiles, runWebpackDevServer } from '../../utils/run-webpack'; export interface WebDevServerOptions { host: string; diff --git a/packages/workspace/src/utilities/run-webpack.ts b/packages/web/src/utils/run-webpack.ts similarity index 98% rename from packages/workspace/src/utilities/run-webpack.ts rename to packages/web/src/utils/run-webpack.ts index 29de0ed912..c9298c8ef7 100644 --- a/packages/workspace/src/utilities/run-webpack.ts +++ b/packages/web/src/utils/run-webpack.ts @@ -1,6 +1,6 @@ import * as webpack from 'webpack'; import type { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-server'; -import { Observable } from 'rxjs/internal/Observable'; +import { Observable } from 'rxjs'; import { extname } from 'path'; export function runWebpack(config: webpack.Configuration): Observable { diff --git a/packages/web/src/utils/third-party/cli-files/utilities/index-file/write-index-html.ts b/packages/web/src/utils/third-party/cli-files/utilities/index-file/write-index-html.ts index 4ad735355f..207077f7ab 100644 --- a/packages/web/src/utils/third-party/cli-files/utilities/index-file/write-index-html.ts +++ b/packages/web/src/utils/third-party/cli-files/utilities/index-file/write-index-html.ts @@ -7,7 +7,6 @@ */ import { dirname, join } from 'path'; -import { EmittedFile } from '@nrwl/workspace/src/utilities/run-webpack'; import { ExtraEntryPoint } from '../../../browser/schema'; import { generateEntryPoints } from '../package-chunk-sort'; import { stripBom } from '../strip-bom'; @@ -18,6 +17,7 @@ import { } from './augment-index-html'; import { readFileSync, writeFileSync } from 'fs'; import { interpolateEnvironmentVariablesToIndex } from '../../../../interpolate-env-variables-to-index'; +import { EmittedFile } from '../../../../run-webpack'; type ExtensionFilter = '.js' | '.css';