@angular-devkit/build-angular 13.1.4 → 13.2.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "@angular-devkit/build-angular",
3
- "version": "13.1.4",
3
+ "version": "13.2.0-rc.0",
4
4
  "description": "Angular Webpack Build Facade",
5
5
  "main": "src/index.js",
6
6
  "typings": "src/index.d.ts",
7
7
  "builders": "builders.json",
8
8
  "dependencies": {
9
9
  "@ampproject/remapping": "1.0.2",
10
- "@angular-devkit/architect": "0.1301.4",
11
- "@angular-devkit/build-webpack": "0.1301.4",
12
- "@angular-devkit/core": "13.1.4",
13
- "@babel/core": "7.16.0",
14
- "@babel/generator": "7.16.0",
15
- "@babel/helper-annotate-as-pure": "7.16.0",
16
- "@babel/plugin-proposal-async-generator-functions": "7.16.4",
17
- "@babel/plugin-transform-async-to-generator": "7.16.0",
18
- "@babel/plugin-transform-runtime": "7.16.4",
19
- "@babel/preset-env": "7.16.4",
20
- "@babel/runtime": "7.16.3",
21
- "@babel/template": "7.16.0",
10
+ "@angular-devkit/architect": "0.1302.0-rc.0",
11
+ "@angular-devkit/build-webpack": "0.1302.0-rc.0",
12
+ "@angular-devkit/core": "13.2.0-rc.0",
13
+ "@babel/core": "7.16.7",
14
+ "@babel/generator": "7.16.8",
15
+ "@babel/helper-annotate-as-pure": "7.16.7",
16
+ "@babel/plugin-proposal-async-generator-functions": "7.16.8",
17
+ "@babel/plugin-transform-async-to-generator": "7.16.8",
18
+ "@babel/plugin-transform-runtime": "7.16.8",
19
+ "@babel/preset-env": "7.16.8",
20
+ "@babel/runtime": "7.16.7",
21
+ "@babel/template": "7.16.7",
22
22
  "@discoveryjs/json-ext": "0.5.6",
23
- "@ngtools/webpack": "13.1.4",
23
+ "@ngtools/webpack": "13.2.0-rc.0",
24
24
  "ansi-colors": "4.1.1",
25
25
  "babel-loader": "8.2.3",
26
26
  "babel-plugin-istanbul": "6.1.1",
27
27
  "browserslist": "^4.9.1",
28
28
  "cacache": "15.3.0",
29
29
  "circular-dependency-plugin": "5.2.2",
30
- "copy-webpack-plugin": "10.0.0",
31
- "core-js": "3.19.3",
30
+ "copy-webpack-plugin": "10.2.0",
31
+ "core-js": "3.20.3",
32
32
  "critters": "0.0.16",
33
33
  "css-loader": "6.5.1",
34
34
  "esbuild-wasm": "0.14.11",
@@ -41,45 +41,45 @@
41
41
  "less-loader": "10.2.0",
42
42
  "license-webpack-plugin": "4.0.0",
43
43
  "loader-utils": "3.2.0",
44
- "mini-css-extract-plugin": "2.4.5",
44
+ "mini-css-extract-plugin": "2.5.2",
45
45
  "minimatch": "3.0.4",
46
46
  "open": "8.4.0",
47
47
  "ora": "5.4.1",
48
48
  "parse5-html-rewriting-stream": "6.0.1",
49
- "piscina": "3.1.0",
50
- "postcss": "8.4.4",
49
+ "piscina": "3.2.0",
50
+ "postcss": "8.4.5",
51
51
  "postcss-import": "14.0.2",
52
52
  "postcss-loader": "6.2.1",
53
53
  "postcss-preset-env": "7.2.3",
54
54
  "regenerator-runtime": "0.13.9",
55
- "resolve-url-loader": "4.0.0",
55
+ "resolve-url-loader": "5.0.0",
56
56
  "rxjs": "6.6.7",
57
- "sass": "1.44.0",
57
+ "sass": "1.49.0",
58
58
  "sass-loader": "12.4.0",
59
59
  "semver": "7.3.5",
60
- "source-map-loader": "3.0.0",
60
+ "source-map-loader": "3.0.1",
61
61
  "source-map-support": "0.5.21",
62
- "stylus": "0.55.0",
62
+ "stylus": "0.56.0",
63
63
  "stylus-loader": "6.2.0",
64
64
  "terser": "5.10.0",
65
65
  "text-table": "0.2.0",
66
66
  "tree-kill": "1.2.2",
67
67
  "tslib": "2.3.1",
68
- "webpack": "5.65.0",
69
- "webpack-dev-middleware": "5.2.2",
70
- "webpack-dev-server": "4.6.0",
68
+ "webpack": "5.66.0",
69
+ "webpack-dev-middleware": "5.3.0",
70
+ "webpack-dev-server": "4.7.3",
71
71
  "webpack-merge": "5.8.0",
72
- "webpack-subresource-integrity": "5.0.0"
72
+ "webpack-subresource-integrity": "5.1.0"
73
73
  },
74
74
  "optionalDependencies": {
75
75
  "esbuild": "0.14.11"
76
76
  },
77
77
  "peerDependencies": {
78
- "@angular/compiler-cli": "^13.0.0 || ^13.1.0-next",
79
- "@angular/localize": "^13.0.0 || ^13.1.0-next",
80
- "@angular/service-worker": "^13.0.0 || ^13.1.0-next",
78
+ "@angular/compiler-cli": "^13.0.0 || ^13.2.0-next",
79
+ "@angular/localize": "^13.0.0 || ^13.2.0-next",
80
+ "@angular/service-worker": "^13.0.0 || ^13.2.0-next",
81
81
  "karma": "^6.3.0",
82
- "ng-packagr": "^13.0.0 || ^13.1.0-next",
82
+ "ng-packagr": "^13.0.0 || ^13.2.0-next",
83
83
  "protractor": "^7.0.0",
84
84
  "tailwindcss": "^2.0.0 || ^3.0.0",
85
85
  "typescript": ">=4.4.3 <4.6"
@@ -53,10 +53,14 @@ export interface Schema {
53
53
  * Replace compilation source files with other compilation source files in the build.
54
54
  */
55
55
  fileReplacements?: FileReplacement[];
56
+ /**
57
+ * How to handle duplicate translations for i18n.
58
+ */
59
+ i18nDuplicateTranslation?: I18NTranslation;
56
60
  /**
57
61
  * How to handle missing translations for i18n.
58
62
  */
59
- i18nMissingTranslation?: I18NMissingTranslation;
63
+ i18nMissingTranslation?: I18NTranslation;
60
64
  /**
61
65
  * Configures the generation of the application's HTML index.
62
66
  */
@@ -266,9 +270,11 @@ export interface FileReplacement {
266
270
  with?: string;
267
271
  }
268
272
  /**
273
+ * How to handle duplicate translations for i18n.
274
+ *
269
275
  * How to handle missing translations for i18n.
270
276
  */
271
- export declare enum I18NMissingTranslation {
277
+ export declare enum I18NTranslation {
272
278
  Error = "error",
273
279
  Ignore = "ignore",
274
280
  Warning = "warning"
@@ -2,7 +2,7 @@
2
2
  // THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE THE
3
3
  // CORRESPONDING JSON SCHEMA FILE, THEN RUN devkit-admin build (or bazel build ...).
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.OutputHashing = exports.InlineStyleLanguage = exports.I18NMissingTranslation = exports.CrossOrigin = exports.Type = void 0;
5
+ exports.OutputHashing = exports.InlineStyleLanguage = exports.I18NTranslation = exports.CrossOrigin = exports.Type = void 0;
6
6
  /**
7
7
  * The type of budget.
8
8
  */
@@ -26,14 +26,16 @@ var CrossOrigin;
26
26
  CrossOrigin["UseCredentials"] = "use-credentials";
27
27
  })(CrossOrigin = exports.CrossOrigin || (exports.CrossOrigin = {}));
28
28
  /**
29
+ * How to handle duplicate translations for i18n.
30
+ *
29
31
  * How to handle missing translations for i18n.
30
32
  */
31
- var I18NMissingTranslation;
32
- (function (I18NMissingTranslation) {
33
- I18NMissingTranslation["Error"] = "error";
34
- I18NMissingTranslation["Ignore"] = "ignore";
35
- I18NMissingTranslation["Warning"] = "warning";
36
- })(I18NMissingTranslation = exports.I18NMissingTranslation || (exports.I18NMissingTranslation = {}));
33
+ var I18NTranslation;
34
+ (function (I18NTranslation) {
35
+ I18NTranslation["Error"] = "error";
36
+ I18NTranslation["Ignore"] = "ignore";
37
+ I18NTranslation["Warning"] = "warning";
38
+ })(I18NTranslation = exports.I18NTranslation || (exports.I18NTranslation = {}));
37
39
  /**
38
40
  * The stylesheet language to use for the application's inline component styles.
39
41
  */
@@ -220,6 +220,12 @@
220
220
  "enum": ["warning", "error", "ignore"],
221
221
  "default": "warning"
222
222
  },
223
+ "i18nDuplicateTranslation": {
224
+ "type": "string",
225
+ "description": "How to handle duplicate translations for i18n.",
226
+ "enum": ["warning", "error", "ignore"],
227
+ "default": "warning"
228
+ },
223
229
  "localize": {
224
230
  "description": "Translate the bundles in one or more locales.",
225
231
  "oneOf": [
@@ -195,11 +195,12 @@ function serveWebpackBrowser(options, context, transforms = {}) {
195
195
  }).pipe((0, operators_1.concatMap)(async (buildEvent, index) => {
196
196
  var _a, _b;
197
197
  // Resolve serve address.
198
+ const publicPath = (_b = (_a = webpackConfig.devServer) === null || _a === void 0 ? void 0 : _a.devMiddleware) === null || _b === void 0 ? void 0 : _b.publicPath;
198
199
  const serverAddress = url.format({
199
200
  protocol: options.ssl ? 'https' : 'http',
200
201
  hostname: options.host === '0.0.0.0' ? 'localhost' : options.host,
201
202
  port: buildEvent.port,
202
- pathname: (_b = (_a = webpackConfig.devServer) === null || _a === void 0 ? void 0 : _a.devMiddleware) === null || _b === void 0 ? void 0 : _b.publicPath,
203
+ pathname: typeof publicPath === 'string' ? publicPath : undefined,
203
204
  });
204
205
  if (index === 0) {
205
206
  logger.info('\n' +
@@ -299,7 +300,7 @@ async function setupLocalize(locale, i18n, browserOptions, webpackConfig, cacheO
299
300
  error(message) {
300
301
  (0, webpack_diagnostics_1.addError)(compilation, message);
301
302
  },
302
- });
303
+ }, undefined, browserOptions.i18nDuplicateTranslation);
303
304
  i18nLoaderOptions.translation = (_a = localeDescription.translation) !== null && _a !== void 0 ? _a : {};
304
305
  }
305
306
  compilation.hooks.finishModules.tap('build-angular', () => {
@@ -28,10 +28,14 @@ export interface Schema {
28
28
  * Replace compilation source files with other compilation source files in the build.
29
29
  */
30
30
  fileReplacements?: FileReplacement[];
31
+ /**
32
+ * How to handle duplicate translations for i18n.
33
+ */
34
+ i18nDuplicateTranslation?: I18NTranslation;
31
35
  /**
32
36
  * How to handle missing translations for i18n.
33
37
  */
34
- i18nMissingTranslation?: I18NMissingTranslation;
38
+ i18nMissingTranslation?: I18NTranslation;
35
39
  /**
36
40
  * The stylesheet language to use for the application's inline component styles.
37
41
  */
@@ -128,9 +132,11 @@ export interface FileReplacement {
128
132
  with?: string;
129
133
  }
130
134
  /**
135
+ * How to handle duplicate translations for i18n.
136
+ *
131
137
  * How to handle missing translations for i18n.
132
138
  */
133
- export declare enum I18NMissingTranslation {
139
+ export declare enum I18NTranslation {
134
140
  Error = "error",
135
141
  Ignore = "ignore",
136
142
  Warning = "warning"
@@ -2,21 +2,23 @@
2
2
  // THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE THE
3
3
  // CORRESPONDING JSON SCHEMA FILE, THEN RUN devkit-admin build (or bazel build ...).
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.OutputHashing = exports.InlineStyleLanguage = exports.I18NMissingTranslation = exports.BundleDependenciesEnum = void 0;
5
+ exports.OutputHashing = exports.InlineStyleLanguage = exports.I18NTranslation = exports.BundleDependenciesEnum = void 0;
6
6
  var BundleDependenciesEnum;
7
7
  (function (BundleDependenciesEnum) {
8
8
  BundleDependenciesEnum["All"] = "all";
9
9
  BundleDependenciesEnum["None"] = "none";
10
10
  })(BundleDependenciesEnum = exports.BundleDependenciesEnum || (exports.BundleDependenciesEnum = {}));
11
11
  /**
12
+ * How to handle duplicate translations for i18n.
13
+ *
12
14
  * How to handle missing translations for i18n.
13
15
  */
14
- var I18NMissingTranslation;
15
- (function (I18NMissingTranslation) {
16
- I18NMissingTranslation["Error"] = "error";
17
- I18NMissingTranslation["Ignore"] = "ignore";
18
- I18NMissingTranslation["Warning"] = "warning";
19
- })(I18NMissingTranslation = exports.I18NMissingTranslation || (exports.I18NMissingTranslation = {}));
16
+ var I18NTranslation;
17
+ (function (I18NTranslation) {
18
+ I18NTranslation["Error"] = "error";
19
+ I18NTranslation["Ignore"] = "ignore";
20
+ I18NTranslation["Warning"] = "warning";
21
+ })(I18NTranslation = exports.I18NTranslation || (exports.I18NTranslation = {}));
20
22
  /**
21
23
  * The stylesheet language to use for the application's inline component styles.
22
24
  */
@@ -133,6 +133,12 @@
133
133
  "enum": ["warning", "error", "ignore"],
134
134
  "default": "warning"
135
135
  },
136
+ "i18nDuplicateTranslation": {
137
+ "type": "string",
138
+ "description": "How to handle duplicate translations for i18n.",
139
+ "enum": ["warning", "error", "ignore"],
140
+ "default": "warning"
141
+ },
136
142
  "localize": {
137
143
  "description": "Translate the bundles in one or more locales.",
138
144
  "oneOf": [
@@ -5,11 +5,11 @@
5
5
  * Use of this source code is governed by an MIT-style license that can be
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
- import { Options, Result, SassException } from 'sass';
8
+ import { LegacyResult as CompileResult, LegacyException as Exception, LegacyOptions as Options } from 'sass';
9
9
  /**
10
10
  * The callback type for the `dart-sass` asynchronous render function.
11
11
  */
12
- declare type RenderCallback = (error?: SassException, result?: Result) => void;
12
+ declare type RenderCallback = (error?: Exception, result?: CompileResult) => void;
13
13
  /**
14
14
  * A Sass renderer implementation that provides an interface that can be used by Webpack's
15
15
  * `sass-loader`. The implementation uses a Worker thread to perform the Sass rendering
@@ -37,7 +37,7 @@ export declare class SassWorkerImplementation {
37
37
  * @param options The `dart-sass` options to use when rendering the stylesheet.
38
38
  * @param callback The function to execute when the rendering is complete.
39
39
  */
40
- render(options: Options, callback: RenderCallback): void;
40
+ render(options: Options<'async'>, callback: RenderCallback): void;
41
41
  /**
42
42
  * Shutdown the Sass render worker.
43
43
  * Executing this method will stop any pending render requests.
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { logging } from '@angular-devkit/core';
9
9
  import type { ParsedConfiguration } from '@angular/compiler-cli';
10
- import { AssetPatternClass, Budget, CrossOrigin, ExtraEntryPoint, I18NMissingTranslation, IndexUnion, InlineStyleLanguage, Localize, SourceMapClass } from '../builders/browser/schema';
10
+ import { AssetPatternClass, Budget, CrossOrigin, ExtraEntryPoint, I18NTranslation, IndexUnion, InlineStyleLanguage, Localize, SourceMapClass } from '../builders/browser/schema';
11
11
  import { Schema as DevServerSchema } from '../builders/dev-server/schema';
12
12
  import { NormalizedCachedOptions } from './normalize-cache';
13
13
  import { NormalizedFileReplacement } from './normalize-file-replacements';
@@ -26,7 +26,7 @@ export interface BuildOptions {
26
26
  verbose?: boolean;
27
27
  progress?: boolean;
28
28
  localize?: Localize;
29
- i18nMissingTranslation?: I18NMissingTranslation;
29
+ i18nMissingTranslation?: I18NTranslation;
30
30
  bundleDependencies?: boolean;
31
31
  externalDependencies?: string[];
32
32
  watch?: boolean;
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { BuilderContext } from '@angular-devkit/architect';
9
9
  import { json } from '@angular-devkit/core';
10
- import { Schema as BrowserBuilderSchema } from '../builders/browser/schema';
10
+ import { Schema as BrowserBuilderSchema, I18NTranslation } from '../builders/browser/schema';
11
11
  import { Schema as ServerBuilderSchema } from '../builders/server/schema';
12
12
  import { TranslationLoader } from './load-translations';
13
13
  export interface LocaleDescription {
@@ -36,4 +36,4 @@ export declare function configureI18nBuild<T extends BrowserBuilderSchema | Serv
36
36
  export declare function loadTranslations(locale: string, desc: LocaleDescription, workspaceRoot: string, loader: TranslationLoader, logger: {
37
37
  warn: (message: string) => void;
38
38
  error: (message: string) => void;
39
- }, usedFormats?: Set<string>): void;
39
+ }, usedFormats?: Set<string>, duplicateTranslation?: I18NTranslation): void;
@@ -16,6 +16,7 @@ const fs_1 = __importDefault(require("fs"));
16
16
  const module_1 = __importDefault(require("module"));
17
17
  const os_1 = __importDefault(require("os"));
18
18
  const path_1 = __importDefault(require("path"));
19
+ const schema_1 = require("../builders/browser/schema");
19
20
  const read_tsconfig_1 = require("../utils/read-tsconfig");
20
21
  const load_translations_1 = require("./load-translations");
21
22
  /**
@@ -166,7 +167,7 @@ async function configureI18nBuild(context, options) {
166
167
  error(message) {
167
168
  throw new Error(message);
168
169
  },
169
- }, usedFormats);
170
+ }, usedFormats, buildOptions.i18nDuplicateTranslation);
170
171
  if (usedFormats.size > 1 && tsConfig.options.enableI18nLegacyMessageIdFormat !== false) {
171
172
  // This limitation is only for legacy message id support (defaults to true as of 9.0)
172
173
  throw new Error('Localization currently only supports using one type of translation file format for the entire application.');
@@ -214,7 +215,7 @@ function deleteTempDirectory(tempPath) {
214
215
  }
215
216
  catch { }
216
217
  }
217
- function loadTranslations(locale, desc, workspaceRoot, loader, logger, usedFormats) {
218
+ function loadTranslations(locale, desc, workspaceRoot, loader, logger, usedFormats, duplicateTranslation) {
218
219
  let translations = undefined;
219
220
  for (const file of desc.files) {
220
221
  const loadResult = loader(path_1.default.join(workspaceRoot, file.path));
@@ -236,7 +237,18 @@ function loadTranslations(locale, desc, workspaceRoot, loader, logger, usedForma
236
237
  // Merge translations
237
238
  for (const [id, message] of Object.entries(loadResult.translations)) {
238
239
  if (translations[id] !== undefined) {
239
- logger.warn(`WARNING [${file.path}]: Duplicate translations for message '${id}' when merging`);
240
+ const duplicateTranslationMessage = `[${file.path}]: Duplicate translations for message '${id}' when merging.`;
241
+ switch (duplicateTranslation) {
242
+ case schema_1.I18NTranslation.Ignore:
243
+ break;
244
+ case schema_1.I18NTranslation.Error:
245
+ logger.error(`ERROR ${duplicateTranslationMessage}`);
246
+ break;
247
+ case schema_1.I18NTranslation.Warning:
248
+ default:
249
+ logger.warn(`WARNING ${duplicateTranslationMessage}`);
250
+ break;
251
+ }
240
252
  }
241
253
  translations[id] = message;
242
254
  }
@@ -25,9 +25,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  __setModuleDefault(result, mod);
26
26
  return result;
27
27
  };
28
+ var __importDefault = (this && this.__importDefault) || function (mod) {
29
+ return (mod && mod.__esModule) ? mod : { "default": mod };
30
+ };
28
31
  Object.defineProperty(exports, "__esModule", { value: true });
29
32
  exports.getStylesConfig = void 0;
30
33
  const fs = __importStar(require("fs"));
34
+ const mini_css_extract_plugin_1 = __importDefault(require("mini-css-extract-plugin"));
31
35
  const path = __importStar(require("path"));
32
36
  const sass_service_1 = require("../../sass/sass-service");
33
37
  const plugins_1 = require("../plugins");
@@ -70,7 +74,6 @@ function resolveGlobalStyles(styleEntrypoints, root, preserveSymlinks) {
70
74
  // eslint-disable-next-line max-lines-per-function
71
75
  function getStylesConfig(wco) {
72
76
  var _a, _b, _c;
73
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
74
77
  const postcssImports = require('postcss-import');
75
78
  const postcssPresetEnv = require('postcss-preset-env');
76
79
  const { root, buildOptions } = wco;
@@ -129,9 +132,6 @@ function getStylesConfig(wco) {
129
132
  ` To enable Tailwind CSS, please install the 'tailwindcss' package.`);
130
133
  }
131
134
  if (tailwindPackagePath) {
132
- if (process.env['TAILWIND_MODE'] === undefined) {
133
- process.env['TAILWIND_MODE'] = buildOptions.watch ? 'watch' : 'build';
134
- }
135
135
  extraPostcssPlugins.push(require(tailwindPackagePath)({ config: tailwindConfigPath }));
136
136
  }
137
137
  }
@@ -191,7 +191,7 @@ function getStylesConfig(wco) {
191
191
  // for component css.
192
192
  !buildOptions.sourceMap.hidden);
193
193
  // extract global css from js files into own css file.
194
- extraPlugins.push(new MiniCssExtractPlugin({ filename: `[name]${hashFormat.extract}.css` }));
194
+ extraPlugins.push(new mini_css_extract_plugin_1.default({ filename: `[name]${hashFormat.extract}.css` }));
195
195
  if (!buildOptions.hmr) {
196
196
  // don't remove `.js` files for `.css` when we are using HMR these contain HMR accept codes.
197
197
  // suppress empty .js files in css only entry points.
@@ -210,7 +210,7 @@ function getStylesConfig(wco) {
210
210
  ];
211
211
  const globalStyleLoaders = [
212
212
  {
213
- loader: MiniCssExtractPlugin.loader,
213
+ loader: mini_css_extract_plugin_1.default.loader,
214
214
  },
215
215
  {
216
216
  loader: require.resolve('css-loader'),
@@ -32,7 +32,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
32
32
  const path = __importStar(require("path"));
33
33
  const glob = __importStar(require("glob"));
34
34
  const webpack_1 = __importDefault(require("webpack"));
35
- const webpackDevMiddleware = require('webpack-dev-middleware');
35
+ const webpack_dev_middleware_1 = __importDefault(require("webpack-dev-middleware"));
36
36
  const stats_1 = require("../../utils/stats");
37
37
  const node_1 = require("@angular-devkit/core/node");
38
38
  const index_1 = require("../../../utils/index");
@@ -172,7 +172,7 @@ const init = (config, emitter) => {
172
172
  }
173
173
  unblock();
174
174
  });
175
- webpackMiddleware = webpackDevMiddleware(compiler, webpackMiddlewareConfig);
175
+ webpackMiddleware = (0, webpack_dev_middleware_1.default)(compiler, webpackMiddlewareConfig);
176
176
  emitter.on('exit', (done) => {
177
177
  webpackMiddleware.close();
178
178
  done();