diff --git a/scopes/generator/generator/exceptions/workspace-path-exists.ts b/scopes/generator/generator/exceptions/workspace-path-exists.ts new file mode 100644 index 000000000000..77ad35b3674e --- /dev/null +++ b/scopes/generator/generator/exceptions/workspace-path-exists.ts @@ -0,0 +1,7 @@ +import { BitError } from '@teambit/bit-error'; + +export class WorkspacePathExists extends BitError { + constructor(readonly path: string) { + super(`unable to create a workspace at "${path}", this path already exists`); + } +} diff --git a/scopes/generator/generator/generator.main.runtime.ts b/scopes/generator/generator/generator.main.runtime.ts index 124da4ee7189..a5a9f63e3b79 100644 --- a/scopes/generator/generator/generator.main.runtime.ts +++ b/scopes/generator/generator/generator.main.runtime.ts @@ -1,13 +1,13 @@ +import fs from 'fs-extra'; +import { resolve } from 'path'; import { GraphqlAspect, GraphqlMain } from '@teambit/graphql'; import { CLIAspect, CLIMain, MainRuntime } from '@teambit/cli'; import { WorkspaceAspect, OutsideWorkspaceError, Workspace } from '@teambit/workspace'; import { EnvDefinition, EnvsAspect, EnvsMain } from '@teambit/envs'; 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'; - import { isCoreAspect, loadBit, restoreGlobals } from '@teambit/bit'; import { Slot, SlotRegistry } from '@teambit/harmony'; import { GitAspect, GitMain } from '@teambit/git'; @@ -35,6 +35,7 @@ import { import { BasicWorkspaceStarter } from './templates/basic'; import { StarterPlugin } from './starter.plugin'; import { GeneratorService } from './generator.service'; +import { WorkspacePathExists } from './exceptions/workspace-path-exists'; export type ComponentTemplateSlot = SlotRegistry; export type WorkspaceTemplateSlot = SlotRegistry; @@ -357,14 +358,18 @@ export class GeneratorMain { if (this.workspace) { throw new BitError('Error: unable to generate a new workspace inside of an existing workspace'); } + const workspacePath = options.currentDir ? process.cwd() : resolve(workspaceName); + if (!options.currentDir && fs.existsSync(workspacePath)) { + throw new WorkspacePathExists(workspacePath); + } const { aspect: aspectId, loadFrom } = options; const { workspaceTemplate, aspect } = loadFrom ? await this.findTemplateInOtherWorkspace(loadFrom, templateName, aspectId) : await this.getWorkspaceTemplate(templateName, aspectId); if (!workspaceTemplate) throw new BitError(`template "${templateName}" was not found`); - const workspaceGenerator = new WorkspaceGenerator(workspaceName, options, workspaceTemplate, aspect); - const workspacePath = await workspaceGenerator.generate(); + const workspaceGenerator = new WorkspaceGenerator(workspaceName, workspacePath, options, workspaceTemplate, aspect); + await workspaceGenerator.generate(); return { workspacePath, appName: workspaceTemplate.appName }; } diff --git a/scopes/generator/generator/workspace-generator.ts b/scopes/generator/generator/workspace-generator.ts index 141fb4e3d13f..8c9f1c5ebf95 100644 --- a/scopes/generator/generator/workspace-generator.ts +++ b/scopes/generator/generator/workspace-generator.ts @@ -13,7 +13,7 @@ import { ImporterAspect, ImporterMain } from '@teambit/importer'; import { CompilerAspect, CompilerMain } from '@teambit/compiler'; import getGitExecutablePath from '@teambit/legacy/dist/utils/git/git-executable'; import GitNotFound from '@teambit/legacy/dist/utils/git/exceptions/git-not-found'; -import { resolve, join } from 'path'; +import { join } from 'path'; import { ComponentID } from '@teambit/component-id'; import { GitAspect, GitMain } from '@teambit/git'; import { InstallAspect, InstallMain } from '@teambit/install'; @@ -27,7 +27,6 @@ import { GeneratorMain } from './generator.main.runtime'; export type GenerateResult = { id: ComponentID; dir: string; files: string[]; envId: string }; export class WorkspaceGenerator { - private workspacePath: string; private harmony: Harmony; private workspace: Workspace; private install: InstallMain; @@ -38,21 +37,15 @@ export class WorkspaceGenerator { private wsConfigFiles: WorkspaceConfigFilesMain; private generator: GeneratorMain; - // private componentGenerator?: ComponentGenerator; - constructor( private workspaceName: string, + private workspacePath: string, private options: NewOptions & { currentDir?: boolean }, private template: WorkspaceTemplate, private aspectComponent?: Component - ) { - this.workspacePath = options.currentDir ? process.cwd() : resolve(this.workspaceName); - } + ) {} async generate(): Promise { - if (!this.options.currentDir && fs.existsSync(this.workspacePath)) { - throw new Error(`unable to create a workspace at "${this.workspaceName}", this path already exists`); - } await fs.ensureDir(this.workspacePath); try { process.chdir(this.workspacePath);