@tramvai/cli 2.112.0 → 2.117.2

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 (98) 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/builder/webpack/providers/shared.js +12 -3
  16. package/lib/builder/webpack/providers/shared.js.map +1 -1
  17. package/lib/builder/webpack/utils/maxMemoryRss.d.ts +1 -0
  18. package/lib/builder/webpack/utils/maxMemoryRss.js +15 -0
  19. package/lib/builder/webpack/utils/maxMemoryRss.js.map +1 -0
  20. package/lib/builder/webpack/utils/runWebpack.js +6 -0
  21. package/lib/builder/webpack/utils/runWebpack.js.map +1 -1
  22. package/lib/commands/benchmark/benchmark.js +15 -7
  23. package/lib/commands/benchmark/benchmark.js.map +1 -1
  24. package/lib/config/constants.js +1 -1
  25. package/lib/config/constants.js.map +1 -1
  26. package/lib/di/providers/builder.js +10 -0
  27. package/lib/di/providers/builder.js.map +1 -1
  28. package/lib/di/tokens/builder.d.ts +5 -0
  29. package/lib/di/tokens/builder.js +2 -1
  30. package/lib/di/tokens/builder.js.map +1 -1
  31. package/lib/library/babel/plugins/fill-action-name.js +1 -2
  32. package/lib/library/babel/plugins/fill-action-name.js.map +1 -1
  33. package/lib/library/swc/index.d.ts +2 -2
  34. package/lib/library/swc/index.js +2 -4
  35. package/lib/library/swc/index.js.map +1 -1
  36. package/lib/library/webpack/blocks/js.js +25 -47
  37. package/lib/library/webpack/blocks/js.js.map +1 -1
  38. package/lib/library/webpack/blocks/pagesResolve.js.map +1 -1
  39. package/lib/library/webpack/blocks/pwa/client.js +1 -1
  40. package/lib/library/webpack/blocks/pwa/client.js.map +1 -1
  41. package/lib/library/webpack/blocks/serverInline.d.ts +1 -1
  42. package/lib/library/webpack/blocks/serverInline.js +8 -12
  43. package/lib/library/webpack/blocks/serverInline.js.map +1 -1
  44. package/lib/library/webpack/blocks/ts.d.ts +1 -1
  45. package/lib/library/webpack/blocks/ts.js +6 -6
  46. package/lib/library/webpack/blocks/ts.js.map +1 -1
  47. package/lib/library/webpack/loaders/pagesResolve.d.ts +2 -2
  48. package/lib/library/webpack/loaders/pagesResolve.js +9 -3
  49. package/lib/library/webpack/loaders/pagesResolve.js.map +1 -1
  50. package/lib/library/webpack/plugins/ModuleFederationFixRange.d.ts +1 -1
  51. package/lib/library/webpack/plugins/ModuleFederationFixRange.js +70 -68
  52. package/lib/library/webpack/plugins/ModuleFederationFixRange.js.map +1 -1
  53. package/lib/library/webpack/plugins/WebpackBar/utils/log-update.js +7 -1
  54. package/lib/library/webpack/plugins/WebpackBar/utils/log-update.js.map +1 -1
  55. package/lib/library/webpack/utils/files.js +4 -2
  56. package/lib/library/webpack/utils/files.js.map +1 -1
  57. package/lib/library/webpack/utils/transpiler.d.ts +1 -1
  58. package/lib/library/webpack/utils/transpiler.js +1 -1
  59. package/lib/library/webpack/utils/transpiler.js.map +1 -1
  60. package/lib/schema/autogeneratedSchema.json +4 -0
  61. package/lib/typings/build/Builder.d.ts +1 -0
  62. package/lib/typings/configEntry/application.d.ts +4 -0
  63. package/package.json +9 -7
  64. package/schema.json +4 -0
  65. package/src/api/benchmark/build.ts +4 -14
  66. package/src/api/benchmark/index.ts +9 -1
  67. package/src/api/benchmark/start.ts +7 -14
  68. package/src/api/benchmark/types.ts +6 -1
  69. package/src/api/benchmark/utils/stats.ts +17 -1
  70. package/src/api/build/index.ts +1 -0
  71. package/src/api/start/__integration__/start.test.ts +2 -2
  72. package/src/api/start/index.ts +1 -0
  73. package/src/builder/webpack/providers/shared.ts +15 -4
  74. package/src/builder/webpack/utils/maxMemoryRss.ts +12 -0
  75. package/src/builder/webpack/utils/runWebpack.ts +9 -0
  76. package/src/commands/benchmark/benchmark.ts +17 -7
  77. package/src/config/constants.ts +1 -1
  78. package/src/di/providers/builder.ts +10 -0
  79. package/src/di/tokens/builder.ts +2 -0
  80. package/src/library/babel/plugins/fill-action-name.ts +1 -2
  81. package/src/library/swc/__integration__/__snapshots__/swc.build.test.ts.snap +7 -24
  82. package/src/library/swc/__integration__/__snapshots__/swc.start.test.ts.snap +11 -23
  83. package/src/library/swc/index.ts +4 -6
  84. package/src/library/webpack/blocks/js.ts +27 -51
  85. package/src/library/webpack/blocks/pagesResolve.ts +2 -1
  86. package/src/library/webpack/blocks/pwa/client.ts +1 -1
  87. package/src/library/webpack/blocks/serverInline.ts +14 -12
  88. package/src/library/webpack/blocks/ts.ts +6 -7
  89. package/src/library/webpack/loaders/pagesResolve.ts +12 -4
  90. package/src/library/webpack/plugins/ModuleFederationFixRange.ts +92 -87
  91. package/src/library/webpack/plugins/WebpackBar/utils/log-update.ts +7 -1
  92. package/src/library/webpack/utils/files.ts +9 -6
  93. package/src/library/webpack/utils/transpiler.ts +16 -18
  94. package/src/schema/autogeneratedSchema.json +4 -0
  95. package/src/typings/build/Builder.ts +1 -0
  96. package/src/typings/configEntry/application.ts +4 -0
  97. /package/src/api/start/__integration__/__fixtures__/app/routes/{about.tsx → about/index.tsx} +0 -0
  98. /package/src/api/start/__integration__/__fixtures__/app/routes/{home.tsx → home/index.tsx} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"transpiler.js","sourceRoot":"","sources":["../../../../src/library/webpack/utils/transpiler.ts"],"names":[],"mappings":";;;;AACA,qCAA0C;AAE1C,mCAA0C;AAC1C,gEAAsC;AAuB/B,MAAM,mBAAmB,GAAG,CACjC,aAA4C,EAC5C,IAAgB,EAChB,gBAAkC,EAClC,EAAE;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC;IAE3D,IAAI,MAAM,KAAK,KAAK,EAAE;QACpB,IAAI;YACF,IAAA,cAAO,EAAC,uCAAuC,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;SACtF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC;;OAEf,CAAC,CAAC;SACJ;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAA,mBAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KACjF;IAED,IAAI,MAAM,KAAK,OAAO,EAAE;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,IAAA,eAAW,EAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KACjF;AACH,CAAC,CAAC;AAtBW,QAAA,mBAAmB,uBAsB9B;AAEK,MAAM,mBAAmB,GAAG,CACjC,aAA4C,EAC5C,kBAA6C,EAAE,EAC7B,EAAE;IACpB,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC;IAClG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;IAEtC,uBACE,QAAQ,EAAE,aAAa,CAAC,SAAS,KAAK,QAAQ,EAC9C,GAAG;QACH,iBAAiB;QACjB,MAAM;QACN,KAAK,EACL,OAAO,EAAE,IAAI,EACb,kBAAkB,EAAE,IAAI,EACxB,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EACvC,iBAAiB;QACjB,0BAA0B,EAC1B,OAAO,EAAE,aAAa,CAAC,OAAO,EAC9B,MAAM,EAAE,aAAa,CAAC,MAAM,EAC5B,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,KAAK,IACd,eAAe,EAClB;AACJ,CAAC,CAAC;AAzBW,QAAA,mBAAmB,uBAyB9B"}
1
+ {"version":3,"file":"transpiler.js","sourceRoot":"","sources":["../../../../src/library/webpack/utils/transpiler.ts"],"names":[],"mappings":";;;;AACA,qCAA0C;AAE1C,mCAA0C;AAC1C,gEAAsC;AAuB/B,MAAM,mBAAmB,GAC9B,CAAC,aAA4C,EAAE,gBAAkC,EAAE,EAAE,CACrF,CAAC,IAAgB,EAAE,EAAE;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC;IAE3D,IAAI,MAAM,KAAK,KAAK,EAAE;QACpB,IAAI;YACF,IAAA,cAAO,EAAC,uCAAuC,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;SACtF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC;;OAEjB,CAAC,CAAC;SACF;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAA,mBAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KACjF;IAED,IAAI,MAAM,KAAK,OAAO,EAAE;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,IAAA,eAAW,EAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KACjF;AACH,CAAC,CAAC;AApBS,QAAA,mBAAmB,uBAoB5B;AAEG,MAAM,mBAAmB,GAAG,CACjC,aAA4C,EAC5C,kBAA6C,EAAE,EAC7B,EAAE;IACpB,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,GAAG,aAAa,CAAC;IAClG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;IAEtC,uBACE,QAAQ,EAAE,aAAa,CAAC,SAAS,KAAK,QAAQ,EAC9C,GAAG;QACH,iBAAiB;QACjB,MAAM;QACN,KAAK,EACL,OAAO,EAAE,IAAI,EACb,kBAAkB,EAAE,IAAI,EACxB,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EACvC,iBAAiB;QACjB,0BAA0B,EAC1B,OAAO,EAAE,aAAa,CAAC,OAAO,EAC9B,MAAM,EAAE,aAAa,CAAC,MAAM,EAC5B,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,KAAK,IACd,eAAe,EAClB;AACJ,CAAC,CAAC;AAzBW,QAAA,mBAAmB,uBAyB9B"}
@@ -96,6 +96,10 @@
96
96
  "type": "string"
97
97
  }
98
98
  ]
99
+ },
100
+ "componentsPattern": {
101
+ "title": "Test Regexp to add only files with specific name to list of FS Components",
102
+ "type": "string"
99
103
  }
100
104
  },
101
105
  "additionalProperties": false
@@ -30,6 +30,7 @@ export type GetBuildStats = () => {
30
30
  clientBuildTime?: number;
31
31
  clientModernBuildTime?: number;
32
32
  serverBuildTime?: number;
33
+ maxMemoryRss?: number;
33
34
  };
34
35
  export type BuildType = 'client' | 'server' | 'clientModern';
35
36
  export interface BuilderEvents {
@@ -152,6 +152,10 @@ export interface ApplicationConfigEntry extends CliConfigEntry {
152
152
  * @default "pages"
153
153
  */
154
154
  pagesDir: string | false;
155
+ /**
156
+ * @title Test Regexp to add only files with specific name to list of FS Components
157
+ */
158
+ componentsPattern: string;
155
159
  };
156
160
  /**
157
161
  * @title Configure the options on webpack splitChunks
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/cli",
3
- "version": "2.112.0",
3
+ "version": "2.117.2",
4
4
  "description": "Cli инструмент для сборки и запуска приложений",
5
5
  "files": [
6
6
  "src",
@@ -62,7 +62,7 @@
62
62
  "@svgr/webpack": "^6.5.1",
63
63
  "@tinkoff/browserslist-config": "0.2.5",
64
64
  "@tinkoff/dippy": "0.8.15",
65
- "@tinkoff/is-modern-lib": "2.0.9",
65
+ "@tinkoff/is-modern-lib": "2.0.10",
66
66
  "@tinkoff/logger": "0.10.63",
67
67
  "@tinkoff/minicss-class-generator": "0.2.5",
68
68
  "@tinkoff/package-manager-wrapper": "0.1.9",
@@ -71,7 +71,7 @@
71
71
  "@tinkoff/utils": "^2.1.3",
72
72
  "@tinkoff/webpack-dedupe-plugin": "1.0.5",
73
73
  "@tramvai/build": "3.1.3",
74
- "@tramvai/react": "2.112.0",
74
+ "@tramvai/react": "2.117.2",
75
75
  "@tramvai/tools-check-versions": "0.4.14",
76
76
  "@tramvai/tools-migrate": "0.6.18",
77
77
  "ajv": "^6.12.6",
@@ -136,6 +136,7 @@
136
136
  "postcss-loader": "^7.0.1",
137
137
  "postcss-modules-tilda": "^2.0.0",
138
138
  "postcss-modules-values-replace": "^4.0.0",
139
+ "pretty-bytes": "^5.6.0",
139
140
  "prettyoutput": "^1.2.0",
140
141
  "process": "^0.11.10",
141
142
  "promise-queue": "^2.2.5",
@@ -157,15 +158,16 @@
157
158
  "v8-compile-cache": "^2.3.0",
158
159
  "validate-npm-package-name": "^3.0.0",
159
160
  "wait-on": "^5.3.0",
160
- "webpack": "5.85.0",
161
+ "webpack": "5.87.0",
161
162
  "webpack-build-notifier": "^2.3.0",
162
163
  "webpack-bundle-analyzer": "^4.9.0",
163
164
  "webpack-chain": "^6.5.1",
164
165
  "webpack-dev-middleware": "^6.1.1",
165
- "webpack-hot-middleware": "^2.25.3",
166
- "webpack-stats-plugin": "^1.1.1",
166
+ "webpack-hot-middleware": "^2.25.4",
167
+ "webpack-stats-plugin": "^1.1.3",
167
168
  "webpackbar": "^5.0.2",
168
- "workbox-webpack-plugin": "^6.5.4",
169
+ "workbox-build": "^6.6.1",
170
+ "workbox-webpack-plugin": "^6.6.1",
169
171
  "wrap-ansi": "^7.0.0"
170
172
  },
171
173
  "devDependencies": {
package/schema.json CHANGED
@@ -117,6 +117,10 @@
117
117
  "type": "string"
118
118
  }
119
119
  ]
120
+ },
121
+ "componentsPattern": {
122
+ "title": "Test Regexp to add only files with specific name to list of FS Components",
123
+ "type": "string"
120
124
  }
121
125
  },
122
126
  "additionalProperties": false
@@ -3,27 +3,14 @@ import type { Params as OriginalBuildParams, Result as OriginalBuildResult } fro
3
3
  import { COMMAND_PARAMETERS_TOKEN, COMMAND_RUNNER_TOKEN } from '../../di/tokens';
4
4
  import type { Params, Result } from './index';
5
5
  import type { Samples, RunStats } from './types';
6
- import { getSamplesStats } from './utils/stats';
7
6
  import { clearCacheDirectory } from './utils/clearCache';
7
+ import { getResultStats } from './utils/stats';
8
8
 
9
9
  export interface BuildParams extends Params {
10
10
  command: 'build';
11
11
  commandOptions: OriginalBuildParams;
12
12
  }
13
13
 
14
- const getResultStats = ({
15
- clientSamples,
16
- serverSamples,
17
- }: {
18
- clientSamples: number[];
19
- serverSamples: number[];
20
- }): RunStats => {
21
- return {
22
- client: getSamplesStats(clientSamples),
23
- server: getSamplesStats(serverSamples),
24
- };
25
- };
26
-
27
14
  export interface BuildResult extends Result {
28
15
  noCache?: RunStats;
29
16
  cache?: RunStats;
@@ -41,6 +28,7 @@ const runBuildCommand = async (
41
28
  ): Promise<Samples> => {
42
29
  const clientSamples: number[] = Array(times);
43
30
  const serverSamples: number[] = Array(times);
31
+ const maxMemoryRssSamples: number[] = Array(times);
44
32
 
45
33
  const { commandOptions } = di.get(COMMAND_PARAMETERS_TOKEN) as BuildParams;
46
34
 
@@ -56,11 +44,13 @@ const runBuildCommand = async (
56
44
 
57
45
  clientSamples[i] = stats.clientBuildTime;
58
46
  serverSamples[i] = stats.serverBuildTime;
47
+ maxMemoryRssSamples[i] = stats.maxMemoryRss;
59
48
  }
60
49
 
61
50
  return {
62
51
  clientSamples,
63
52
  serverSamples,
53
+ maxMemoryRssSamples,
64
54
  };
65
55
  };
66
56
 
@@ -1,7 +1,11 @@
1
1
  import type { Provider } from '@tinkoff/dippy';
2
2
  import { provide } from '@tinkoff/dippy';
3
3
  import { createCommand } from '../../commands/createCommand';
4
- import { COMMAND_PARAMETERS_TOKEN, UI_OS_NOTIFY_TOKEN } from '../../di/tokens';
4
+ import {
5
+ COMMAND_PARAMETERS_TOKEN,
6
+ UI_OS_NOTIFY_TOKEN,
7
+ WITH_BUILD_STATS_TOKEN,
8
+ } from '../../di/tokens';
5
9
  import type { BuildParams, BuildResult } from './build';
6
10
  import { benchmarkBuild } from './build';
7
11
  import type { StartParams, StartResult } from './start';
@@ -41,5 +45,9 @@ export default createCommand({
41
45
  // disable notification in benchmark as it is annoying and not needed actually
42
46
  useValue: false,
43
47
  }),
48
+ {
49
+ provide: WITH_BUILD_STATS_TOKEN,
50
+ useValue: true,
51
+ },
44
52
  ],
45
53
  });
@@ -3,8 +3,8 @@ import type { Params as OriginalStartParams, Result as OriginalStartResult } fro
3
3
  import { COMMAND_PARAMETERS_TOKEN, COMMAND_RUNNER_TOKEN } from '../../di/tokens';
4
4
  import type { Params, Result } from './index';
5
5
  import type { Samples, RunStats } from './types';
6
- import { getSamplesStats } from './utils/stats';
7
6
  import { clearCacheDirectory } from './utils/clearCache';
7
+ import { getResultStats } from './utils/stats';
8
8
 
9
9
  const REBUILD_WARMUP_TIMES = 3;
10
10
 
@@ -13,19 +13,6 @@ export interface StartParams extends Params {
13
13
  commandOptions: OriginalStartParams;
14
14
  }
15
15
 
16
- const getResultStats = ({
17
- clientSamples,
18
- serverSamples,
19
- }: {
20
- clientSamples: number[];
21
- serverSamples: number[];
22
- }): RunStats => {
23
- return {
24
- client: getSamplesStats(clientSamples),
25
- server: getSamplesStats(serverSamples),
26
- };
27
- };
28
-
29
16
  export interface StartResult extends Result {
30
17
  noCache?: RunStats;
31
18
  cache?: RunStats;
@@ -44,6 +31,7 @@ const runStartCommand = async (
44
31
  ): Promise<Samples> => {
45
32
  const clientSamples: number[] = Array(times);
46
33
  const serverSamples: number[] = Array(times);
34
+ const maxMemoryRssSamples: number[] = Array(times);
47
35
 
48
36
  const { commandOptions } = di.get(COMMAND_PARAMETERS_TOKEN) as StartParams;
49
37
 
@@ -61,17 +49,20 @@ const runStartCommand = async (
61
49
 
62
50
  clientSamples[i] = stats.clientBuildTime;
63
51
  serverSamples[i] = stats.serverBuildTime;
52
+ maxMemoryRssSamples[i] = stats.maxMemoryRss;
64
53
  }
65
54
 
66
55
  return {
67
56
  clientSamples,
68
57
  serverSamples,
58
+ maxMemoryRssSamples,
69
59
  };
70
60
  };
71
61
 
72
62
  const runRebuild = async (di: Container, { times }: { times: number }): Promise<Samples> => {
73
63
  const clientSamples: number[] = Array(times);
74
64
  const serverSamples: number[] = Array(times);
65
+ const maxMemoryRssSamples: number[] = Array(times);
75
66
  const { commandOptions } = di.get(COMMAND_PARAMETERS_TOKEN) as StartParams;
76
67
 
77
68
  const { close, invalidate, getBuildStats } = await (di
@@ -90,6 +81,7 @@ const runRebuild = async (di: Container, { times }: { times: number }): Promise<
90
81
 
91
82
  clientSamples[i] = stats.clientBuildTime;
92
83
  serverSamples[i] = stats.serverBuildTime;
84
+ maxMemoryRssSamples[i] = stats.maxMemoryRss;
93
85
  }
94
86
 
95
87
  await close();
@@ -97,6 +89,7 @@ const runRebuild = async (di: Container, { times }: { times: number }): Promise<
97
89
  return {
98
90
  clientSamples,
99
91
  serverSamples,
92
+ maxMemoryRssSamples,
100
93
  };
101
94
  };
102
95
 
@@ -6,9 +6,14 @@ export interface Stats {
6
6
  variance: number;
7
7
  }
8
8
 
9
- export type Samples = { clientSamples: Stats['samples']; serverSamples: Stats['samples'] };
9
+ export type Samples = {
10
+ clientSamples: Stats['samples'];
11
+ serverSamples: Stats['samples'];
12
+ maxMemoryRssSamples: Stats['samples'];
13
+ };
10
14
 
11
15
  export type RunStats = {
12
16
  client: Stats;
13
17
  server: Stats;
18
+ maxMemoryRss: Stats;
14
19
  };
@@ -1,4 +1,4 @@
1
- import type { Stats } from '../types';
1
+ import type { RunStats, Stats } from '../types';
2
2
 
3
3
  export const getSamplesStats = (samples: number[]): Stats => {
4
4
  const n = samples.length;
@@ -27,3 +27,19 @@ export const getSamplesStats = (samples: number[]): Stats => {
27
27
  variance,
28
28
  };
29
29
  };
30
+
31
+ export const getResultStats = ({
32
+ clientSamples,
33
+ serverSamples,
34
+ maxMemoryRssSamples,
35
+ }: {
36
+ clientSamples: number[];
37
+ serverSamples: number[];
38
+ maxMemoryRssSamples: number[];
39
+ }): RunStats => {
40
+ return {
41
+ client: getSamplesStats(clientSamples),
42
+ server: getSamplesStats(serverSamples),
43
+ maxMemoryRss: getSamplesStats(maxMemoryRssSamples),
44
+ };
45
+ };
@@ -20,6 +20,7 @@ export type Params = WithConfig<{
20
20
  showConfig?: boolean;
21
21
  env?: Record<string, string>;
22
22
  fileCache?: boolean;
23
+ withBuildStats?: boolean;
23
24
 
24
25
  // `package` target parameters
25
26
  watchMode?: boolean;
@@ -120,8 +120,8 @@ describe('@tramvai/cli start command', () => {
120
120
 
121
121
  expect(pagesConfig).toEqual({
122
122
  routes: {
123
- '@/routes/about': {},
124
- '@/routes/home': {},
123
+ '@/routes/about/index': {},
124
+ '@/routes/home/index': {},
125
125
  },
126
126
  pages: {},
127
127
  layouts: {},
@@ -24,6 +24,7 @@ export type Params = WithConfig<{
24
24
  noClientRebuild?: boolean;
25
25
  resolveSymlinks?: boolean;
26
26
  showConfig?: boolean;
27
+ withBuildStats?: boolean;
27
28
  // @todo: not working?
28
29
  env?: Record<string, string>;
29
30
  onlyBundles?: string[];
@@ -1,7 +1,7 @@
1
1
  import type { Provider } from '@tinkoff/dippy';
2
2
  import { provide } from '@tinkoff/dippy';
3
3
  import { EventEmitter } from 'events';
4
- import { CONFIG_MANAGER_TOKEN } from '../../../di/tokens';
4
+ import { CONFIG_MANAGER_TOKEN, WITH_BUILD_STATS_TOKEN } from '../../../di/tokens';
5
5
  import { closeWorkerPoolTranspiler } from '../../../library/webpack/utils/workersPool';
6
6
  import {
7
7
  CLOSE_HANDLER_TOKEN,
@@ -14,23 +14,34 @@ import {
14
14
  } from '../tokens';
15
15
  import { calculateBuildTime } from '../utils/calculateBuildTime';
16
16
  import { emitWebpackEvents } from '../utils/webpackEvents';
17
+ import { maxMemoryRss } from '../utils/maxMemoryRss';
17
18
 
18
19
  export const sharedProviders: Provider[] = [
19
20
  provide({
20
21
  provide: GET_BUILD_STATS_TOKEN,
21
- useFactory: ({ clientCompiler, clientModernCompiler, serverCompiler }) => {
22
+ useFactory: ({ withBuildStats, clientCompiler, clientModernCompiler, serverCompiler }) => {
23
+ if (!withBuildStats) {
24
+ return () => {
25
+ return {};
26
+ };
27
+ }
28
+
22
29
  const getClientTime = clientCompiler && calculateBuildTime(clientCompiler);
23
30
  const getClientModernTime = clientModernCompiler && calculateBuildTime(clientModernCompiler);
24
31
  const getServerTime = serverCompiler && calculateBuildTime(serverCompiler);
25
- return (() => {
32
+
33
+ const getMaxMemoryRss = maxMemoryRss();
34
+ return () => {
26
35
  return {
27
36
  clientBuildTime: getClientTime?.(),
28
37
  clientModernBuildTime: getClientModernTime?.(),
29
38
  serverBuildTime: getServerTime?.(),
39
+ maxMemoryRss: getMaxMemoryRss?.(),
30
40
  };
31
- }) as typeof GET_BUILD_STATS_TOKEN;
41
+ };
32
42
  },
33
43
  deps: {
44
+ withBuildStats: { token: WITH_BUILD_STATS_TOKEN, optional: true },
34
45
  clientCompiler: { token: WEBPACK_CLIENT_COMPILER_TOKEN, optional: true },
35
46
  clientModernCompiler: { token: WEBPACK_CLIENT_MODERN_COMPILER_TOKEN, optional: true },
36
47
  serverCompiler: { token: WEBPACK_SERVER_COMPILER_TOKEN, optional: true },
@@ -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