@tramvai/cli 6.68.4 → 6.77.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 (118) hide show
  1. package/README.md +1 -1
  2. package/bin/const.js +5 -0
  3. package/bin/platform.js +12 -6
  4. package/bin/spawn.js +6 -0
  5. package/lib/api/analyze/index.d.ts.map +1 -1
  6. package/lib/api/analyze/index.js +1 -13
  7. package/lib/api/analyze/index.js.map +1 -1
  8. package/lib/api/index.js +1 -1
  9. package/lib/api/index.js.map +1 -1
  10. package/lib/api/start/application.experimental.d.ts.map +1 -1
  11. package/lib/api/start/application.experimental.js +13 -0
  12. package/lib/api/start/application.experimental.js.map +1 -1
  13. package/lib/api/start/index.d.ts +1 -0
  14. package/lib/api/start/index.d.ts.map +1 -1
  15. package/lib/api/start/index.js.map +1 -1
  16. package/lib/builder/webpack/analyzePlugins/rsdoctor.d.ts +2 -2
  17. package/lib/builder/webpack/analyzePlugins/rsdoctor.d.ts.map +1 -1
  18. package/lib/builder/webpack/analyzePlugins/rsdoctor.js +4 -2
  19. package/lib/builder/webpack/analyzePlugins/rsdoctor.js.map +1 -1
  20. package/lib/builder/webpack/index.d.ts.map +1 -1
  21. package/lib/builder/webpack/index.js +14 -12
  22. package/lib/builder/webpack/index.js.map +1 -1
  23. package/lib/builder/webpack/providers/build/client.d.ts.map +1 -1
  24. package/lib/builder/webpack/providers/build/client.js +3 -2
  25. package/lib/builder/webpack/providers/build/client.js.map +1 -1
  26. package/lib/builder/webpack/providers/build/server.d.ts.map +1 -1
  27. package/lib/builder/webpack/providers/build/server.js +3 -2
  28. package/lib/builder/webpack/providers/build/server.js.map +1 -1
  29. package/lib/builder/webpack/providers/shared.d.ts.map +1 -1
  30. package/lib/builder/webpack/providers/shared.js +31 -1
  31. package/lib/builder/webpack/providers/shared.js.map +1 -1
  32. package/lib/builder/webpack/providers/start/shared.d.ts.map +1 -1
  33. package/lib/builder/webpack/providers/start/shared.js +6 -2
  34. package/lib/builder/webpack/providers/start/shared.js.map +1 -1
  35. package/lib/builder/webpack/tokens.d.ts +2 -0
  36. package/lib/builder/webpack/tokens.d.ts.map +1 -1
  37. package/lib/cli/index.d.ts.map +1 -1
  38. package/lib/cli/index.js +12 -12
  39. package/lib/cli/index.js.map +1 -1
  40. package/lib/commands/analyze/command.d.ts +1 -1
  41. package/lib/commands/analyze/command.d.ts.map +1 -1
  42. package/lib/commands/build/command.d.ts.map +1 -1
  43. package/lib/commands/build/command.js +5 -0
  44. package/lib/commands/build/command.js.map +1 -1
  45. package/lib/commands/new/steps/installDependencies.d.ts.map +1 -1
  46. package/lib/commands/new/steps/installDependencies.js +3 -4
  47. package/lib/commands/new/steps/installDependencies.js.map +1 -1
  48. package/lib/commands/start/command.d.ts.map +1 -1
  49. package/lib/commands/start/command.js +5 -0
  50. package/lib/commands/start/command.js.map +1 -1
  51. package/lib/commands/static/application.d.ts.map +1 -1
  52. package/lib/commands/static/application.js +9 -3
  53. package/lib/commands/static/application.js.map +1 -1
  54. package/lib/commands/static/generate.d.ts.map +1 -1
  55. package/lib/commands/static/generate.js +16 -12
  56. package/lib/commands/static/generate.js.map +1 -1
  57. package/lib/config/configManager.d.ts +1 -0
  58. package/lib/config/configManager.d.ts.map +1 -1
  59. package/lib/config/configManager.js +1 -0
  60. package/lib/config/configManager.js.map +1 -1
  61. package/lib/di/tokens/config.d.ts +1 -0
  62. package/lib/di/tokens/config.d.ts.map +1 -1
  63. package/lib/library/webpack/blocks/css.d.ts.map +1 -1
  64. package/lib/library/webpack/blocks/css.js +23 -9
  65. package/lib/library/webpack/blocks/css.js.map +1 -1
  66. package/lib/library/webpack/blocks/js.d.ts.map +1 -1
  67. package/lib/library/webpack/blocks/js.js +52 -11
  68. package/lib/library/webpack/blocks/js.js.map +1 -1
  69. package/lib/library/webpack/common/main.d.ts.map +1 -1
  70. package/lib/library/webpack/common/main.js +2 -1
  71. package/lib/library/webpack/common/main.js.map +1 -1
  72. package/lib/schema/autogeneratedSchema.json +204 -15
  73. package/lib/typings/configEntry/cli.d.ts +5 -0
  74. package/lib/typings/configEntry/cli.d.ts.map +1 -1
  75. package/lib/utils/dev-app/request.d.ts +1 -0
  76. package/lib/utils/dev-app/request.d.ts.map +1 -1
  77. package/lib/utils/dev-app/request.js +10 -1
  78. package/lib/utils/dev-app/request.js.map +1 -1
  79. package/package.json +37 -37
  80. package/schema.json +204 -15
  81. package/src/api/analyze/index.ts +3 -16
  82. package/src/api/index.ts +1 -1
  83. package/src/api/start/application.experimental.ts +14 -0
  84. package/src/api/start/index.ts +1 -0
  85. package/src/builder/webpack/analyzePlugins/rsdoctor.ts +6 -3
  86. package/src/builder/webpack/index.ts +16 -21
  87. package/src/builder/webpack/providers/build/client.ts +7 -2
  88. package/src/builder/webpack/providers/build/server.ts +7 -2
  89. package/src/builder/webpack/providers/shared.ts +45 -1
  90. package/src/builder/webpack/providers/start/shared.ts +7 -2
  91. package/src/cli/index.ts +3 -2
  92. package/src/commands/analyze/command.ts +1 -1
  93. package/src/commands/build/command.ts +6 -0
  94. package/src/commands/new/steps/installDependencies.ts +3 -4
  95. package/src/commands/new/templates/app/block/shared/header/Header.spec.tsx.hbs +7 -5
  96. package/src/commands/new/templates/shared/package.json.hbs +1 -1
  97. package/src/commands/start/command.ts +6 -0
  98. package/src/commands/static/application.ts +11 -4
  99. package/src/commands/static/generate.ts +19 -12
  100. package/src/config/configManager.ts +2 -0
  101. package/src/library/webpack/blocks/css.ts +24 -8
  102. package/src/library/webpack/blocks/js.ts +59 -12
  103. package/src/library/webpack/common/main.ts +6 -2
  104. package/src/models/config.spec.ts +4 -0
  105. package/src/schema/autogeneratedSchema.json +204 -15
  106. package/src/schema/tramvai.spec.ts +2 -0
  107. package/src/typings/configEntry/cli.ts +6 -0
  108. package/src/utils/dev-app/request.ts +15 -0
  109. package/lib/api/analyze/providers/shared.d.ts +0 -3
  110. package/lib/api/analyze/providers/shared.d.ts.map +0 -1
  111. package/lib/api/analyze/providers/shared.js +0 -23
  112. package/lib/api/analyze/providers/shared.js.map +0 -1
  113. package/lib/builder/webpack/providers/analyze/shared.d.ts +0 -3
  114. package/lib/builder/webpack/providers/analyze/shared.d.ts.map +0 -1
  115. package/lib/builder/webpack/providers/analyze/shared.js +0 -137
  116. package/lib/builder/webpack/providers/analyze/shared.js.map +0 -1
  117. package/src/api/analyze/providers/shared.ts +0 -26
  118. package/src/builder/webpack/providers/analyze/shared.ts +0 -156
package/schema.json CHANGED
@@ -933,6 +933,69 @@
933
933
  "type": "string"
934
934
  }
935
935
  ]
936
+ },
937
+ "include": {
938
+ "cli_overridable": "",
939
+ "title": "customize transpiling of node_modules in prod/dev environments",
940
+ "default": "only-modern",
941
+ "anyOf": [
942
+ {
943
+ "type": "array",
944
+ "items": {
945
+ "type": "string"
946
+ }
947
+ },
948
+ {
949
+ "type": "object",
950
+ "properties": {
951
+ "development": {
952
+ "anyOf": [
953
+ {
954
+ "type": "array",
955
+ "items": {
956
+ "type": "string"
957
+ }
958
+ },
959
+ {
960
+ "enum": [
961
+ "all",
962
+ "none",
963
+ "only-modern"
964
+ ],
965
+ "type": "string"
966
+ }
967
+ ]
968
+ },
969
+ "production": {
970
+ "anyOf": [
971
+ {
972
+ "type": "array",
973
+ "items": {
974
+ "type": "string"
975
+ }
976
+ },
977
+ {
978
+ "enum": [
979
+ "all",
980
+ "none",
981
+ "only-modern"
982
+ ],
983
+ "type": "string"
984
+ }
985
+ ]
986
+ }
987
+ },
988
+ "additionalProperties": false
989
+ },
990
+ {
991
+ "enum": [
992
+ "all",
993
+ "none",
994
+ "only-modern"
995
+ ],
996
+ "type": "string"
997
+ }
998
+ ]
936
999
  }
937
1000
  },
938
1001
  "additionalProperties": false
@@ -1311,23 +1374,23 @@
1311
1374
  "dotAll": {
1312
1375
  "type": "boolean"
1313
1376
  },
1314
- "__@match@8920": {
1377
+ "__@match@9310": {
1315
1378
  "type": "object",
1316
1379
  "additionalProperties": false
1317
1380
  },
1318
- "__@replace@8922": {
1381
+ "__@replace@9312": {
1319
1382
  "type": "object",
1320
1383
  "additionalProperties": false
1321
1384
  },
1322
- "__@search@8925": {
1385
+ "__@search@9315": {
1323
1386
  "type": "object",
1324
1387
  "additionalProperties": false
1325
1388
  },
1326
- "__@split@8927": {
1389
+ "__@split@9317": {
1327
1390
  "type": "object",
1328
1391
  "additionalProperties": false
1329
1392
  },
1330
- "__@matchAll@8929": {
1393
+ "__@matchAll@9319": {
1331
1394
  "type": "object",
1332
1395
  "additionalProperties": false
1333
1396
  }
@@ -1844,6 +1907,69 @@
1844
1907
  "type": "string"
1845
1908
  }
1846
1909
  ]
1910
+ },
1911
+ "include": {
1912
+ "cli_overridable": "",
1913
+ "title": "customize transpiling of node_modules in prod/dev environments",
1914
+ "default": "only-modern",
1915
+ "anyOf": [
1916
+ {
1917
+ "type": "array",
1918
+ "items": {
1919
+ "type": "string"
1920
+ }
1921
+ },
1922
+ {
1923
+ "type": "object",
1924
+ "properties": {
1925
+ "development": {
1926
+ "anyOf": [
1927
+ {
1928
+ "type": "array",
1929
+ "items": {
1930
+ "type": "string"
1931
+ }
1932
+ },
1933
+ {
1934
+ "enum": [
1935
+ "all",
1936
+ "none",
1937
+ "only-modern"
1938
+ ],
1939
+ "type": "string"
1940
+ }
1941
+ ]
1942
+ },
1943
+ "production": {
1944
+ "anyOf": [
1945
+ {
1946
+ "type": "array",
1947
+ "items": {
1948
+ "type": "string"
1949
+ }
1950
+ },
1951
+ {
1952
+ "enum": [
1953
+ "all",
1954
+ "none",
1955
+ "only-modern"
1956
+ ],
1957
+ "type": "string"
1958
+ }
1959
+ ]
1960
+ }
1961
+ },
1962
+ "additionalProperties": false
1963
+ },
1964
+ {
1965
+ "enum": [
1966
+ "all",
1967
+ "none",
1968
+ "only-modern"
1969
+ ],
1970
+ "type": "string"
1971
+ }
1972
+ ]
1847
1973
  }
1848
1974
  },
1849
1975
  "additionalProperties": false
@@ -2115,23 +2241,23 @@
2115
2241
  "dotAll": {
2116
2242
  "type": "boolean"
2117
2243
  },
2118
- "__@match@8920": {
2244
+ "__@match@9310": {
2119
2245
  "type": "object",
2120
2246
  "additionalProperties": false
2121
2247
  },
2122
- "__@replace@8922": {
2248
+ "__@replace@9312": {
2123
2249
  "type": "object",
2124
2250
  "additionalProperties": false
2125
2251
  },
2126
- "__@search@8925": {
2252
+ "__@search@9315": {
2127
2253
  "type": "object",
2128
2254
  "additionalProperties": false
2129
2255
  },
2130
- "__@split@8927": {
2256
+ "__@split@9317": {
2131
2257
  "type": "object",
2132
2258
  "additionalProperties": false
2133
2259
  },
2134
- "__@matchAll@8929": {
2260
+ "__@matchAll@9319": {
2135
2261
  "type": "object",
2136
2262
  "additionalProperties": false
2137
2263
  }
@@ -2648,6 +2774,69 @@
2648
2774
  "type": "string"
2649
2775
  }
2650
2776
  ]
2777
+ },
2778
+ "include": {
2779
+ "cli_overridable": "",
2780
+ "title": "customize transpiling of node_modules in prod/dev environments",
2781
+ "default": "only-modern",
2782
+ "anyOf": [
2783
+ {
2784
+ "type": "array",
2785
+ "items": {
2786
+ "type": "string"
2787
+ }
2788
+ },
2789
+ {
2790
+ "type": "object",
2791
+ "properties": {
2792
+ "development": {
2793
+ "anyOf": [
2794
+ {
2795
+ "type": "array",
2796
+ "items": {
2797
+ "type": "string"
2798
+ }
2799
+ },
2800
+ {
2801
+ "enum": [
2802
+ "all",
2803
+ "none",
2804
+ "only-modern"
2805
+ ],
2806
+ "type": "string"
2807
+ }
2808
+ ]
2809
+ },
2810
+ "production": {
2811
+ "anyOf": [
2812
+ {
2813
+ "type": "array",
2814
+ "items": {
2815
+ "type": "string"
2816
+ }
2817
+ },
2818
+ {
2819
+ "enum": [
2820
+ "all",
2821
+ "none",
2822
+ "only-modern"
2823
+ ],
2824
+ "type": "string"
2825
+ }
2826
+ ]
2827
+ }
2828
+ },
2829
+ "additionalProperties": false
2830
+ },
2831
+ {
2832
+ "enum": [
2833
+ "all",
2834
+ "none",
2835
+ "only-modern"
2836
+ ],
2837
+ "type": "string"
2838
+ }
2839
+ ]
2651
2840
  }
2652
2841
  },
2653
2842
  "additionalProperties": false
@@ -2919,23 +3108,23 @@
2919
3108
  "dotAll": {
2920
3109
  "type": "boolean"
2921
3110
  },
2922
- "__@match@8920": {
3111
+ "__@match@9310": {
2923
3112
  "type": "object",
2924
3113
  "additionalProperties": false
2925
3114
  },
2926
- "__@replace@8922": {
3115
+ "__@replace@9312": {
2927
3116
  "type": "object",
2928
3117
  "additionalProperties": false
2929
3118
  },
2930
- "__@search@8925": {
3119
+ "__@search@9315": {
2931
3120
  "type": "object",
2932
3121
  "additionalProperties": false
2933
3122
  },
2934
- "__@split@8927": {
3123
+ "__@split@9317": {
2935
3124
  "type": "object",
2936
3125
  "additionalProperties": false
2937
3126
  },
2938
- "__@matchAll@8929": {
3127
+ "__@matchAll@9319": {
2939
3128
  "type": "object",
2940
3129
  "additionalProperties": false
2941
3130
  }
@@ -1,8 +1,5 @@
1
1
  import type { Provider } from '@tinkoff/dippy';
2
2
  import { createCommand } from '../../commands/createCommand';
3
- import { ABSTRACT_BUILDER_FACTORY_TOKEN, COMMAND_PARAMETERS_TOKEN } from '../../di/tokens';
4
- import { registerProviders } from '../../utils/di';
5
- import { sharedProviders } from './providers/shared';
6
3
 
7
4
  export interface Params {
8
5
  target: string;
@@ -17,18 +14,8 @@ export type AnalyzeCommand = (params: Params, providers?: Provider[]) => Promise
17
14
  export default createCommand({
18
15
  name: 'analyze',
19
16
  command: async (di): Promise<void> => {
20
- const { plugin } = di.get(COMMAND_PARAMETERS_TOKEN) as Params;
21
-
22
- registerProviders(di, sharedProviders);
23
-
24
- const builderFactory = di.get(ABSTRACT_BUILDER_FACTORY_TOKEN);
25
- const builder = await builderFactory.createBuilder('webpack', {
26
- options: {
27
- shouldBuildClient: true,
28
- shouldBuildServer: false,
29
- },
30
- });
31
-
32
- await builder.analyze({ plugin });
17
+ throw new Error(
18
+ 'tramvai analyze is deprecated, please use `tramvai start|build --analyze=pluginName`\n'
19
+ );
33
20
  },
34
21
  });
package/src/api/index.ts CHANGED
@@ -33,8 +33,8 @@ const app = createApp({
33
33
  commands: {
34
34
  start: () => import('./start'),
35
35
  build: () => import('./build'),
36
- benchmark: () => import('./benchmark'),
37
36
  analyze: () => import('./analyze'),
37
+ benchmark: () => import('./benchmark'),
38
38
  'start-prod': () => import('./start-prod'),
39
39
  },
40
40
  providers: [
@@ -26,6 +26,7 @@ export const startApplicationExperimental = async (di: Container): Result => {
26
26
  mode: 'development',
27
27
  benchmark: options.benchmark,
28
28
  buildType: options.buildType,
29
+ analyze: options.analyze,
29
30
  port: options.port,
30
31
  host: options.host,
31
32
  staticPort: options.staticPort,
@@ -276,6 +277,19 @@ function mapTramvaiJsonToNewTsConfig({ rootDir }: { rootDir: string }) {
276
277
  }
277
278
  mappedProject.webpack.devtool = applicationProject.webpack.devtool;
278
279
  }
280
+ if (applicationProject.experiments?.transpilation) {
281
+ const applicationProjectInclude = applicationProject.experiments.transpilation.include;
282
+ mappedProject.transpilation = {
283
+ include: {
284
+ development:
285
+ typeof applicationProjectInclude === 'string' ||
286
+ Array.isArray(applicationProjectInclude)
287
+ ? applicationProjectInclude
288
+ : // @ts-ignore
289
+ applicationProjectInclude.development,
290
+ },
291
+ };
292
+ }
279
293
  if (applicationProject.experiments?.pwa) {
280
294
  mappedProject.pwa = {
281
295
  workbox: {
@@ -24,6 +24,7 @@ export type Params = WithConfig<{
24
24
  noClientRebuild?: boolean;
25
25
  resolveSymlinks?: boolean;
26
26
  showConfig?: boolean;
27
+ analyze?: false | 'bundle' | 'whybundled' | 'statoscope' | 'rsdoctor';
27
28
  benchmark?: boolean;
28
29
  withBuildStats?: boolean;
29
30
  // @todo: not working?
@@ -1,4 +1,4 @@
1
- import { RsdoctorWebpackPlugin } from '@rsdoctor/webpack-plugin';
1
+ import type { RsdoctorWebpackPlugin } from '@rsdoctor/webpack-plugin';
2
2
  import { AnalyzePlugin } from '../types';
3
3
 
4
4
  type options = ConstructorParameters<typeof RsdoctorWebpackPlugin<[]>>;
@@ -7,8 +7,11 @@ export class RsdoctorAnalyzePlugin extends AnalyzePlugin {
7
7
 
8
8
  options: options = [];
9
9
 
10
- plugin = RsdoctorWebpackPlugin;
11
-
12
10
  // rsdoctor поднимает dev server
13
11
  afterBuild = () => new Promise(() => null);
12
+
13
+ get plugin() {
14
+ // eslint-disable-next-line import/no-unresolved
15
+ return require('@rsdoctor/webpack-plugin').RsdoctorWebpackMultiplePlugin;
16
+ }
14
17
  }
@@ -27,7 +27,6 @@ import { buildClientProviders } from './providers/build/client';
27
27
  import { buildServerProviders } from './providers/build/server';
28
28
  import { CONFIG_MANAGER_TOKEN } from '../../di/tokens';
29
29
  import { buildApplicationServerProviders } from './providers/build/application/server';
30
- import { analyzeSharedProviders } from './providers/analyze/shared';
31
30
 
32
31
  const BUILDER_NAME = 'webpack';
33
32
 
@@ -53,6 +52,14 @@ export const webpackProviders: Provider[] = [
53
52
  ...(shouldBuildServer ? startServerProviders : []),
54
53
  ]);
55
54
 
55
+ const configManager = di.get(CONFIG_MANAGER_TOKEN);
56
+ if (configManager.analyze) {
57
+ di.register({
58
+ provide: WEBPACK_ANALYZE_PLUGIN_NAME_TOKEN,
59
+ useValue: configManager.analyze,
60
+ });
61
+ }
62
+
56
63
  await runHandlers(di.get({ token: INIT_HANDLER_TOKEN, optional: true, multi: true }));
57
64
 
58
65
  const getBuildStats = di.get(GET_BUILD_STATS_TOKEN);
@@ -89,9 +96,13 @@ export const webpackProviders: Provider[] = [
89
96
  ...(shouldBuildServer ? buildServerProviders : []),
90
97
  ]);
91
98
 
92
- await runHandlers(di.get({ token: INIT_HANDLER_TOKEN, optional: true, multi: true }));
93
-
94
99
  const configManager = di.get(CONFIG_MANAGER_TOKEN);
100
+ if (configManager.analyze) {
101
+ di.register({
102
+ provide: WEBPACK_ANALYZE_PLUGIN_NAME_TOKEN,
103
+ useValue: configManager.analyze,
104
+ });
105
+ }
95
106
 
96
107
  if (configManager.type === 'application') {
97
108
  registerProviders(di, [
@@ -99,6 +110,8 @@ export const webpackProviders: Provider[] = [
99
110
  ]);
100
111
  }
101
112
 
113
+ await runHandlers(di.get({ token: INIT_HANDLER_TOKEN, optional: true, multi: true }));
114
+
102
115
  const getBuildStats = di.get(GET_BUILD_STATS_TOKEN);
103
116
 
104
117
  await runHandlers(
@@ -113,24 +126,6 @@ export const webpackProviders: Provider[] = [
113
126
  getBuildStats,
114
127
  };
115
128
  },
116
- async analyze({ plugin }) {
117
- di.register({
118
- provide: WEBPACK_ANALYZE_PLUGIN_NAME_TOKEN,
119
- useValue: plugin || 'bundle',
120
- });
121
-
122
- registerProviders(di, analyzeSharedProviders);
123
-
124
- await runHandlers(di.get({ token: INIT_HANDLER_TOKEN, optional: true, multi: true }));
125
-
126
- await runHandlers(
127
- di.get({ token: PROCESS_HANDLER_TOKEN, optional: true, multi: true })
128
- );
129
-
130
- await runHandlers(
131
- di.get({ token: CLOSE_HANDLER_TOKEN, optional: true, multi: true })
132
- );
133
- },
134
129
  on(event, callback) {
135
130
  di.get(EVENT_EMITTER_TOKEN).on(event, callback);
136
131
  },
@@ -6,6 +6,7 @@ import {
6
6
  CLIENT_CONFIG_MANAGER_TOKEN,
7
7
  CLOSE_HANDLER_TOKEN,
8
8
  PROCESS_HANDLER_TOKEN,
9
+ WEBPACK_ANALYZE_PLUGIN_TOKEN,
9
10
  WEBPACK_CLIENT_COMPILER_TOKEN,
10
11
  WEBPACK_CLIENT_CONFIG_TOKEN,
11
12
  } from '../../tokens';
@@ -27,12 +28,16 @@ export const buildClientProviders: Provider[] = [
27
28
  }),
28
29
  provide({
29
30
  provide: WEBPACK_CLIENT_COMPILER_TOKEN,
30
- useFactory: ({ webpackConfig, di }) => {
31
- return createCompiler(toWebpackConfig(webpackConfig), di);
31
+ useFactory: ({ webpackConfig, di, analyzePlugin }) => {
32
+ return createCompiler(
33
+ toWebpackConfig(analyzePlugin ? analyzePlugin.patchConfig(webpackConfig) : webpackConfig),
34
+ di
35
+ );
32
36
  },
33
37
  deps: {
34
38
  webpackConfig: WEBPACK_CLIENT_CONFIG_TOKEN,
35
39
  di: DI_TOKEN,
40
+ analyzePlugin: { token: WEBPACK_ANALYZE_PLUGIN_TOKEN, optional: true },
36
41
  },
37
42
  }),
38
43
  provide({
@@ -8,6 +8,7 @@ import {
8
8
  INIT_HANDLER_TOKEN,
9
9
  PROCESS_HANDLER_TOKEN,
10
10
  SERVER_CONFIG_MANAGER_TOKEN,
11
+ WEBPACK_ANALYZE_PLUGIN_TOKEN,
11
12
  WEBPACK_SERVER_COMPILER_TOKEN,
12
13
  WEBPACK_SERVER_CONFIG_TOKEN,
13
14
  } from '../../tokens';
@@ -18,12 +19,16 @@ import { createCompiler } from '../../utils/compiler';
18
19
  export const buildServerProviders: Provider[] = [
19
20
  provide({
20
21
  provide: WEBPACK_SERVER_COMPILER_TOKEN,
21
- useFactory: ({ webpackConfig, di }) => {
22
- return createCompiler(toWebpackConfig(webpackConfig), di);
22
+ useFactory: ({ webpackConfig, di, analyzePlugin }) => {
23
+ return createCompiler(
24
+ toWebpackConfig(analyzePlugin ? analyzePlugin.patchConfig(webpackConfig) : webpackConfig),
25
+ di
26
+ );
23
27
  },
24
28
  deps: {
25
29
  webpackConfig: WEBPACK_SERVER_CONFIG_TOKEN,
26
30
  di: DI_TOKEN,
31
+ analyzePlugin: { token: WEBPACK_ANALYZE_PLUGIN_TOKEN, optional: true },
27
32
  },
28
33
  }),
29
34
  provide({
@@ -11,8 +11,26 @@ import {
11
11
  INIT_HANDLER_TOKEN,
12
12
  WEBPACK_CLIENT_COMPILER_TOKEN,
13
13
  WEBPACK_SERVER_COMPILER_TOKEN,
14
+ WEBPACK_ANALYZE_PLUGIN_NAME_TOKEN,
15
+ WEBPACK_ANALYZE_PLUGIN_TOKEN,
14
16
  } from '../tokens';
15
17
  import { emitWebpackEvents } from '../utils/webpackEvents';
18
+ import { BundleAnalyzePlugin } from '../analyzePlugins/bundle';
19
+ import { StatoscopeAnalyzePlugin } from '../analyzePlugins/statoscope';
20
+ import { WhyBundledAnalyzePlugin } from '../analyzePlugins/whyBundled';
21
+ import { RsdoctorAnalyzePlugin } from '../analyzePlugins/rsdoctor';
22
+ import type { AnalyzePlugin } from '../types';
23
+
24
+ interface Type<T> extends Function {
25
+ new (...args: any[]): T;
26
+ }
27
+
28
+ const pluginMap: Record<string, Type<AnalyzePlugin>> = {
29
+ bundle: BundleAnalyzePlugin,
30
+ whybundled: WhyBundledAnalyzePlugin,
31
+ statoscope: StatoscopeAnalyzePlugin,
32
+ rsdoctor: RsdoctorAnalyzePlugin,
33
+ };
16
34
 
17
35
  export const sharedProviders: Provider[] = [
18
36
  provide({
@@ -46,6 +64,27 @@ export const sharedProviders: Provider[] = [
46
64
  serverCompiler: { token: WEBPACK_SERVER_COMPILER_TOKEN, optional: true },
47
65
  },
48
66
  }),
67
+ provide({
68
+ provide: WEBPACK_ANALYZE_PLUGIN_TOKEN,
69
+ useFactory: ({ pluginName }) => {
70
+ if (!pluginName) {
71
+ return;
72
+ }
73
+
74
+ const PluginClass = pluginMap[pluginName];
75
+
76
+ if (!PluginClass) {
77
+ throw new Error(
78
+ 'Set correct value for --analytics cli option, <bundle|whybundled|statoscope|rsdoctor>\n'
79
+ );
80
+ }
81
+
82
+ return new PluginClass();
83
+ },
84
+ deps: {
85
+ pluginName: WEBPACK_ANALYZE_PLUGIN_NAME_TOKEN,
86
+ },
87
+ }),
49
88
  provide({
50
89
  provide: EVENT_EMITTER_TOKEN,
51
90
  useClass: EventEmitter,
@@ -80,13 +119,18 @@ export const sharedProviders: Provider[] = [
80
119
  provide({
81
120
  provide: CLOSE_HANDLER_TOKEN,
82
121
  multi: true,
83
- useFactory: ({ configManager }) => {
122
+ useFactory: ({ configManager, analyzePlugin }) => {
84
123
  return async () => {
85
124
  await closeWorkerPool(configManager);
125
+
126
+ if (analyzePlugin) {
127
+ return analyzePlugin.afterBuild();
128
+ }
86
129
  };
87
130
  },
88
131
  deps: {
89
132
  configManager: CONFIG_MANAGER_TOKEN,
133
+ analyzePlugin: { token: WEBPACK_ANALYZE_PLUGIN_TOKEN, optional: true },
90
134
  },
91
135
  }),
92
136
  ];
@@ -9,6 +9,7 @@ import {
9
9
  WEBPACK_COMPILER_TOKEN,
10
10
  WEBPACK_SERVER_COMPILER_TOKEN,
11
11
  WEBPACK_SERVER_CONFIG_TOKEN,
12
+ WEBPACK_ANALYZE_PLUGIN_TOKEN,
12
13
  } from '../../tokens';
13
14
  import { createDevServer } from '../../devServer/setup';
14
15
  import { CONFIG_MANAGER_TOKEN, STATIC_SERVER_TOKEN } from '../../../../di/tokens';
@@ -16,8 +17,11 @@ import { CONFIG_MANAGER_TOKEN, STATIC_SERVER_TOKEN } from '../../../../di/tokens
16
17
  export const startSharedProviders: Provider[] = [
17
18
  provide({
18
19
  provide: WEBPACK_COMPILER_TOKEN,
19
- useFactory: ({ clientConfig, serverConfig }) => {
20
- const configs = [clientConfig, serverConfig].filter(Boolean).map(toWebpackConfig);
20
+ useFactory: ({ clientConfig, serverConfig, analyzePlugin }) => {
21
+ const configs = [clientConfig, serverConfig]
22
+ .filter(Boolean)
23
+ .map((config) => (analyzePlugin ? analyzePlugin.patchConfig(config) : config))
24
+ .map(toWebpackConfig);
21
25
  const multiCompiler = webpack(configs);
22
26
  const { inputFileSystem } = multiCompiler.compilers[0];
23
27
 
@@ -51,6 +55,7 @@ export const startSharedProviders: Provider[] = [
51
55
  deps: {
52
56
  clientConfig: { token: WEBPACK_CLIENT_CONFIG_TOKEN, optional: true },
53
57
  serverConfig: { token: WEBPACK_SERVER_CONFIG_TOKEN, optional: true },
58
+ analyzePlugin: { token: WEBPACK_ANALYZE_PLUGIN_TOKEN, optional: true },
54
59
  },
55
60
  }),
56
61
  provide({
package/src/cli/index.ts CHANGED
@@ -14,8 +14,8 @@ import buildCommand from '../commands/build/command';
14
14
  import { StartCommand } from '../commands/start/command';
15
15
  import lintCommand from '../commands/lint/command';
16
16
  import taskCommand from '../commands/task/command';
17
- import analyze from '../commands/analyze/command';
18
17
  import generate from '../commands/generate/command';
18
+ import analyze from '../commands/analyze/command';
19
19
  import newCommand from '../commands/new/command';
20
20
  import updateCommand from '../commands/update/command';
21
21
  import addCommand from '../commands/add/command';
@@ -29,15 +29,16 @@ import type { TaskMap } from '../models/task';
29
29
  import { getRootFile } from '../utils/getRootFile';
30
30
  import { getTramvaiConfig } from '../utils/getTramvaiConfig';
31
31
  import { syncJsonFile } from '../utils/syncJsonFile';
32
+ import AnalyzeCommand from '../commands/analyze/command';
32
33
 
33
34
  async function loadCommands(): Promise<CommandMap> {
34
35
  return [
35
36
  buildCommand,
37
+ AnalyzeCommand,
36
38
  StartProdCommand,
37
39
  StartCommand,
38
40
  lintCommand,
39
41
  taskCommand,
40
- analyze,
41
42
  generate,
42
43
  newCommand,
43
44
  updateCommand,
@@ -2,7 +2,7 @@ import { CLICommand } from '../../models/command';
2
2
 
3
3
  export type Params = {
4
4
  target: string;
5
- plugin?: 'bundle' | 'whybundled' | 'statoscope';
5
+ plugin?: 'bundle' | 'whybundled' | 'statoscope' | 'rsdoctor';
6
6
  showConfig?: boolean;
7
7
  };
8
8