@tramvai/cli 2.89.2 → 2.90.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.
Files changed (28) hide show
  1. package/lib/library/webpack/application/client/common.d.ts +1 -1
  2. package/lib/library/webpack/application/client/common.js +31 -31
  3. package/lib/library/webpack/application/client/common.js.map +1 -1
  4. package/lib/library/webpack/application/common.js +2 -0
  5. package/lib/library/webpack/application/common.js.map +1 -1
  6. package/lib/library/webpack/application/fakeRootErrorBoundaryModule.d.ts +1 -0
  7. package/lib/library/webpack/application/fakeRootErrorBoundaryModule.js +3 -0
  8. package/lib/library/webpack/application/fakeRootErrorBoundaryModule.js.map +1 -0
  9. package/lib/library/webpack/application/server/common.js +30 -30
  10. package/lib/library/webpack/application/server/common.js.map +1 -1
  11. package/lib/library/webpack/blocks/css.js +1 -1
  12. package/lib/library/webpack/blocks/rootErrorBoundary.d.ts +3 -0
  13. package/lib/library/webpack/blocks/rootErrorBoundary.js +30 -0
  14. package/lib/library/webpack/blocks/rootErrorBoundary.js.map +1 -0
  15. package/lib/library/webpack/constants/stats.js +3 -1
  16. package/lib/library/webpack/constants/stats.js.map +1 -1
  17. package/lib/library/webpack/loaders/root-error-boundary-loader/index.d.ts +8 -0
  18. package/lib/library/webpack/loaders/root-error-boundary-loader/index.js +34 -0
  19. package/lib/library/webpack/loaders/root-error-boundary-loader/index.js.map +1 -0
  20. package/package.json +2 -2
  21. package/src/library/webpack/application/client/common.ts +34 -42
  22. package/src/library/webpack/application/common.ts +3 -0
  23. package/src/library/webpack/application/fakeRootErrorBoundaryModule.tsx +1 -0
  24. package/src/library/webpack/application/server/common.ts +43 -51
  25. package/src/library/webpack/blocks/css.ts +1 -1
  26. package/src/library/webpack/blocks/rootErrorBoundary.ts +33 -0
  27. package/src/library/webpack/constants/stats.ts +2 -0
  28. package/src/library/webpack/loaders/root-error-boundary-loader/index.ts +46 -0
@@ -1,5 +1,5 @@
1
1
  import type Config from 'webpack-chain';
2
2
  import type { ConfigManager } from '../../../../config/configManager';
3
3
  import type { ApplicationConfigEntry } from '../../../../typings/configEntry/application';
4
- declare const _default: (configManager: ConfigManager<ApplicationConfigEntry>) => (config: Config) => void;
4
+ declare const _default: (configManager: ConfigManager<ApplicationConfigEntry>) => (config: Config) => Config;
5
5
  export default _default;
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
4
4
  const path_1 = tslib_1.__importDefault(require("path"));
5
5
  const fs_1 = tslib_1.__importDefault(require("fs"));
6
6
  const webpack_stats_plugin_1 = require("webpack-stats-plugin");
7
+ const safeRequire_1 = require("../../../../utils/safeRequire");
7
8
  const main_1 = tslib_1.__importDefault(require("../../common/main"));
8
9
  const common_1 = require("../common");
9
10
  const filesClient_1 = tslib_1.__importDefault(require("../../blocks/filesClient"));
@@ -14,49 +15,48 @@ const css_1 = tslib_1.__importDefault(require("../../blocks/css"));
14
15
  const postcssAssets_1 = tslib_1.__importDefault(require("../../blocks/postcssAssets"));
15
16
  const nodeClient_1 = tslib_1.__importDefault(require("../../blocks/nodeClient"));
16
17
  const pagesResolve_1 = require("../../blocks/pagesResolve");
17
- const stats_1 = require("../../constants/stats");
18
18
  const configToEnv_1 = require("../../blocks/configToEnv");
19
- const safeRequire_1 = require("../../../../utils/safeRequire");
19
+ const stats_1 = require("../../constants/stats");
20
20
  exports.default = (configManager) => (config) => {
21
21
  const { polyfill, fileSystemPages } = configManager;
22
- config.name('client');
23
- config.batch((0, main_1.default)(configManager));
24
- config.batch((0, common_1.commonApplication)(configManager));
25
- config.batch((0, filesClient_1.default)(configManager));
26
- if (fileSystemPages.enabled) {
27
- config.batch((0, pagesResolve_1.pagesResolve)(configManager));
28
- }
29
22
  const portal = path_1.default.resolve(configManager.rootDir, `packages/${process.env.APP_ID}/portal.js`);
30
- config.target(configManager.modern ? 'web' : ['web', 'es5']);
31
- config.batch((0, configToEnv_1.configToEnv)(configManager));
23
+ const polyfillPath = path_1.default.resolve(configManager.rootDir, polyfill !== null && polyfill !== void 0 ? polyfill : 'src/polyfill');
24
+ const portalExists = fs_1.default.existsSync(portal);
25
+ const polyfillExists = !!(0, safeRequire_1.safeRequireResolve)(polyfillPath, typeof polyfill === 'undefined');
26
+ config
27
+ .name('client')
28
+ .target(configManager.modern ? 'web' : ['web', 'es5'])
29
+ .batch((0, main_1.default)(configManager))
30
+ .batch((0, common_1.commonApplication)(configManager))
31
+ .batch((0, configToEnv_1.configToEnv)(configManager))
32
+ .batch((0, filesClient_1.default)(configManager))
33
+ .batch((0, js_1.default)(configManager))
34
+ .batch((0, ts_1.default)(configManager))
35
+ .batch((0, less_1.default)(configManager))
36
+ .batch((0, css_1.default)(configManager))
37
+ .batch((0, nodeClient_1.default)(configManager))
38
+ .batch((0, postcssAssets_1.default)(configManager))
39
+ .when(fileSystemPages.enabled, (cfg) => cfg.batch((0, pagesResolve_1.pagesResolve)(configManager)));
32
40
  config
33
41
  .entry('platform')
34
42
  .add(path_1.default.resolve(configManager.rootDir, `${configManager.root}/index`))
35
43
  .end()
36
- .when(fs_1.default.existsSync(portal), (cfg) => cfg.entry('portal').add(portal))
37
- .plugin('define')
38
- .tap((args) => [
39
- Object.assign(Object.assign({}, args[0]), { 'process.env.BROWSER': true, 'process.env.SERVER': false }),
40
- ])
41
- .end();
42
- const polyfillPath = path_1.default.resolve(configManager.rootDir, polyfill !== null && polyfill !== void 0 ? polyfill : 'src/polyfill');
43
- if ((0, safeRequire_1.safeRequireResolve)(polyfillPath, typeof polyfill === 'undefined')) {
44
- config.entry('polyfill').add(polyfillPath);
45
- }
46
- const statsFileName = configManager.modern ? 'stats.modern.json' : 'stats.json';
47
- config.plugin('stats-plugin').use(webpack_stats_plugin_1.StatsWriterPlugin, [
44
+ .when(portalExists, (cfg) => cfg.entry('portal').add(portal))
45
+ .when(polyfillExists, (cfg) => cfg.entry('polyfill').add(polyfillPath));
46
+ config
47
+ .plugin('stats-plugin')
48
+ .use(webpack_stats_plugin_1.StatsWriterPlugin, [
48
49
  {
49
- filename: statsFileName,
50
+ filename: configManager.modern ? 'stats.modern.json' : 'stats.json',
50
51
  stats: stats_1.DEFAULT_STATS_OPTIONS,
51
52
  fields: stats_1.DEFAULT_STATS_FIELDS,
52
53
  },
54
+ ])
55
+ .end()
56
+ .plugin('define')
57
+ .tap((args) => [
58
+ Object.assign(Object.assign({}, args[0]), { 'process.env.BROWSER': true, 'process.env.SERVER': false }),
53
59
  ]);
54
- config
55
- .batch((0, js_1.default)(configManager))
56
- .batch((0, ts_1.default)(configManager))
57
- .batch((0, less_1.default)(configManager))
58
- .batch((0, css_1.default)(configManager))
59
- .batch((0, nodeClient_1.default)(configManager));
60
- config.batch((0, postcssAssets_1.default)(configManager));
60
+ return config;
61
61
  };
62
62
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/library/webpack/application/client/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/library/webpack/application/client/common.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ exports.commonApplication = void 0;
4
4
  const webpack_1 = require("webpack");
5
5
  const moduleFederationShared_1 = require("../child-app/moduleFederationShared");
6
6
  const ModuleFederationIgnoreEntries_1 = require("../plugins/ModuleFederationIgnoreEntries");
7
+ const rootErrorBoundary_1 = require("../blocks/rootErrorBoundary");
7
8
  const commonApplication = (configManager) => (config) => {
8
9
  config.plugin('module-federation').use(webpack_1.container.ModuleFederationPlugin, [
9
10
  {
@@ -16,6 +17,7 @@ const commonApplication = (configManager) => (config) => {
16
17
  .use(ModuleFederationIgnoreEntries_1.ModuleFederationIgnoreEntries, [
17
18
  { entries: ['polyfill'] },
18
19
  ]);
20
+ config.batch((0, rootErrorBoundary_1.rootErrorBoundaryFactory)(configManager));
19
21
  };
20
22
  exports.commonApplication = commonApplication;
21
23
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/library/webpack/application/common.ts"],"names":[],"mappings":";;;AACA,qCAAoC;AACpC,gFAAuE;AAKvE,4FAAyF;AAElF,MAAM,iBAAiB,GAC5B,CAAC,aAAoD,EAAE,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE;IAC3E,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,mBAAS,CAAC,sBAAsB,EAAE;QACvE;YACE,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAA,yCAAgB,EAAC,aAAa,CAAC;SACP;KACnC,CAAC,CAAC;IAEH,MAAM;SACH,MAAM,CAAC,kCAAkC,CAAC;SAC1C,GAAG,CAAC,6DAA6B,EAAE;QAClC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAA0C;KAClE,CAAC,CAAC;AACP,CAAC,CAAC;AAdS,QAAA,iBAAiB,qBAc1B"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/library/webpack/application/common.ts"],"names":[],"mappings":";;;AACA,qCAAoC;AACpC,gFAAuE;AAKvE,4FAAyF;AACzF,mEAAuE;AAEhE,MAAM,iBAAiB,GAC5B,CAAC,aAAoD,EAAE,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE;IAC3E,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,mBAAS,CAAC,sBAAsB,EAAE;QACvE;YACE,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAA,yCAAgB,EAAC,aAAa,CAAC;SACP;KACnC,CAAC,CAAC;IAEH,MAAM;SACH,MAAM,CAAC,kCAAkC,CAAC;SAC1C,GAAG,CAAC,6DAA6B,EAAE;QAClC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAA0C;KAClE,CAAC,CAAC;IAEL,MAAM,CAAC,KAAK,CAAC,IAAA,4CAAwB,EAAC,aAAa,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC;AAhBS,QAAA,iBAAiB,qBAgB1B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=fakeRootErrorBoundaryModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fakeRootErrorBoundaryModule.js","sourceRoot":"","sources":["../../../../src/library/webpack/application/fakeRootErrorBoundaryModule.tsx"],"names":[],"mappings":""}
@@ -18,51 +18,51 @@ const extractCssPlugin_1 = require("../../blocks/extractCssPlugin");
18
18
  // eslint-disable-next-line import/no-default-export
19
19
  exports.default = (configManager) => (config) => {
20
20
  const { output, fileSystemPages } = configManager;
21
- config.name('server');
22
- config.batch((0, main_1.default)(configManager));
23
- config.batch((0, common_1.commonApplication)(configManager));
24
- config.batch((0, filesServer_1.default)(configManager));
25
- config.batch((0, apiResolve_1.default)(configManager));
26
- if (fileSystemPages.enabled) {
27
- config.batch((0, pagesResolve_1.pagesResolve)(configManager));
28
- }
29
- config.target('node');
30
- config.output.libraryTarget('commonjs2');
31
- config.node.set('__dirname', false);
32
21
  config
22
+ .name('server')
23
+ .target('node')
33
24
  .entry('server')
34
- .add(path_1.default.resolve(configManager.rootDir, `${configManager.root}/index`))
35
- .end()
36
- .resolve.extensions.merge(['.node']);
25
+ .add(path_1.default.resolve(configManager.rootDir, `${configManager.root}/index`));
26
+ config
27
+ .batch((0, main_1.default)(configManager))
28
+ .batch((0, common_1.commonApplication)(configManager))
29
+ .batch((0, configToEnv_1.configToEnv)(configManager))
30
+ .batch((0, filesServer_1.default)(configManager))
31
+ .batch((0, apiResolve_1.default)(configManager))
32
+ .batch((0, js_1.default)(configManager))
33
+ .batch((0, ts_1.default)(configManager))
34
+ .batch((0, serverInline_1.serverInline)(configManager))
35
+ .batch((0, browserslistConfig_1.browserslistConfigResolve)(configManager))
36
+ .batch((0, extractCssPlugin_1.extractCssPluginFactory)(configManager, {
37
+ filename: 'server.[contenthash].css',
38
+ chunkFilename: null,
39
+ }))
40
+ .batch((0, css_1.default)(configManager))
41
+ .when(fileSystemPages.enabled, (cfg) => cfg.batch((0, pagesResolve_1.pagesResolve)(configManager)));
37
42
  config.output
38
43
  .path(configManager.buildPath)
39
44
  .publicPath(path_1.default.posix.join('/', output.server))
40
- .filename('server.js');
41
- config.optimization.splitChunks(false).removeAvailableModules(false);
45
+ .filename('server.js')
46
+ .libraryTarget('commonjs2');
47
+ config.resolve.extensions.merge(['.node']);
48
+ config.node.set('__dirname', false);
42
49
  config.module
43
50
  .rule('less')
44
51
  .test(/\.less$/)
45
52
  .use('ignore')
46
53
  .loader('null-loader');
47
- config.batch((0, configToEnv_1.configToEnv)(configManager));
48
- config.plugin('define').tap((args) => [
54
+ config
55
+ .plugin('define')
56
+ .tap((args) => [
49
57
  Object.assign(Object.assign({}, args[0]), { 'global.GENTLY': false, 'process.env.MODULE': true, 'process.env.BROWSER': false, 'process.env.SERVER': true }),
50
- ]);
51
- config.batch((0, extractCssPlugin_1.extractCssPluginFactory)(configManager, {
52
- filename: 'server.[contenthash].css',
53
- chunkFilename: null,
54
- }));
55
- config.plugin('limit-chunk').use(webpack_1.default.optimize.LimitChunkCountPlugin, [
58
+ ])
59
+ .end()
60
+ .plugin('limit-chunk')
61
+ .use(webpack_1.default.optimize.LimitChunkCountPlugin, [
56
62
  {
57
63
  maxChunks: 1,
58
64
  },
59
65
  ]);
60
- config
61
- .batch((0, js_1.default)(configManager))
62
- .batch((0, ts_1.default)(configManager))
63
- .batch((0, serverInline_1.serverInline)(configManager))
64
- .batch((0, browserslistConfig_1.browserslistConfigResolve)(configManager))
65
- .batch((0, css_1.default)(configManager));
66
66
  return config;
67
67
  };
68
68
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/library/webpack/application/server/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../src/library/webpack/application/server/common.ts"],"names":[],"mappings":";;;AAAA,wDAAwB;AACxB,8DAA8B;AAM9B,qEAAuC;AACvC,mFAA6C;AAC7C,iEAAiC;AACjC,iEAAiC;AACjC,mEAAmC;AACnC,iFAAiD;AACjD,4DAAyD;AACzD,4DAAyD;AACzD,wEAA4E;AAC5E,0DAAuD;AACvD,sCAA8C;AAC9C,oEAAwE;AAExE,oDAAoD;AACpD,kBAAe,CAAC,aAAoD,EAAE,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE;IAC1F,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,aAAa,CAAC;IAElD,MAAM;SACH,IAAI,CAAC,QAAQ,CAAC;SACd,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,cAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAE3E,MAAM;SACH,KAAK,CAAC,IAAA,cAAM,EAAC,aAAa,CAAC,CAAC;SAC5B,KAAK,CAAC,IAAA,0BAAiB,EAAC,aAAa,CAAC,CAAC;SACvC,KAAK,CAAC,IAAA,yBAAW,EAAC,aAAa,CAAC,CAAC;SACjC,KAAK,CAAC,IAAA,qBAAK,EAAC,aAAa,CAAC,CAAC;SAC3B,KAAK,CAAC,IAAA,oBAAU,EAAC,aAAa,CAAC,CAAC;SAChC,KAAK,CAAC,IAAA,YAAE,EAAC,aAAa,CAAC,CAAC;SACxB,KAAK,CAAC,IAAA,YAAE,EAAC,aAAa,CAAC,CAAC;SACxB,KAAK,CAAC,IAAA,2BAAY,EAAC,aAAa,CAAC,CAAC;SAClC,KAAK,CAAC,IAAA,8CAAyB,EAAC,aAAa,CAAC,CAAC;SAC/C,KAAK,CACJ,IAAA,0CAAuB,EAAC,aAAa,EAAE;QACrC,QAAQ,EAAE,0BAA0B;QACpC,aAAa,EAAE,IAAI;KACpB,CAAC,CACH;SACA,KAAK,CAAC,IAAA,aAAG,EAAC,aAAa,CAAC,CAAC;SACzB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAA,2BAAY,EAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAElF,MAAM,CAAC,MAAM;SACV,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;SAC7B,UAAU,CAAC,cAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC/C,QAAQ,CAAC,WAAW,CAAC;SACrB,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEpC,MAAM,CAAC,MAAM;SACV,IAAI,CAAC,MAAM,CAAC;SACZ,IAAI,CAAC,SAAS,CAAC;SACf,GAAG,CAAC,QAAQ,CAAC;SACb,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,MAAM;SACH,MAAM,CAAC,QAAQ,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wCAER,IAAI,CAAC,CAAC,CAAC,KACV,eAAe,EAAE,KAAK,EACtB,oBAAoB,EAAE,IAAI,EAC1B,qBAAqB,EAAE,KAAK,EAC5B,oBAAoB,EAAE,IAAI;KAE7B,CAAC;SACD,GAAG,EAAE;SACL,MAAM,CAAC,aAAa,CAAC;SACrB,GAAG,CAAC,iBAAO,CAAC,QAAQ,CAAC,qBAAqB,EAAE;QAC3C;YACE,SAAS,EAAE,CAAC;SACb;KACF,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -36,7 +36,7 @@ const cssWebpackRulesFactory = (configManager, options = {}) => (config) => {
36
36
  if (cssModulePattern) {
37
37
  cssModulesOptions.auto = new RegExp(cssModulePattern);
38
38
  }
39
- // TODO: можно будет избавиться от проверки и сотавить всё в minicss-плагине, когда зарелизят эти изменения
39
+ // TODO: можно будет избавиться от проверки и оставить всё в minicss-плагине, когда зарелизят эти изменения
40
40
  // https://github.com/webpack-contrib/css-loader/blob/master/src/utils.js#L310
41
41
  if (/\[minicss]/.test(localIdentName)) {
42
42
  cssModulesOptions.getLocalIdent = (0, minicss_class_generator_1.createGenerator)();
@@ -0,0 +1,3 @@
1
+ import type Config from 'webpack-chain';
2
+ import type { ConfigManager } from '../../../config/configManager';
3
+ export declare const rootErrorBoundaryFactory: (configManager: ConfigManager) => (config: Config) => void;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rootErrorBoundaryFactory = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = tslib_1.__importDefault(require("fs"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const ROOT_ERROR_BOUNDARY_CHUNK_NAME = 'rootErrorBoundary';
8
+ const ROOT_ERROR_BOUNDARY_ALIAS = '@/__private__/error';
9
+ const rootErrorBoundaryFactory = (configManager) => (config) => {
10
+ const { root, rootDir, buildType } = configManager;
11
+ const rootErrorBoundaryPath = path_1.default.resolve(rootDir, root, 'error.tsx');
12
+ const fakeErrorBoundaryModule = require.resolve('../application/fakeRootErrorBoundaryModule');
13
+ const doesErrorBoundaryExist = fs_1.default.existsSync(rootErrorBoundaryPath);
14
+ if (doesErrorBoundaryExist) {
15
+ config
16
+ .when(buildType === 'client',
17
+ // We don't need additional entrypoint on the server
18
+ (client) => client.entry(ROOT_ERROR_BOUNDARY_CHUNK_NAME).add(fakeErrorBoundaryModule), (server) =>
19
+ // Hack that allows to require a root error boundary module on the server
20
+ server.resolve.alias.set(ROOT_ERROR_BOUNDARY_ALIAS, rootErrorBoundaryPath))
21
+ .module.rule('root-error-boundary')
22
+ .enforce('pre')
23
+ .test(new RegExp(fakeErrorBoundaryModule))
24
+ .use('root-error-boundary-loader')
25
+ .loader(path_1.default.resolve(__dirname, '..', 'loaders', 'root-error-boundary-loader'))
26
+ .options({ path: rootErrorBoundaryPath, buildType });
27
+ }
28
+ };
29
+ exports.rootErrorBoundaryFactory = rootErrorBoundaryFactory;
30
+ //# sourceMappingURL=rootErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootErrorBoundary.js","sourceRoot":"","sources":["../../../../src/library/webpack/blocks/rootErrorBoundary.ts"],"names":[],"mappings":";;;;AAAA,oDAAoB;AACpB,wDAAwB;AAKxB,MAAM,8BAA8B,GAAG,mBAAmB,CAAC;AAC3D,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAEjD,MAAM,wBAAwB,GAAG,CAAC,aAA4B,EAAE,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE;IAC3F,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;IACnD,MAAM,qBAAqB,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;IAC9F,MAAM,sBAAsB,GAAG,YAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAEpE,IAAI,sBAAsB,EAAE;QAC1B,MAAM;aACH,IAAI,CACH,SAAS,KAAK,QAAQ;QACtB,oDAAoD;QACpD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,EACrF,CAAC,MAAM,EAAE,EAAE;QACT,yEAAyE;QACzE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAC7E;aACA,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC;aAClC,OAAO,CAAC,KAAK,CAAC;aACd,IAAI,CAAC,IAAI,MAAM,CAAC,uBAAuB,CAAC,CAAC;aACzC,GAAG,CAAC,4BAA4B,CAAC;aACjC,MAAM,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAAC;aAC9E,OAAO,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;KACxD;AACH,CAAC,CAAC;AAvBW,QAAA,wBAAwB,4BAuBnC"}
@@ -7,12 +7,14 @@ exports.DEFAULT_STATS_OPTIONS = {
7
7
  assets: true,
8
8
  outputPath: true,
9
9
  chunkGroups: true,
10
- ids: true, // необходимо чтобы в chunksGroups были выставлены связи между модулями
10
+ ids: true,
11
+ entrypoints: true, // нужно, чтобы узнать чанки для каждой точки входа
11
12
  };
12
13
  exports.DEFAULT_STATS_FIELDS = [
13
14
  'publicPath',
14
15
  'outputPath',
15
16
  'assetsByChunkName',
16
17
  'namedChunkGroups',
18
+ 'entrypoints',
17
19
  ];
18
20
  //# sourceMappingURL=stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../../src/library/webpack/constants/stats.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAA2B;IAC3D,GAAG,EAAE,KAAK;IAEV,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,IAAI,EAAE,uEAAuE;CACnF,CAAC;AAEW,QAAA,oBAAoB,GAAa;IAC5C,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,kBAAkB;CACnB,CAAC"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../../src/library/webpack/constants/stats.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAA2B;IAC3D,GAAG,EAAE,KAAK;IAEV,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,IAAI;IACT,WAAW,EAAE,IAAI,EAAE,mDAAmD;CACvE,CAAC;AAEW,QAAA,oBAAoB,GAAa;IAC5C,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;CACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { LoaderDefinition } from 'webpack';
2
+ import type { BuildType } from '../../../../typings/projectType';
3
+ interface Options {
4
+ buildType: BuildType;
5
+ path: string;
6
+ }
7
+ declare const rootErrorBoundaryLoader: LoaderDefinition<Options>;
8
+ export default rootErrorBoundaryLoader;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const shouldUseReactRoot_1 = require("../../../../utils/shouldUseReactRoot");
4
+ const COMPONENT_NAME = 'RootErrorBoundary';
5
+ const REACT_18_HYDRATION_CODE = `
6
+ const { hydrateRoot } = require('react-dom/client')
7
+
8
+ hydrateRoot(
9
+ document,
10
+ <${COMPONENT_NAME} error={window.serverError} url={window.serverUrl} />,
11
+ );
12
+ `;
13
+ const REACT_HYDRATION_CODE = `
14
+ const { hydrate } = require('react-dom')
15
+
16
+ hydrate(
17
+ <${COMPONENT_NAME} error={window.serverError} url={window.serverUrl} />,
18
+ document,
19
+ );
20
+ `;
21
+ // eslint-disable-next-line func-style
22
+ const rootErrorBoundaryLoader = function (content) {
23
+ const options = this.getOptions();
24
+ this.cacheable(false);
25
+ // We don't need hydration code on the server
26
+ if (options.buildType === 'client') {
27
+ const IMPORT_CODE = `import ${COMPONENT_NAME} from "${options.path}"\n`;
28
+ const HYDRATION_CODE = (0, shouldUseReactRoot_1.shouldUseReactRoot)() ? REACT_18_HYDRATION_CODE : REACT_HYDRATION_CODE;
29
+ return IMPORT_CODE.concat(HYDRATION_CODE);
30
+ }
31
+ return content;
32
+ };
33
+ exports.default = rootErrorBoundaryLoader;
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/root-error-boundary-loader/index.ts"],"names":[],"mappings":";;AAGA,6EAA0E;AAO1E,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAC3C,MAAM,uBAAuB,GAAG;;;;;KAK3B,cAAc;;CAElB,CAAC;AACF,MAAM,oBAAoB,GAAG;;;;KAIxB,cAAc;;;CAGlB,CAAC;AAEF,sCAAsC;AACtC,MAAM,uBAAuB,GAA8B,UAAU,OAAO;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAElC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEtB,6CAA6C;IAC7C,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE;QAClC,MAAM,WAAW,GAAG,UAAU,cAAc,UAAU,OAAO,CAAC,IAAI,KAAK,CAAC;QACxE,MAAM,cAAc,GAAG,IAAA,uCAAkB,GAAE,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAE7F,OAAO,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;KAC3C;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,kBAAe,uBAAuB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/cli",
3
- "version": "2.89.2",
3
+ "version": "2.90.0",
4
4
  "description": "Cli инструмент для сборки и запуска приложений",
5
5
  "files": [
6
6
  "src",
@@ -71,7 +71,7 @@
71
71
  "@tinkoff/utils": "^2.1.3",
72
72
  "@tinkoff/webpack-dedupe-plugin": "1.0.4",
73
73
  "@tramvai/build": "3.1.3",
74
- "@tramvai/react": "2.89.2",
74
+ "@tramvai/react": "2.90.0",
75
75
  "@tramvai/tools-check-versions": "0.4.11",
76
76
  "@tramvai/tools-migrate": "0.6.14",
77
77
  "ajv": "^6.12.6",
@@ -5,6 +5,7 @@ import { StatsWriterPlugin } from 'webpack-stats-plugin';
5
5
 
6
6
  import type { ConfigManager } from '../../../../config/configManager';
7
7
  import type { ApplicationConfigEntry } from '../../../../typings/configEntry/application';
8
+ import { safeRequireResolve } from '../../../../utils/safeRequire';
8
9
 
9
10
  import common from '../../common/main';
10
11
  import { commonApplication } from '../common';
@@ -16,34 +17,49 @@ import css from '../../blocks/css';
16
17
  import postcssAssets from '../../blocks/postcssAssets';
17
18
  import nodeClient from '../../blocks/nodeClient';
18
19
  import { pagesResolve } from '../../blocks/pagesResolve';
19
- import { DEFAULT_STATS_OPTIONS, DEFAULT_STATS_FIELDS } from '../../constants/stats';
20
20
  import { configToEnv } from '../../blocks/configToEnv';
21
- import { safeRequireResolve } from '../../../../utils/safeRequire';
21
+ import { DEFAULT_STATS_OPTIONS, DEFAULT_STATS_FIELDS } from '../../constants/stats';
22
22
 
23
23
  export default (configManager: ConfigManager<ApplicationConfigEntry>) => (config: Config) => {
24
24
  const { polyfill, fileSystemPages } = configManager;
25
25
 
26
- config.name('client');
27
-
28
- config.batch(common(configManager));
29
- config.batch(commonApplication(configManager));
30
- config.batch(files(configManager));
31
-
32
- if (fileSystemPages.enabled) {
33
- config.batch(pagesResolve(configManager));
34
- }
35
-
36
26
  const portal = path.resolve(configManager.rootDir, `packages/${process.env.APP_ID}/portal.js`);
27
+ const polyfillPath = path.resolve(configManager.rootDir, polyfill ?? 'src/polyfill');
28
+ const portalExists = fs.existsSync(portal);
29
+ const polyfillExists = !!safeRequireResolve(polyfillPath, typeof polyfill === 'undefined');
37
30
 
38
- config.target(configManager.modern ? 'web' : ['web', 'es5']);
39
-
40
- config.batch(configToEnv(configManager));
31
+ config
32
+ .name('client')
33
+ .target(configManager.modern ? 'web' : ['web', 'es5'])
34
+ .batch(common(configManager))
35
+ .batch(commonApplication(configManager))
36
+ .batch(configToEnv(configManager))
37
+ .batch(files(configManager))
38
+ .batch(js(configManager))
39
+ .batch(ts(configManager))
40
+ .batch(less(configManager))
41
+ .batch(css(configManager))
42
+ .batch(nodeClient(configManager))
43
+ .batch(postcssAssets(configManager))
44
+ .when(fileSystemPages.enabled, (cfg) => cfg.batch(pagesResolve(configManager)));
41
45
 
42
46
  config
43
47
  .entry('platform')
44
48
  .add(path.resolve(configManager.rootDir, `${configManager.root}/index`))
45
49
  .end()
46
- .when(fs.existsSync(portal), (cfg) => cfg.entry('portal').add(portal))
50
+ .when(portalExists, (cfg) => cfg.entry('portal').add(portal))
51
+ .when(polyfillExists, (cfg) => cfg.entry('polyfill').add(polyfillPath));
52
+
53
+ config
54
+ .plugin('stats-plugin')
55
+ .use(StatsWriterPlugin, [
56
+ {
57
+ filename: configManager.modern ? 'stats.modern.json' : 'stats.json',
58
+ stats: DEFAULT_STATS_OPTIONS,
59
+ fields: DEFAULT_STATS_FIELDS,
60
+ },
61
+ ])
62
+ .end()
47
63
  .plugin('define')
48
64
  .tap((args) => [
49
65
  {
@@ -51,31 +67,7 @@ export default (configManager: ConfigManager<ApplicationConfigEntry>) => (config
51
67
  'process.env.BROWSER': true,
52
68
  'process.env.SERVER': false,
53
69
  },
54
- ])
55
- .end();
56
-
57
- const polyfillPath = path.resolve(configManager.rootDir, polyfill ?? 'src/polyfill');
58
-
59
- if (safeRequireResolve(polyfillPath, typeof polyfill === 'undefined')) {
60
- config.entry('polyfill').add(polyfillPath);
61
- }
62
-
63
- const statsFileName = configManager.modern ? 'stats.modern.json' : 'stats.json';
64
-
65
- config.plugin('stats-plugin').use(StatsWriterPlugin, [
66
- {
67
- filename: statsFileName,
68
- stats: DEFAULT_STATS_OPTIONS,
69
- fields: DEFAULT_STATS_FIELDS,
70
- },
71
- ]);
72
-
73
- config
74
- .batch(js(configManager))
75
- .batch(ts(configManager))
76
- .batch(less(configManager))
77
- .batch(css(configManager))
78
- .batch(nodeClient(configManager));
70
+ ]);
79
71
 
80
- config.batch(postcssAssets(configManager));
72
+ return config;
81
73
  };
@@ -6,6 +6,7 @@ import type { ConfigManager } from '../../../config/configManager';
6
6
  import type { ApplicationConfigEntry } from '../../../typings/configEntry/application';
7
7
  import type { ModuleFederationIgnoreEntriesOptions } from '../plugins/ModuleFederationIgnoreEntries';
8
8
  import { ModuleFederationIgnoreEntries } from '../plugins/ModuleFederationIgnoreEntries';
9
+ import { rootErrorBoundaryFactory } from '../blocks/rootErrorBoundary';
9
10
 
10
11
  export const commonApplication =
11
12
  (configManager: ConfigManager<ApplicationConfigEntry>) => (config: Config) => {
@@ -21,4 +22,6 @@ export const commonApplication =
21
22
  .use(ModuleFederationIgnoreEntries, [
22
23
  { entries: ['polyfill'] } as ModuleFederationIgnoreEntriesOptions,
23
24
  ]);
25
+
26
+ config.batch(rootErrorBoundaryFactory(configManager));
24
27
  };
@@ -22,34 +22,39 @@ import { extractCssPluginFactory } from '../../blocks/extractCssPlugin';
22
22
  export default (configManager: ConfigManager<ApplicationConfigEntry>) => (config: Config) => {
23
23
  const { output, fileSystemPages } = configManager;
24
24
 
25
- config.name('server');
26
-
27
- config.batch(common(configManager));
28
- config.batch(commonApplication(configManager));
29
- config.batch(files(configManager));
30
- config.batch(apiResolve(configManager));
31
-
32
- if (fileSystemPages.enabled) {
33
- config.batch(pagesResolve(configManager));
34
- }
35
-
36
- config.target('node');
37
- config.output.libraryTarget('commonjs2');
38
-
39
- config.node.set('__dirname', false);
40
-
41
25
  config
26
+ .name('server')
27
+ .target('node')
42
28
  .entry('server')
43
- .add(path.resolve(configManager.rootDir, `${configManager.root}/index`))
44
- .end()
45
- .resolve.extensions.merge(['.node']);
29
+ .add(path.resolve(configManager.rootDir, `${configManager.root}/index`));
30
+
31
+ config
32
+ .batch(common(configManager))
33
+ .batch(commonApplication(configManager))
34
+ .batch(configToEnv(configManager))
35
+ .batch(files(configManager))
36
+ .batch(apiResolve(configManager))
37
+ .batch(js(configManager))
38
+ .batch(ts(configManager))
39
+ .batch(serverInline(configManager))
40
+ .batch(browserslistConfigResolve(configManager))
41
+ .batch(
42
+ extractCssPluginFactory(configManager, {
43
+ filename: 'server.[contenthash].css',
44
+ chunkFilename: null,
45
+ })
46
+ )
47
+ .batch(css(configManager))
48
+ .when(fileSystemPages.enabled, (cfg) => cfg.batch(pagesResolve(configManager)));
46
49
 
47
50
  config.output
48
51
  .path(configManager.buildPath)
49
52
  .publicPath(path.posix.join('/', output.server))
50
- .filename('server.js');
53
+ .filename('server.js')
54
+ .libraryTarget('commonjs2');
51
55
 
52
- config.optimization.splitChunks(false).removeAvailableModules(false);
56
+ config.resolve.extensions.merge(['.node']);
57
+ config.node.set('__dirname', false);
53
58
 
54
59
  config.module
55
60
  .rule('less')
@@ -57,37 +62,24 @@ export default (configManager: ConfigManager<ApplicationConfigEntry>) => (config
57
62
  .use('ignore')
58
63
  .loader('null-loader');
59
64
 
60
- config.batch(configToEnv(configManager));
61
-
62
- config.plugin('define').tap((args) => [
63
- {
64
- ...args[0],
65
- 'global.GENTLY': false,
66
- 'process.env.MODULE': true, // mimic module to bundle svg's inside js and prevent errors from iconLoader
67
- 'process.env.BROWSER': false,
68
- 'process.env.SERVER': true,
69
- },
70
- ]);
71
-
72
- config.batch(
73
- extractCssPluginFactory(configManager, {
74
- filename: 'server.[contenthash].css',
75
- chunkFilename: null,
76
- })
77
- );
78
-
79
- config.plugin('limit-chunk').use(webpack.optimize.LimitChunkCountPlugin, [
80
- {
81
- maxChunks: 1,
82
- },
83
- ]);
84
-
85
65
  config
86
- .batch(js(configManager))
87
- .batch(ts(configManager))
88
- .batch(serverInline(configManager))
89
- .batch(browserslistConfigResolve(configManager))
90
- .batch(css(configManager));
66
+ .plugin('define')
67
+ .tap((args) => [
68
+ {
69
+ ...args[0],
70
+ 'global.GENTLY': false,
71
+ 'process.env.MODULE': true, // mimic module to bundle svg's inside js and prevent errors from iconLoader
72
+ 'process.env.BROWSER': false,
73
+ 'process.env.SERVER': true,
74
+ },
75
+ ])
76
+ .end()
77
+ .plugin('limit-chunk')
78
+ .use(webpack.optimize.LimitChunkCountPlugin, [
79
+ {
80
+ maxChunks: 1,
81
+ },
82
+ ]);
91
83
 
92
84
  return config;
93
85
  };
@@ -51,7 +51,7 @@ export const cssWebpackRulesFactory =
51
51
  cssModulesOptions.auto = new RegExp(cssModulePattern);
52
52
  }
53
53
 
54
- // TODO: можно будет избавиться от проверки и сотавить всё в minicss-плагине, когда зарелизят эти изменения
54
+ // TODO: можно будет избавиться от проверки и оставить всё в minicss-плагине, когда зарелизят эти изменения
55
55
  // https://github.com/webpack-contrib/css-loader/blob/master/src/utils.js#L310
56
56
  if (/\[minicss]/.test(localIdentName)) {
57
57
  cssModulesOptions.getLocalIdent = createGenerator();
@@ -0,0 +1,33 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import type Config from 'webpack-chain';
4
+
5
+ import type { ConfigManager } from '../../../config/configManager';
6
+
7
+ const ROOT_ERROR_BOUNDARY_CHUNK_NAME = 'rootErrorBoundary';
8
+ const ROOT_ERROR_BOUNDARY_ALIAS = '@/__private__/error';
9
+
10
+ export const rootErrorBoundaryFactory = (configManager: ConfigManager) => (config: Config) => {
11
+ const { root, rootDir, buildType } = configManager;
12
+ const rootErrorBoundaryPath = path.resolve(rootDir, root, 'error.tsx');
13
+ const fakeErrorBoundaryModule = require.resolve('../application/fakeRootErrorBoundaryModule');
14
+ const doesErrorBoundaryExist = fs.existsSync(rootErrorBoundaryPath);
15
+
16
+ if (doesErrorBoundaryExist) {
17
+ config
18
+ .when(
19
+ buildType === 'client',
20
+ // We don't need additional entrypoint on the server
21
+ (client) => client.entry(ROOT_ERROR_BOUNDARY_CHUNK_NAME).add(fakeErrorBoundaryModule),
22
+ (server) =>
23
+ // Hack that allows to require a root error boundary module on the server
24
+ server.resolve.alias.set(ROOT_ERROR_BOUNDARY_ALIAS, rootErrorBoundaryPath)
25
+ )
26
+ .module.rule('root-error-boundary')
27
+ .enforce('pre')
28
+ .test(new RegExp(fakeErrorBoundaryModule))
29
+ .use('root-error-boundary-loader')
30
+ .loader(path.resolve(__dirname, '..', 'loaders', 'root-error-boundary-loader'))
31
+ .options({ path: rootErrorBoundaryPath, buildType });
32
+ }
33
+ };
@@ -8,6 +8,7 @@ export const DEFAULT_STATS_OPTIONS: Configuration['stats'] = {
8
8
  outputPath: true, // выводит информацию о том в какой папке хранится билд на диске
9
9
  chunkGroups: true, // позволяет получить в stats поле namedChunkGroups которое потом используется в webpack-flush-chunks для получения чанков-зависимостей
10
10
  ids: true, // необходимо чтобы в chunksGroups были выставлены связи между модулями
11
+ entrypoints: true, // нужно, чтобы узнать чанки для каждой точки входа
11
12
  };
12
13
 
13
14
  export const DEFAULT_STATS_FIELDS: string[] = [
@@ -15,4 +16,5 @@ export const DEFAULT_STATS_FIELDS: string[] = [
15
16
  'outputPath',
16
17
  'assetsByChunkName',
17
18
  'namedChunkGroups',
19
+ 'entrypoints',
18
20
  ];
@@ -0,0 +1,46 @@
1
+ import type { LoaderDefinition } from 'webpack';
2
+
3
+ import type { BuildType } from '../../../../typings/projectType';
4
+ import { shouldUseReactRoot } from '../../../../utils/shouldUseReactRoot';
5
+
6
+ interface Options {
7
+ buildType: BuildType;
8
+ // Path to root error boundary component
9
+ path: string;
10
+ }
11
+ const COMPONENT_NAME = 'RootErrorBoundary';
12
+ const REACT_18_HYDRATION_CODE = `
13
+ const { hydrateRoot } = require('react-dom/client')
14
+
15
+ hydrateRoot(
16
+ document,
17
+ <${COMPONENT_NAME} error={window.serverError} url={window.serverUrl} />,
18
+ );
19
+ `;
20
+ const REACT_HYDRATION_CODE = `
21
+ const { hydrate } = require('react-dom')
22
+
23
+ hydrate(
24
+ <${COMPONENT_NAME} error={window.serverError} url={window.serverUrl} />,
25
+ document,
26
+ );
27
+ `;
28
+
29
+ // eslint-disable-next-line func-style
30
+ const rootErrorBoundaryLoader: LoaderDefinition<Options> = function (content) {
31
+ const options = this.getOptions();
32
+
33
+ this.cacheable(false);
34
+
35
+ // We don't need hydration code on the server
36
+ if (options.buildType === 'client') {
37
+ const IMPORT_CODE = `import ${COMPONENT_NAME} from "${options.path}"\n`;
38
+ const HYDRATION_CODE = shouldUseReactRoot() ? REACT_18_HYDRATION_CODE : REACT_HYDRATION_CODE;
39
+
40
+ return IMPORT_CODE.concat(HYDRATION_CODE);
41
+ }
42
+
43
+ return content;
44
+ };
45
+
46
+ export default rootErrorBoundaryLoader;