diff --git a/common/changes/@boostercloud/framework-core/fix-1196_remove-params-from-new-project_2022-12-14-13-08.json b/common/changes/@boostercloud/framework-core/fix-1196_remove-params-from-new-project_2022-12-14-13-08.json new file mode 100644 index 000000000..1fde84247 --- /dev/null +++ b/common/changes/@boostercloud/framework-core/fix-1196_remove-params-from-new-project_2022-12-14-13-08.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@boostercloud/framework-core", + "comment": "updated default behaviour for new:project", + "type": "minor" + } + ], + "packageName": "@boostercloud/framework-core" +} \ No newline at end of file diff --git a/docs/chapters/02_getting-started.md b/docs/chapters/02_getting-started.md index 61cdfa0a4..8c99ab4bf 100644 --- a/docs/chapters/02_getting-started.md +++ b/docs/chapters/02_getting-started.md @@ -345,7 +345,7 @@ running for a blog application in just a few minutes. The steps to follow will b ### 1. Create the project -First of all, we will use the Booster generators to create a project. Run this command `boost new:project boosted-blog` and follow +First of all, we will use the Booster generators to create a project. Run this command `boost new:project boosted-blog --interactive` and follow the instructions. After some prompted questions, the CLI will ask you to select one of the available providers to set up as the main provider that will be used. ```shell @@ -373,14 +373,11 @@ After choosing your provider, you will see your project generated!: ℹ Project generated! ``` -> [!TIP] If you prefer to create the project with default parameters, you can run the command as `boost new:project booster-blog --default`. The default -> parameters are as follows: +> [!TIP] If you prefer to create the project with default parameters, you can run the command as `boost new:project booster-blog --providerPackageName `. The package name of the provider is the only required parameter and can be any `npm` package that implements Booster's provider interfaces. The framework provides the following: > -> - Project name: The one provided when running the command, in this case "booster-blog" -> - Provider: AWS -> - Description, author, homepage and repository: "" -> - License: MIT -> - Version: 0.1.0 +> - `@boostercloud/framework-provider-aws`: Runs your app in AWS. +> - `@boostercloud/framework-provider-azure`: Runs your app in Azure. +> - `@boostercloud/framework-provider-kubernetes` (Experimental): Proof of concept that shows how to run your app on a Kubernetes cluster. In case you want to specify each parameter without following the instructions, you can use the following flags with this structure `=`. diff --git a/packages/cli/src/commands/new/project.ts b/packages/cli/src/commands/new/project.ts index 3c6a40d6c..373531c44 100644 --- a/packages/cli/src/commands/new/project.ts +++ b/packages/cli/src/commands/new/project.ts @@ -58,6 +58,10 @@ export default class Project extends Command { description: 'skip git initialization', default: false, }), + interactive: flags.boolean({ + description: 'run an interactive wizard to configure your project', + default: false, + }), } public static args = [{ name: 'projectName' }] @@ -71,6 +75,8 @@ export default class Project extends Command { assertNameIsCorrect(projectName) await checkProjectAlreadyExists(projectName) const parsedFlags = { projectName, ...flags } + if (!flags.interactive && !flags.providerPackageName) + throw 'You must set a provider runtime package using the --provider flag or use the interactive mode with the --interactive flag.' await run(parsedFlags as Partial, this.config.version) } catch (error) { console.error(error) @@ -126,10 +132,44 @@ export const parseConfig = async ( flags: Partial, boosterVersion: string ): Promise => { - if (flags.default) { - return Promise.resolve({ + if (flags.interactive) { + const description = await prompter.defaultOrPrompt( + flags.description, + 'What\'s your project description? (default: "")' + ) + const versionPrompt = await prompter.defaultOrPrompt(flags.version, "What's the first version? (default: 0.1.0)") + const version = versionPrompt || '0.1.0' + const author = await prompter.defaultOrPrompt(flags.author, 'Who\'s the author? (default: "")') + const homepage = await prompter.defaultOrPrompt(flags.homepage, 'What\'s the website? (default: "")') + const licensePrompt = await prompter.defaultOrPrompt( + flags.license, + 'What license will you be publishing this under? (default: MIT)' + ) + const license = licensePrompt || 'MIT' + const repository = await prompter.defaultOrPrompt( + flags.repository, + 'What\'s the URL of the repository? (default: "")' + ) + const providerPackageName = await getProviderPackageName(prompter, flags.providerPackageName) + + return { + projectName: flags.projectName as string, + providerPackageName, + description, + version, + author, + homepage, + license, + repository, + boosterVersion, + skipInstall: flags.skipInstall || false, + skipGit: flags.skipGit || false, + interactive: true, + } + } else { + return { projectName: flags.projectName as string, - providerPackageName: '@boostercloud/framework-provider-aws', + providerPackageName: flags.providerPackageName as string, description: '', version: '0.1.0', author: '', @@ -137,43 +177,9 @@ export const parseConfig = async ( license: 'MIT', repository: '', boosterVersion, - default: flags.default, skipInstall: flags.skipInstall || false, skipGit: flags.skipGit || false, - }) + interactive: false, + } } - - const description = await prompter.defaultOrPrompt( - flags.description, - 'What\'s your project description? (default: "")' - ) - const versionPrompt = await prompter.defaultOrPrompt(flags.version, "What's the first version? (default: 0.1.0)") - const version = versionPrompt || '0.1.0' - const author = await prompter.defaultOrPrompt(flags.author, 'Who\'s the author? (default: "")') - const homepage = await prompter.defaultOrPrompt(flags.homepage, 'What\'s the website? (default: "")') - const licensePrompt = await prompter.defaultOrPrompt( - flags.license, - 'What license will you be publishing this under? (default: MIT)' - ) - const license = licensePrompt || 'MIT' - const repository = await prompter.defaultOrPrompt( - flags.repository, - 'What\'s the URL of the repository? (default: "")' - ) - const providerPackageName = await getProviderPackageName(prompter, flags.providerPackageName) - - return Promise.resolve({ - projectName: flags.projectName as string, - providerPackageName, - description, - version, - author, - homepage, - license, - repository, - boosterVersion, - default: false, - skipInstall: flags.skipInstall || false, - skipGit: flags.skipGit || false, - }) } diff --git a/packages/cli/src/services/project-initializer.ts b/packages/cli/src/services/project-initializer.ts index 56f75315b..6d10da492 100644 --- a/packages/cli/src/services/project-initializer.ts +++ b/packages/cli/src/services/project-initializer.ts @@ -68,9 +68,9 @@ export interface ProjectInitializerConfig { repository: string providerPackageName: string boosterVersion: string - default: boolean skipInstall: boolean skipGit: boolean + interactive: boolean } function renderToFile(templateData: ProjectInitializerConfig): (_: [Array, string]) => Promise { diff --git a/packages/cli/test/commands/new/project.test.ts b/packages/cli/test/commands/new/project.test.ts index 874c8fba6..8b25e62a7 100644 --- a/packages/cli/test/commands/new/project.test.ts +++ b/packages/cli/test/commands/new/project.test.ts @@ -1,4 +1,4 @@ -import { restore, replace, fake, spy } from 'sinon' +import { restore, replace, fake } from 'sinon' import { ProjectInitializerConfig } from '../../../src/services/project-initializer' import { oraLogger } from '../../../src/services/logger' import * as fs from 'fs-extra' @@ -47,13 +47,13 @@ describe('new', (): void => { repository: '', providerPackageName: defaultProvider, boosterVersion: '0.5.1', - default: true, skipInstall: false, skipGit: false, + interactive: false, } as ProjectInitializerConfig const renderPackageJson = (config: ProjectInitializerConfig): string => { - return Mustache.render(packageJson.template, config) + return Mustache.render(packageJson.template, config) } beforeEach(() => { @@ -71,10 +71,10 @@ describe('new', (): void => { }) describe('works properly', () => { - it('without flags', async () => { + it('with the --interactive flag', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) - await new Project.default([projectName], {} as IConfig).run() + await new Project.default([projectName, '--interactive'], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called @@ -85,7 +85,7 @@ describe('new', (): void => { it('skip dependencies installation with --skipInstall', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) - await new Project.default([projectName, '--skipInstall'], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '--skipInstall'], {} as IConfig).run() expect(ProjectInitializer.installDependencies).to.have.not.been.called expect(ProjectInitializer.initializeGit).to.have.been.called @@ -93,152 +93,144 @@ describe('new', (): void => { expectFilesAndDirectoriesCreated(projectName) }) - it('generates project with default parameters when using --default flag', async () => { - const parseConfigSpy = spy(Project, 'parseConfig') - - await new Project.default([projectName, '--default'], { version: '0.5.1' } as IConfig).run() - - expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') - expectFilesAndDirectoriesCreated(projectName) - expect(parseConfigSpy).to.have.been.calledOnce - expect(await parseConfigSpy.firstCall.returnValue).to.be.deep.equal( - defaultProjectInitializerConfig as ProjectInitializerConfig - ) - - const expectedPackageJson = renderPackageJson(defaultProjectInitializerConfig) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,expectedPackageJson) - expect(ProjectInitializer.installDependencies).to.have.been.called - }) - it('skips git repository initialization with --skipGit', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) - await new Project.default([projectName, '--skipGit'], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '--skipGit'], {} as IConfig).run() expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expect(ProjectInitializer.initializeGit).to.have.not.been.called expectFilesAndDirectoriesCreated(projectName) const expectedPackageJson = renderPackageJson(defaultProjectInitializerConfig) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,expectedPackageJson) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, expectedPackageJson) }) - describe('define homepage', () => { + describe('define homepage', () => { it('with --homepage', async () => { const config = { ...defaultProjectInitializerConfig, homepage: 'booster.cloud' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'--homepage',"'booster.cloud'"], {} as IConfig).run() + await new Project.default( + [projectName, '--interactive', '--homepage', "'booster.cloud'"], + {} as IConfig + ).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) it('with -H', async () => { const config = { ...defaultProjectInitializerConfig, homepage: 'booster.cloud' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'-H',"'booster.cloud'"], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '-H', "'booster.cloud'"], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) }) - describe('define author', () => { + describe('define author', () => { it('with --author', async () => { const config = { ...defaultProjectInitializerConfig, author: 'John Doe' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'--author',"'John Doe'"], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '--author', "'John Doe'"], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) it('with -a', async () => { const config = { ...defaultProjectInitializerConfig, author: 'John Doe' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'-a',"'John Doe'"], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '-a', "'John Doe'"], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) }) - describe('define description', () => { + describe('define description', () => { it('with --description', async () => { const config = { ...defaultProjectInitializerConfig, description: 'a short description' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'--description',"'a short description'"], {} as IConfig).run() + await new Project.default( + [projectName, '--interactive', '--description', "'a short description'"], + {} as IConfig + ).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) it('with -d', async () => { const config = { ...defaultProjectInitializerConfig, description: 'a short description' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'-d',"'a short description'"], {} as IConfig).run() + await new Project.default( + [projectName, '--interactive', '-d', "'a short description'"], + {} as IConfig + ).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) }) - describe('define license', () => { + describe('define license', () => { it('with --license', async () => { const config = { ...defaultProjectInitializerConfig, license: 'GPL' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'--license','GPL'], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '--license', 'GPL'], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) it('with -l', async () => { const config = { ...defaultProjectInitializerConfig, license: 'GPL' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'-l','GPL'], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '-l', 'GPL'], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) }) - describe('define provider', () => { + describe('define provider', () => { it('with --providerPackageName', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) - await new Project.default([projectName,'--providerPackageName',defaultProvider], {} as IConfig).run() + await new Project.default([projectName, '--providerPackageName', defaultProvider], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called @@ -249,7 +241,7 @@ describe('new', (): void => { it('with -p', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) - await new Project.default([projectName,'-p',defaultProvider], {} as IConfig).run() + await new Project.default([projectName, '-p', defaultProvider], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called @@ -258,125 +250,160 @@ describe('new', (): void => { }) }) - describe('define repository', () => { + describe('define repository', () => { it('with --repository', async () => { const config = { ...defaultProjectInitializerConfig, repository: defaultRepository } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'--repository',defaultRepository], {} as IConfig).run() + await new Project.default( + [projectName, '--interactive', '--repository', defaultRepository], + {} as IConfig + ).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) it('with -r', async () => { const config = { ...defaultProjectInitializerConfig, repository: defaultRepository } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'-r',defaultRepository], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '-r', defaultRepository], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) }) - describe('define version', () => { + describe('define version', () => { it('with --version', async () => { const config = { ...defaultProjectInitializerConfig, version: '1.0.0' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'--version','1.0.0'], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '--version', '1.0.0'], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) it('with -v', async () => { const config = { ...defaultProjectInitializerConfig, version: '1.0.0' } replace(Project, 'parseConfig', fake.returns(config)) - await new Project.default([projectName,'-v','1.0.0'], {} as IConfig).run() + await new Project.default([projectName, '--interactive', '-v', '1.0.0'], {} as IConfig).run() expect(ProjectInitializer.initializeGit).to.have.been.called expect(ProjectInitializer.installDependencies).to.have.been.called expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') expectFilesAndDirectoriesCreated(projectName) - expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`,renderPackageJson(config)) + expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/package.json`, renderPackageJson(config)) }) }) - describe('define multiple flags', () => { - it('with all options (long flags)', async () => { - await new Project.default([projectName, - '--version','1.0.0', - '--author',"'John Doe'", - '--description',"'a new description'", - '--homepage','booster.cloud', - '--repository','github.com/boostercloud/booster.git', - '--license','GPL', - '--providerPackageName',defaultProvider, + describe('define multiple flags', () => { + it('with all options (long flags)', async () => { + await new Project.default( + [ + projectName, + '--version', + '1.0.0', + '--author', + "'John Doe'", + '--description', + "'a new description'", + '--homepage', + 'booster.cloud', + '--repository', + 'github.com/boostercloud/booster.git', + '--license', + 'GPL', + '--providerPackageName', + defaultProvider, + '--skipInstall', + '--skipGit', + ], + {} as IConfig + ).run() + + expect(ProjectInitializer.initializeGit).to.have.not.been.called + expect(ProjectInitializer.installDependencies).to.have.not.been.called + expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') + expectFilesAndDirectoriesCreated(projectName) + }) + + it('with all options (short flags)', async () => { + await new Project.default( + [ + projectName, + '-v', + '1.0.0', + '-a', + "'John Doe'", + '-d', + "'a new description'", + '-H', + 'booster.cloud', + '-r', + 'github.com/boostercloud/booster.git', + '-l', + 'GPL', + '-p', + defaultProvider, '--skipInstall', - '--skipGit' - ], {} as IConfig).run() - - expect(ProjectInitializer.initializeGit).to.have.not.been.called - expect(ProjectInitializer.installDependencies).to.have.not.been.called - expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') - expectFilesAndDirectoriesCreated(projectName) - }) - - it('with all options (short flags)', async () => { - await new Project.default([projectName, - '-v','1.0.0', - '-a',"'John Doe'", - '-d',"'a new description'", - '-H','booster.cloud', - '-r','github.com/boostercloud/booster.git', - '-l','GPL', - '-p',defaultProvider, - '--skipInstall', - '--skipGit' - ], {} as IConfig).run() - - expect(ProjectInitializer.initializeGit).to.have.not.been.called - expect(ProjectInitializer.installDependencies).to.have.not.been.called - expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') - expectFilesAndDirectoriesCreated(projectName) - }) + '--skipGit', + ], + {} as IConfig + ).run() + + expect(ProjectInitializer.initializeGit).to.have.not.been.called + expect(ProjectInitializer.installDependencies).to.have.not.been.called + expect(oraLogger.info).to.have.been.calledWithMatch('Project generated!') + expectFilesAndDirectoriesCreated(projectName) + }) }) }) describe('displays an error', () => { it('with empty project name', async () => { - replace(console,'error', fake.resolves({})) + replace(console, 'error', fake.resolves({})) await new Project.default([], {} as IConfig).run() expect(fs.mkdirs).to.have.not.been.calledWithMatch(`${projectName}/src`) expect(console.error).to.have.been.calledWithMatch(/You haven't provided a project name/) expect(oraLogger.info).to.have.not.been.calledWithMatch('Project generated!') }) + it('with neither the interactive flag, not provider package name', async () => { + replace(console, 'error', fake.resolves({})) + await new Project.default([projectName], {} as IConfig).run() + expect(fs.mkdirs).to.have.not.been.calledWithMatch(`${projectName}/src`) + expect(console.error).to.have.been.calledWithMatch( + /You must set a provider runtime package using the --provider flag or use the interactive mode with the --interactive flag./ + ) + expect(oraLogger.info).to.have.not.been.calledWithMatch('Project generated!') + }) + it('with nonexisting option', async () => { - let exceptionThrown = false - let exceptionMessage = '' - try { - await new Project.default([projectName,'--nonexistingoption'], {} as IConfig).run() - } catch(e) { - exceptionThrown = true - exceptionMessage = e.message - } - expect(exceptionThrown).to.be.equal(true) - expect(exceptionMessage).to.contain('Unexpected argument: --nonexistingoption') - expect(oraLogger.info).to.have.not.been.calledWithMatch('Project generated!') - expect(fs.mkdirs).to.have.not.been.calledWithMatch(`${projectName}/src`) + let exceptionThrown = false + let exceptionMessage = '' + try { + await new Project.default([projectName, '--nonexistingoption'], {} as IConfig).run() + } catch (e) { + exceptionThrown = true + exceptionMessage = e.message + } + expect(exceptionThrown).to.be.equal(true) + expect(exceptionMessage).to.contain('Unexpected argument: --nonexistingoption') + expect(oraLogger.info).to.have.not.been.calledWithMatch('Project generated!') + expect(fs.mkdirs).to.have.not.been.calledWithMatch(`${projectName}/src`) }) describe('define homepage badly', () => { @@ -386,8 +413,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--homepage'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--homepage'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -401,8 +428,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-H'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-H'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -418,8 +445,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--author'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--author'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -433,8 +460,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-a'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-a'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -450,8 +477,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--description'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--description'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -465,8 +492,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-d'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-d'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -482,8 +509,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--license'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--license'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -497,8 +524,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-l'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-l'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -514,8 +541,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--providerPackageName'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--providerPackageName'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -529,8 +556,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-p'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-p'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -539,15 +566,15 @@ describe('new', (): void => { }) }) - describe('define repository badly', () => { + describe('define repository badly', () => { it('with --repository and no repository name', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--repository'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--repository'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -561,8 +588,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-r'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-r'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -571,15 +598,15 @@ describe('new', (): void => { }) }) - describe('define version badly', () => { + describe('define version badly', () => { it('with --version and no version number', async () => { replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--version'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '--version'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -593,8 +620,8 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'-v'], {} as IConfig).run() - } catch(e) { + await new Project.default([projectName, '-v'], {} as IConfig).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -612,8 +639,11 @@ describe('new', (): void => { let exceptionThrown = false let exceptionMessage = '' try { - await new Project.default([projectName,'--providerPackageName','nonexistingProvider'], {} as IConfig).run() - } catch(e) { + await new Project.default( + [projectName, '--providerPackageName', 'nonexistingProvider'], + {} as IConfig + ).run() + } catch (e) { exceptionThrown = true exceptionMessage = e.message } @@ -623,24 +653,22 @@ describe('new', (): void => { }) describe('define repository badly', () => { - xit('with --repository and invalid URL', async () => { - replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) - - let exceptionThrown = false - let exceptionMessage = '' - try { - await new Project.default([projectName,'--repository','invalidUrl'], {} as IConfig).run() - } catch(e) { - exceptionThrown = true - exceptionMessage = e.message - } - expect(exceptionThrown).to.be.equal(true) - expect(exceptionMessage).to.contain('--repository expects a url') - }) + xit('with --repository and invalid URL', async () => { + replace(Project, 'parseConfig', fake.returns(defaultProjectInitializerConfig)) + + let exceptionThrown = false + let exceptionMessage = '' + try { + await new Project.default([projectName, '--repository', 'invalidUrl'], {} as IConfig).run() + } catch (e) { + exceptionThrown = true + exceptionMessage = e.message + } + expect(exceptionThrown).to.be.equal(true) + expect(exceptionMessage).to.contain('--repository expects a url') }) + }) }) - - }) }) }) diff --git a/packages/cli/test/services/project-initializer.test.ts b/packages/cli/test/services/project-initializer.test.ts index 37fe91130..d62559c63 100644 --- a/packages/cli/test/services/project-initializer.test.ts +++ b/packages/cli/test/services/project-initializer.test.ts @@ -25,7 +25,7 @@ describe('project initializer', (): void => { const projectName = 'test-project' const defaultProvider = '@boostercloud/framework-provider-aws' - const defaultProjectInitializerConfig = { + const defaultProjectInitializerConfig: ProjectInitializerConfig = { projectName: projectName, description: '', version: '0.1.0', @@ -35,10 +35,10 @@ describe('project initializer', (): void => { repository: '', providerPackageName: defaultProvider, boosterVersion: '0.5.1', - default: true, skipInstall: false, skipGit: false, - } as ProjectInitializerConfig + interactive: true, + } it('initialize Git', async () => { await initializeGit(defaultProjectInitializerConfig) @@ -79,4 +79,4 @@ describe('project initializer', (): void => { expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/src/index.ts`) expect(fs.outputFile).to.have.been.calledWithMatch(`${projectName}/.mocharc.yml`) }) -}) +}) \ No newline at end of file