From 687bfd7b4321edf8d72ff70e8e0d310bcc9640d4 Mon Sep 17 00:00:00 2001 From: Samuel Rizzon Date: Sun, 15 May 2022 13:46:08 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20generate=20api=20and=20comm?= =?UTF-8?q?on=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/generate/service/api/api.ts | 59 +++++++++++++++++++ .../generate/service/common/common.ts | 59 +++++++++++++++++++ src/commands/generate/service/service.ts | 34 +++++++++++ src/templates/service.template.spec.ts.ejs | 16 +++++ src/templates/service.template.ts.ejs | 6 ++ 5 files changed, 174 insertions(+) create mode 100644 src/commands/generate/service/api/api.ts create mode 100644 src/commands/generate/service/common/common.ts create mode 100644 src/commands/generate/service/service.ts create mode 100644 src/templates/service.template.spec.ts.ejs create mode 100644 src/templates/service.template.ts.ejs 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.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..3e867a1 --- /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 de tipo específico', + + run: async (toolbox: GluegunToolbox) => { + const { parameters, prompt } = toolbox; + + let 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/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