From 313bc5a146c83608fb94027f15de77a65b5dff62 Mon Sep 17 00:00:00 2001 From: Gilad Shoham Date: Sun, 20 Aug 2023 13:55:06 +0300 Subject: [PATCH 1/6] feature(create) - re-generate ws config files on bit create --- .../generator/component-generator.ts | 29 ++++++++++++++++++- .../generator/generator.main.runtime.ts | 13 +++++++-- .../workspace-config-files.main.runtime.ts | 13 +++++++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/scopes/generator/generator/component-generator.ts b/scopes/generator/generator/component-generator.ts index 683605390d42..e1f45981d29c 100644 --- a/scopes/generator/generator/component-generator.ts +++ b/scopes/generator/generator/component-generator.ts @@ -15,6 +15,8 @@ import componentIdToPackageName from '@teambit/legacy/dist/utils/bit/component-i import DataToPersist from '@teambit/legacy/dist/consumer/component/sources/data-to-persist'; import { NewComponentHelperMain } from '@teambit/new-component-helper'; import { ComponentID } from '@teambit/component-id'; +import { WorkspaceConfigFilesMain } from '@teambit/workspace-config-files'; + import { ComponentTemplate, ComponentFile, ComponentConfig } from './component-template'; import { CreateOptions } from './create.cmd'; @@ -36,6 +38,7 @@ export class ComponentGenerator { private envs: EnvsMain, private newComponentHelper: NewComponentHelperMain, private tracker: TrackerMain, + private wsConfigFiles: WorkspaceConfigFilesMain, private logger: Logger, private aspectId: string, private envId?: ComponentID @@ -65,6 +68,13 @@ export class ComponentGenerator { await this.workspace.bitMap.write(); const ids = generateResults.map((r) => r.id); + await this.tryLinkToNodeModules(ids); + await this.tryWriteConfigFiles(); + + return generateResults; + } + + private async tryLinkToNodeModules(ids: ComponentID[]) { try { await linkToNodeModulesByIds( this.workspace, @@ -75,8 +85,25 @@ export class ComponentGenerator { `failed linking the new components to node_modules, please run "bit link" manually. error: ${err.message}` ); } + } - return generateResults; + /** + * The function `tryWriteConfigFiles` attempts to write workspace config files, and if it fails, it logs an error + * message. + * @returns If the condition `!shouldWrite` is true, then nothing is being returned. Otherwise, if the `writeConfigFiles` + * function is successfully executed, nothing is being returned. If an error occurs during the execution of + * `writeConfigFiles`, an error message is being returned. + */ + private async tryWriteConfigFiles() { + try { + const shouldWrite = !this.wsConfigFiles.isWorkspaceConfigWriteDisabled(); + if (!shouldWrite) return; + await this.wsConfigFiles.writeConfigFiles({}); + } catch (err: any) { + this.logger.consoleFailure( + `failed generating workspace config files, please run "bit ws-config write" manually. error: ${err.message}` + ); + } } private async deleteGeneratedComponents(dirs: string[]) { diff --git a/scopes/generator/generator/generator.main.runtime.ts b/scopes/generator/generator/generator.main.runtime.ts index 8d9790389441..af0b4379e000 100644 --- a/scopes/generator/generator/generator.main.runtime.ts +++ b/scopes/generator/generator/generator.main.runtime.ts @@ -5,6 +5,7 @@ import { EnvDefinition, EnvsAspect, EnvsMain } from '@teambit/envs'; import { CommunityAspect } from '@teambit/community'; import type { CommunityMain } from '@teambit/community'; import ComponentConfig from '@teambit/legacy/dist/consumer/config'; +import WorkspaceConfigFilesAspect, { WorkspaceConfigFilesMain } from '@teambit/workspace-config-files'; import ComponentAspect, { ComponentID } from '@teambit/component'; import type { ComponentMain, Component } from '@teambit/component'; @@ -82,7 +83,8 @@ export class GeneratorMain { private componentAspect: ComponentMain, private tracker: TrackerMain, private logger: Logger, - private git: GitMain + private git: GitMain, + private wsConfigFiles: WorkspaceConfigFilesMain ) {} /** @@ -303,6 +305,7 @@ export class GeneratorMain { this.envs, this.newComponentHelper, this.tracker, + this.wsConfigFiles, this.logger, templateWithId.id, templateWithId.envName ? ComponentID.fromString(templateWithId.id) : undefined @@ -479,6 +482,7 @@ export class GeneratorMain { TrackerAspect, LoggerAspect, GitAspect, + WorkspaceConfigFilesAspect, ]; static runtime = MainRuntime; @@ -496,6 +500,7 @@ export class GeneratorMain { tracker, loggerMain, git, + wsConfigFiles, ]: [ Workspace, CLIMain, @@ -507,7 +512,8 @@ export class GeneratorMain { ComponentMain, TrackerMain, LoggerMain, - GitMain + GitMain, + WorkspaceConfigFilesMain ], config: GeneratorConfig, [componentTemplateSlot, workspaceTemplateSlot]: [ComponentTemplateSlot, WorkspaceTemplateSlot] @@ -524,7 +530,8 @@ export class GeneratorMain { componentAspect, tracker, logger, - git + git, + wsConfigFiles ); const commands = [ new CreateCmd(generator, community.getDocsDomain()), diff --git a/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts b/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts index 1d56f541530c..20d7884c0ad9 100644 --- a/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts +++ b/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts @@ -30,6 +30,7 @@ import { */ export type WorkspaceConfigFilesAspectConfig = { configsRootDir?: string; + disableWorkspaceConfigWrite?: boolean; }; export type EnvConfigWriter = { @@ -144,6 +145,14 @@ export class WorkspaceConfigFilesMain { return cleanResults; } + /** + * The function checks if the writing of workspace configuration is disabled. + * @returns the boolean value of `!!this.config.disableWorkspaceConfigWrite`. + */ + isWorkspaceConfigWriteDisabled() { + return !!this.config.disableWorkspaceConfigWrite; + } + /** * It returns a list of all the config writers that have been registered with the config writer slot * @returns An array of objects with aspectId and configWriter properties. @@ -339,6 +348,10 @@ ${chalk.bold('Do you want to continue? [yes(y)/no(n)]')}`, static runtime = MainRuntime; + static defaultConfig: Partial = { + disableWorkspaceConfigWrite: false, + }; + static async provider( [cli, workspace, envs, loggerAspect]: [CLIMain, Workspace, EnvsMain, LoggerMain], config: WorkspaceConfigFilesAspectConfig From 69307a6fd1f4f23a5234d695fb424d8636785feb Mon Sep 17 00:00:00 2001 From: Gilad Shoham Date: Sun, 20 Aug 2023 14:03:35 +0300 Subject: [PATCH 2/6] improvements --- scopes/generator/generator/component-generator.ts | 6 +++++- scopes/harmony/config/workspace-template.jsonc | 4 ++++ .../workspace-config-files.main.runtime.ts | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/scopes/generator/generator/component-generator.ts b/scopes/generator/generator/component-generator.ts index e1f45981d29c..4e8cefc3661a 100644 --- a/scopes/generator/generator/component-generator.ts +++ b/scopes/generator/generator/component-generator.ts @@ -98,7 +98,11 @@ export class ComponentGenerator { try { const shouldWrite = !this.wsConfigFiles.isWorkspaceConfigWriteDisabled(); if (!shouldWrite) return; - await this.wsConfigFiles.writeConfigFiles({}); + await this.wsConfigFiles.writeConfigFiles({ + clean: true, + silent: true, + dedupe: true, + }); } catch (err: any) { this.logger.consoleFailure( `failed generating workspace config files, please run "bit ws-config write" manually. error: ${err.message}` diff --git a/scopes/harmony/config/workspace-template.jsonc b/scopes/harmony/config/workspace-template.jsonc index 49075cef9c9b..a0ffe2ba7e25 100644 --- a/scopes/harmony/config/workspace-template.jsonc +++ b/scopes/harmony/config/workspace-template.jsonc @@ -52,6 +52,10 @@ } }, + "teambit.workspace/workspace-config-files": { + "disableWorkspaceConfigWrite": false + }, + /** * workspace variants allow to set different subsets of configuration for components in your * workspace. this is extremely useful for upgrading, aligning and building components with a new diff --git a/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts b/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts index 20d7884c0ad9..0768c2cc25c4 100644 --- a/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts +++ b/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts @@ -349,7 +349,7 @@ ${chalk.bold('Do you want to continue? [yes(y)/no(n)]')}`, static runtime = MainRuntime; static defaultConfig: Partial = { - disableWorkspaceConfigWrite: false, + disableWorkspaceConfigWrite: true, }; static async provider( From 2d4ad20238e29563d9195c3893d18affa5d96e1c Mon Sep 17 00:00:00 2001 From: Gilad Shoham Date: Sun, 20 Aug 2023 14:17:06 +0300 Subject: [PATCH 3/6] clear component cache before writing config files --- scopes/generator/generator/component-generator.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scopes/generator/generator/component-generator.ts b/scopes/generator/generator/component-generator.ts index 4e8cefc3661a..6832160b425d 100644 --- a/scopes/generator/generator/component-generator.ts +++ b/scopes/generator/generator/component-generator.ts @@ -69,7 +69,7 @@ export class ComponentGenerator { const ids = generateResults.map((r) => r.id); await this.tryLinkToNodeModules(ids); - await this.tryWriteConfigFiles(); + await this.tryWriteConfigFiles(ids); return generateResults; } @@ -94,10 +94,11 @@ export class ComponentGenerator { * function is successfully executed, nothing is being returned. If an error occurs during the execution of * `writeConfigFiles`, an error message is being returned. */ - private async tryWriteConfigFiles() { + private async tryWriteConfigFiles(ids: ComponentID[]) { try { const shouldWrite = !this.wsConfigFiles.isWorkspaceConfigWriteDisabled(); if (!shouldWrite) return; + ids.map((id) => this.workspace.clearComponentCache(id)); await this.wsConfigFiles.writeConfigFiles({ clean: true, silent: true, From 78ebe3b39c839beebda9897fd23150118f638e34 Mon Sep 17 00:00:00 2001 From: Gilad Shoham Date: Mon, 21 Aug 2023 17:42:56 +0300 Subject: [PATCH 4/6] Install missing envs upon bit create --- .../generator/component-generator.ts | 14 ++++++++ .../generator/generator.main.runtime.ts | 23 +++++++++++-- scopes/generator/generator/index.ts | 1 + .../workspace/install/install.main.runtime.ts | 33 +++++++++++++++++-- scopes/workspace/workspace/workspace.ts | 2 +- 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/scopes/generator/generator/component-generator.ts b/scopes/generator/generator/component-generator.ts index 6832160b425d..871fcfc14c14 100644 --- a/scopes/generator/generator/component-generator.ts +++ b/scopes/generator/generator/component-generator.ts @@ -19,6 +19,7 @@ import { WorkspaceConfigFilesMain } from '@teambit/workspace-config-files'; import { ComponentTemplate, ComponentFile, ComponentConfig } from './component-template'; import { CreateOptions } from './create.cmd'; +import { OnComponentCreateSlot } from './generator.main.runtime'; export type GenerateResult = { id: ComponentID; @@ -29,6 +30,8 @@ export type GenerateResult = { packageName: string; }; +export type OnComponentCreateFn = (generateResults: GenerateResult[]) => Promise; + export class ComponentGenerator { constructor( private workspace: Workspace, @@ -40,6 +43,7 @@ export class ComponentGenerator { private tracker: TrackerMain, private wsConfigFiles: WorkspaceConfigFilesMain, private logger: Logger, + private onComponentCreateSlot: OnComponentCreateSlot, private aspectId: string, private envId?: ComponentID ) {} @@ -69,6 +73,10 @@ export class ComponentGenerator { const ids = generateResults.map((r) => r.id); await this.tryLinkToNodeModules(ids); + await this.runOnComponentCreateHook(generateResults); + // We are running this after the runOnComponentCreateHook as it require + // the env to be installed to work properly, and the hook might install + // the env. await this.tryWriteConfigFiles(ids); return generateResults; @@ -87,6 +95,12 @@ export class ComponentGenerator { } } + private async runOnComponentCreateHook(generateResults: GenerateResult[]) { + const fns = this.onComponentCreateSlot.values(); + if (!fns.length) return; + await Promise.all(fns.map((fn) => fn(generateResults))); + } + /** * The function `tryWriteConfigFiles` attempts to write workspace config files, and if it fails, it logs an error * message. diff --git a/scopes/generator/generator/generator.main.runtime.ts b/scopes/generator/generator/generator.main.runtime.ts index af0b4379e000..008618882f98 100644 --- a/scopes/generator/generator/generator.main.runtime.ts +++ b/scopes/generator/generator/generator.main.runtime.ts @@ -24,7 +24,7 @@ import { GeneratorAspect } from './generator.aspect'; import { CreateCmd, CreateOptions } from './create.cmd'; import { TemplatesCmd } from './templates.cmd'; import { generatorSchema } from './generator.graphql'; -import { ComponentGenerator, GenerateResult } from './component-generator'; +import { ComponentGenerator, GenerateResult, OnComponentCreateFn } from './component-generator'; import { WorkspaceGenerator } from './workspace-generator'; import { WorkspaceTemplate } from './workspace-template'; import { NewCmd, NewOptions } from './new.cmd'; @@ -36,6 +36,7 @@ import { GeneratorService } from './generator.service'; export type ComponentTemplateSlot = SlotRegistry; export type WorkspaceTemplateSlot = SlotRegistry; +export type OnComponentCreateSlot = SlotRegistry; export type TemplateDescriptor = { aspectId: string; @@ -75,6 +76,7 @@ export class GeneratorMain { constructor( private componentTemplateSlot: ComponentTemplateSlot, private workspaceTemplateSlot: WorkspaceTemplateSlot, + private onComponentCreateSlot: OnComponentCreateSlot, private config: GeneratorConfig, private workspace: Workspace, private envs: EnvsMain, @@ -103,6 +105,11 @@ export class GeneratorMain { return this; } + registerOnComponentCreate(fn: OnComponentCreateFn) { + this.onComponentCreateSlot.register(fn); + return this; + } + /** * list all component templates registered in the workspace or workspace templates in case the * workspace is not available @@ -307,6 +314,7 @@ export class GeneratorMain { this.tracker, this.wsConfigFiles, this.logger, + this.onComponentCreateSlot, templateWithId.id, templateWithId.envName ? ComponentID.fromString(templateWithId.id) : undefined ); @@ -468,7 +476,11 @@ export class GeneratorMain { this.aspectLoaded = true; } - static slots = [Slot.withType(), Slot.withType()]; + static slots = [ + Slot.withType(), + Slot.withType(), + Slot.withType(), + ]; static dependencies = [ WorkspaceAspect, @@ -516,12 +528,17 @@ export class GeneratorMain { WorkspaceConfigFilesMain ], config: GeneratorConfig, - [componentTemplateSlot, workspaceTemplateSlot]: [ComponentTemplateSlot, WorkspaceTemplateSlot] + [componentTemplateSlot, workspaceTemplateSlot, onComponentCreateSlot]: [ + ComponentTemplateSlot, + WorkspaceTemplateSlot, + OnComponentCreateSlot + ] ) { const logger = loggerMain.createLogger(GeneratorAspect.id); const generator = new GeneratorMain( componentTemplateSlot, workspaceTemplateSlot, + onComponentCreateSlot, config, workspace, envs, diff --git a/scopes/generator/generator/index.ts b/scopes/generator/generator/index.ts index 162567938724..62042415b54a 100644 --- a/scopes/generator/generator/index.ts +++ b/scopes/generator/generator/index.ts @@ -11,3 +11,4 @@ export { GeneratorEnv } from './generator-env-type'; export { GeneratorAspect } from './generator.aspect'; export { TemplateList } from './template-list'; export { StarterList } from './starter-list'; +export type { GenerateResult } from './component-generator'; diff --git a/scopes/workspace/install/install.main.runtime.ts b/scopes/workspace/install/install.main.runtime.ts index 9a4b79d985cd..31fdffd88b70 100644 --- a/scopes/workspace/install/install.main.runtime.ts +++ b/scopes/workspace/install/install.main.runtime.ts @@ -47,6 +47,7 @@ import { LinkCommand } from './link'; import InstallCmd from './install.cmd'; import UninstallCmd from './uninstall.cmd'; import UpdateCmd from './update.cmd'; +import { GenerateResult, GeneratorAspect, GeneratorMain } from '@teambit/generator'; export type WorkspaceLinkOptions = LinkingOptions & { rootPolicy?: WorkspacePolicy; @@ -175,6 +176,31 @@ export class InstallMain { this.postInstallSlot.register(fn); } + async onComponentCreate(generateResults: GenerateResult[]) { + this.workspace.inInstallContext = true; + const ids = generateResults.map((r) => r.id); + const nonLoadedEnvs: string[] = []; + ids.map((id) => this.workspace.clearComponentCache(id)); + await pMapSeries(ids, async (id) => { + const component = await this.workspace.get(id); + // const envId = await this.envs.getEnvId(component); + const envId = (await this.envs.calculateEnvId(component)).toString(); + const isLoaded = this.envs.isEnvRegistered(envId); + if (!isLoaded) { + nonLoadedEnvs.push(envId); + } + return component; + }); + if (!nonLoadedEnvs.length) { + this.workspace.inInstallContext = false; + return; + } + this.logger.consoleWarning( + `the following environments are not installed yet: ${nonLoadedEnvs.join(', ')}. installing them now...` + ); + await this.install(); + } + private async _addPackages(packages: string[], options?: WorkspaceInstallOptions) { if ((options?.lifecycleType as string) === 'dev') { throw new DependencyTypeNotSupportedInPolicy(options?.lifecycleType as string); @@ -824,12 +850,13 @@ export class InstallMain { EnvsAspect, ApplicationAspect, IpcEventsAspect, + GeneratorAspect, ]; static runtime = MainRuntime; static async provider( - [dependencyResolver, workspace, loggerExt, variants, cli, compiler, issues, envs, app, ipcEvents]: [ + [dependencyResolver, workspace, loggerExt, variants, cli, compiler, issues, envs, app, ipcEvents, generator]: [ DependencyResolverMain, Workspace, LoggerMain, @@ -839,7 +866,8 @@ export class InstallMain { IssuesMain, EnvsMain, ApplicationMain, - IpcEventsMain + IpcEventsMain, + GeneratorMain ], _, [preLinkSlot, preInstallSlot, postInstallSlot]: [PreLinkSlot, PreInstallSlot, PostInstallSlot] @@ -866,6 +894,7 @@ export class InstallMain { if (issues) { issues.registerAddComponentsIssues(installExt.addDuplicateComponentAndPackageIssue.bind(installExt)); } + generator.registerOnComponentCreate(installExt.onComponentCreate.bind(installExt)); const commands: CommandList = [ new InstallCmd(installExt, workspace, logger), new UninstallCmd(installExt), diff --git a/scopes/workspace/workspace/workspace.ts b/scopes/workspace/workspace/workspace.ts index 554a5e5fd538..53d0b0f3d9a3 100644 --- a/scopes/workspace/workspace/workspace.ts +++ b/scopes/workspace/workspace/workspace.ts @@ -144,7 +144,7 @@ export class Workspace implements ComponentFactory { componentLoader: WorkspaceComponentLoader; bitMap: BitMap; /** - * Indicate that we are now running installaion process + * Indicate that we are now running installation process * This is important to know to ignore missing modules across different places */ inInstallContext = false; From 4318e7ff3d53d8acc05433feb07607c45d627408 Mon Sep 17 00:00:00 2001 From: Gilad Shoham Date: Mon, 21 Aug 2023 17:53:38 +0300 Subject: [PATCH 5/6] rename flag --- scopes/generator/generator/component-generator.ts | 2 +- scopes/harmony/config/workspace-template.jsonc | 2 +- .../workspace-config-files.main.runtime.ts | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/scopes/generator/generator/component-generator.ts b/scopes/generator/generator/component-generator.ts index 871fcfc14c14..a3b3ad5d5509 100644 --- a/scopes/generator/generator/component-generator.ts +++ b/scopes/generator/generator/component-generator.ts @@ -110,7 +110,7 @@ export class ComponentGenerator { */ private async tryWriteConfigFiles(ids: ComponentID[]) { try { - const shouldWrite = !this.wsConfigFiles.isWorkspaceConfigWriteDisabled(); + const shouldWrite = this.wsConfigFiles.isWorkspaceConfigWriteEnabled(); if (!shouldWrite) return; ids.map((id) => this.workspace.clearComponentCache(id)); await this.wsConfigFiles.writeConfigFiles({ diff --git a/scopes/harmony/config/workspace-template.jsonc b/scopes/harmony/config/workspace-template.jsonc index a0ffe2ba7e25..b149e1fb7a75 100644 --- a/scopes/harmony/config/workspace-template.jsonc +++ b/scopes/harmony/config/workspace-template.jsonc @@ -53,7 +53,7 @@ }, "teambit.workspace/workspace-config-files": { - "disableWorkspaceConfigWrite": false + "enableWorkspaceConfigWrite": true }, /** diff --git a/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts b/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts index 0768c2cc25c4..a82cb74e10c4 100644 --- a/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts +++ b/scopes/workspace/workspace-config-files/workspace-config-files.main.runtime.ts @@ -30,7 +30,7 @@ import { */ export type WorkspaceConfigFilesAspectConfig = { configsRootDir?: string; - disableWorkspaceConfigWrite?: boolean; + enableWorkspaceConfigWrite?: boolean; }; export type EnvConfigWriter = { @@ -146,11 +146,12 @@ export class WorkspaceConfigFilesMain { } /** - * The function checks if the writing of workspace configuration is disabled. - * @returns the boolean value of `!!this.config.disableWorkspaceConfigWrite`. + * The function checks if the auto writing of workspace configuration is enabled. + * if it's enabled we will re-generate the configuration files upon bit create + * @returns the boolean value of `!!this.config.enableWorkspaceConfigWrite`. */ - isWorkspaceConfigWriteDisabled() { - return !!this.config.disableWorkspaceConfigWrite; + isWorkspaceConfigWriteEnabled() { + return !!this.config.enableWorkspaceConfigWrite; } /** @@ -349,7 +350,7 @@ ${chalk.bold('Do you want to continue? [yes(y)/no(n)]')}`, static runtime = MainRuntime; static defaultConfig: Partial = { - disableWorkspaceConfigWrite: true, + enableWorkspaceConfigWrite: false, }; static async provider( From b2da388e829b4d7179ffcc91ef9e8f5e2be26f2f Mon Sep 17 00:00:00 2001 From: Gilad Shoham Date: Mon, 21 Aug 2023 18:08:28 +0300 Subject: [PATCH 6/6] linting --- scopes/workspace/install/install.main.runtime.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scopes/workspace/install/install.main.runtime.ts b/scopes/workspace/install/install.main.runtime.ts index 31fdffd88b70..da0a099829ef 100644 --- a/scopes/workspace/install/install.main.runtime.ts +++ b/scopes/workspace/install/install.main.runtime.ts @@ -7,6 +7,7 @@ import chalk from 'chalk'; import { WorkspaceAspect, Workspace, ComponentConfigFile } from '@teambit/workspace'; import { compact, mapValues, omit, uniq, intersection } from 'lodash'; import { ProjectManifest } from '@pnpm/types'; +import { GenerateResult, GeneratorAspect, GeneratorMain } from '@teambit/generator'; import componentIdToPackageName from '@teambit/legacy/dist/utils/bit/component-id-to-package-name'; import { ApplicationMain, ApplicationAspect } from '@teambit/application'; import { VariantsMain, Patterns, VariantsAspect } from '@teambit/variants'; @@ -47,7 +48,6 @@ import { LinkCommand } from './link'; import InstallCmd from './install.cmd'; import UninstallCmd from './uninstall.cmd'; import UpdateCmd from './update.cmd'; -import { GenerateResult, GeneratorAspect, GeneratorMain } from '@teambit/generator'; export type WorkspaceLinkOptions = LinkingOptions & { rootPolicy?: WorkspacePolicy;