sample works
', async () => { const name = 'sample-with-default-template'; - await cli(`g c c ${name}`); + await runNgxdCLI(`g c c ${name}`); const html = filesystem.read(`${name}/${name}.component.html`); @@ -39,7 +39,7 @@ describe('[Commands: generate common component]', () => { test('should generate a common component with correct templateUrl: and styleUrls ', async () => { const name = 'sample-style-template-url'; - await cli(`g c c ${name}`); + await runNgxdCLI(`g c c ${name}`); const ts = filesystem.read(`${name}/${name}.component.ts`); diff --git a/src/commands/generate/component/component.ts b/src/commands/generate/component/component.ts index 74721f4..efdc59d 100644 --- a/src/commands/generate/component/component.ts +++ b/src/commands/generate/component/component.ts @@ -6,12 +6,12 @@ import { findCommand } from '../../../utils/functions.helper'; const COMMAND: GluegunCommand = { name: 'component', alias: ['c'], - description: 'Cria um componente Angular de tipo especΓfico', + description: 'Cria um componente Angular', run: async (toolbox: GluegunToolbox) => { const { parameters, prompt } = toolbox; - let componentName = parameters.first; + const componentName = parameters.first; const QUESTION = 'Qual tipo de componente vocΓͺ deseja criar?'; const TYPES = ['common', 'page', 'widget', 'layout', 'dialog']; @@ -27,7 +27,7 @@ const COMMAND: GluegunCommand = { const command = findCommand(toolbox, componentType); toolbox.parameters.first = componentName; - command.run(toolbox); + command?.run(toolbox); } }; diff --git a/src/commands/generate/component/dialog/dialog.test.ts b/src/commands/generate/component/dialog/dialog.test.ts index 897b56b..59aeb13 100644 --- a/src/commands/generate/component/dialog/dialog.test.ts +++ b/src/commands/generate/component/dialog/dialog.test.ts @@ -1,6 +1,6 @@ import { filesystem } from 'gluegun'; -import { cli } from '@ngxd/cli-test-setup'; +import { runNgxdCLI } from '../../../../utils/cli-test-setup'; describe('[Commands: generate dialog component]', () => { const name = 'gdc'; @@ -16,7 +16,7 @@ describe('[Commands: generate dialog component]', () => { }); test('should generate a dialog component with 3 files', async () => { - await cli(`g c d ${name}`); + await runNgxdCLI(`g c d ${name}`); const html = filesystem.read(`${name}/${name}.dialog.html`); const scss = filesystem.read(`${name}/${name}.dialog.scss`); @@ -28,14 +28,14 @@ describe('[Commands: generate dialog component]', () => { }); test('should generate a dialog component html with default templatesample works
', async () => { - await cli(`g c d ${name}`); + await runNgxdCLI(`g c d ${name}`); const html = filesystem.read(`${name}/${name}.dialog.html`); expect(html).toContain(`${name} works
`); }); test('should generate a dialog component with correct templateUrl: and styleUrls ', async () => { - await cli(`g c d ${name}`); + await runNgxdCLI(`g c d ${name}`); const ts = filesystem.read(`${name}/${name}.dialog.ts`); diff --git a/src/commands/generate/component/page/page.test.ts b/src/commands/generate/component/page/page.test.ts index 18fad73..507579b 100644 --- a/src/commands/generate/component/page/page.test.ts +++ b/src/commands/generate/component/page/page.test.ts @@ -1,6 +1,6 @@ import { filesystem } from 'gluegun'; -import { cli } from '@ngxd/cli-test-setup'; +import { runNgxdCLI } from '../../../../utils/cli-test-setup'; describe('[Commands: generate page component]', () => { const name = 'gpc'; @@ -16,7 +16,7 @@ describe('[Commands: generate page component]', () => { }); test('should generate a page component with 3 files', async () => { - await cli(`g c p ${name}`); + await runNgxdCLI(`g c p ${name}`); const html = filesystem.read(`${name}/${name}.page.html`); const scss = filesystem.read(`${name}/${name}.page.scss`); @@ -28,14 +28,14 @@ describe('[Commands: generate page component]', () => { }); test('should generate a page component html with default templatesample works
', async () => { - await cli(`g c p ${name}`); + await runNgxdCLI(`g c p ${name}`); const html = filesystem.read(`${name}/${name}.page.html`); expect(html).toContain(`${name} works
`); }); test('should generate a page component with correct templateUrl: and styleUrls ', async () => { - await cli(`g c p ${name}`); + await runNgxdCLI(`g c p ${name}`); const ts = filesystem.read(`${name}/${name}.page.ts`); diff --git a/src/commands/generate/component/widget/widget.test.ts b/src/commands/generate/component/widget/widget.test.ts index 6d86f9a..75fb863 100644 --- a/src/commands/generate/component/widget/widget.test.ts +++ b/src/commands/generate/component/widget/widget.test.ts @@ -1,6 +1,6 @@ import { filesystem } from 'gluegun'; -import { cli } from '@ngxd/cli-test-setup'; +import { runNgxdCLI } from '../../../../utils/cli-test-setup'; describe('[Commands: generate widget component]', () => { const name = 'gwc'; @@ -17,7 +17,7 @@ describe('[Commands: generate widget component]', () => { test('should generate a widget component on provided path', async () => { const path = 'sample-project/components'; - await cli(`g c w ${name} --path=${path}`); + await runNgxdCLI(`g c w ${name} --path=${path}`); const html = filesystem.read(`${path}/${name}/${name}.component.html`); const scss = filesystem.read(`${path}/${name}/${name}.component.scss`); @@ -33,7 +33,7 @@ describe('[Commands: generate widget component]', () => { }); test('should generate widget component with 4 files', async () => { - await cli(`g c w ${name}`); + await runNgxdCLI(`g c w ${name}`); const html = filesystem.read(`${name}/${name}.component.html`); const scss = filesystem.read(`${name}/${name}.component.scss`); @@ -47,14 +47,14 @@ describe('[Commands: generate widget component]', () => { }); test('should generate widget component html with default templatesample works
', async () => { - await cli(`g c w ${name}`); + await runNgxdCLI(`g c w ${name}`); const html = filesystem.read(`${name}/${name}.component.html`); expect(html).toContain(`${name} works
`); }); test('should generate a widget component with correct templateUrl: and styleUrls ', async () => { - await cli(`g c w ${name}`); + await runNgxdCLI(`g c w ${name}`); const ts = filesystem.read(`${name}/${name}.component.ts`); diff --git a/src/commands/generate/generate.ts b/src/commands/generate/generate.ts index c9ec8ca..e265f95 100644 --- a/src/commands/generate/generate.ts +++ b/src/commands/generate/generate.ts @@ -8,29 +8,22 @@ const COMMAND: GluegunCommand = { description: 'Cria uma nova entidade', alias: ['g'], run: async (toolbox: GluegunToolbox) => { - const { prompt } = toolbox + const { prompt } = toolbox; - const GENERATE_MODEL_TYPE_QUESTION = - 'Qual o tipo de entidade que vocΓͺ deseja criar?' + const GENERATE_MODEL_TYPE_QUESTION = 'Qual o tipo de entidade que vocΓͺ deseja criar?'; - const GENERATE_MODEL_TYPE_OPTIONS = [ - 'component', - 'directive', - 'guard', - 'interceptor', - 'module', - ] + const GENERATE_MODEL_TYPE_OPTIONS = ['component', 'directive', 'guard', 'interceptor', 'module']; const modelTypeResponse: GluegunAskResponse = await prompt.ask({ type: 'select', name: 'type', message: GENERATE_MODEL_TYPE_QUESTION, - choices: GENERATE_MODEL_TYPE_OPTIONS, - }) + choices: GENERATE_MODEL_TYPE_OPTIONS + }); - const command = findCommand(toolbox, modelTypeResponse.type) - command.run(toolbox) - }, -} + const command = findCommand(toolbox, modelTypeResponse.type); + command?.run(toolbox); + } +}; -module.exports = COMMAND +module.exports = COMMAND; diff --git a/src/commands/generate/service/api/api.test.ts b/src/commands/generate/service/api/api.test.ts new file mode 100644 index 0000000..aeefb6f --- /dev/null +++ b/src/commands/generate/service/api/api.test.ts @@ -0,0 +1,47 @@ +import { filesystem } from 'gluegun'; + +import { runNgxdCLI } from '../../../../utils/cli-test-setup'; + +describe('Commands: [Generate] => [Service] => [Api]', () => { + const name = 'gsc'; + + beforeEach(() => { + jest.useFakeTimers(); + jest.setTimeout(100000); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + test('should generate a api service with 2 files', async () => { + await runNgxdCLI(`g s a ${name}`); + + const ts = filesystem.read(`${name}/${name}.api.ts`); + const spec = filesystem.read(`${name}/${name}.api.spec.ts`); + + expect(ts).toBeDefined(); + expect(spec).toBeDefined(); + filesystem.remove(`${name}`); + }); + + test('should generate a api service with correct content ', async () => { + const name = 'fruit'; + + await runNgxdCLI(`g s a ${name}`); + + const ts = filesystem.read(`${name}/${name}.api.ts`); + const spec = filesystem.read(`${name}/${name}.api.spec.ts`); + + expect(ts).toContain(`import { Injectable } from '@angular/core'`); + expect(ts).toContain(`@Injectable({`); + expect(ts).toContain(`providedIn: 'root'`); + expect(ts).toContain(`export class FruitApi {`); + + expect(spec).toContain("describe('FruitApi', () => {"); + expect(spec).toContain("it('should be created', () => {"); + expect(spec).toContain('service = TestBed.inject(FruitApi);'); + + filesystem.remove(`${name}`); + }); +}); diff --git a/src/commands/generate/service/api/api.ts b/src/commands/generate/service/api/api.ts new file mode 100644 index 0000000..7f422c7 --- /dev/null +++ b/src/commands/generate/service/api/api.ts @@ -0,0 +1,59 @@ +import { GluegunCommand, GluegunToolbox } from 'gluegun'; +import { GluegunAskResponse } from 'gluegun/build/types/toolbox/prompt-types'; + +import { printCreated } from '../../../../utils/functions.helper'; + +const COMMAND: GluegunCommand = { + name: 'api', + alias: ['a'], + description: 'cria um serviΓ§o Angular do tipo Api', + run: async (toolbox: GluegunToolbox) => { + const { parameters, print, prompt, template, strings } = toolbox; + + let serviceName = parameters.first; + + if (!serviceName) { + const response: GluegunAskResponse = await prompt.ask({ + type: 'input', + name: 'serviceName', + message: 'Qual o nome do serviΓ§o?', + validate: (value: string) => { + if (!value) { + return 'O nome do serviΓ§o nΓ£o pode ser vazio'; + } + + return true; + } + }); + + serviceName = response.serviceName; + } + + const serviceNameKebab = strings.kebabCase(serviceName); + + template.generate({ + template: 'service.template.ts.ejs', + target: `./${serviceNameKebab}/${serviceNameKebab}.api.ts`, + props: { + type: 'api', + name: serviceName, + ...strings + } + }); + + template.generate({ + template: 'service.template.spec.ts.ejs', + target: `./${serviceNameKebab}/${serviceNameKebab}.api.spec.ts`, + props: { + type: 'api', + name: serviceName, + ...strings + } + }); + + printCreated(print, `${serviceNameKebab}/${serviceNameKebab}.api.ts`); + printCreated(print, `${serviceNameKebab}/${serviceNameKebab}.api.spec.ts`); + } +}; + +module.exports = COMMAND; diff --git a/src/commands/generate/service/common/common.test.ts b/src/commands/generate/service/common/common.test.ts new file mode 100644 index 0000000..750dfc0 --- /dev/null +++ b/src/commands/generate/service/common/common.test.ts @@ -0,0 +1,47 @@ +import { filesystem } from 'gluegun'; + +import { runNgxdCLI } from '../../../../utils/cli-test-setup'; + +describe('Commands: [Generate] => [Service] => [Common]', () => { + const name = 'gsc'; + + beforeEach(() => { + jest.useFakeTimers(); + jest.setTimeout(100000); + }); + + afterEach(() => { + jest.clearAllTimers(); + }); + + test('should generate a common service with 2 files', async () => { + await runNgxdCLI(`g s c ${name}`); + + const ts = filesystem.read(`${name}/${name}.service.ts`); + const spec = filesystem.read(`${name}/${name}.service.spec.ts`); + + expect(ts).toBeDefined(); + expect(spec).toBeDefined(); + filesystem.remove(`${name}`); + }); + + test('should generate a common service with correct content ', async () => { + const name = 'fruit'; + + await runNgxdCLI(`g s c ${name}`); + + const ts = filesystem.read(`${name}/${name}.service.ts`); + const spec = filesystem.read(`${name}/${name}.service.spec.ts`); + + expect(ts).toContain(`import { Injectable } from '@angular/core'`); + expect(ts).toContain(`@Injectable({`); + expect(ts).toContain(`providedIn: 'root'`); + expect(ts).toContain(`export class FruitService {`); + + expect(spec).toContain("describe('FruitService', () => {"); + expect(spec).toContain("it('should be created', () => {"); + expect(spec).toContain('service = TestBed.inject(FruitService);'); + + filesystem.remove(`${name}`); + }); +}); diff --git a/src/commands/generate/service/common/common.ts b/src/commands/generate/service/common/common.ts new file mode 100644 index 0000000..6957eb8 --- /dev/null +++ b/src/commands/generate/service/common/common.ts @@ -0,0 +1,59 @@ +import { GluegunCommand, GluegunToolbox } from 'gluegun'; +import { GluegunAskResponse } from 'gluegun/build/types/toolbox/prompt-types'; + +import { printCreated } from '../../../../utils/functions.helper'; + +const COMMAND: GluegunCommand = { + name: 'common', + alias: ['c'], + description: 'cria um serviΓ§o Angular', + run: async (toolbox: GluegunToolbox) => { + const { parameters, print, prompt, template, strings } = toolbox; + + let serviceName = parameters.first; + + if (!serviceName) { + const response: GluegunAskResponse = await prompt.ask({ + type: 'input', + name: 'serviceName', + message: 'Qual o nome do serviΓ§o?', + validate: (value: string) => { + if (!value) { + return 'O nome do serviΓ§o nΓ£o pode ser vazio'; + } + + return true; + } + }); + + serviceName = response.serviceName; + } + + const serviceNameKebab = strings.kebabCase(serviceName); + + template.generate({ + template: 'service.template.ts.ejs', + target: `./${serviceNameKebab}/${serviceNameKebab}.service.ts`, + props: { + type: 'service', + name: serviceName, + ...strings + } + }); + + template.generate({ + template: 'service.template.spec.ts.ejs', + target: `./${serviceNameKebab}/${serviceNameKebab}.service.spec.ts`, + props: { + type: 'service', + name: serviceName, + ...strings + } + }); + + printCreated(print, `${serviceNameKebab}/${serviceNameKebab}.service.ts`); + printCreated(print, `${serviceNameKebab}/${serviceNameKebab}.service.spec.ts`); + } +}; + +module.exports = COMMAND; diff --git a/src/commands/generate/service/service.ts b/src/commands/generate/service/service.ts new file mode 100644 index 0000000..5ce204f --- /dev/null +++ b/src/commands/generate/service/service.ts @@ -0,0 +1,34 @@ +import { GluegunCommand, GluegunToolbox } from 'gluegun'; +import { GluegunAskResponse } from 'gluegun/build/types/toolbox/prompt-types'; + +import { findCommand } from '../../../utils/functions.helper'; + +const COMMAND: GluegunCommand = { + name: 'service', + alias: ['s'], + description: 'Cria um serviΓ§o Angular', + + run: async (toolbox: GluegunToolbox) => { + const { parameters, prompt } = toolbox; + + const componentName = parameters.first; + + const QUESTION = 'Qual tipo de serviΓ§o vocΓͺ deseja criar?'; + const TYPES = ['common', 'api']; + + const componentTypeResponse: GluegunAskResponse = await prompt.ask({ + type: 'select', + name: 'type', + message: QUESTION, + choices: TYPES + }); + + const componentType = componentTypeResponse.type; + const command = findCommand(toolbox, componentType); + + toolbox.parameters.first = componentName; + command?.run(toolbox); + } +}; + +module.exports = COMMAND; diff --git a/src/commands/ngx-devs-cli.ts b/src/commands/ngx-devs-cli.ts index 5e56e71..447d7af 100644 --- a/src/commands/ngx-devs-cli.ts +++ b/src/commands/ngx-devs-cli.ts @@ -1,5 +1,6 @@ import { GluegunCommand } from 'gluegun'; +import * as packageJson from '../../package.json'; import { ASCII_ART } from '../utils/cli-ascii.const'; import { printVersion } from '../utils/functions.helper'; @@ -9,7 +10,7 @@ const COMMAND: GluegunCommand = { description: 'Inicializa a CLI do NgxDevs', run: async (toolbox) => { const { print } = toolbox; - const version = require('../../package.json').version; + const version = packageJson.version; print.info(ASCII_ART); printVersion(print, version); diff --git a/src/commands/version.ts b/src/commands/version.ts index 4140577..c6a1e6d 100644 --- a/src/commands/version.ts +++ b/src/commands/version.ts @@ -1,6 +1,6 @@ import { GluegunCommand, GluegunToolbox } from 'gluegun'; -import { PackageJSON } from 'gluegun/build/types/toolbox/meta-types'; +import * as packageJson from '../../package.json'; import { printVersion } from '../utils/functions.helper'; const COMMAND: GluegunCommand = { @@ -8,7 +8,6 @@ const COMMAND: GluegunCommand = { alias: ['v', '-v', '--version', '-version'], description: 'Mostra a versΓ£o do NgxDevs', run: async ({ print }: GluegunToolbox) => { - const packageJson: PackageJSON = require('../../package.json'); const version = packageJson?.version; printVersion(print, version); } diff --git a/src/templates/service.template.spec.ts.ejs b/src/templates/service.template.spec.ts.ejs new file mode 100644 index 0000000..96c314c --- /dev/null +++ b/src/templates/service.template.spec.ts.ejs @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { <%= pascalCase(props.name) %><%= pascalCase(props.type) %> } from './<%= kebabCase(props.name) %>.<%= kebabCase(props.type) %>'; + +describe('<%= pascalCase(props.name) %><%= pascalCase(props.type) %>', () => { + let service: <%= pascalCase(props.name) %><%= pascalCase(props.type) %>; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(<%= pascalCase(props.name) %><%= pascalCase(props.type) %>); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/templates/service.template.ts.ejs b/src/templates/service.template.ts.ejs new file mode 100644 index 0000000..181cfe9 --- /dev/null +++ b/src/templates/service.template.ts.ejs @@ -0,0 +1,6 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class <%= pascalCase(props.name) %><%= pascalCase(props.type) %> {} \ No newline at end of file diff --git a/src/utils/cli-ascii.const.ts b/src/utils/cli-ascii.const.ts index 16bda63..2bf2c17 100644 --- a/src/utils/cli-ascii.const.ts +++ b/src/utils/cli-ascii.const.ts @@ -4,4 +4,4 @@ export const ASCII_ART = ` ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ -ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ` +ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ`; diff --git a/src/utils/cli-test-setup.ts b/src/utils/cli-test-setup.ts new file mode 100644 index 0000000..c215480 --- /dev/null +++ b/src/utils/cli-test-setup.ts @@ -0,0 +1,7 @@ +import { filesystem, system } from 'gluegun'; + +const src = filesystem.path(__dirname, '..', '..'); + +export async function runNgxdCLI(cmd: string): Promise