@tramvai/cli 2.111.1 → 2.117.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 (118) hide show
  1. package/lib/api/benchmark/build.js +6 -9
  2. package/lib/api/benchmark/build.js.map +1 -1
  3. package/lib/api/benchmark/index.js +4 -0
  4. package/lib/api/benchmark/index.js.map +1 -1
  5. package/lib/api/benchmark/start.js +10 -10
  6. package/lib/api/benchmark/start.js.map +1 -1
  7. package/lib/api/benchmark/types.d.ts +2 -0
  8. package/lib/api/benchmark/utils/stats.d.ts +6 -1
  9. package/lib/api/benchmark/utils/stats.js +9 -1
  10. package/lib/api/benchmark/utils/stats.js.map +1 -1
  11. package/lib/api/build/index.d.ts +1 -0
  12. package/lib/api/build/index.js.map +1 -1
  13. package/lib/api/start/index.d.ts +1 -0
  14. package/lib/api/start/index.js.map +1 -1
  15. package/lib/api/start/providers/application/shared.js +4 -4
  16. package/lib/api/start/providers/application/shared.js.map +1 -1
  17. package/lib/api/start/providers/child-app/shared.js +1 -4
  18. package/lib/api/start/providers/child-app/shared.js.map +1 -1
  19. package/lib/api/start/providers/module/shared.js +1 -4
  20. package/lib/api/start/providers/module/shared.js.map +1 -1
  21. package/lib/api/start-prod/providers/application.js +4 -4
  22. package/lib/api/start-prod/providers/application.js.map +1 -1
  23. package/lib/api/start-prod/providers/child-app.js +4 -4
  24. package/lib/api/start-prod/providers/child-app.js.map +1 -1
  25. package/lib/builder/webpack/providers/shared.js +12 -3
  26. package/lib/builder/webpack/providers/shared.js.map +1 -1
  27. package/lib/builder/webpack/utils/maxMemoryRss.d.ts +1 -0
  28. package/lib/builder/webpack/utils/maxMemoryRss.js +15 -0
  29. package/lib/builder/webpack/utils/maxMemoryRss.js.map +1 -0
  30. package/lib/builder/webpack/utils/runWebpack.js +6 -0
  31. package/lib/builder/webpack/utils/runWebpack.js.map +1 -1
  32. package/lib/commands/benchmark/benchmark.js +15 -7
  33. package/lib/commands/benchmark/benchmark.js.map +1 -1
  34. package/lib/config/constants.js +1 -1
  35. package/lib/config/constants.js.map +1 -1
  36. package/lib/di/providers/builder.js +10 -0
  37. package/lib/di/providers/builder.js.map +1 -1
  38. package/lib/di/tokens/builder.d.ts +5 -0
  39. package/lib/di/tokens/builder.js +2 -1
  40. package/lib/di/tokens/builder.js.map +1 -1
  41. package/lib/library/babel/plugins/fill-action-name.js +1 -2
  42. package/lib/library/babel/plugins/fill-action-name.js.map +1 -1
  43. package/lib/library/swc/index.d.ts +2 -2
  44. package/lib/library/swc/index.js +2 -4
  45. package/lib/library/swc/index.js.map +1 -1
  46. package/lib/library/typescript/index.d.ts +1 -1
  47. package/lib/library/webpack/blocks/js.js +25 -47
  48. package/lib/library/webpack/blocks/js.js.map +1 -1
  49. package/lib/library/webpack/blocks/pagesResolve.js.map +1 -1
  50. package/lib/library/webpack/blocks/pwa/client.js +1 -1
  51. package/lib/library/webpack/blocks/pwa/client.js.map +1 -1
  52. package/lib/library/webpack/blocks/serverInline.d.ts +1 -1
  53. package/lib/library/webpack/blocks/serverInline.js +8 -12
  54. package/lib/library/webpack/blocks/serverInline.js.map +1 -1
  55. package/lib/library/webpack/blocks/ts.d.ts +1 -1
  56. package/lib/library/webpack/blocks/ts.js +6 -6
  57. package/lib/library/webpack/blocks/ts.js.map +1 -1
  58. package/lib/library/webpack/loaders/pagesResolve.d.ts +2 -2
  59. package/lib/library/webpack/loaders/pagesResolve.js +9 -3
  60. package/lib/library/webpack/loaders/pagesResolve.js.map +1 -1
  61. package/lib/library/webpack/plugins/ModuleFederationFixRange.d.ts +1 -1
  62. package/lib/library/webpack/plugins/ModuleFederationFixRange.js +70 -68
  63. package/lib/library/webpack/plugins/ModuleFederationFixRange.js.map +1 -1
  64. package/lib/library/webpack/plugins/WebpackBar/utils/log-update.js +7 -1
  65. package/lib/library/webpack/plugins/WebpackBar/utils/log-update.js.map +1 -1
  66. package/lib/library/webpack/utils/files.js +4 -2
  67. package/lib/library/webpack/utils/files.js.map +1 -1
  68. package/lib/library/webpack/utils/transpiler.d.ts +1 -1
  69. package/lib/library/webpack/utils/transpiler.js +1 -1
  70. package/lib/library/webpack/utils/transpiler.js.map +1 -1
  71. package/lib/schema/autogeneratedSchema.json +4 -0
  72. package/lib/typings/build/Builder.d.ts +1 -0
  73. package/lib/typings/configEntry/application.d.ts +4 -0
  74. package/lib/utils/detectPortSync.d.ts +13 -1
  75. package/lib/utils/detectPortSync.js +12 -2
  76. package/lib/utils/detectPortSync.js.map +1 -1
  77. package/package.json +9 -7
  78. package/schema.json +4 -0
  79. package/src/api/benchmark/build.ts +4 -14
  80. package/src/api/benchmark/index.ts +9 -1
  81. package/src/api/benchmark/start.ts +7 -14
  82. package/src/api/benchmark/types.ts +6 -1
  83. package/src/api/benchmark/utils/stats.ts +17 -1
  84. package/src/api/build/index.ts +1 -0
  85. package/src/api/start/__integration__/start.test.ts +24 -5
  86. package/src/api/start/index.ts +1 -0
  87. package/src/api/start/providers/application/shared.ts +5 -2
  88. package/src/api/start/providers/child-app/shared.ts +1 -1
  89. package/src/api/start/providers/module/shared.ts +1 -1
  90. package/src/api/start-prod/providers/application.ts +5 -2
  91. package/src/api/start-prod/providers/child-app.ts +4 -1
  92. package/src/builder/webpack/providers/shared.ts +15 -4
  93. package/src/builder/webpack/utils/maxMemoryRss.ts +12 -0
  94. package/src/builder/webpack/utils/runWebpack.ts +9 -0
  95. package/src/commands/benchmark/benchmark.ts +17 -7
  96. package/src/config/constants.ts +1 -1
  97. package/src/di/providers/builder.ts +10 -0
  98. package/src/di/tokens/builder.ts +2 -0
  99. package/src/library/babel/plugins/fill-action-name.ts +1 -2
  100. package/src/library/swc/__integration__/__snapshots__/swc.build.test.ts.snap +7 -24
  101. package/src/library/swc/__integration__/__snapshots__/swc.start.test.ts.snap +11 -23
  102. package/src/library/swc/index.ts +4 -6
  103. package/src/library/webpack/blocks/js.ts +27 -51
  104. package/src/library/webpack/blocks/pagesResolve.ts +2 -1
  105. package/src/library/webpack/blocks/pwa/client.ts +1 -1
  106. package/src/library/webpack/blocks/serverInline.ts +14 -12
  107. package/src/library/webpack/blocks/ts.ts +6 -7
  108. package/src/library/webpack/loaders/pagesResolve.ts +12 -4
  109. package/src/library/webpack/plugins/ModuleFederationFixRange.ts +92 -87
  110. package/src/library/webpack/plugins/WebpackBar/utils/log-update.ts +7 -1
  111. package/src/library/webpack/utils/files.ts +9 -6
  112. package/src/library/webpack/utils/transpiler.ts +16 -18
  113. package/src/schema/autogeneratedSchema.json +4 -0
  114. package/src/typings/build/Builder.ts +1 -0
  115. package/src/typings/configEntry/application.ts +4 -0
  116. package/src/utils/detectPortSync.ts +18 -2
  117. /package/src/api/start/__integration__/__fixtures__/app/routes/{about.tsx → about/index.tsx} +0 -0
  118. /package/src/api/start/__integration__/__fixtures__/app/routes/{home.tsx → home/index.tsx} +0 -0
@@ -0,0 +1,12 @@
1
+ export const maxMemoryRss = () => {
2
+ let maxMemory = process.memoryUsage.rss();
3
+
4
+ const interval = setInterval(() => {
5
+ maxMemory = Math.max(maxMemory, process.memoryUsage.rss());
6
+ }, 5000);
7
+
8
+ return () => {
9
+ clearInterval(interval);
10
+ return maxMemory;
11
+ };
12
+ };
@@ -3,6 +3,15 @@ import type { Compiler, MultiCompiler } from 'webpack';
3
3
  export const runWebpack = (compiler: Compiler | MultiCompiler) => {
4
4
  return new Promise<void>((resolve, reject) => {
5
5
  compiler.run((err, stats) => {
6
+ console.warn(
7
+ stats.toString({
8
+ all: false,
9
+ colors: true,
10
+ warnings: true,
11
+ errors: true,
12
+ })
13
+ );
14
+
6
15
  if (err || stats.hasErrors()) {
7
16
  return reject(
8
17
  err ||
@@ -1,4 +1,5 @@
1
1
  import mdtable from 'mdtable';
2
+ import prettyBytes from 'pretty-bytes';
2
3
  import type { Context } from '../../models/context';
3
4
  import type { CommandResult } from '../../models/command';
4
5
  import type { Result } from '../../api/benchmark';
@@ -7,29 +8,38 @@ import { app } from '../index';
7
8
 
8
9
  const roundStats = (n: number) => Math.round(100 * n) / 100;
9
10
 
10
- const formatStats = (stats: Result[string]['client']) => {
11
+ const formatTimeStats = (stats: Result[string]['client']) => {
11
12
  return `${roundStats(stats.mean)}ms ± ${roundStats(stats.variance)}%`;
12
13
  };
13
14
 
15
+ const formatMemoryStats = (stats: Result[string]['client']) => {
16
+ const value = prettyBytes(stats.mean, {
17
+ maximumFractionDigits: 2,
18
+ });
19
+
20
+ return `${value} ± ${roundStats(stats.variance)}%`;
21
+ };
22
+
14
23
  const formatStatsTable = (stats: Result) => {
15
- const header = [] as string[];
16
- const alignment = [] as string[];
17
- const row = [] as string[];
24
+ const header = [''] as string[];
25
+ const alignment = ['C'] as string[];
26
+ const rows = [['time'], ['mem']] as string[][];
18
27
 
19
28
  for (const key in stats) {
20
29
  header.push(key);
21
30
  alignment.push('C');
22
31
 
23
- const { client, server } = stats[key];
32
+ const { client, server, maxMemoryRss } = stats[key];
24
33
 
25
- row.push(`${formatStats(client)} / ${formatStats(server)}`);
34
+ rows[0].push(`${formatTimeStats(client)} / ${formatTimeStats(server)}`);
35
+ rows[1].push(formatMemoryStats(maxMemoryRss));
26
36
  }
27
37
 
28
38
  return mdtable(
29
39
  {
30
40
  header,
31
41
  alignment,
32
- rows: [row],
42
+ rows,
33
43
  },
34
44
  {
35
45
  borders: true,
@@ -1,4 +1,4 @@
1
- export const extensions = ['.js', '.jsx', '.ts', '.tsx'];
1
+ export const extensions = ['.mjs', '.js', '.jsx', '.ts', '.tsx'];
2
2
 
3
3
  export const DEBUG_ARGV = ['--inspect', '-r', 'source-map-support/register'];
4
4
 
@@ -7,6 +7,7 @@ import {
7
7
  ABSTRACT_BUILDER_FACTORY_TOKEN,
8
8
  BUILDER_FACTORY_TOKEN,
9
9
  } from '../tokens/builder';
10
+ import { COMMAND_PARAMETERS_TOKEN, WITH_BUILD_STATS_TOKEN } from '../tokens';
10
11
 
11
12
  export const builderProviders: Provider[] = [
12
13
  provide({
@@ -61,4 +62,13 @@ next builders are available: "${[...builderMap.keys()]}"`);
61
62
  builderFactories: BUILDER_MODULE_TOKEN as any as typeof BUILDER_MODULE_TOKEN[],
62
63
  },
63
64
  }),
65
+ {
66
+ provide: WITH_BUILD_STATS_TOKEN,
67
+ useFactory: ({ params }) => {
68
+ return !!params.withBuildStats;
69
+ },
70
+ deps: {
71
+ params: COMMAND_PARAMETERS_TOKEN,
72
+ },
73
+ },
64
74
  ];
@@ -15,3 +15,5 @@ export const BUILDER_MODULE_TOKEN = createToken<BuilderModule<any>>('builder mod
15
15
 
16
16
  export const ABSTRACT_BUILDER_FACTORY_TOKEN =
17
17
  createToken<AbstractBuilderFactory>('builder abstractFactory');
18
+
19
+ export const WITH_BUILD_STATS_TOKEN = createToken<boolean>('builder withBuildStats');
@@ -4,8 +4,7 @@ const contextRe = /[\\/](Client)?Context.[jt]s$/;
4
4
  /** @deprecated */
5
5
  module.exports = function plugin({ types }) {
6
6
  function getAssignStatement(node) {
7
- // eslint-disable-line max-params
8
- if (!node.name) {
7
+ if (!node || !node.name) {
9
8
  return;
10
9
  }
11
10
 
@@ -13,20 +13,11 @@ exports[`client-legacy: create-token-pure.ts 1`] = `
13
13
  `;
14
14
 
15
15
  exports[`client-legacy: images/logo.svg\\?react 1`] = `
16
- " /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("webpack/sharing/consume/default/react/jsx-runtime/react/jsx-runtime");
17
- /* harmony import */ function _extends() {
18
- return _extends = Object.assign || function(target) {
19
- for (var i = 1; i < arguments.length; i++) {
20
- var source = arguments[i];
21
- for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
22
- }
23
- return target;
24
- }, _extends.apply(this, arguments);
25
- }
26
- __webpack_require__("webpack/sharing/consume/default/react/react"),
16
+ " /* harmony import */ var _swc_helpers_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("../../node_modules/@swc/helpers/esm/_extends.js"), react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("webpack/sharing/consume/default/react/jsx-runtime/react/jsx-runtime");
17
+ /* harmony import */ __webpack_require__("webpack/sharing/consume/default/react/react"),
27
18
  /* harmony default export */ __webpack_exports__.Z = function(props) {
28
19
  /*#__PURE__*/
29
- return (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", _extends({
20
+ return (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", (0, _swc_helpers_extends__WEBPACK_IMPORTED_MODULE_2__._)({
30
21
  xmlns: "http://www.w3.org/2000/svg",
31
22
  viewBox: "0 0 80.9 72.2"
32
23
  }, props, {
@@ -202,18 +193,10 @@ exports[`client-modern: images/logo.svg\\?react 1`] = `
202
193
  return __WEBPACK_DEFAULT_EXPORT__;
203
194
  }
204
195
  /* harmony export */ });
205
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("webpack/sharing/consume/default/react/jsx-runtime/react/jsx-runtime");
206
- /* harmony import */ function _extends() {
207
- return _extends = Object.assign || function(target) {
208
- for (var i = 1; i < arguments.length; i++) {
209
- var source = arguments[i];
210
- for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);
211
- }
212
- return target;
213
- }, _extends.apply(this, arguments);
214
- }
215
- __webpack_require__("webpack/sharing/consume/default/react/react");
216
- const __WEBPACK_DEFAULT_EXPORT__ = props => /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", _extends({
196
+ /* harmony import */ var _swc_helpers_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("../../node_modules/@swc/helpers/esm/_extends.js"), react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("webpack/sharing/consume/default/react/jsx-runtime/react/jsx-runtime");
197
+ /* harmony import */ __webpack_require__("webpack/sharing/consume/default/react/react");
198
+ const __WEBPACK_DEFAULT_EXPORT__ = props => /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg", (0,
199
+ _swc_helpers_extends__WEBPACK_IMPORTED_MODULE_2__._)({
217
200
  xmlns: "http://www.w3.org/2000/svg",
218
201
  viewBox: "0 0 80.9 72.2"
219
202
  }, props, {
@@ -52,27 +52,15 @@ exports[`client: images/logo.svg\\?react 1`] = `
52
52
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
53
53
  /* harmony export */ "default": function() { return __WEBPACK_DEFAULT_EXPORT__; }
54
54
  /* harmony export */ });
55
+ /* harmony import */ var _swc_helpers_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("../../node_modules/@swc/helpers/esm/_extends.js");
55
56
  /* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("webpack/sharing/consume/default/react/jsx-dev-runtime/react/jsx-dev-runtime");
56
57
  /* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);
57
58
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("webpack/sharing/consume/default/react/react");
58
59
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
59
- function _extends() {
60
- _extends = Object.assign || function(target) {
61
- for(var i = 1; i < arguments.length; i++){
62
- var source = arguments[i];
63
- for(var key in source){
64
- if (Object.prototype.hasOwnProperty.call(source, key)) {
65
- target[key] = source[key];
66
- }
67
- }
68
- }
69
- return target;
70
- };
71
- return _extends.apply(this, arguments);
72
- }
73
60
 
74
61
 
75
- const SvgLogo = (props)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)("svg", _extends({
62
+
63
+ const SvgLogo = (props)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)("svg", (0,_swc_helpers_extends__WEBPACK_IMPORTED_MODULE_2__._)({
76
64
  xmlns: "http://www.w3.org/2000/svg",
77
65
  viewBox: "0 0 80.9 72.2"
78
66
  }, props, {
@@ -301,17 +289,17 @@ exports[`client: provider-stack.ts 1`] = `
301
289
  /* provided dependency */ var __react_refresh_utils__ = __webpack_require__("../../node_modules/@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js");
302
290
  __webpack_require__.$Refresh$.runtime = __webpack_require__("../../node_modules/react-refresh/runtime.js");
303
291
 
304
- var _ref0;
292
+ var _ref;
305
293
 
306
294
 
307
295
  const providers = [
308
- (0,_tramvai_core__WEBPACK_IMPORTED_MODULE_0__.provide)((_ref0 = {
296
+ (0,_tramvai_core__WEBPACK_IMPORTED_MODULE_0__.provide)((_ref = {
309
297
  provide: _create_token_pure__WEBPACK_IMPORTED_MODULE_1__.TEST_TOKEN,
310
298
  useValue: "test"
311
- }, Object.defineProperty(_ref0, "__stack", {
299
+ }, Object.defineProperty(_ref, "__stack", {
312
300
  enumerable: false,
313
301
  value: new globalThis.Error().stack
314
- }), _ref0))
302
+ }), _ref))
315
303
  ];
316
304
 
317
305
 
@@ -692,17 +680,17 @@ exports[`server: provider-stack.ts 1`] = `
692
680
  /* harmony export */ });
693
681
  /* harmony import */ var _tramvai_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./src/library/swc/__integration__/mocks/tramvai-core.ts");
694
682
  /* harmony import */ var _create_token_pure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./src/library/swc/__integration__/create-token-pure.ts");
695
- var _ref0;
683
+ var _ref;
696
684
 
697
685
 
698
686
  const providers = [
699
- (0,_tramvai_core__WEBPACK_IMPORTED_MODULE_0__.provide)((_ref0 = {
687
+ (0,_tramvai_core__WEBPACK_IMPORTED_MODULE_0__.provide)((_ref = {
700
688
  provide: _create_token_pure__WEBPACK_IMPORTED_MODULE_1__.TEST_TOKEN,
701
689
  useValue: "test"
702
- }, Object.defineProperty(_ref0, "__stack", {
690
+ }, Object.defineProperty(_ref, "__stack", {
703
691
  enumerable: false,
704
692
  value: new globalThis.Error().stack
705
- }), _ref0))
693
+ }), _ref))
706
694
  ];
707
695
 
708
696
 
@@ -5,7 +5,7 @@ import browserslist from 'browserslist';
5
5
  import envTargets from '@tinkoff/browserslist-config';
6
6
  import { sync as resolve } from 'resolve';
7
7
  import findCacheDir from 'find-cache-dir';
8
- import type { Config } from '@swc/core';
8
+ import type { Options as SwcOptions } from '@swc/core';
9
9
  import type { TranspilerConfig } from '../webpack/utils/transpiler';
10
10
 
11
11
  const TRAMVAI_SWC_TARGET_PATH = '@tramvai/swc-integration/target/wasm32-wasi';
@@ -13,7 +13,7 @@ const TRAMVAI_SWC_TARGET_PATH = '@tramvai/swc-integration/target/wasm32-wasi';
13
13
  const NOT_SUPPORTED_FIELDS = ['alias', 'generateDataQaTag', 'enableFillActionNamePlugin'];
14
14
  let warningWasShown = false;
15
15
 
16
- export const getSwcOptions = (config: TranspilerConfig): Config => {
16
+ export const getSwcOptions = (config: TranspilerConfig): SwcOptions => {
17
17
  const {
18
18
  env = 'development',
19
19
  target,
@@ -109,9 +109,9 @@ Having swc config may conflict with @tramvai/cli configuration`
109
109
  module: {
110
110
  type: modules || 'es6',
111
111
  },
112
+ isModule: 'unknown',
112
113
  jsc: {
113
- // TODO: should trim output size, but doesn't work well with some libs
114
- // externalHelpers: true,
114
+ externalHelpers: true,
115
115
  parser: {
116
116
  syntax: typescript ? 'typescript' : 'ecmascript',
117
117
  decorators: true,
@@ -129,8 +129,6 @@ Having swc config may conflict with @tramvai/cli configuration`
129
129
  globals: {
130
130
  // let the webpack replace NODE_ENV as replacement with swc may mess up with tests
131
131
  envs: [],
132
- // @ts-ignore
133
- // TODO: there is not typings for typeofs, but the field is mentioned in docs
134
132
  typeofs: removeTypeofWindow
135
133
  ? {
136
134
  window: isServer ? 'undefined' : 'object',
@@ -2,7 +2,6 @@ import type Config from 'webpack-chain';
2
2
  import { modernLibsFilter } from '@tinkoff/is-modern-lib';
3
3
  import { createWorkerPoolTranspiler } from '../utils/workersPool';
4
4
  import type { ConfigManager } from '../../../config/configManager';
5
- import type { TranspilerConfig } from '../utils/transpiler';
6
5
  import { getTranspilerConfig, addTranspilerLoader } from '../utils/transpiler';
7
6
  import type { CliConfigEntry } from '../../../typings/configEntry/cli';
8
7
 
@@ -10,56 +9,33 @@ import type { CliConfigEntry } from '../../../typings/configEntry/cli';
10
9
  export default (configManager: ConfigManager<CliConfigEntry>) => (config: Config) => {
11
10
  const { transpileOnlyModernLibs } = configManager;
12
11
 
13
- const jsRule = (transpilerConfig: TranspilerConfig) => (rule: Config.Rule) => {
14
- const cfg = rule
15
- .test(/\.[cm]?js[x]?$/)
16
- .oneOf('default')
17
- // TODO разобраться почему на винде все плохо с thread-loader
18
- .when(process.platform !== 'win32' && !configManager.debug, (cfg) =>
19
- cfg
20
- .use('thread')
21
- .loader('thread-loader')
22
- .options(createWorkerPoolTranspiler(configManager))
23
- .end()
24
- )
25
- .use('transpiler');
12
+ const rule = config.module
13
+ .rule('js')
14
+ .test(/\.[cm]?js[x]?$/)
15
+ // TODO: разобраться почему на винде все плохо с thread-loader
16
+ .when(process.platform !== 'win32' && !configManager.debug, (cfg) =>
17
+ cfg
18
+ .use('thread')
19
+ .loader('thread-loader')
20
+ .options(createWorkerPoolTranspiler(configManager))
21
+ .end()
22
+ );
26
23
 
27
- return addTranspilerLoader(configManager, cfg, transpilerConfig);
28
- };
24
+ rule
25
+ .oneOf('project')
26
+ .exclude.add(/node_modules/)
27
+ .end()
28
+ .use('transpiler')
29
+ .batch(addTranspilerLoader(configManager, getTranspilerConfig(configManager)));
29
30
 
30
- if (transpileOnlyModernLibs) {
31
- config.module
32
- .rule('js:project')
33
- .exclude.add(/node_modules/)
34
- .end()
35
- .batch(jsRule(getTranspilerConfig(configManager)));
36
-
37
- config.module
38
- .rule('js:node_modules')
39
- .include.add(modernLibsFilter)
40
- .end()
41
- .batch(jsRule(getTranspilerConfig(configManager, { hot: false })))
42
- .merge({
43
- // TODO: некоторые пакеты неправильно описывают импорты для es модулей
44
- // https://github.com/babel/babel/issues/12058
45
- resolve: { fullySpecified: false },
46
- });
47
- } else {
48
- config.module
49
- .rule('js:project')
50
- .exclude.add(/node_modules/)
51
- .end()
52
- .batch(jsRule(getTranspilerConfig(configManager)));
53
-
54
- config.module
55
- .rule('js:node_modules')
56
- .include.add(/node_modules/)
57
- .end()
58
- .batch(jsRule(getTranspilerConfig(configManager, { hot: false })))
59
- .merge({
60
- // TODO: некоторые пакеты неправильно описывают импорты для es модулей
61
- // https://github.com/babel/babel/issues/12058
62
- resolve: { fullySpecified: false },
63
- });
64
- }
31
+ rule
32
+ .oneOf('node_module')
33
+ .when(transpileOnlyModernLibs, (cfg) => cfg.include.add(modernLibsFilter))
34
+ .merge({
35
+ // true value forces to use file extensions for importing mjs modules
36
+ // but we want to use mjs if it exists anyway
37
+ resolve: { fullySpecified: false },
38
+ })
39
+ .use('transpiler')
40
+ .batch(addTranspilerLoader(configManager, getTranspilerConfig(configManager, { hot: false })));
65
41
  };
@@ -1,5 +1,6 @@
1
1
  import path from 'path';
2
2
  import type Config from 'webpack-chain';
3
+ import type { PagesResolveOptions } from '../loaders/pagesResolve';
3
4
  import type { ConfigManager } from '../../../config/configManager';
4
5
  import type { ApplicationConfigEntry } from '../../../typings/configEntry/application';
5
6
 
@@ -20,7 +21,7 @@ export const pagesResolve =
20
21
  rootDir: configManager.rootDir,
21
22
  root: configManager.root,
22
23
  extensions: config.resolve.extensions.values(),
23
- })
24
+ } as PagesResolveOptions)
24
25
  .end()
25
26
  // babel-loader is required to process this file
26
27
  .enforce('pre');
@@ -26,7 +26,7 @@ export const pwaBlock =
26
26
  config.batch(pwaSharedBlock(configManager));
27
27
 
28
28
  if (
29
- !safeRequireResolve('@tramvai/module-progressive-web-app') &&
29
+ !safeRequireResolve('@tramvai/module-progressive-web-app', true) &&
30
30
  (pwa.workbox?.enabled || pwa.webmanifest?.enabled)
31
31
  ) {
32
32
  throw Error('PWA functional requires @tramvai/module-progressive-web-app installed');
@@ -1,25 +1,27 @@
1
- import Config from 'webpack-chain';
1
+ import type Config from 'webpack-chain';
2
2
  import type { ConfigManager } from '../../../config/configManager';
3
3
  import type { CliConfigEntry } from '../../../typings/configEntry/cli';
4
- import js from './js';
5
- import ts from './ts';
4
+ import { addTranspilerLoader, getTranspilerConfig } from '../utils/transpiler';
6
5
 
7
6
  export const serverInline = (configManager: ConfigManager<CliConfigEntry>) => (config: Config) => {
8
7
  // создаём клиентский конфиг и отключаем modern режим
9
8
  const clientConfigManager = configManager.withSettings({ buildType: 'client', modern: false });
10
9
 
11
- const clientConfig = new Config().batch(js(clientConfigManager)).batch(ts(clientConfigManager));
12
-
13
- const addInlineHandler = (type: string, extension: string) => {
10
+ const addInlineHandler = (type: string) => {
14
11
  config.module
15
12
  .rule(type)
16
13
  .oneOf('inline')
17
- .before('default')
18
- .test(new RegExp(`\\.inline(\\.es)?\\.${extension}$`))
19
- .uses.merge(clientConfig.module.rule(type).oneOfs.get('default').uses.entries());
14
+ .before('project')
15
+ .test(new RegExp(`\\.inline(\\.es)?\\.${type}$`))
16
+ .use('transpiler')
17
+ .batch(
18
+ addTranspilerLoader(
19
+ clientConfigManager,
20
+ getTranspilerConfig(clientConfigManager, { typescript: type === 'ts' })
21
+ )
22
+ );
20
23
  };
21
24
 
22
- addInlineHandler('js:project', 'js');
23
- addInlineHandler('js:node_modules', 'js');
24
- addInlineHandler('ts:project', 'ts');
25
+ addInlineHandler('js');
26
+ addInlineHandler('ts');
25
27
  };
@@ -7,13 +7,12 @@ import type { CliConfigEntry } from '../../../typings/configEntry/cli';
7
7
  export default (configManager: ConfigManager<CliConfigEntry>) => (config: Config) => {
8
8
  const transpilerConfig = getTranspilerConfig(configManager, { typescript: true });
9
9
 
10
- const cfg = config.module
11
- .rule('ts:project')
10
+ config.module
11
+ .rule('ts')
12
12
  .test(/\.ts[x]?$/)
13
13
  .exclude.add(/node_modules/)
14
14
  .end()
15
- .oneOf('default')
16
- // TODO разобраться почему на винде все плохо с thread-loader
15
+ // TODO: разобраться почему на винде все плохо с thread-loader
17
16
  .when(process.platform !== 'win32', (cfg) =>
18
17
  cfg
19
18
  .use('thread')
@@ -21,7 +20,7 @@ export default (configManager: ConfigManager<CliConfigEntry>) => (config: Config
21
20
  .options(createWorkerPoolTranspiler(configManager))
22
21
  .end()
23
22
  )
24
- .use('transpiler');
25
-
26
- return addTranspilerLoader(configManager, cfg, transpilerConfig);
23
+ .oneOf('project')
24
+ .use('transpiler')
25
+ .batch(addTranspilerLoader(configManager, transpilerConfig));
27
26
  };
@@ -8,7 +8,7 @@ const LAYOUT_FILENAME = '_layout.tsx';
8
8
  const ERROR_BOUNDARY_FILENAME = '_error.tsx';
9
9
  const WILDCARD_TOKEN = '[...';
10
10
 
11
- interface Options {
11
+ export interface PagesResolveOptions {
12
12
  rootDir: string;
13
13
  root: string;
14
14
  extensions: string[];
@@ -22,8 +22,9 @@ const removeExtension = (filename: string): string => {
22
22
  };
23
23
 
24
24
  // eslint-disable-next-line func-style
25
- const pagesResolve: LoaderDefinitionFunction<Options> = function () {
25
+ const pagesResolve: LoaderDefinitionFunction<PagesResolveOptions> = function () {
26
26
  const { fileSystemPages, rootDir, root, extensions } = this.getOptions();
27
+ const extensionsRegexp = new RegExp(`\\.(${extensions.map((ext) => ext.slice(1)).join('|')})$`);
27
28
  const fsLayouts: string[] = [];
28
29
  const fsErrorBoundaries: string[] = [];
29
30
  const fsWildcards: string[] = [];
@@ -34,9 +35,11 @@ const pagesResolve: LoaderDefinitionFunction<Options> = function () {
34
35
  const filesToPages = ({
35
36
  pagesRootDirectory,
36
37
  isRoutes = false,
38
+ test,
37
39
  }: {
38
40
  pagesRootDirectory: string;
39
41
  isRoutes?: boolean;
42
+ test: RegExp;
40
43
  }) => {
41
44
  const pagesDir = path.resolve(rootDir, root, pagesRootDirectory);
42
45
 
@@ -51,9 +54,10 @@ const pagesResolve: LoaderDefinitionFunction<Options> = function () {
51
54
 
52
55
  for (const file of pagesFiles) {
53
56
  const extname = path.extname(file);
54
- const name = file.replace(new RegExp(`\\${extname}$`), '').replace(/\\/g, '/');
57
+ const normalizedFile = file.replace(/\\/g, '/');
55
58
 
56
- if (extensions.indexOf(extname) !== -1) {
59
+ if (test.test(normalizedFile)) {
60
+ const name = normalizedFile.replace(new RegExp(`\\${extname}$`), '');
57
61
  const pageComponentName = `@/${pagesRootDirectory}/${name}`;
58
62
  const pageComponentPath = path.resolve(pagesDir, name).replace(/\\/g, '\\\\');
59
63
  const chunkname = pageComponentName.replace(/\//g, '_');
@@ -112,11 +116,15 @@ const pagesResolve: LoaderDefinitionFunction<Options> = function () {
112
116
  ? filesToPages({
113
117
  pagesRootDirectory: fileSystemPages.routesDir,
114
118
  isRoutes: true,
119
+ test: new RegExp(`index${extensionsRegexp.source}`),
115
120
  })
116
121
  : [];
117
122
  const fsPages = fileSystemPages.pagesDir
118
123
  ? filesToPages({
119
124
  pagesRootDirectory: fileSystemPages.pagesDir,
125
+ test: fileSystemPages.componentsPattern
126
+ ? new RegExp(fileSystemPages.componentsPattern)
127
+ : extensionsRegexp,
120
128
  })
121
129
  : [];
122
130