@tramvai/cli 5.22.0 → 5.40.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 (122) hide show
  1. package/README.md +38 -0
  2. package/bin/platform.js +26 -1
  3. package/bin/spawn.js +36 -8
  4. package/lib/api/start-prod/providers/application.js +2 -2
  5. package/lib/api/start-prod/providers/application.js.map +1 -1
  6. package/lib/builder/webpack/devServer/pool/process/pool.d.ts.map +1 -1
  7. package/lib/builder/webpack/devServer/pool/process/pool.js +2 -1
  8. package/lib/builder/webpack/devServer/pool/process/pool.js.map +1 -1
  9. package/lib/builder/webpack/devServer/pool/thread/pool.d.ts.map +1 -1
  10. package/lib/builder/webpack/devServer/pool/thread/pool.js +2 -1
  11. package/lib/builder/webpack/devServer/pool/thread/pool.js.map +1 -1
  12. package/lib/builder/webpack/devServer/server.d.ts.map +1 -1
  13. package/lib/builder/webpack/devServer/server.js +31 -2
  14. package/lib/builder/webpack/devServer/server.js.map +1 -1
  15. package/lib/builder/webpack/tokens.d.ts +3 -3
  16. package/lib/cli/CLI.d.ts +1 -1
  17. package/lib/cli/CLI.d.ts.map +1 -1
  18. package/lib/cli/CLI.js +2 -2
  19. package/lib/cli/CLI.js.map +1 -1
  20. package/lib/cli/index.d.ts.map +1 -1
  21. package/lib/cli/index.js +1 -2
  22. package/lib/cli/index.js.map +1 -1
  23. package/lib/commands/add/add.d.ts +3 -2
  24. package/lib/commands/add/add.d.ts.map +1 -1
  25. package/lib/commands/add/add.js +8 -2
  26. package/lib/commands/add/add.js.map +1 -1
  27. package/lib/commands/add/checkPackageValidator.d.ts +1 -1
  28. package/lib/commands/add/checkPackageValidator.d.ts.map +1 -1
  29. package/lib/commands/add/checkPackageValidator.js +7 -2
  30. package/lib/commands/add/checkPackageValidator.js.map +1 -1
  31. package/lib/commands/add/command.d.ts +8 -3
  32. package/lib/commands/add/command.d.ts.map +1 -1
  33. package/lib/commands/add/command.js +6 -1
  34. package/lib/commands/add/command.js.map +1 -1
  35. package/lib/commands/new/new.d.ts.map +1 -1
  36. package/lib/commands/new/new.js +22 -20
  37. package/lib/commands/new/new.js.map +1 -1
  38. package/lib/commands/new/steps/installDependencies.d.ts +4 -3
  39. package/lib/commands/new/steps/installDependencies.d.ts.map +1 -1
  40. package/lib/commands/new/steps/installDependencies.js +58 -20
  41. package/lib/commands/new/steps/installDependencies.js.map +1 -1
  42. package/lib/commands/update/update.d.ts.map +1 -1
  43. package/lib/commands/update/update.js +14 -3
  44. package/lib/commands/update/update.js.map +1 -1
  45. package/lib/commands/update/updatePackageJson.d.ts +1 -1
  46. package/lib/commands/update/updatePackageJson.d.ts.map +1 -1
  47. package/lib/commands/update/updatePackageJson.js +5 -11
  48. package/lib/commands/update/updatePackageJson.js.map +1 -1
  49. package/lib/config/configManager.d.ts +1 -1
  50. package/lib/config/configManager.d.ts.map +1 -1
  51. package/lib/config/constants.d.ts +0 -1
  52. package/lib/config/constants.d.ts.map +1 -1
  53. package/lib/config/constants.js +1 -2
  54. package/lib/config/constants.js.map +1 -1
  55. package/lib/config/utils.d.ts +2 -0
  56. package/lib/config/utils.d.ts.map +1 -0
  57. package/lib/config/utils.js +19 -0
  58. package/lib/config/utils.js.map +1 -0
  59. package/lib/di/tokens/config.d.ts +1 -1
  60. package/lib/library/webpack/application/client/dev.js +1 -1
  61. package/lib/library/webpack/application/client/dev.js.map +1 -1
  62. package/lib/library/webpack/application/client/prod/optimization/splitChunks.d.ts.map +1 -1
  63. package/lib/library/webpack/application/client/prod/optimization/splitChunks.js +51 -1
  64. package/lib/library/webpack/application/client/prod/optimization/splitChunks.js.map +1 -1
  65. package/lib/library/webpack/application/server/dev.js +1 -1
  66. package/lib/library/webpack/application/server/dev.js.map +1 -1
  67. package/lib/library/webpack/utils/threadLoader.d.ts.map +1 -1
  68. package/lib/library/webpack/utils/threadLoader.js +1 -0
  69. package/lib/library/webpack/utils/threadLoader.js.map +1 -1
  70. package/lib/models/context.d.ts +3 -3
  71. package/lib/models/context.d.ts.map +1 -1
  72. package/lib/models/context.js +1 -2
  73. package/lib/models/context.js.map +1 -1
  74. package/lib/schema/autogeneratedSchema.json +29 -24
  75. package/lib/typings/configEntry/application.d.ts +5 -0
  76. package/lib/typings/configEntry/application.d.ts.map +1 -1
  77. package/lib/typings/configEntry/cli.d.ts +1 -1
  78. package/lib/typings/configEntry/cli.d.ts.map +1 -1
  79. package/lib/utils/commands/dependencies/findTramvaiVersion.js +1 -1
  80. package/lib/utils/commands/dependencies/findTramvaiVersion.js.map +1 -1
  81. package/lib/utils/commands/dependencies/getWorkspaceRootByAppName.d.ts +3 -0
  82. package/lib/utils/commands/dependencies/getWorkspaceRootByAppName.d.ts.map +1 -0
  83. package/lib/utils/commands/dependencies/getWorkspaceRootByAppName.js +8 -0
  84. package/lib/utils/commands/dependencies/getWorkspaceRootByAppName.js.map +1 -0
  85. package/lib/utils/npmRequire.js +1 -1
  86. package/lib/utils/npmRequire.js.map +1 -1
  87. package/package.json +5 -4
  88. package/schema.json +29 -24
  89. package/src/api/start-prod/providers/application.ts +2 -2
  90. package/src/builder/webpack/devServer/pool/process/pool.ts +3 -2
  91. package/src/builder/webpack/devServer/pool/thread/pool.ts +3 -2
  92. package/src/builder/webpack/devServer/server.ts +38 -2
  93. package/src/cli/CLI.ts +1 -3
  94. package/src/cli/index.ts +1 -3
  95. package/src/commands/add/add.ts +17 -3
  96. package/src/commands/add/checkPackageValidator.ts +6 -2
  97. package/src/commands/add/command.ts +6 -1
  98. package/src/commands/new/new.ts +34 -21
  99. package/src/commands/new/steps/installDependencies.ts +75 -27
  100. package/src/commands/new/templates/monorepo-block/package.json.hbs +5 -0
  101. package/src/commands/new/templates/shared/package.json.hbs +2 -1
  102. package/src/commands/update/update.ts +26 -3
  103. package/src/commands/update/updatePackageJson.spec.ts +16 -10
  104. package/src/commands/update/updatePackageJson.ts +10 -15
  105. package/src/config/configManager.ts +1 -1
  106. package/src/config/constants.ts +0 -2
  107. package/src/config/utils.ts +18 -0
  108. package/src/library/swc/__integration__/swc.start.test.ts +3 -0
  109. package/src/library/webpack/application/client/dev.ts +1 -1
  110. package/src/library/webpack/application/client/prod/optimization/splitChunks.ts +66 -2
  111. package/src/library/webpack/application/server/dev.ts +1 -1
  112. package/src/library/webpack/utils/threadLoader.ts +1 -0
  113. package/src/models/config.spec.ts +2 -0
  114. package/src/models/context.ts +3 -2
  115. package/src/schema/autogeneratedSchema.json +29 -24
  116. package/src/schema/tramvai.spec.ts +1 -0
  117. package/src/typings/configEntry/application.ts +5 -0
  118. package/src/typings/configEntry/cli.ts +6 -1
  119. package/src/typings/webpack-chain/index.d.ts +1 -0
  120. package/src/utils/commands/dependencies/findTramvaiVersion.ts +1 -1
  121. package/src/utils/commands/dependencies/getWorkspaceRootByAppName.ts +5 -0
  122. package/src/utils/npmRequire.ts +1 -1
@@ -65,6 +65,50 @@ export const resolveFrameworksPaths = (rootDir: string, frameworksList: string[]
65
65
  return topLevelFrameworkPaths;
66
66
  };
67
67
 
68
+ const tramvaiScopes = ['@tramvai/', '@tramvai-tinkoff/'];
69
+ const tinkoffPackages = [
70
+ '@tinkoff/router',
71
+ '@tinkoff/logger',
72
+ '@tinkoff/dippy',
73
+ '@tinkoff/user-agent',
74
+ '@tinkoff/module-loader-client',
75
+ '@tinkoff/meta-tags-generate',
76
+ '@tinkoff/browser-cookies',
77
+ '@tinkoff/errors',
78
+ '@tinkoff/layout-factory',
79
+ '@tinkoff/url',
80
+ '@tinkoff/roles',
81
+ '@tinkoff/hook-runner',
82
+ '@tinkoff/pubsub',
83
+ '@tinkoff/browser-timings',
84
+ ];
85
+ const tinkoffPackagesSet = new Set(tinkoffPackages);
86
+
87
+ function isTramvaiPackage(packageName: string | undefined) {
88
+ if (!packageName) return false;
89
+
90
+ return (
91
+ tramvaiScopes.some((scope) => packageName.startsWith(scope)) ||
92
+ tinkoffPackagesSet.has(packageName)
93
+ );
94
+ }
95
+
96
+ function normalizePath(packagePath: string) {
97
+ return packagePath.endsWith('/') ? packagePath : `${packagePath}/`;
98
+ }
99
+
100
+ const tramvaiPackagesPaths = [...tramvaiScopes, ...tinkoffPackages].map((packageName) =>
101
+ normalizePath(`/node_modules/${packageName}`)
102
+ );
103
+
104
+ function isTramvaiResource(resource: string | undefined) {
105
+ if (!resource) return false;
106
+
107
+ return tramvaiPackagesPaths.some((tramvaiPackagePath) => resource.includes(tramvaiPackagePath));
108
+ }
109
+
110
+ type CacheGroup = Exclude<Required<SplitChunksOptions>, boolean>['cacheGroups'][string];
111
+
68
112
  // eslint-disable-next-line max-statements
69
113
  export const splitChunksConfig =
70
114
  (configManager: ConfigManager<ApplicationConfigEntry>) => (config: Config) => {
@@ -72,13 +116,13 @@ export const splitChunksConfig =
72
116
 
73
117
  const topLevelFrameworkPaths = resolveFrameworksPaths(rootDir, ['react', 'react-dom']);
74
118
 
75
- const reactCacheGroup: Exclude<Required<SplitChunksOptions>, boolean>['cacheGroups'][string] = {
119
+ const reactCacheGroup: CacheGroup = {
76
120
  chunks: 'all',
77
121
  name: 'react',
78
122
  // This regex ignores nested copies of framework libraries so they're bundled with their issuer.
79
123
  // test: /(?<!node_modules.*)[\\/]node_modules[\\/](react|react-dom|scheduler|prop-types|use-subscription)[\\/]/,
80
124
  test(module: webpack.Module) {
81
- const resource = module.nameForCondition && module.nameForCondition();
125
+ const resource = module.nameForCondition?.();
82
126
 
83
127
  if (!resource) {
84
128
  return false;
@@ -93,6 +137,24 @@ export const splitChunksConfig =
93
137
  // Don't let webpack eliminate this chunk (prevents this chunk from becoming a part of the commons chunk)
94
138
  enforce: true,
95
139
  };
140
+
141
+ const tramvaiCacheGroup: CacheGroup = splitChunks.frameworkChunk
142
+ ? {
143
+ chunks: 'initial',
144
+ name: 'tramvai',
145
+ test(module: webpack.Module) {
146
+ const resource = module.nameForCondition?.();
147
+ const packageName = (module as webpack.NormalModule).resourceResolveData
148
+ ?.descriptionFileData?.name as string | undefined;
149
+
150
+ return isTramvaiPackage(packageName) || isTramvaiResource(resource);
151
+ },
152
+ priority: 35,
153
+ // Don't let webpack eliminate this chunk (prevents this chunk from becoming a part of the commons chunk)
154
+ enforce: true,
155
+ }
156
+ : false;
157
+
96
158
  let webpackSplitChunks: SplitChunksOptions = false;
97
159
 
98
160
  switch (splitChunks.mode) {
@@ -130,6 +192,7 @@ export const splitChunksConfig =
130
192
  default: false,
131
193
  defaultVendors: false,
132
194
  reactCacheGroup,
195
+ tramvaiCacheGroup,
133
196
  shared,
134
197
  },
135
198
  };
@@ -141,6 +204,7 @@ export const splitChunksConfig =
141
204
  default: false,
142
205
  defaultVendors: false,
143
206
  reactCacheGroup,
207
+ tramvaiCacheGroup,
144
208
  commons: {
145
209
  name: 'common-chunk',
146
210
  minChunks: splitChunks.commonChunkSplitNumber,
@@ -36,7 +36,7 @@ export const webpackServerConfig = ({
36
36
 
37
37
  config.mode('development');
38
38
 
39
- config.devtool(configManager.webpack.devtool);
39
+ config.devtool(configManager.webpack.devtool ?? false);
40
40
 
41
41
  if (configManager.sourceMap) {
42
42
  config.batch(sourcemaps(configManager));
@@ -25,6 +25,7 @@ const isApplicable = (configManager: ConfigManager<CliConfigEntry>) => {
25
25
  return (
26
26
  // thread-loader uses child_process.fork under the hood, and sometimes (50/50) work in these processes does not get into inspector.Session profile
27
27
  !process.env.TRAMVAI_CPU_PROFILE &&
28
+ !process.env.TRAMVAI_DEBUG_BUILD &&
28
29
  // TODO: check that there is still issue with windows systems and thread-loader
29
30
  process.platform !== 'win32' &&
30
31
  // swc has inbuilt threads support, see https://swc.rs/blog/perf-swc-vs-babel#real-world-benchmark
@@ -116,6 +116,7 @@ it('should populate defaults for config', () => {
116
116
  "sourceMap": false,
117
117
  "splitChunks": {
118
118
  "commonChunkSplitNumber": 3,
119
+ "frameworkChunk": false,
119
120
  "granularChunksMinSize": 20000,
120
121
  "granularChunksSplitNumber": 2,
121
122
  "mode": "granularChunks",
@@ -366,6 +367,7 @@ it('should populate defaults for overridable options', () => {
366
367
  "sourceMap": false,
367
368
  "splitChunks": {
368
369
  "commonChunkSplitNumber": 3,
370
+ "frameworkChunk": false,
369
371
  "granularChunksMinSize": 20000,
370
372
  "granularChunksSplitNumber": 2,
371
373
  "mode": "granularChunks",
@@ -1,4 +1,4 @@
1
- import type { PackageManager } from '@tinkoff/package-manager-wrapper';
1
+ import { resolvePackageManager, type PackageManager } from '@tinkoff/package-manager-wrapper';
2
2
  import type { Logger } from './logger';
3
3
  import type { Command, CommandResult } from './command';
4
4
  import type { Task, TaskResult } from './task';
@@ -6,13 +6,14 @@ import type { ConfigManager } from './config';
6
6
  import type { Analytics } from './analytics';
7
7
 
8
8
  export class Context {
9
+ public packageManager: PackageManager;
10
+
9
11
  constructor(
10
12
  public config: ConfigManager,
11
13
  public logger: Logger,
12
14
  public analytics: Analytics,
13
15
  public cliRootDir: string,
14
16
  public cliPackageManager: PackageManager,
15
- public packageManager: PackageManager,
16
17
  public runTask: (name, params?) => Promise<TaskResult>,
17
18
  public runCommand: (name, params?) => Promise<CommandResult>,
18
19
  public getTasks: () => Task[],
@@ -116,6 +116,11 @@
116
116
  "granularChunks"
117
117
  ]
118
118
  },
119
+ "frameworkChunk": {
120
+ "title": "Move tramvai packages into a separate chunk",
121
+ "default": false,
122
+ "type": "boolean"
123
+ },
119
124
  "granularChunksSplitNumber": {
120
125
  "title": "Move module to shared chunk if used at least as many times in other chunks",
121
126
  "default": 2,
@@ -1227,23 +1232,23 @@
1227
1232
  "dotAll": {
1228
1233
  "type": "boolean"
1229
1234
  },
1230
- "__@match@7341": {
1235
+ "__@match@7842": {
1231
1236
  "type": "object",
1232
1237
  "additionalProperties": false
1233
1238
  },
1234
- "__@replace@7343": {
1239
+ "__@replace@7844": {
1235
1240
  "type": "object",
1236
1241
  "additionalProperties": false
1237
1242
  },
1238
- "__@search@7346": {
1243
+ "__@search@7847": {
1239
1244
  "type": "object",
1240
1245
  "additionalProperties": false
1241
1246
  },
1242
- "__@split@7348": {
1247
+ "__@split@7849": {
1243
1248
  "type": "object",
1244
1249
  "additionalProperties": false
1245
1250
  },
1246
- "__@matchAll@7350": {
1251
+ "__@matchAll@7851": {
1247
1252
  "type": "object",
1248
1253
  "additionalProperties": false
1249
1254
  }
@@ -1275,9 +1280,9 @@
1275
1280
  "eval",
1276
1281
  "eval-cheap-module-source-map",
1277
1282
  "eval-cheap-source-map",
1278
- "eval-source-map"
1279
- ],
1280
- "type": "string"
1283
+ "eval-source-map",
1284
+ false
1285
+ ]
1281
1286
  }
1282
1287
  },
1283
1288
  "additionalProperties": false
@@ -1979,23 +1984,23 @@
1979
1984
  "dotAll": {
1980
1985
  "type": "boolean"
1981
1986
  },
1982
- "__@match@7341": {
1987
+ "__@match@7842": {
1983
1988
  "type": "object",
1984
1989
  "additionalProperties": false
1985
1990
  },
1986
- "__@replace@7343": {
1991
+ "__@replace@7844": {
1987
1992
  "type": "object",
1988
1993
  "additionalProperties": false
1989
1994
  },
1990
- "__@search@7346": {
1995
+ "__@search@7847": {
1991
1996
  "type": "object",
1992
1997
  "additionalProperties": false
1993
1998
  },
1994
- "__@split@7348": {
1999
+ "__@split@7849": {
1995
2000
  "type": "object",
1996
2001
  "additionalProperties": false
1997
2002
  },
1998
- "__@matchAll@7350": {
2003
+ "__@matchAll@7851": {
1999
2004
  "type": "object",
2000
2005
  "additionalProperties": false
2001
2006
  }
@@ -2027,9 +2032,9 @@
2027
2032
  "eval",
2028
2033
  "eval-cheap-module-source-map",
2029
2034
  "eval-cheap-source-map",
2030
- "eval-source-map"
2031
- ],
2032
- "type": "string"
2035
+ "eval-source-map",
2036
+ false
2037
+ ]
2033
2038
  }
2034
2039
  },
2035
2040
  "additionalProperties": false
@@ -2731,23 +2736,23 @@
2731
2736
  "dotAll": {
2732
2737
  "type": "boolean"
2733
2738
  },
2734
- "__@match@7341": {
2739
+ "__@match@7842": {
2735
2740
  "type": "object",
2736
2741
  "additionalProperties": false
2737
2742
  },
2738
- "__@replace@7343": {
2743
+ "__@replace@7844": {
2739
2744
  "type": "object",
2740
2745
  "additionalProperties": false
2741
2746
  },
2742
- "__@search@7346": {
2747
+ "__@search@7847": {
2743
2748
  "type": "object",
2744
2749
  "additionalProperties": false
2745
2750
  },
2746
- "__@split@7348": {
2751
+ "__@split@7849": {
2747
2752
  "type": "object",
2748
2753
  "additionalProperties": false
2749
2754
  },
2750
- "__@matchAll@7350": {
2755
+ "__@matchAll@7851": {
2751
2756
  "type": "object",
2752
2757
  "additionalProperties": false
2753
2758
  }
@@ -2779,9 +2784,9 @@
2779
2784
  "eval",
2780
2785
  "eval-cheap-module-source-map",
2781
2786
  "eval-cheap-source-map",
2782
- "eval-source-map"
2783
- ],
2784
- "type": "string"
2787
+ "eval-source-map",
2788
+ false
2789
+ ]
2785
2790
  }
2786
2791
  },
2787
2792
  "additionalProperties": false
@@ -145,6 +145,7 @@ describe('JSON schema для tramvai.json', () => {
145
145
  "sourceMap": false,
146
146
  "splitChunks": {
147
147
  "commonChunkSplitNumber": 3,
148
+ "frameworkChunk": false,
148
149
  "granularChunksMinSize": 20000,
149
150
  "granularChunksSplitNumber": 2,
150
151
  "mode": "granularChunks",
@@ -189,6 +189,11 @@ export interface ApplicationConfigEntry extends CliConfigEntry {
189
189
  * @default "granularChunks"
190
190
  */
191
191
  mode: 'granularChunks' | 'commonChunk' | false;
192
+ /**
193
+ * @title Move tramvai packages into a separate chunk
194
+ * @default false
195
+ */
196
+ frameworkChunk: boolean;
192
197
  /**
193
198
  * @title Move module to shared chunk if used at least as many times in other chunks
194
199
  * @default 2
@@ -251,7 +251,12 @@ export interface CliConfigEntry extends ConfigEntry {
251
251
  /**
252
252
  * @title Use the specified type of source maps for building in development mode
253
253
  */
254
- devtool: 'eval' | 'eval-cheap-source-map' | 'eval-cheap-module-source-map' | 'eval-source-map';
254
+ devtool:
255
+ | false
256
+ | 'eval'
257
+ | 'eval-cheap-source-map'
258
+ | 'eval-cheap-module-source-map'
259
+ | 'eval-source-map';
255
260
  };
256
261
 
257
262
  // options that affect only production builds
@@ -434,6 +434,7 @@ declare module 'webpack-chain' {
434
434
  }
435
435
 
436
436
  type DevTool =
437
+ | boolean
437
438
  | 'eval'
438
439
  | 'eval-cheap-source-map'
439
440
  | 'eval-cheap-module-source-map'
@@ -10,7 +10,7 @@ const getVersionFromDep = (dep?: string) => {
10
10
  export const findTramvaiVersion = async () => {
11
11
  const file = fs.readFileSync('package.json');
12
12
  const content = JSON.parse(file.toString());
13
- const currentVersion = getVersionFromDep(content.dependencies['@tramvai/core']);
13
+ const currentVersion = getVersionFromDep(content.devDependencies['@tramvai/cli']);
14
14
 
15
15
  return currentVersion;
16
16
  };
@@ -0,0 +1,5 @@
1
+ import type { Context } from '../../../models/context';
2
+
3
+ export const getWorkspaceRootByAppName = (context: Context, appName: string) => {
4
+ return context.config.getProject(appName).root;
5
+ };
@@ -28,7 +28,7 @@ async function runtimeInstallPackage({
28
28
 
29
29
  try {
30
30
  await packageManager.install({
31
- name: packageName,
31
+ packageNames: packageName,
32
32
  version: packageVersion,
33
33
  registry,
34
34
  noSave,