@teambit/install 1.0.380 → 1.0.381

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.
@@ -5,7 +5,7 @@ import { GenerateResult, GeneratorMain } from '@teambit/generator';
5
5
  import { ApplicationMain } from '@teambit/application';
6
6
  import { VariantsMain } from '@teambit/variants';
7
7
  import { Component, ComponentMap } from '@teambit/component';
8
- import { SlotRegistry } from '@teambit/harmony';
8
+ import { Harmony, SlotRegistry } from '@teambit/harmony';
9
9
  import { CodemodResult, NodeModulesLinksResult } from '@teambit/workspace.modules.node-modules-linker';
10
10
  import { EnvsMain } from '@teambit/envs';
11
11
  import { IpcEventsMain } from '@teambit/ipc-events';
@@ -13,6 +13,7 @@ import { WorkspaceDependencyLifecycleType, DependencyResolverMain, LinkingOption
13
13
  import { WorkspaceConfigFilesMain } from '@teambit/workspace-config-files';
14
14
  import { Logger, LoggerMain } from '@teambit/logger';
15
15
  import { IssuesMain } from '@teambit/issues';
16
+ import { AspectLoaderMain } from '@teambit/aspect-loader';
16
17
  export type WorkspaceLinkOptions = LinkingOptions & {
17
18
  rootPolicy?: WorkspacePolicy;
18
19
  linkToBitRoots?: boolean;
@@ -57,14 +58,16 @@ export declare class InstallMain {
57
58
  private compiler;
58
59
  private envs;
59
60
  private wsConfigFiles;
61
+ private aspectLoader;
60
62
  private app;
61
63
  private generator;
62
64
  private preLinkSlot;
63
65
  private preInstallSlot;
64
66
  private postInstallSlot;
65
67
  private ipcEvents;
68
+ private harmony;
66
69
  private visitedAspects;
67
- constructor(dependencyResolver: DependencyResolverMain, logger: Logger, workspace: Workspace, variants: VariantsMain, compiler: CompilerMain, envs: EnvsMain, wsConfigFiles: WorkspaceConfigFilesMain, app: ApplicationMain, generator: GeneratorMain, preLinkSlot: PreLinkSlot, preInstallSlot: PreInstallSlot, postInstallSlot: PostInstallSlot, ipcEvents: IpcEventsMain);
70
+ constructor(dependencyResolver: DependencyResolverMain, logger: Logger, workspace: Workspace, variants: VariantsMain, compiler: CompilerMain, envs: EnvsMain, wsConfigFiles: WorkspaceConfigFilesMain, aspectLoader: AspectLoaderMain, app: ApplicationMain, generator: GeneratorMain, preLinkSlot: PreLinkSlot, preInstallSlot: PreInstallSlot, postInstallSlot: PostInstallSlot, ipcEvents: IpcEventsMain, harmony: Harmony);
68
71
  /**
69
72
  * Install dependencies for all components in the workspace
70
73
  *
@@ -79,6 +82,34 @@ export declare class InstallMain {
79
82
  private _addPackages;
80
83
  private _installModules;
81
84
  private shouldClearCacheOnInstall;
85
+ /**
86
+ * This function is very important to fix some issues that might happen during the installation process.
87
+ * The case is the following:
88
+ * during/before the installation process we load some envs from their bit.env files
89
+ * this contains code like:
90
+ * protected tsconfigPath = require.resolve('./config/tsconfig.json');
91
+ * protected eslintConfigPath = require.resolve('./config/eslintrc.cjs');
92
+ * When we load that file, we calculated the resolved path, and it's stored in the env
93
+ * object instance.
94
+ * then later on during the install we move the env to another location (like bit roots)
95
+ * which points to a .pnpm folder with some peers, that changed during the install
96
+ * then when we take this env object and call write ws config for example
97
+ * or compile
98
+ * we use that resolved path to calculate the final tsconfig
99
+ * however that file is no longer exists which result in an error
100
+ * This function will check if an env folder doesn't exist anymore, and will re-load it
101
+ * from its new location.
102
+ * This usually happen when we have install running in the middle of the process followed
103
+ * by other bit ops.
104
+ * examples:
105
+ * bit new - which might run few installs then other ops.
106
+ * bit switch - which might run few installs then other ops, and potentially change the
107
+ * peer deps during the install.
108
+ * bit server (vscode plugin) - which keep the process always live, so any install ops
109
+ * that change the location, will cause the vscode plugin/bit server to crash later.
110
+ * @returns
111
+ */
112
+ private reloadMovedEnvs;
82
113
  private _getComponentsManifestsAndRootPolicy;
83
114
  /**
84
115
  * The function `tryWriteConfigFiles` attempts to write workspace config files, and if it fails, it logs an error
@@ -166,7 +197,7 @@ export declare class InstallMain {
166
197
  static slots: (((registerFn: () => string) => SlotRegistry<PreLinkSlot>) | ((registerFn: () => string) => SlotRegistry<PreInstallSlot>))[];
167
198
  static dependencies: import("@teambit/harmony").Aspect[];
168
199
  static runtime: import("@teambit/harmony").RuntimeDefinition;
169
- static provider([dependencyResolver, workspace, loggerExt, variants, cli, compiler, issues, envs, app, ipcEvents, generator, wsConfigFiles,]: [
200
+ static provider([dependencyResolver, workspace, loggerExt, variants, cli, compiler, issues, envs, app, ipcEvents, generator, wsConfigFiles, aspectLoader,]: [
170
201
  DependencyResolverMain,
171
202
  Workspace,
172
203
  LoggerMain,
@@ -178,7 +209,8 @@ export declare class InstallMain {
178
209
  ApplicationMain,
179
210
  IpcEventsMain,
180
211
  GeneratorMain,
181
- WorkspaceConfigFilesMain
182
- ], _: any, [preLinkSlot, preInstallSlot, postInstallSlot]: [PreLinkSlot, PreInstallSlot, PostInstallSlot]): Promise<InstallMain>;
212
+ WorkspaceConfigFilesMain,
213
+ AspectLoaderMain
214
+ ], _: any, [preLinkSlot, preInstallSlot, postInstallSlot]: [PreLinkSlot, PreInstallSlot, PostInstallSlot], harmony: Harmony): Promise<InstallMain>;
183
215
  }
184
216
  export default InstallMain;
@@ -4,6 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.InstallMain = void 0;
7
+ function _pFilter() {
8
+ const data = _interopRequireDefault(require("p-filter"));
9
+ _pFilter = function () {
10
+ return data;
11
+ };
12
+ return data;
13
+ }
7
14
  function _fsExtra() {
8
15
  const data = _interopRequireWildcard(require("fs-extra"));
9
16
  _fsExtra = function () {
@@ -235,16 +242,23 @@ function _update() {
235
242
  };
236
243
  return data;
237
244
  }
238
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
245
+ function _aspectLoader() {
246
+ const data = require("@teambit/aspect-loader");
247
+ _aspectLoader = function () {
248
+ return data;
249
+ };
250
+ return data;
251
+ }
239
252
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
240
253
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
254
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
241
255
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
242
256
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
243
257
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
244
258
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
245
259
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
246
260
  class InstallMain {
247
- constructor(dependencyResolver, logger, workspace, variants, compiler, envs, wsConfigFiles, app, generator, preLinkSlot, preInstallSlot, postInstallSlot, ipcEvents) {
261
+ constructor(dependencyResolver, logger, workspace, variants, compiler, envs, wsConfigFiles, aspectLoader, app, generator, preLinkSlot, preInstallSlot, postInstallSlot, ipcEvents, harmony) {
248
262
  this.dependencyResolver = dependencyResolver;
249
263
  this.logger = logger;
250
264
  this.workspace = workspace;
@@ -252,12 +266,14 @@ class InstallMain {
252
266
  this.compiler = compiler;
253
267
  this.envs = envs;
254
268
  this.wsConfigFiles = wsConfigFiles;
269
+ this.aspectLoader = aspectLoader;
255
270
  this.app = app;
256
271
  this.generator = generator;
257
272
  this.preLinkSlot = preLinkSlot;
258
273
  this.preInstallSlot = preInstallSlot;
259
274
  this.postInstallSlot = postInstallSlot;
260
275
  this.ipcEvents = ipcEvents;
276
+ this.harmony = harmony;
261
277
  _defineProperty(this, "visitedAspects", new Set());
262
278
  }
263
279
  /**
@@ -352,8 +368,8 @@ class InstallMain {
352
368
  await this.install(packages, {
353
369
  addMissingDeps: installMissing,
354
370
  skipIfExisting: true,
355
- writeConfigFiles: false,
356
- skipPrune: true
371
+ writeConfigFiles: false
372
+ // skipPrune: true,
357
373
  });
358
374
  }
359
375
  async _addPackages(packages, options) {
@@ -460,6 +476,7 @@ class InstallMain {
460
476
  }, pmInstallOptions);
461
477
  let cacheCleared = false;
462
478
  await this.linkCodemods(compDirMap);
479
+ await this.reloadMovedEnvs();
463
480
  const shouldClearCacheOnInstall = this.shouldClearCacheOnInstall();
464
481
  if (options?.compile ?? true) {
465
482
  const compileStartTime = process.hrtime();
@@ -477,6 +494,7 @@ class InstallMain {
477
494
  await this.compiler.compileOnWorkspace([], {
478
495
  initiator: _compiler().CompilationInitiator.Install
479
496
  });
497
+
480
498
  // Right now we don't need to load extensions/execute load slot at this point
481
499
  // await this.compiler.compileOnWorkspace([], { initiator: CompilationInitiator.Install }, undefined, {
482
500
  // executeLoadSlot: true,
@@ -522,6 +540,72 @@ class InstallMain {
522
540
  const nonLoadedEnvs = this.envs.getFailedToLoadEnvs();
523
541
  return nonLoadedEnvs.length > 0;
524
542
  }
543
+
544
+ /**
545
+ * This function is very important to fix some issues that might happen during the installation process.
546
+ * The case is the following:
547
+ * during/before the installation process we load some envs from their bit.env files
548
+ * this contains code like:
549
+ * protected tsconfigPath = require.resolve('./config/tsconfig.json');
550
+ * protected eslintConfigPath = require.resolve('./config/eslintrc.cjs');
551
+ * When we load that file, we calculated the resolved path, and it's stored in the env
552
+ * object instance.
553
+ * then later on during the install we move the env to another location (like bit roots)
554
+ * which points to a .pnpm folder with some peers, that changed during the install
555
+ * then when we take this env object and call write ws config for example
556
+ * or compile
557
+ * we use that resolved path to calculate the final tsconfig
558
+ * however that file is no longer exists which result in an error
559
+ * This function will check if an env folder doesn't exist anymore, and will re-load it
560
+ * from its new location.
561
+ * This usually happen when we have install running in the middle of the process followed
562
+ * by other bit ops.
563
+ * examples:
564
+ * bit new - which might run few installs then other ops.
565
+ * bit switch - which might run few installs then other ops, and potentially change the
566
+ * peer deps during the install.
567
+ * bit server (vscode plugin) - which keep the process always live, so any install ops
568
+ * that change the location, will cause the vscode plugin/bit server to crash later.
569
+ * @returns
570
+ */
571
+ async reloadMovedEnvs() {
572
+ const allEnvs = this.envs.getAllRegisteredEnvs();
573
+ const movedEnvs = await (0, _pFilter().default)(allEnvs, async env => {
574
+ if (!env.__path) return false;
575
+ const regularPathExists = await (0, _fsExtra().pathExists)(env.__path);
576
+ const resolvedPathExists = await (0, _fsExtra().pathExists)(env.__resolvedPath);
577
+ return !regularPathExists || !resolvedPathExists;
578
+ });
579
+ const idsToLoad = movedEnvs.map(env => env.id);
580
+ // const envPlugin = this.envs.getEnvPlugin();
581
+
582
+ if (idsToLoad.length && this.workspace) {
583
+ const componentIdsToLoad = idsToLoad.map(id => _component().ComponentID.fromString(id));
584
+ const aspects = await this.workspace.resolveAspects(undefined, componentIdsToLoad, {
585
+ requestedOnly: true,
586
+ excludeCore: true,
587
+ throwOnError: false
588
+ // Theoretically we should use skipDeps here, but according to implementation at the moment
589
+ // it will lead to plugins not load, and we need them to be loaded.
590
+ // This is a bug in the flow and should be fixed.
591
+ // skipDeps: true,
592
+ });
593
+ const loadedPlugins = (0, _lodash().compact)(await Promise.all(aspects.map(aspectDef => {
594
+ const localPath = aspectDef.aspectPath;
595
+ const component = aspectDef.component;
596
+ if (!component) return undefined;
597
+ const plugins = this.aspectLoader.getPlugins(component, localPath);
598
+ if (plugins.has()) {
599
+ return plugins.load(_cli().MainRuntime.name);
600
+ }
601
+ })));
602
+ await Promise.all(loadedPlugins.map(plugin => {
603
+ const runtime = plugin.getRuntime(_cli().MainRuntime);
604
+ return runtime?.provider(undefined, undefined, undefined, this.harmony);
605
+ }));
606
+ }
607
+ return movedEnvs;
608
+ }
525
609
  async _getComponentsManifestsAndRootPolicy(installer, options) {
526
610
  const mergedRootPolicy = await this.addConfiguredAspectsToWorkspacePolicy();
527
611
  await this.addConfiguredGeneratorEnvsToWorkspacePolicy(mergedRootPolicy);
@@ -1032,7 +1116,7 @@ class InstallMain {
1032
1116
  await this.link();
1033
1117
  }
1034
1118
  }
1035
- static async provider([dependencyResolver, workspace, loggerExt, variants, cli, compiler, issues, envs, app, ipcEvents, generator, wsConfigFiles], _, [preLinkSlot, preInstallSlot, postInstallSlot]) {
1119
+ static async provider([dependencyResolver, workspace, loggerExt, variants, cli, compiler, issues, envs, app, ipcEvents, generator, wsConfigFiles, aspectLoader], _, [preLinkSlot, preInstallSlot, postInstallSlot], harmony) {
1036
1120
  const logger = loggerExt.createLogger(_install().InstallAspect.id);
1037
1121
  ipcEvents.registerGotEventSlot(async eventName => {
1038
1122
  if (eventName !== 'onPostInstall') return;
@@ -1041,7 +1125,7 @@ class InstallMain {
1041
1125
  workspace.clearAllComponentsCache();
1042
1126
  await (0, _pMapSeries().default)(postInstallSlot.values(), fn => fn());
1043
1127
  });
1044
- const installExt = new InstallMain(dependencyResolver, logger, workspace, variants, compiler, envs, wsConfigFiles, app, generator, preLinkSlot, preInstallSlot, postInstallSlot, ipcEvents);
1128
+ const installExt = new InstallMain(dependencyResolver, logger, workspace, variants, compiler, envs, wsConfigFiles, aspectLoader, app, generator, preLinkSlot, preInstallSlot, postInstallSlot, ipcEvents, harmony);
1045
1129
  if (issues) {
1046
1130
  issues.registerAddComponentsIssues(installExt.addDuplicateComponentAndPackageIssue.bind(installExt));
1047
1131
  }
@@ -1058,7 +1142,7 @@ class InstallMain {
1058
1142
  }
1059
1143
  exports.InstallMain = InstallMain;
1060
1144
  _defineProperty(InstallMain, "slots", [_harmony().Slot.withType(), _harmony().Slot.withType(), _harmony().Slot.withType()]);
1061
- _defineProperty(InstallMain, "dependencies", [_dependencyResolver().DependencyResolverAspect, _workspace2().WorkspaceAspect, _logger().LoggerAspect, _variants().VariantsAspect, _cli().CLIAspect, _compiler().CompilerAspect, _issues().IssuesAspect, _envs().EnvsAspect, _application().ApplicationAspect, _ipcEvents().IpcEventsAspect, _generator().GeneratorAspect, _workspaceConfigFiles().WorkspaceConfigFilesAspect]);
1145
+ _defineProperty(InstallMain, "dependencies", [_dependencyResolver().DependencyResolverAspect, _workspace2().WorkspaceAspect, _logger().LoggerAspect, _variants().VariantsAspect, _cli().CLIAspect, _compiler().CompilerAspect, _issues().IssuesAspect, _envs().EnvsAspect, _application().ApplicationAspect, _ipcEvents().IpcEventsAspect, _generator().GeneratorAspect, _workspaceConfigFiles().WorkspaceConfigFilesAspect, _aspectLoader().AspectLoaderAspect]);
1062
1146
  _defineProperty(InstallMain, "runtime", _cli().MainRuntime);
1063
1147
  function hasComponentsFromWorkspaceInMissingDeps({
1064
1148
  componentDirectoryMap,