cleanarch
TypeScript icon, indicating that this package has built-in type declarations

1.0.29 • Public • Published

cleanarch

A simple CLI tô generate typescript code based on uncle-bob clean architecture propose

Installation

npm i --save-dev cleanarch

Configure

You need creating in a root folder an a cleanarch-cli.config.json, thats a simple json with keys:

  • commands: an array of Command object
  • schema: an array of Schema object

Command Object: Owns 2 keys:

Schema Object

  • sufix: Suffix for generated class. eg: "Usecase"
  • extensionSufix: Suffix for extension: eg: ".usecase"
  • languageSufix: We currently only supports typescript so: ".ts"
  • defaultImplements: If the class implements an other classes use an array to declare the sufix of them: ["Inteface", "OtherSuffix"]
  • defaultDependencies: If the class uses other classes use an array to declare the sufix of them: ["Protocol"]
  • useDecorators: If your class use decorators use an array: ["@Service()", "Other()"]
  • folder: Generate file into the folder. eg: "./src/core/usecases/"
  • abstract: If class is abstract class so true else false;

Full Simple

{
  "lintPreferences": {
    "useSemicolon": true
  },
  "commands": [
    {
      "command": "-it --interface [commands...]",
      "comment": "Generate an Interface"
    },
    {
      "command": "-uc --usecase [commands...]",
      "comment": "Generate an Usecase"
    },
    {
      "command": "-pc --protocol [commands...]",
      "comment": "Generate an Protocol"
    },
    {
      "command": "-ct --connector [commands...]",
      "comment": "Generate an Connector"
    }
  ],
  "schema": [
    {
      "sufix": "Strategy",
      "extensionSufix": ".strategy",
      "languageSufix": ".ts",
      "defaultImplementsSuffix": "",
      "defaultDependenciesSuffix": "",
      "useDecorators": [],
      "folder": "./core/strategies/",
      "abstract": true,
      "importsFrom": []
    },
    {
      "sufix": "Usecase",
      "extensionSufix": ".usecase",
      "languageSufix": ".ts",
      "defaultImplementsSuffix": "Strategy",
      "defaultDependenciesSuffix": "Protocol",
      "useDecorators": [
        "@Core.Injection()"
      ],
      "folder": "./core/usecases/",
      "abstract": false,
      "importsFrom": [
        {
          "path": "'../interfaces/interfaces.exports'",
          "defaultSuffix": "Interface"
        },
        {
          "path": "'../protocols/protocols.exports'",
          "defaultSuffix": "Protocol"
        }
      ]
    },
    {
      "sufix": "Protocol",
      "extensionSufix": ".protocol",
      "languageSufix": ".ts",
      "defaultImplementsSuffix": "",
      "defaultDependenciesSuffix": "",
      "useDecorators": [],
      "folder": "./core/protocols/",
      "abstract": true,
      "importsFrom": []
    },
    {
      "sufix": "Connector",
      "extensionSufix": ".connector",
      "languageSufix": ".ts",
      "defaultImplementsSuffix": "Protocol",
      "defaultDependenciesSuffix": "",
      "useDecorators": [
        "@Core.Injection()"
      ],
      "folder": "./adapters/connectors/",
      "abstract": false,
      "importsFrom": [
        {
          "path": "'../../core/protocols/protocols.exports'",
          "defaultSuffix": "Protocol"
        }
      ]
    }
  ],
  "exportsConfig": {
    "extensionType": ".ts"
  }
}

Default Commands:

-all

Generete a full and complete schema

usage: -all <classes...>

-u

Make the class use a set of classes begining with given classes names

usage: -u <classes...>

-us

Make the class use a set of classes with specified names

-i

Make the class implements a specific set of classes

usage: -i <classes...>

-exports

usage: -export [path] Make or update a export file from current path or a path based on relative path (starting in current path)

Usage

Generate a complete Schema :

cleanarch -all UserLogin UserLogout

Thats create a bellow structure:

src>
    core>
        strategy>
            user-login.strategy.ts
            user-logout.strategy.ts
        usecases>
            user-login.usecase.ts
            user-logout.usecese.ts
        protocols>
            user-login.protocol.ts
            user-logout.protocol.ts
    adapter>
        connectors>
            user-login.protocol.ts
            user-logout.protocol.ts

Generate an specify component

assuming it has been configured in cleanarch-cli.json as presented

Generate Usecase

cleanarch -uc Login

that's generete a content file be like

export class LoginUsecase implements LoginStrategy {
  constructor(private readonly loginProtocol: LoginProtocol) {}
}

Generate an Usecase with specific dependencies and implements

cleanarch -uc Login -i AuthStrategy JwtStrategy AnyAbstractClass -u AuthProtocol AnyClass 

generate:

export class LoginUsecase implements AuthStrategy, JwtStrategy, AnyAbstractClass {
  constructor(private readonly authProtocol: AuthProtocol, private readonly anyClass: AnyClass) { }
} 

If you run this cli in empty project

Run in your terminal:

npm init -y
npm i --save-dev @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-prettier eslint-plugin-prettier prettier ts-loader ts-node tsconfig-paths typescript

Add files on source folder

ts.config.json

{
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "dist",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,
    "target": "ES2020",
    "sourceMap": true,
    "incremental": true,
    "skipLibCheck": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noFallthroughCasesInSwitch": true,
    "strict": false,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "strictBindCallApply": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "alwaysStrict": true
  }
}
{
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "dist",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,
    "target": "ES2020",
    "sourceMap": true,
    "incremental": true,
    "skipLibCheck": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noFallthroughCasesInSwitch": true,
    "strict": false,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "strictBindCallApply": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "alwaysStrict": true
  }
}
// TODO: a partir de strict: true é configuração manual baseada nos padrões do angular

ts.config.build.json

{
  "extends": "./tsconfig.json",
  "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
}

Readme

Keywords

none

Package Sidebar

Install

npm i cleanarch

Weekly Downloads

0

Version

1.0.29

License

ISC

Unpacked Size

186 kB

Total Files

125

Last publish

Collaborators

  • sprafael