npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

clean_code_template_cli

v0.0.103

Published

Professional API using Clean Architecture and TDD.

Downloads

177

Readme

Clean code Template cli

npm npm bundle size

npm

Getting started

This cli is a tool for generate clean code using template from Rodrigo Manguinhos clean-typescript

1. Install command

Global install


npm i clean_code_template_cli -g

OR with npx


npx clean_code_template_cli

2. Name File

The name of the file must be used with camel Case or snake case or to put inside classNames and transfom correctly name of files like Like NameOfFile

3. Sub Folders

The sub folders can be created adding pre paths like /path/NameOfFile

4. Commands

all commands will be uses with clean_code_template_cli create

CREATING

All commands must used with folder name like /name/ArquiveName

Controller

Will create a controller inside a folder /src/application/controllers


clean_code_template_cli create {{nameFile}} -ctl

will create


import { Controller } from '@/application/controllers'

import { HttpResponse, ok } from '@/application/helpers'

import { ValidationBuilder as Builder, Validator } from 'library-validators'

import { CreateCustomer } from '@/domain/contracts/repos'

import { {{ className }}UseCase } from '@/domain/use-cases'



type HttpRequest = {

name: string

nickname: string

email: string

inscription: string

firstName: string

lastName: string

password: string

domain: string

}

type Model = Error | CreateCustomer.Output



export class {{ className }}Controller extends Controller {

constructor (private readonly {{ className }}: {{ className }}UseCase) {

super()

}



async perform (input: HttpRequest): Promise<HttpResponse<Model>> {

const data = await this.{{ className }}(input)

return ok(data)

}



override buildValidators ({ name, email, inscription, firstName, lastName, password, domain }: HttpRequest): Validator[] {

return [

...Builder.of({ value: name, fieldName: 'name' }).required().build(),

...Builder.of({ value: email, fieldName: 'email' }).required().build(),

...Builder.of({ value: firstName, fieldName: 'firstName' }).required().build(),

...Builder.of({ value: lastName, fieldName: 'lastName' }).required().build(),

...Builder.of({ value: inscription, fieldName: 'inscription' }).required().build(),

...Builder.of({ value: password, fieldName: 'password' }).required().build(),

...Builder.of({ value: domain, fieldName: 'domain' }).required().build()

]

}

}


Contract

Will generate a contract file to use for a repository or gateway, does't have test file


clean_code_template_cli create {{nameFile}} -cta

will create


export interface {{ className }} {

{{ classNameLower }}: (input: {{ className }}.Input) => Promise<{{ className }}.Output>

}



export namespace {{ className }} {

export type Input = {

{{ properties }}

}

export type Output = undefined | {

{{ properties }}

}

}


UseCase

This command will generate Usecase file inside /src/domain/use-cases


clean_code_template_cli create {{nameFile}} -use

will create


//import { LoadFacebookUser, TokenGenerator } from '@/domain/contracts/gateways'

//import { LoadUserAccount, SaveFacebookAccount } from '@/domain/contracts/repos'

//import { AccessToken, FacebookAccount, AuthenticationError } from '@/domain/entities'



type Setup = () => {{ className }}

type Input = { {{ properties }} }

type Output = { accessToken: string }

export type {{ className }} = (input: Input) => Promise<Output>



export const setup{{ className }}: Setup = () => async input => {



}

Gateway

This command will generate Gateway file inside /src/infra/gateways


clean_code_template_cli create {{nameFile}} -gat

will create


//import { {{ className }} } from '@/infra/gateways'



export class {{ className }} // implements

{

constructor(

// private readonly httpClient: HttpGetClient,

){}



async handle(input: {{ className }}.Input): Promise<{{ className }}.Output>{



}

}


Repository

This command will generate Repository file inside /src/infra/repos/postgres


clean_code_template_cli create {{nameFile}} -rep

will create


//import { {{ className }}Show, {{ className }}Update } from '@/domain/contracts/repos'

import { PgRepository } from '@/infra/repos/postgres/repository'

import { Pg{{ className }} } from './entities'



export class Pg{{ className }}Repository extends PgRepository // implements {

async {{ className }} (input: {{ className }}.Input): Promise<{{ className }}.Output> {



}



async show ({ id }: {{ className }}Show.Input): Promise<{{ className }}Show.Output> {

const pg{{classNameLower}}Repo = await this.getRepository(Pg{{className}})

const {{classNameLower}} = await pg{{className}}Repo.findOne({ id })



if ({{classNameLower}} !== undefined) {

return {

id: {{classNameLower}}.id,

contactId: {{classNameLower}}.contactId,

email: {{classNameLower}}.email,

default: {{classNameLower}}.default as boolean,

created_at: {{classNameLower}}.createdAt,

updated_at: {{classNameLower}}.updatedAt

}

}

}

async store (input: {{ className }}Store.Input): Promise<{{ className }}Store.Output> {

const pg{{ className }}Repo = await this.getRepository(Pg{{ className }})

const contactEmail = await pg{{ className }}Repo.save(input)



return {

id: contactEmail.id,

contactId: contactEmail.contactId,

email: contactEmail.email,

default: contactEmail.default as boolean,

created_at: contactEmail.createdAt

}

}



async update ({ emailId, ...input }: {{ className }}Update.Input): Promise<{{ className }}Update.Output> {

const pg{{ className }}Repo = await this.getRepository(Pg{{ className }})



const result = await pg{{ className }}.update({ id: emailId }, input)



return result.affected != null && result.affected > 0

}



async delete ({ id }: {{ className }}Delete.Input): Promise<{{ className }}Delete.Output> {

const pg{{ className }}Repo = await this.getRepository(Pg{{ className }})



const result = await pg{{ className }}Repo.delete({ id })



return result.affected != null && result.affected > 0

}

}


Entities

This command will generate Entities file inside /src/domain/entities


clean_code_template_cli create {{nameFile}} -ent

will create


export class {{ className }} {

constructor( {{ properties }} ){}



execute(): Promise<void>{}

}


Error

This command will generate Error file inside /src/domain/entities/errors


clean_code_template_cli create {{nameFile}} -err

will create


export class {{ className }} extends Error {

constructor () {

super('{{ className }}')

this.name = '{{ className }}'

}

}

Adapter

This command will generate Adapter file inside /src/main/adapter


clean_code_template_cli create {{nameFile}} -adp

will create


import { Controller } from '@/application/controllers'



import { RequestHandler } from 'express'



type Adapter = (controller: Controller) => RequestHandler



export const adapt{{ className }}: Adapter = controller => async (req, res) => {

const { statusCode, data } = await controller.handle({ ...req.body, ...req.locals, ...req.params, ...req.query })

const json = [200, 204].includes(statusCode) ? data : { error: data.message }

res.status(statusCode).json(json)

}

Decorator


clean_code_template_cli create {{nameFile}} -dec

This command will generate Decorator file inside /src/aplication/decorator

import { {{ className }} } from '@/application/contracts'

import { Controller } from '@/application/controllers'

import { HttpResponse } from '@/application/helpers'

import { Validator } from '@/domain/contracts'



export class {{ className }}Controller extends Controller {

constructor (

private readonly decoratee: Controller,

private readonly db: {{ className }}

) {

super()

}



override buildValidators (httpRequest: any): Validator[] {

return this.decoratee.buildValidators(httpRequest)

}



async perform (httpRequest: any): Promise<HttpResponse> {

await this.db.openTransaction()



try {

const httpResponse = await this.decoratee.perform(httpRequest)

await this.db.commit()

return httpResponse

} catch (error) {

await this.db.rollback()

throw error

} finally {

await this.db.closeTransaction()

}

}

}

Route


clean_code_template_cli create {{nameFile}} -rot

This command will generate Decorator file inside /src/main/routes

import { adaptExpressRoute as adapt } from '@/main/adapters'

import { make{{ className }} } from '@/main/factories/application/controllers'



import { Router } from 'express'



export default (router: Router): void => {

router.post('/message/send', adapt(make{{ className }}()))

}

Validation


clean_code_template_cli create {{nameFile}} -val

This command will generate Decorator file inside /src/main/routes

// import { InvalidFieldError } from '@/application/errors'

import { Validator } from './validator'



export class {{ className }} implements Validator {

constructor (

private readonly value: Date,

private readonly field: string

) { }



validate (): Error | undefined {

// if (isNaN(Date.parse(this.value.toString()))) return new InvalidFieldError(this.field)

}

}

5. Combined Commands

Test

This command need be combined with ctl,use,gat,rep,ent to generate a test


clean_code_template_cli create {{nameFile}} -ctl -test

Properties

This command need be combined with ctl,use,gat,rep,ent and add properties file


clean_code_template_cli create {{nameFile}} -pro

OnlyTest

This command need be combined with ctl,use,gat,rep,ent to generate only a test file


clean_code_template_cli create {{nameFile}} -onlyTest

Author

  • Lucas Pereira