@tramvai/cli 2.51.1 → 2.56.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 (34) hide show
  1. package/README.md +12 -0
  2. package/lib/api/index.d.ts +1 -0
  3. package/lib/api/index.js +1 -0
  4. package/lib/api/index.js.map +1 -1
  5. package/lib/api/start/providers/child-app/shared.js +1 -4
  6. package/lib/api/start/providers/child-app/shared.js.map +1 -1
  7. package/lib/api/start/providers/module/shared.js +1 -4
  8. package/lib/api/start/providers/module/shared.js.map +1 -1
  9. package/lib/api/start/utils/banner.js +17 -6
  10. package/lib/api/start/utils/banner.js.map +1 -1
  11. package/lib/api/start/utils/tips/index.d.ts +4 -0
  12. package/lib/api/start/utils/tips/index.js +82 -0
  13. package/lib/api/start/utils/tips/index.js.map +1 -0
  14. package/lib/api/start/utils/tips/tips.d.ts +2 -0
  15. package/lib/api/start/utils/tips/tips.js +127 -0
  16. package/lib/api/start/utils/tips/tips.js.map +1 -0
  17. package/lib/api/start/utils/tips/types.d.ts +10 -0
  18. package/lib/api/start/utils/tips/types.js +3 -0
  19. package/lib/api/start/utils/tips/types.js.map +1 -0
  20. package/lib/builder/webpack/providers/shared.js +1 -4
  21. package/lib/builder/webpack/providers/shared.js.map +1 -1
  22. package/lib/library/webpack/utils/workersPool.d.ts +0 -7
  23. package/lib/library/webpack/utils/workersPool.js +1 -18
  24. package/lib/library/webpack/utils/workersPool.js.map +1 -1
  25. package/package.json +3 -4
  26. package/src/api/index.ts +1 -1
  27. package/src/api/start/providers/child-app/shared.ts +2 -8
  28. package/src/api/start/providers/module/shared.ts +2 -8
  29. package/src/api/start/utils/banner.ts +21 -6
  30. package/src/api/start/utils/tips/index.ts +107 -0
  31. package/src/api/start/utils/tips/tips.ts +139 -0
  32. package/src/api/start/utils/tips/types.ts +12 -0
  33. package/src/builder/webpack/providers/shared.ts +2 -8
  34. package/src/library/webpack/utils/workersPool.ts +0 -25
package/README.md CHANGED
@@ -161,6 +161,7 @@ Configuration is provided through json-file with the name `tramvai.json` in the
161
161
  ### build or serve config?
162
162
 
163
163
  When you are deciding where to put specific settings in `tramvai.json` consider next statements:
164
+
164
165
  - `serve` config is only for development builds (using `tramvai start`)
165
166
  - `build` config mostly focused on production builds (`tramvai build`, `tramvai analyze`, `tramvai start-prod`) but may affect development builds as well (is this case this configs are merged)
166
167
 
@@ -237,3 +238,14 @@ For setting access through local network follow next steps:
237
238
  3. from the testing device open the new page in the browser and use the ip address from the previous step as domain name
238
239
 
239
240
  > When calling @tramvai/cli using npm you need to pass `--` before any additional arguments, e.g. command should look similar to this `npm start -- --staticHost 192.168.1.3`
241
+
242
+ ### How to enable paths mapping
243
+
244
+ In case you want to use special imports instead of pure relative paths in your code.
245
+
246
+ More details and examples you can find in typescript documentation:
247
+
248
+ - [baseUrl](https://www.typescriptlang.org/docs/handbook/module-resolution.html#base-url)
249
+ - [path mapping](https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping)
250
+
251
+ @tramvai/cli will reuse options `baseUrl` and `paths` from the app's `tsconfig.json` to provide path mapping functionality.
@@ -16,6 +16,7 @@ export { postcssAssetsWebpackRulesFactory } from '../library/webpack/blocks/post
16
16
  export { extractCssPluginFactory } from '../library/webpack/blocks/extractCssPlugin';
17
17
  export { configToEnv } from '../library/webpack/blocks/configToEnv';
18
18
  export * from '../typings/public';
19
+ export * from './start/utils/tips/types';
19
20
  export declare const start: StartCommand;
20
21
  export declare const build: BuildCommand;
21
22
  export declare const benchmark: BenchmarkCommand;
package/lib/api/index.js CHANGED
@@ -29,6 +29,7 @@ Object.defineProperty(exports, "extractCssPluginFactory", { enumerable: true, ge
29
29
  var configToEnv_1 = require("../library/webpack/blocks/configToEnv");
30
30
  Object.defineProperty(exports, "configToEnv", { enumerable: true, get: function () { return configToEnv_1.configToEnv; } });
31
31
  tslib_1.__exportStar(require("../typings/public"), exports);
32
+ tslib_1.__exportStar(require("./start/utils/tips/types"), exports);
32
33
  const app = (0, createApp_1.createApp)({
33
34
  commands: {
34
35
  start: () => Promise.resolve().then(() => tslib_1.__importStar(require('./start'))),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
@@ -66,10 +66,7 @@ exports.sharedProviders = [
66
66
  multi: true,
67
67
  useFactory: ({ configManager }) => {
68
68
  return () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
69
- yield Promise.all([
70
- (0, workersPool_1.closeWorkerPoolTranspiler)(configManager),
71
- (0, workersPool_1.closeWorkerPoolStyles)(configManager),
72
- ]);
69
+ yield (0, workersPool_1.closeWorkerPoolTranspiler)(configManager);
73
70
  });
74
71
  },
75
72
  deps: {
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/api/start/providers/child-app/shared.ts"],"names":[],"mappings":";;;;AACA,yCAAuE;AACvE,kDAK+B;AAG/B,oEAAiE;AACjE,+EAGuD;AACvD,uDAAoD;AACpD,2DAAwD;AACxD,2DAAwD;AAE3C,QAAA,eAAe,GAAwB;IAClD;QACE,OAAO,EAAE,6BAAoB;QAC7B,UAAU,EAAE,CAAC,EACX,WAAW,EACX,UAAU,GAIX,EAAE,EAAE;;YACH,OAAO,IAAI,6BAAa,CAAC,WAAW,kCAC/B,UAAU,KACb,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAA,UAAU,CAAC,IAAI,mCAAI,IAAI,EAC7B,SAAS,EAAE,QAAQ,IACnB,CAAC;QACL,CAAC;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,2BAAkB;YAC/B,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,UAAU,EAAE,2BAAY;KACzB;IACD;QACE,OAAO,EAAE,2BAAkB;QAC3B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EACX,YAAY,EACZ,UAAU,GAIX,EAAE,EAAE;YACH,OAAO,SAAe,kBAAkB;;oBACtC,MAAM,EAAE,IAAI,GAAG,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,UAAU,CAAC;oBAEvD,IAAI;wBACF,MAAM,IAAA,2BAAY,EAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;qBAC9C;oBAAC,OAAO,KAAK,EAAE;wBACd,IAAK,KAAa,CAAC,IAAI,KAAK,YAAY,EAAE;4BACxC,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,IAAI,IAAI,iEAAiE,CAC1F,CAAC;yBACH;wBAED,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC;aAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;YACjC,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAgD,EAAE,EAAE;YAC7E,OAAO,GAAG,EAAE;gBACV,OAAO,IAAA,uBAAU,EAAC,YAAY,CAAC,CAAC;YAClC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;SAClC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,aAAa,EAAkD,EAAE,EAAE;YAChF,OAAO,GAAS,EAAE;gBAChB,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,IAAA,uCAAyB,EAAC,aAAa,CAAC;oBACxC,IAAA,mCAAqB,EAAC,aAAa,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC,CAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,6BAAoB;SACpC;KACF;CACO,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/api/start/providers/child-app/shared.ts"],"names":[],"mappings":";;;;AACA,yCAAuE;AACvE,kDAK+B;AAG/B,oEAAiE;AACjE,+EAA0F;AAC1F,uDAAoD;AACpD,2DAAwD;AACxD,2DAAwD;AAE3C,QAAA,eAAe,GAAwB;IAClD;QACE,OAAO,EAAE,6BAAoB;QAC7B,UAAU,EAAE,CAAC,EACX,WAAW,EACX,UAAU,GAIX,EAAE,EAAE;;YACH,OAAO,IAAI,6BAAa,CAAC,WAAW,kCAC/B,UAAU,KACb,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAA,UAAU,CAAC,IAAI,mCAAI,IAAI,EAC7B,SAAS,EAAE,QAAQ,IACnB,CAAC;QACL,CAAC;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,2BAAkB;YAC/B,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,UAAU,EAAE,2BAAY;KACzB;IACD;QACE,OAAO,EAAE,2BAAkB;QAC3B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EACX,YAAY,EACZ,UAAU,GAIX,EAAE,EAAE;YACH,OAAO,SAAe,kBAAkB;;oBACtC,MAAM,EAAE,IAAI,GAAG,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,UAAU,CAAC;oBAEvD,IAAI;wBACF,MAAM,IAAA,2BAAY,EAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;qBAC9C;oBAAC,OAAO,KAAK,EAAE;wBACd,IAAK,KAAa,CAAC,IAAI,KAAK,YAAY,EAAE;4BACxC,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,IAAI,IAAI,iEAAiE,CAC1F,CAAC;yBACH;wBAED,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC;aAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;YACjC,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAgD,EAAE,EAAE;YAC7E,OAAO,GAAG,EAAE;gBACV,OAAO,IAAA,uBAAU,EAAC,YAAY,CAAC,CAAC;YAClC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;SAClC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,aAAa,EAAkD,EAAE,EAAE;YAChF,OAAO,GAAS,EAAE;gBAChB,MAAM,IAAA,uCAAyB,EAAC,aAAa,CAAC,CAAC;YACjD,CAAC,CAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,6BAAoB;SACpC;KACF;CACO,CAAC"}
@@ -66,10 +66,7 @@ exports.sharedProviders = [
66
66
  multi: true,
67
67
  useFactory: ({ configManager }) => {
68
68
  return () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
69
- yield Promise.all([
70
- (0, workersPool_1.closeWorkerPoolTranspiler)(configManager),
71
- (0, workersPool_1.closeWorkerPoolStyles)(configManager),
72
- ]);
69
+ (0, workersPool_1.closeWorkerPoolTranspiler)(configManager);
73
70
  });
74
71
  },
75
72
  deps: {
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/api/start/providers/module/shared.ts"],"names":[],"mappings":";;;;AACA,yCAAuE;AACvE,kDAK+B;AAG/B,oEAAiE;AACjE,+EAGuD;AACvD,uDAAoD;AACpD,2DAAwD;AACxD,2DAAwD;AAE3C,QAAA,eAAe,GAAwB;IAClD;QACE,OAAO,EAAE,6BAAoB;QAC7B,UAAU,EAAE,CAAC,EACX,WAAW,EACX,UAAU,GAIX,EAAE,EAAE;;YACH,OAAO,IAAI,6BAAa,CAAC,WAAW,kCAC/B,UAAU,KACb,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAA,UAAU,CAAC,IAAI,mCAAI,IAAI,EAC7B,SAAS,EAAE,QAAQ,IACnB,CAAC;QACL,CAAC;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,2BAAkB;YAC/B,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,UAAU,EAAE,2BAAY;KACzB;IACD;QACE,OAAO,EAAE,2BAAkB;QAC3B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EACX,YAAY,EACZ,UAAU,GAIX,EAAE,EAAE;YACH,OAAO,SAAe,kBAAkB;;oBACtC,MAAM,EAAE,IAAI,GAAG,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,UAAU,CAAC;oBAEvD,IAAI;wBACF,MAAM,IAAA,2BAAY,EAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;qBAC9C;oBAAC,OAAO,KAAK,EAAE;wBACd,IAAK,KAAa,CAAC,IAAI,KAAK,YAAY,EAAE;4BACxC,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,IAAI,IAAI,iEAAiE,CAC1F,CAAC;yBACH;wBAED,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC;aAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;YACjC,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAgD,EAAE,EAAE;YAC7E,OAAO,GAAG,EAAE;gBACV,OAAO,IAAA,uBAAU,EAAC,YAAY,CAAC,CAAC;YAClC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;SAClC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,aAAa,EAAkD,EAAE,EAAE;YAChF,OAAO,GAAS,EAAE;gBAChB,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,IAAA,uCAAyB,EAAC,aAAa,CAAC;oBACxC,IAAA,mCAAqB,EAAC,aAAa,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC,CAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,6BAAoB;SACpC;KACF;CACO,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/api/start/providers/module/shared.ts"],"names":[],"mappings":";;;;AACA,yCAAuE;AACvE,kDAK+B;AAG/B,oEAAiE;AACjE,+EAA0F;AAC1F,uDAAoD;AACpD,2DAAwD;AACxD,2DAAwD;AAE3C,QAAA,eAAe,GAAwB;IAClD;QACE,OAAO,EAAE,6BAAoB;QAC7B,UAAU,EAAE,CAAC,EACX,WAAW,EACX,UAAU,GAIX,EAAE,EAAE;;YACH,OAAO,IAAI,6BAAa,CAAC,WAAW,kCAC/B,UAAU,KACb,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAA,UAAU,CAAC,IAAI,mCAAI,IAAI,EAC7B,SAAS,EAAE,QAAQ,IACnB,CAAC;QACL,CAAC;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,2BAAkB;YAC/B,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,UAAU,EAAE,2BAAY;KACzB;IACD;QACE,OAAO,EAAE,2BAAkB;QAC3B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EACX,YAAY,EACZ,UAAU,GAIX,EAAE,EAAE;YACH,OAAO,SAAe,kBAAkB;;oBACtC,MAAM,EAAE,IAAI,GAAG,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,UAAU,CAAC;oBAEvD,IAAI;wBACF,MAAM,IAAA,2BAAY,EAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;qBAC9C;oBAAC,OAAO,KAAK,EAAE;wBACd,IAAK,KAAa,CAAC,IAAI,KAAK,YAAY,EAAE;4BACxC,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,IAAI,IAAI,iEAAiE,CAC1F,CAAC;yBACH;wBAED,MAAM,KAAK,CAAC;qBACb;gBACH,CAAC;aAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;YACjC,UAAU,EAAE,iCAAwB;SACrC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAgD,EAAE,EAAE;YAC7E,OAAO,GAAG,EAAE;gBACV,OAAO,IAAA,uBAAU,EAAC,YAAY,CAAC,CAAC;YAClC,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;SAClC;KACF;IACD;QACE,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,aAAa,EAAkD,EAAE,EAAE;YAChF,OAAO,GAAS,EAAE;gBAChB,IAAA,uCAAyB,EAAC,aAAa,CAAC,CAAC;YAC3C,CAAC,CAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,6BAAoB;SACpC;KACF;CACO,CAAC"}
@@ -5,7 +5,9 @@ const tslib_1 = require("tslib");
5
5
  const chalk_1 = tslib_1.__importDefault(require("chalk"));
6
6
  const formatting_1 = require("../../../utils/formatting");
7
7
  const tokens_1 = require("../../../di/tokens");
8
+ const tips_1 = require("./tips");
8
9
  const label = (name) => chalk_1.default.bold.cyan(`▸ ${name}:`);
10
+ const link = (url) => chalk_1.default.underline.blue(url);
9
11
  function showBanner(di) {
10
12
  if (!di.get({ token: tokens_1.UI_SHOW_BANNER_TOKEN, optional: true })) {
11
13
  return;
@@ -27,15 +29,24 @@ function showBanner(di) {
27
29
  const staticServer = `http://${config.staticHost.replace('0.0.0.0', 'localhost')}:${config.staticPort}`;
28
30
  if (config.type === 'application') {
29
31
  // Listeners
30
- messageLines.push(chalk_1.default.bold('Static: ') + chalk_1.default.underline.blue(staticServer));
31
- messageLines.push(chalk_1.default.bold('App: ') + chalk_1.default.underline.blue(server));
32
+ messageLines.push(chalk_1.default.bold('Static: ') + link(staticServer));
33
+ messageLines.push(chalk_1.default.bold('App: ') + link(server));
32
34
  }
33
35
  if (config.type === 'child-app') {
34
- messageLines.push(chalk_1.default.bold('Base Url: ') + chalk_1.default.underline.blue(`${server}/`));
36
+ messageLines.push(chalk_1.default.bold('Base Url: ') + link(`${server}/`));
35
37
  messageLines.push(chalk_1.default.bold('JS: ') +
36
- chalk_1.default.underline.blue(`${config.name}/${config.name}_(client|server)@${config.version}.js`));
37
- messageLines.push(chalk_1.default.bold('CSS: ') +
38
- chalk_1.default.underline.blue(`${config.name}/${config.name}@${config.version}.css`));
38
+ link(`${config.name}/${config.name}_(client|server)@${config.version}.js`));
39
+ messageLines.push(chalk_1.default.bold('CSS: ') + link(`${config.name}/${config.name}@${config.version}.css`));
40
+ }
41
+ const tip = (0, tips_1.getTip)(di);
42
+ if (tip) {
43
+ messageLines.push(`
44
+ ${chalk_1.default.italic.yellow('Tip of the day:')}
45
+
46
+ ${tip.text}
47
+
48
+ ${chalk_1.default.bold.green('Related documentation:')}
49
+ ${link(`${(0, tips_1.getDocUrl)(tip.docLink)}`)}`);
39
50
  }
40
51
  di.get(tokens_1.STDOUT_TOKEN).write((0, formatting_1.successBox)(titleLines, messageLines));
41
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../../src/api/start/utils/banner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../../src/api/start/utils/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Container } from '@tinkoff/dippy';
2
+ import type { TramvaiTip } from './types';
3
+ export declare const getTip: (di: Container) => TramvaiTip | undefined;
4
+ export declare const getDocUrl: (relativeUrl: string) => string;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDocUrl = exports.getTip = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const shuffle_1 = tslib_1.__importDefault(require("@tinkoff/utils/array/shuffle"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const find_cache_dir_1 = tslib_1.__importDefault(require("find-cache-dir"));
8
+ const fs_extra_1 = require("fs-extra");
9
+ const tips_1 = require("./tips");
10
+ const SHOW_ALL_TIPS_WINDOW = 1000 * 60 * 60 * 5; // 5 hours
11
+ const SHOW_SINGLE_TIP_WINDOW = 1000 * 60 * 60 * 24 * 14; // 2 weeks
12
+ let docUrl = 'https://tramvai.dev/docs/';
13
+ let tips = tips_1.tips;
14
+ try {
15
+ // eslint-disable-next-line import/no-extraneous-dependencies
16
+ const { tips: privateTips, docUrl: privateDocUrl } = require('@tramvai-tinkoff/cli-tips');
17
+ tips = tips.concat(privateTips);
18
+ docUrl = privateDocUrl;
19
+ }
20
+ catch (_) { }
21
+ const cacheDirectory = (0, find_cache_dir_1.default)({ name: 'tramvai' });
22
+ const tipsFile = path_1.default.resolve(cacheDirectory !== null && cacheDirectory !== void 0 ? cacheDirectory : '', 'showed-tips');
23
+ const DEFAULT_TIP_USAGE_INFO = {
24
+ lastTimeShowed: 0,
25
+ lastTimeShowedByTip: {},
26
+ };
27
+ const getTipUsageInfo = () => {
28
+ if (!cacheDirectory) {
29
+ return DEFAULT_TIP_USAGE_INFO;
30
+ }
31
+ try {
32
+ return (0, fs_extra_1.readJSONSync)(tipsFile);
33
+ }
34
+ catch (_) {
35
+ return DEFAULT_TIP_USAGE_INFO;
36
+ }
37
+ };
38
+ const updateTipUsageInfo = (usageInfo) => {
39
+ if (!cacheDirectory) {
40
+ return;
41
+ }
42
+ try {
43
+ (0, fs_extra_1.outputJsonSync)(tipsFile, Object.assign(Object.assign({}, usageInfo), { lastTimeShowed: Date.now() }), {
44
+ spaces: 2,
45
+ });
46
+ }
47
+ catch (_) { }
48
+ };
49
+ const getTip = (di) => {
50
+ if (process.env.TRAMVAI_DISABLE_TIPS) {
51
+ return;
52
+ }
53
+ const tipUsageInfo = getTipUsageInfo();
54
+ const now = Date.now();
55
+ // show tips only once in a time window
56
+ if (now - tipUsageInfo.lastTimeShowed < SHOW_ALL_TIPS_WINDOW) {
57
+ return;
58
+ }
59
+ // ignore tips that were showed recently
60
+ // add shuffle to pick up random tip
61
+ const filteredTips = (0, shuffle_1.default)(tips.filter((tip) => {
62
+ return (!tipUsageInfo.lastTimeShowedByTip[tip.docLink] ||
63
+ now - tipUsageInfo.lastTimeShowedByTip[tip.docLink] > SHOW_SINGLE_TIP_WINDOW);
64
+ }));
65
+ let tip;
66
+ for (const possibleTip of filteredTips) {
67
+ tipUsageInfo.lastTimeShowedByTip[possibleTip.docLink] = Date.now();
68
+ if (possibleTip.isApplicable(di)) {
69
+ // show first tip that is applicable
70
+ tip = possibleTip;
71
+ break;
72
+ }
73
+ }
74
+ updateTipUsageInfo(tipUsageInfo);
75
+ return tip;
76
+ };
77
+ exports.getTip = getTip;
78
+ const getDocUrl = (relativeUrl) => {
79
+ return `${docUrl}${relativeUrl}`;
80
+ };
81
+ exports.getDocUrl = getDocUrl;
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/api/start/utils/tips/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { TramvaiTip } from './types';
2
+ export declare const tips: TramvaiTip[];
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tips = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const path_1 = tslib_1.__importDefault(require("path"));
6
+ const fs_extra_1 = require("fs-extra");
7
+ const resolve_1 = require("resolve");
8
+ const tokens_1 = require("../../../../di/tokens");
9
+ const DEFAULT_ROOT_DIR = process.cwd();
10
+ const safeRequireResolve = (id, rootDir = DEFAULT_ROOT_DIR) => {
11
+ try {
12
+ return (0, resolve_1.sync)(id, { basedir: rootDir });
13
+ }
14
+ catch (_) {
15
+ return null;
16
+ }
17
+ };
18
+ exports.tips = [
19
+ {
20
+ text: `Suffer from the slow builds/rebuilds while using @tramvai/cli?
21
+ Consider to test out swc support.`,
22
+ docLink: 'references/cli/experiments#swc',
23
+ isApplicable(di) {
24
+ var _a, _b, _c, _d, _e, _f;
25
+ const configManager = di.get(tokens_1.CONFIG_MANAGER_TOKEN);
26
+ return (((_c = (_b = (_a = configManager.serve.configurations) === null || _a === void 0 ? void 0 : _a.experiments) === null || _b === void 0 ? void 0 : _b.transpilation) === null || _c === void 0 ? void 0 : _c.loader) !== 'swc' &&
27
+ ((_f = (_e = (_d = configManager.build.configurations) === null || _d === void 0 ? void 0 : _d.experiments) === null || _e === void 0 ? void 0 : _e.transpilation) === null || _f === void 0 ? void 0 : _f.loader) !== 'swc');
28
+ },
29
+ },
30
+ {
31
+ text: `Ship modern code to browser`,
32
+ docLink: 'how-to/how-enable-modern',
33
+ isApplicable(di) {
34
+ const configManager = di.get(tokens_1.CONFIG_MANAGER_TOKEN);
35
+ return configManager.modern !== true;
36
+ },
37
+ },
38
+ {
39
+ text: `Forget about reloading page with hotRefresh cli option`,
40
+ docLink: 'references/cli/start/#react-hot-refresh',
41
+ isApplicable(di) {
42
+ const configManager = di.get(tokens_1.CONFIG_MANAGER_TOKEN);
43
+ return configManager.hotRefresh !== true;
44
+ },
45
+ },
46
+ {
47
+ text: `You can use file-based routing with tramvai.
48
+ It may reduce the boilerplate code required with bundles`,
49
+ docLink: 'features/routing/file-system-pages',
50
+ isApplicable(di) {
51
+ const configManager = di.get(tokens_1.CONFIG_MANAGER_TOKEN);
52
+ const { rootDir, root } = configManager;
53
+ const { fileSystemPages } = configManager.build.configurations;
54
+ if (!fileSystemPages.enable) {
55
+ return true;
56
+ }
57
+ const routesDir = path_1.default.resolve(rootDir, root, fileSystemPages.routesDir || '');
58
+ if (!(0, fs_extra_1.existsSync)(routesDir)) {
59
+ return true;
60
+ }
61
+ return false;
62
+ },
63
+ },
64
+ {
65
+ text: `@tramvai/react-query is a great way to manage requests in React components`,
66
+ docLink: 'references/tramvai/react-query',
67
+ isApplicable() {
68
+ return !safeRequireResolve('@tramvai/react-query');
69
+ },
70
+ },
71
+ {
72
+ text: `Did you know tramvai has a set of helpers for testing?`,
73
+ docLink: 'guides/testing',
74
+ isApplicable() {
75
+ return (!safeRequireResolve('@tramvai/test-unit') ||
76
+ !safeRequireResolve('@tramvai/test-integration'));
77
+ },
78
+ },
79
+ {
80
+ text: `Do you love typescript as we do?
81
+ Check out our guide how to use typescript with tramvai`,
82
+ docLink: 'guides/strong-typing',
83
+ isApplicable() {
84
+ return true;
85
+ },
86
+ },
87
+ {
88
+ text: `In case if you are looking how to optimize your bundle`,
89
+ docLink: 'guides/bundle-optimization',
90
+ isApplicable() {
91
+ return true;
92
+ },
93
+ },
94
+ {
95
+ text: `tramvai now supports tsconfig.paths.
96
+ So you can remove alias config from tramvai.json`,
97
+ docLink: 'references/cli/base#how-to-enable-paths-mapping',
98
+ isApplicable(di) {
99
+ var _a;
100
+ const configManager = di.get(tokens_1.CONFIG_MANAGER_TOKEN);
101
+ return !!((_a = configManager.build.configurations) === null || _a === void 0 ? void 0 : _a.alias);
102
+ },
103
+ },
104
+ {
105
+ text: `Do you use storybook?
106
+ Check storybook integration with tramvai`,
107
+ docLink: 'guides/storybook',
108
+ isApplicable(di) {
109
+ const { rootDir } = di.get(tokens_1.CONFIG_MANAGER_TOKEN);
110
+ let storybookDir = path_1.default.resolve(rootDir, 'storybook');
111
+ if (!(0, fs_extra_1.existsSync)(storybookDir)) {
112
+ storybookDir = rootDir;
113
+ }
114
+ return (safeRequireResolve('@storybook/react', storybookDir) &&
115
+ !safeRequireResolve('@tramvai/storybook-addon'));
116
+ },
117
+ },
118
+ {
119
+ text: `Looking for another way to render your app?
120
+ Check available render modes in tramvai`,
121
+ docLink: 'references/modules/page-render-mode',
122
+ isApplicable(di) {
123
+ return !safeRequireResolve('@tramvai/module-page-render-mode');
124
+ },
125
+ },
126
+ ];
127
+ //# sourceMappingURL=tips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tips.js","sourceRoot":"","sources":["../../../../../src/api/start/utils/tips/tips.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Container } from '@tinkoff/dippy';
2
+ export interface TramvaiTip {
3
+ text: string;
4
+ docLink: string;
5
+ isApplicable: (di: Container) => boolean;
6
+ }
7
+ export interface TramvaiTipUsageInfo {
8
+ lastTimeShowed: number;
9
+ lastTimeShowedByTip: Record<string, number>;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/api/start/utils/tips/types.ts"],"names":[],"mappings":""}
@@ -57,10 +57,7 @@ exports.sharedProviders = [
57
57
  multi: true,
58
58
  useFactory: ({ configManager }) => {
59
59
  return () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
60
- yield Promise.all([
61
- (0, workersPool_1.closeWorkerPoolTranspiler)(configManager),
62
- (0, workersPool_1.closeWorkerPoolStyles)(configManager),
63
- ]);
60
+ yield (0, workersPool_1.closeWorkerPoolTranspiler)(configManager);
64
61
  });
65
62
  },
66
63
  deps: {
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/builder/webpack/providers/shared.ts"],"names":[],"mappings":";;;;AACA,0CAAyC;AACzC,mCAAsC;AACtC,+CAA0D;AAC1D,4EAGoD;AACpD,sCAQmB;AACnB,oEAAiE;AACjE,0DAA2D;AAE9C,QAAA,eAAe,GAAe;IACzC,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,8BAAqB;QAC9B,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,EAAE,EAAE;YACvE,MAAM,aAAa,GAAG,cAAc,IAAI,IAAA,uCAAkB,EAAC,cAAc,CAAC,CAAC;YAC3E,MAAM,mBAAmB,GAAG,oBAAoB,IAAI,IAAA,uCAAkB,EAAC,oBAAoB,CAAC,CAAC;YAC7F,MAAM,aAAa,GAAG,cAAc,IAAI,IAAA,uCAAkB,EAAC,cAAc,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,EAAE;gBACX,OAAO;oBACL,eAAe,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI;oBAClC,qBAAqB,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,EAAI;oBAC9C,eAAe,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI;iBACnC,CAAC;YACJ,CAAC,CAAiC,CAAC;QACrC,CAAC;QACD,IAAI,EAAE;YACJ,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxE,oBAAoB,EAAE,EAAE,KAAK,EAAE,6CAAoC,EAAE,QAAQ,EAAE,IAAI,EAAE;YACrF,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzE;KACF,CAAC;IACF,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,4BAAmB;QAC5B,QAAQ,EAAE,qBAAY;KACvB,CAAC;IACF,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,2BAAkB;QAC3B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,EAAE,EAAE;YACrF,OAAO,GAAG,EAAE;gBACV,cAAc,IAAI,IAAA,iCAAiB,EAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAC5E,oBAAoB;oBAClB,IAAA,iCAAiB,EAAC,oBAAoB,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;gBACxE,cAAc,IAAI,IAAA,iCAAiB,EAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC9E,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;YACjC,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxE,oBAAoB,EAAE,EAAE,KAAK,EAAE,6CAAoC,EAAE,QAAQ,EAAE,IAAI,EAAE;YACrF,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzE;KACF,CAAC;IACF,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;YAChC,OAAO,GAAS,EAAE;gBAChB,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,IAAA,uCAAyB,EAAC,aAAa,CAAC;oBACxC,IAAA,mCAAqB,EAAC,aAAa,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC,CAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,6BAAoB;SACpC;KACF,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/builder/webpack/providers/shared.ts"],"names":[],"mappings":";;;;AACA,0CAAyC;AACzC,mCAAsC;AACtC,+CAA0D;AAC1D,4EAAuF;AACvF,sCAQmB;AACnB,oEAAiE;AACjE,0DAA2D;AAE9C,QAAA,eAAe,GAAe;IACzC,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,8BAAqB;QAC9B,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,EAAE,EAAE;YACvE,MAAM,aAAa,GAAG,cAAc,IAAI,IAAA,uCAAkB,EAAC,cAAc,CAAC,CAAC;YAC3E,MAAM,mBAAmB,GAAG,oBAAoB,IAAI,IAAA,uCAAkB,EAAC,oBAAoB,CAAC,CAAC;YAC7F,MAAM,aAAa,GAAG,cAAc,IAAI,IAAA,uCAAkB,EAAC,cAAc,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,EAAE;gBACX,OAAO;oBACL,eAAe,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI;oBAClC,qBAAqB,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,EAAI;oBAC9C,eAAe,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI;iBACnC,CAAC;YACJ,CAAC,CAAiC,CAAC;QACrC,CAAC;QACD,IAAI,EAAE;YACJ,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxE,oBAAoB,EAAE,EAAE,KAAK,EAAE,6CAAoC,EAAE,QAAQ,EAAE,IAAI,EAAE;YACrF,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzE;KACF,CAAC;IACF,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,4BAAmB;QAC5B,QAAQ,EAAE,qBAAY;KACvB,CAAC;IACF,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,2BAAkB;QAC3B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,EAAE,EAAE;YACrF,OAAO,GAAG,EAAE;gBACV,cAAc,IAAI,IAAA,iCAAiB,EAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAC5E,oBAAoB;oBAClB,IAAA,iCAAiB,EAAC,oBAAoB,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;gBACxE,cAAc,IAAI,IAAA,iCAAiB,EAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC9E,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,4BAAmB;YACjC,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxE,oBAAoB,EAAE,EAAE,KAAK,EAAE,6CAAoC,EAAE,QAAQ,EAAE,IAAI,EAAE;YACrF,cAAc,EAAE,EAAE,KAAK,EAAE,sCAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzE;KACF,CAAC;IACF,IAAA,eAAO,EAAC;QACN,OAAO,EAAE,4BAAmB;QAC5B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;YAChC,OAAO,GAAS,EAAE;gBAChB,MAAM,IAAA,uCAAyB,EAAC,aAAa,CAAC,CAAC;YACjD,CAAC,CAAA,CAAC;QACJ,CAAC;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,6BAAoB;SACpC;KACF,CAAC;CACH,CAAC"}
@@ -5,10 +5,3 @@ export declare const createWorkerPoolTranspiler: (configManager: ConfigManager)
5
5
  workers: number;
6
6
  };
7
7
  export declare const closeWorkerPoolTranspiler: (configManager: ConfigManager) => void;
8
- export declare const createWorkerPoolStyles: (configManager: ConfigManager) => (configManager: ConfigManager) => {
9
- name: string;
10
- workerParallelJobs: number;
11
- workers: number;
12
- poolTimeout: number;
13
- };
14
- export declare const closeWorkerPoolStyles: (configManager: ConfigManager) => void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.closeWorkerPoolStyles = exports.createWorkerPoolStyles = exports.closeWorkerPoolTranspiler = exports.createWorkerPoolTranspiler = void 0;
3
+ exports.closeWorkerPoolTranspiler = exports.createWorkerPoolTranspiler = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const threadLoader = tslib_1.__importStar(require("thread-loader"));
6
6
  const workerPools_1 = require("thread-loader/dist/workerPools");
@@ -47,21 +47,4 @@ const closeWorkerPoolTranspiler = (configManager) => {
47
47
  (_a = (0, workerPools_1.getPool)(createTranspilerConfig(configManager))) === null || _a === void 0 ? void 0 : _a.disposeWorkers();
48
48
  };
49
49
  exports.closeWorkerPoolTranspiler = closeWorkerPoolTranspiler;
50
- const createStylesConfig = (configManager) => {
51
- return Object.assign({ name: 'styles', workerParallelJobs: 2, workers: Math.max(getCpuNumber(), 2), poolTimeout: configManager.env === 'development' ? Infinity : undefined }, getCustomConfig(configManager));
52
- };
53
- const createWorkerPoolStyles = (configManager) => {
54
- const config = createStylesConfig;
55
- if (!exports.createWorkerPoolStyles.warmup) {
56
- threadLoader.warmup(config, ['postcss-loader']);
57
- exports.createWorkerPoolStyles.warmup = true;
58
- }
59
- return config;
60
- };
61
- exports.createWorkerPoolStyles = createWorkerPoolStyles;
62
- const closeWorkerPoolStyles = (configManager) => {
63
- var _a;
64
- (_a = (0, workerPools_1.getPool)(createStylesConfig(configManager))) === null || _a === void 0 ? void 0 : _a.disposeWorkers();
65
- };
66
- exports.closeWorkerPoolStyles = closeWorkerPoolStyles;
67
50
  //# sourceMappingURL=workersPool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workersPool.js","sourceRoot":"","sources":["../../../../src/library/webpack/utils/workersPool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workersPool.js","sourceRoot":"","sources":["../../../../src/library/webpack/utils/workersPool.ts"],"names":[],"mappings":";;;;AAAA,oEAA8C;AAC9C,gEAAyD;AACzD,oDAAoB;AAGpB,4HAA4H;AAC5H,SAAS,YAAY;IACnB,OAAO,CAAC,YAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;AAC7C,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAE5B,mGAAmG;IACnG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,aAA4B,EAAE,EAAE;IACvD,MAAM,EACJ,KAAK,EAAE,EACL,cAAc,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,GACnD,GACF,GAAG,aAAa,CAAC;IAElB,OAAO,gBAAgB,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,aAA4B,EAAE,EAAE;IAC9D,uBACE,IAAI,EAAE,YAAY,EAClB,WAAW,EAAE,aAAa,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACvE,OAAO,EAAE,wBAAwB,EAAE,IAChC,eAAe,CAAC,aAAa,CAAC,EACjC;AACJ,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAG,CAAC,aAA4B,EAAE,EAAE;IACzE,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAErD,IAAI,CAAE,kCAAkC,CAAC,MAAM,EAAE;QAC/C,IAAI,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,KAAK,KAAK,EAAE;YAC5D,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;SAC1D;aAAM;YACL,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC1B,cAAc;gBACd,mBAAmB;gBACnB,0BAA0B;gBAC1B,qBAAqB;gBACrB,iCAAiC;gBACjC,qBAAqB;aACtB,CAAC,CAAC;SACJ;QACA,kCAAkC,CAAC,MAAM,GAAG,IAAI,CAAC;KACnD;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AApBW,QAAA,0BAA0B,8BAoBrC;AAEK,MAAM,yBAAyB,GAAG,CAAC,aAA4B,EAAE,EAAE;;IACxE,MAAA,IAAA,qBAAO,EAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,0CAAE,cAAc,EAAE,CAAC;AACnE,CAAC,CAAC;AAFW,QAAA,yBAAyB,6BAEpC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/cli",
3
- "version": "2.51.1",
3
+ "version": "2.56.0",
4
4
  "description": "Cli инструмент для сборки и запуска приложений",
5
5
  "files": [
6
6
  "src",
@@ -44,7 +44,6 @@
44
44
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
45
45
  "@babel/plugin-transform-duplicate-keys": "^7.18.9",
46
46
  "@babel/plugin-transform-react-constant-elements": "^7.18.12",
47
- "@babel/plugin-transform-react-inline-elements": "^7.18.6",
48
47
  "@babel/plugin-transform-runtime": "^7.18.10",
49
48
  "@babel/preset-env": "^7.18.10",
50
49
  "@babel/preset-react": "^7.18.6",
@@ -60,7 +59,7 @@
60
59
  "@sentry/node": "^6.2.5",
61
60
  "@svgr/webpack": "^6.4.0",
62
61
  "@tinkoff/browserslist-config": "0.2.4",
63
- "@tinkoff/dippy": "0.8.9",
62
+ "@tinkoff/dippy": "0.8.10",
64
63
  "@tinkoff/is-modern-lib": "2.0.5",
65
64
  "@tinkoff/logger": "0.10.55",
66
65
  "@tinkoff/minicss-class-generator": "0.2.4",
@@ -69,7 +68,7 @@
69
68
  "@tinkoff/request-plugin-protocol-http": "^0.11.6",
70
69
  "@tinkoff/utils": "^2.1.3",
71
70
  "@tramvai/build": "3.0.6",
72
- "@tramvai/react": "2.51.1",
71
+ "@tramvai/react": "2.56.0",
73
72
  "@tramvai/tools-check-versions": "0.4.6",
74
73
  "@tramvai/tools-migrate": "0.6.7",
75
74
  "ajv": "^6.12.6",
package/src/api/index.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { writableNoopStream } from 'noop-stream';
2
- import type { Provider } from '@tinkoff/dippy';
3
2
  import {
4
3
  ANALYTICS_PACKAGE_INFO_TOKEN,
5
4
  COMMAND_PARAMETERS_TOKEN,
@@ -27,6 +26,7 @@ export { postcssAssetsWebpackRulesFactory } from '../library/webpack/blocks/post
27
26
  export { extractCssPluginFactory } from '../library/webpack/blocks/extractCssPlugin';
28
27
  export { configToEnv } from '../library/webpack/blocks/configToEnv';
29
28
  export * from '../typings/public';
29
+ export * from './start/utils/tips/types';
30
30
 
31
31
  const app = createApp({
32
32
  commands: {
@@ -9,10 +9,7 @@ import {
9
9
  import type { ChildAppConfigEntry } from '../../../../typings/configEntry/child-app';
10
10
  import type { Params } from '../../index';
11
11
  import { ConfigManager } from '../../../../config/configManager';
12
- import {
13
- closeWorkerPoolTranspiler,
14
- closeWorkerPoolStyles,
15
- } from '../../../../library/webpack/utils/workersPool';
12
+ import { closeWorkerPoolTranspiler } from '../../../../library/webpack/utils/workersPool';
16
13
  import { stopServer } from '../../utils/stopServer';
17
14
  import { createServer } from '../../utils/createServer';
18
15
  import { listenServer } from '../../utils/listenServer';
@@ -91,10 +88,7 @@ export const sharedProviders: readonly Provider[] = [
91
88
  multi: true,
92
89
  useFactory: ({ configManager }: { configManager: typeof CONFIG_MANAGER_TOKEN }) => {
93
90
  return async () => {
94
- await Promise.all([
95
- closeWorkerPoolTranspiler(configManager),
96
- closeWorkerPoolStyles(configManager),
97
- ]);
91
+ await closeWorkerPoolTranspiler(configManager);
98
92
  };
99
93
  },
100
94
  deps: {
@@ -9,10 +9,7 @@ import {
9
9
  import type { ModuleConfigEntry } from '../../../../typings/configEntry/module';
10
10
  import type { Params } from '../../index';
11
11
  import { ConfigManager } from '../../../../config/configManager';
12
- import {
13
- closeWorkerPoolTranspiler,
14
- closeWorkerPoolStyles,
15
- } from '../../../../library/webpack/utils/workersPool';
12
+ import { closeWorkerPoolTranspiler } from '../../../../library/webpack/utils/workersPool';
16
13
  import { stopServer } from '../../utils/stopServer';
17
14
  import { createServer } from '../../utils/createServer';
18
15
  import { listenServer } from '../../utils/listenServer';
@@ -91,10 +88,7 @@ export const sharedProviders: readonly Provider[] = [
91
88
  multi: true,
92
89
  useFactory: ({ configManager }: { configManager: typeof CONFIG_MANAGER_TOKEN }) => {
93
90
  return async () => {
94
- await Promise.all([
95
- closeWorkerPoolTranspiler(configManager),
96
- closeWorkerPoolStyles(configManager),
97
- ]);
91
+ closeWorkerPoolTranspiler(configManager);
98
92
  };
99
93
  },
100
94
  deps: {
@@ -2,8 +2,10 @@ import chalk from 'chalk';
2
2
  import type { Container } from '@tinkoff/dippy';
3
3
  import { successBox } from '../../../utils/formatting';
4
4
  import { UI_SHOW_BANNER_TOKEN, CONFIG_MANAGER_TOKEN, STDOUT_TOKEN } from '../../../di/tokens';
5
+ import { getDocUrl, getTip } from './tips';
5
6
 
6
7
  const label = (name) => chalk.bold.cyan(`▸ ${name}:`);
8
+ const link = (url) => chalk.underline.blue(url);
7
9
 
8
10
  export function showBanner(di: Container) {
9
11
  if (!di.get({ token: UI_SHOW_BANNER_TOKEN, optional: true })) {
@@ -35,21 +37,34 @@ export function showBanner(di: Container) {
35
37
 
36
38
  if (config.type === 'application') {
37
39
  // Listeners
38
- messageLines.push(chalk.bold('Static: ') + chalk.underline.blue(staticServer));
39
- messageLines.push(chalk.bold('App: ') + chalk.underline.blue(server));
40
+ messageLines.push(chalk.bold('Static: ') + link(staticServer));
41
+ messageLines.push(chalk.bold('App: ') + link(server));
40
42
  }
41
43
 
42
44
  if (config.type === 'child-app') {
43
- messageLines.push(chalk.bold('Base Url: ') + chalk.underline.blue(`${server}/`));
45
+ messageLines.push(chalk.bold('Base Url: ') + link(`${server}/`));
44
46
 
45
47
  messageLines.push(
46
48
  chalk.bold('JS: ') +
47
- chalk.underline.blue(`${config.name}/${config.name}_(client|server)@${config.version}.js`)
49
+ link(`${config.name}/${config.name}_(client|server)@${config.version}.js`)
48
50
  );
49
51
 
50
52
  messageLines.push(
51
- chalk.bold('CSS: ') +
52
- chalk.underline.blue(`${config.name}/${config.name}@${config.version}.css`)
53
+ chalk.bold('CSS: ') + link(`${config.name}/${config.name}@${config.version}.css`)
54
+ );
55
+ }
56
+
57
+ const tip = getTip(di);
58
+
59
+ if (tip) {
60
+ messageLines.push(
61
+ `
62
+ ${chalk.italic.yellow('Tip of the day:')}
63
+
64
+ ${tip.text}
65
+
66
+ ${chalk.bold.green('Related documentation:')}
67
+ ${link(`${getDocUrl(tip.docLink)}`)}`
53
68
  );
54
69
  }
55
70
 
@@ -0,0 +1,107 @@
1
+ import shuffle from '@tinkoff/utils/array/shuffle';
2
+
3
+ import path from 'path';
4
+ import type { Container } from '@tinkoff/dippy';
5
+ import findCacheDir from 'find-cache-dir';
6
+ import { readJSONSync, outputJsonSync } from 'fs-extra';
7
+ import { tips as publicTips } from './tips';
8
+ import type { TramvaiTip, TramvaiTipUsageInfo } from './types';
9
+
10
+ const SHOW_ALL_TIPS_WINDOW = 1000 * 60 * 60 * 5; // 5 hours
11
+ const SHOW_SINGLE_TIP_WINDOW = 1000 * 60 * 60 * 24 * 14; // 2 weeks
12
+
13
+ let docUrl = 'https://tramvai.dev/docs/';
14
+ let tips = publicTips;
15
+
16
+ try {
17
+ // eslint-disable-next-line import/no-extraneous-dependencies
18
+ const { tips: privateTips, docUrl: privateDocUrl } = require('@tramvai-tinkoff/cli-tips');
19
+
20
+ tips = tips.concat(privateTips);
21
+
22
+ docUrl = privateDocUrl;
23
+ } catch (_) {}
24
+
25
+ const cacheDirectory = findCacheDir({ name: 'tramvai' });
26
+ const tipsFile = path.resolve(cacheDirectory ?? '', 'showed-tips');
27
+
28
+ const DEFAULT_TIP_USAGE_INFO: TramvaiTipUsageInfo = {
29
+ lastTimeShowed: 0,
30
+ lastTimeShowedByTip: {},
31
+ };
32
+
33
+ const getTipUsageInfo = (): TramvaiTipUsageInfo => {
34
+ if (!cacheDirectory) {
35
+ return DEFAULT_TIP_USAGE_INFO;
36
+ }
37
+
38
+ try {
39
+ return readJSONSync(tipsFile);
40
+ } catch (_) {
41
+ return DEFAULT_TIP_USAGE_INFO;
42
+ }
43
+ };
44
+
45
+ const updateTipUsageInfo = (usageInfo: TramvaiTipUsageInfo) => {
46
+ if (!cacheDirectory) {
47
+ return;
48
+ }
49
+
50
+ try {
51
+ outputJsonSync(
52
+ tipsFile,
53
+ {
54
+ ...usageInfo,
55
+ lastTimeShowed: Date.now(),
56
+ } as TramvaiTipUsageInfo,
57
+ {
58
+ spaces: 2,
59
+ }
60
+ );
61
+ } catch (_) {}
62
+ };
63
+
64
+ export const getTip = (di: Container): TramvaiTip | undefined => {
65
+ if (process.env.TRAMVAI_DISABLE_TIPS) {
66
+ return;
67
+ }
68
+
69
+ const tipUsageInfo: TramvaiTipUsageInfo = getTipUsageInfo();
70
+ const now = Date.now();
71
+
72
+ // show tips only once in a time window
73
+ if (now - tipUsageInfo.lastTimeShowed < SHOW_ALL_TIPS_WINDOW) {
74
+ return;
75
+ }
76
+
77
+ // ignore tips that were showed recently
78
+ // add shuffle to pick up random tip
79
+ const filteredTips = shuffle(
80
+ tips.filter((tip) => {
81
+ return (
82
+ !tipUsageInfo.lastTimeShowedByTip[tip.docLink] ||
83
+ now - tipUsageInfo.lastTimeShowedByTip[tip.docLink] > SHOW_SINGLE_TIP_WINDOW
84
+ );
85
+ })
86
+ );
87
+
88
+ let tip;
89
+
90
+ for (const possibleTip of filteredTips) {
91
+ tipUsageInfo.lastTimeShowedByTip[possibleTip.docLink] = Date.now();
92
+
93
+ if (possibleTip.isApplicable(di)) {
94
+ // show first tip that is applicable
95
+ tip = possibleTip;
96
+ break;
97
+ }
98
+ }
99
+
100
+ updateTipUsageInfo(tipUsageInfo);
101
+
102
+ return tip;
103
+ };
104
+
105
+ export const getDocUrl = (relativeUrl: string) => {
106
+ return `${docUrl}${relativeUrl}`;
107
+ };
@@ -0,0 +1,139 @@
1
+ import path from 'path';
2
+ import { existsSync } from 'fs-extra';
3
+ import { sync as resolveSync } from 'resolve';
4
+ import { CONFIG_MANAGER_TOKEN } from '../../../../di/tokens';
5
+ import type { TramvaiTip } from './types';
6
+
7
+ const DEFAULT_ROOT_DIR = process.cwd();
8
+
9
+ const safeRequireResolve = (id: string, rootDir = DEFAULT_ROOT_DIR) => {
10
+ try {
11
+ return resolveSync(id, { basedir: rootDir });
12
+ } catch (_) {
13
+ return null;
14
+ }
15
+ };
16
+
17
+ export const tips: TramvaiTip[] = [
18
+ {
19
+ text: `Suffer from the slow builds/rebuilds while using @tramvai/cli?
20
+ Consider to test out swc support.`,
21
+ docLink: 'references/cli/experiments#swc',
22
+ isApplicable(di) {
23
+ const configManager = di.get(CONFIG_MANAGER_TOKEN);
24
+
25
+ return (
26
+ configManager.serve.configurations?.experiments?.transpilation?.loader !== 'swc' &&
27
+ configManager.build.configurations?.experiments?.transpilation?.loader !== 'swc'
28
+ );
29
+ },
30
+ },
31
+ {
32
+ text: `Ship modern code to browser`,
33
+ docLink: 'how-to/how-enable-modern',
34
+ isApplicable(di) {
35
+ const configManager = di.get(CONFIG_MANAGER_TOKEN);
36
+
37
+ return configManager.modern !== true;
38
+ },
39
+ },
40
+ {
41
+ text: `Forget about reloading page with hotRefresh cli option`,
42
+ docLink: 'references/cli/start/#react-hot-refresh',
43
+ isApplicable(di) {
44
+ const configManager = di.get(CONFIG_MANAGER_TOKEN);
45
+
46
+ return configManager.hotRefresh !== true;
47
+ },
48
+ },
49
+ {
50
+ text: `You can use file-based routing with tramvai.
51
+ It may reduce the boilerplate code required with bundles`,
52
+ docLink: 'features/routing/file-system-pages',
53
+ isApplicable(di) {
54
+ const configManager = di.get(CONFIG_MANAGER_TOKEN);
55
+ const { rootDir, root } = configManager;
56
+ const { fileSystemPages } = configManager.build.configurations;
57
+
58
+ if (!fileSystemPages.enable) {
59
+ return true;
60
+ }
61
+
62
+ const routesDir = path.resolve(rootDir, root, fileSystemPages.routesDir || '');
63
+
64
+ if (!existsSync(routesDir)) {
65
+ return true;
66
+ }
67
+
68
+ return false;
69
+ },
70
+ },
71
+ {
72
+ text: `@tramvai/react-query is a great way to manage requests in React components`,
73
+ docLink: 'references/tramvai/react-query',
74
+ isApplicable() {
75
+ return !safeRequireResolve('@tramvai/react-query');
76
+ },
77
+ },
78
+ {
79
+ text: `Did you know tramvai has a set of helpers for testing?`,
80
+ docLink: 'guides/testing',
81
+ isApplicable() {
82
+ return (
83
+ !safeRequireResolve('@tramvai/test-unit') ||
84
+ !safeRequireResolve('@tramvai/test-integration')
85
+ );
86
+ },
87
+ },
88
+ {
89
+ text: `Do you love typescript as we do?
90
+ Check out our guide how to use typescript with tramvai`,
91
+ docLink: 'guides/strong-typing',
92
+ isApplicable() {
93
+ return true;
94
+ },
95
+ },
96
+ {
97
+ text: `In case if you are looking how to optimize your bundle`,
98
+ docLink: 'guides/bundle-optimization',
99
+ isApplicable() {
100
+ return true;
101
+ },
102
+ },
103
+ {
104
+ text: `tramvai now supports tsconfig.paths.
105
+ So you can remove alias config from tramvai.json`,
106
+ docLink: 'references/cli/base#how-to-enable-paths-mapping',
107
+ isApplicable(di) {
108
+ const configManager = di.get(CONFIG_MANAGER_TOKEN);
109
+
110
+ return !!configManager.build.configurations?.alias;
111
+ },
112
+ },
113
+ {
114
+ text: `Do you use storybook?
115
+ Check storybook integration with tramvai`,
116
+ docLink: 'guides/storybook',
117
+ isApplicable(di) {
118
+ const { rootDir } = di.get(CONFIG_MANAGER_TOKEN);
119
+ let storybookDir = path.resolve(rootDir, 'storybook');
120
+
121
+ if (!existsSync(storybookDir)) {
122
+ storybookDir = rootDir;
123
+ }
124
+
125
+ return (
126
+ safeRequireResolve('@storybook/react', storybookDir) &&
127
+ !safeRequireResolve('@tramvai/storybook-addon')
128
+ );
129
+ },
130
+ },
131
+ {
132
+ text: `Looking for another way to render your app?
133
+ Check available render modes in tramvai`,
134
+ docLink: 'references/modules/page-render-mode',
135
+ isApplicable(di) {
136
+ return !safeRequireResolve('@tramvai/module-page-render-mode');
137
+ },
138
+ },
139
+ ];
@@ -0,0 +1,12 @@
1
+ import type { Container } from '@tinkoff/dippy';
2
+
3
+ export interface TramvaiTip {
4
+ text: string;
5
+ docLink: string;
6
+ isApplicable: (di: Container) => boolean;
7
+ }
8
+
9
+ export interface TramvaiTipUsageInfo {
10
+ lastTimeShowed: number;
11
+ lastTimeShowedByTip: Record<string, number>;
12
+ }
@@ -2,10 +2,7 @@ import type { Provider } from '@tinkoff/dippy';
2
2
  import { provide } from '@tinkoff/dippy';
3
3
  import { EventEmitter } from 'events';
4
4
  import { CONFIG_MANAGER_TOKEN } from '../../../di/tokens';
5
- import {
6
- closeWorkerPoolTranspiler,
7
- closeWorkerPoolStyles,
8
- } from '../../../library/webpack/utils/workersPool';
5
+ import { closeWorkerPoolTranspiler } from '../../../library/webpack/utils/workersPool';
9
6
  import {
10
7
  CLOSE_HANDLER_TOKEN,
11
8
  EVENT_EMITTER_TOKEN,
@@ -66,10 +63,7 @@ export const sharedProviders: Provider[] = [
66
63
  multi: true,
67
64
  useFactory: ({ configManager }) => {
68
65
  return async () => {
69
- await Promise.all([
70
- closeWorkerPoolTranspiler(configManager),
71
- closeWorkerPoolStyles(configManager),
72
- ]);
66
+ await closeWorkerPoolTranspiler(configManager);
73
67
  };
74
68
  },
75
69
  deps: {
@@ -59,28 +59,3 @@ export const createWorkerPoolTranspiler = (configManager: ConfigManager) => {
59
59
  export const closeWorkerPoolTranspiler = (configManager: ConfigManager) => {
60
60
  getPool(createTranspilerConfig(configManager))?.disposeWorkers();
61
61
  };
62
-
63
- const createStylesConfig = (configManager: ConfigManager) => {
64
- return {
65
- name: 'styles',
66
- workerParallelJobs: 2,
67
- workers: Math.max(getCpuNumber(), 2),
68
- poolTimeout: configManager.env === 'development' ? Infinity : undefined,
69
- ...getCustomConfig(configManager),
70
- };
71
- };
72
-
73
- export const createWorkerPoolStyles = (configManager: ConfigManager) => {
74
- const config = createStylesConfig;
75
-
76
- if (!(createWorkerPoolStyles as any).warmup) {
77
- threadLoader.warmup(config, ['postcss-loader']);
78
- (createWorkerPoolStyles as any).warmup = true;
79
- }
80
-
81
- return config;
82
- };
83
-
84
- export const closeWorkerPoolStyles = (configManager: ConfigManager) => {
85
- getPool(createStylesConfig(configManager))?.disposeWorkers();
86
- };