@koalarx/nest-cli 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/code-base/startup-project/.gitattributes +1 -0
  4. package/code-base/startup-project/LICENSE +21 -0
  5. package/code-base/startup-project/README.md +5 -0
  6. package/code-base/startup-project/eslint.config.mjs +22 -0
  7. package/code-base/startup-project/nest-cli.json +35 -0
  8. package/code-base/startup-project/package.json +68 -0
  9. package/code-base/startup-project/prisma/schema.prisma +30 -0
  10. package/code-base/startup-project/src/application/person/create/create-person.handler.spec.ts +22 -0
  11. package/code-base/startup-project/src/application/person/create/create-person.handler.ts +39 -0
  12. package/code-base/startup-project/src/application/person/create/create-person.request.ts +18 -0
  13. package/code-base/startup-project/src/application/person/create/create-person.response.ts +3 -0
  14. package/code-base/startup-project/src/application/person/create/create-person.validator.ts +16 -0
  15. package/code-base/startup-project/src/application/person/create-person-job/create-person-job.ts +57 -0
  16. package/code-base/startup-project/src/application/person/delete/delete-person.handler.spec.ts +24 -0
  17. package/code-base/startup-project/src/application/person/delete/delete-person.handler.ts +33 -0
  18. package/code-base/startup-project/src/application/person/delete-inative-job/delete-inactive-job.ts +49 -0
  19. package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-event.ts +3 -0
  20. package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-handler.ts +27 -0
  21. package/code-base/startup-project/src/application/person/events/person-event.job.ts +11 -0
  22. package/code-base/startup-project/src/application/person/read/read-person.handler.spec.ts +29 -0
  23. package/code-base/startup-project/src/application/person/read/read-person.handler.ts +37 -0
  24. package/code-base/startup-project/src/application/person/read/read-person.response.ts +30 -0
  25. package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts +72 -0
  26. package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts +42 -0
  27. package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts +15 -0
  28. package/code-base/startup-project/src/application/person/read-many/read-many-person.response.ts +16 -0
  29. package/code-base/startup-project/src/application/person/read-many/read-many.validator.ts +16 -0
  30. package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts +42 -0
  31. package/code-base/startup-project/src/application/person/update/update-person.handler.ts +56 -0
  32. package/code-base/startup-project/src/application/person/update/update-person.request.ts +26 -0
  33. package/code-base/startup-project/src/application/person/update/update-person.validator.ts +17 -0
  34. package/code-base/startup-project/src/domain/entities/person/person-phone.ts +10 -0
  35. package/code-base/startup-project/src/domain/entities/person/person.ts +18 -0
  36. package/code-base/startup-project/src/domain/mapping/mapping.profile.ts +10 -0
  37. package/code-base/startup-project/src/domain/mapping/person.mapping.ts +24 -0
  38. package/code-base/startup-project/src/domain/repositories/iperson.repository.ts +14 -0
  39. package/code-base/startup-project/src/infra/app.module.ts +27 -0
  40. package/code-base/startup-project/src/infra/controllers/controller.module.ts +16 -0
  41. package/code-base/startup-project/src/infra/controllers/controllers.module.ts +12 -0
  42. package/code-base/startup-project/src/infra/controllers/person/create-person.controller.ts +30 -0
  43. package/code-base/startup-project/src/infra/controllers/person/delete-person.controller.ts +22 -0
  44. package/code-base/startup-project/src/infra/controllers/person/person.controller.e2e-spec.ts +120 -0
  45. package/code-base/startup-project/src/infra/controllers/person/person.module.ts +31 -0
  46. package/code-base/startup-project/src/infra/controllers/person/read-many-person.controller.ts +29 -0
  47. package/code-base/startup-project/src/infra/controllers/person/read-person.controller.ts +26 -0
  48. package/code-base/startup-project/src/infra/controllers/person/router.config.ts +9 -0
  49. package/code-base/startup-project/src/infra/controllers/person/update-person.controller.ts +30 -0
  50. package/code-base/startup-project/src/infra/database/db-transaction-context.ts +18 -0
  51. package/code-base/startup-project/src/infra/database/repositories/person.repository.ts +51 -0
  52. package/code-base/startup-project/src/infra/database/repositories/repositories.module.ts +14 -0
  53. package/code-base/startup-project/src/infra/main.ts +30 -0
  54. package/code-base/startup-project/src/test/create-e2e-test-app.ts +17 -0
  55. package/code-base/startup-project/src/test/create-unit-test-app.ts +24 -0
  56. package/code-base/startup-project/src/test/mockup/person/create-person-request.mockup.ts +8 -0
  57. package/code-base/startup-project/src/test/repositories/person.repository.ts +27 -0
  58. package/code-base/startup-project/src/test/setup-e2e.ts +7 -0
  59. package/code-base/startup-project/tsconfig.json +31 -0
  60. package/code-base/startup-project/vitest.config.e2e.mts +18 -0
  61. package/code-base/startup-project/vitest.config.mts +10 -0
  62. package/commands/new-project/index.d.ts +3 -0
  63. package/commands/new-project/index.js +80 -0
  64. package/index.d.ts +1 -0
  65. package/index.js +152 -0
  66. package/package.json +61 -0
  67. package/utils/copy-folder.d.ts +3 -0
  68. package/utils/copy-folder.js +59 -0
@@ -0,0 +1,29 @@
1
+ import { ReadManyPersonHandler } from '@/application/person/read-many/read-many-person.handler'
2
+ import { ReadManyPersonRequest } from '@/application/person/read-many/read-many-person.request'
3
+ import { ReadManyPersonResponse } from '@/application/person/read-many/read-many-person.response'
4
+ import { IController } from '@koalarx/nest/core/controllers/base.controller'
5
+ import { Controller, Get, Query } from '@nestjs/common'
6
+ import { ApiOkResponse, ApiTags } from '@nestjs/swagger'
7
+ import { PERSON_ROUTER_CONFIG } from './router.config'
8
+
9
+ @ApiTags(PERSON_ROUTER_CONFIG.tag)
10
+ @Controller(PERSON_ROUTER_CONFIG.group)
11
+ export class ReadManyPersonController
12
+ implements IController<ReadManyPersonRequest, ReadManyPersonResponse>
13
+ {
14
+ constructor(private readonly handler: ReadManyPersonHandler) {}
15
+
16
+ @Get()
17
+ @ApiOkResponse({ type: ReadManyPersonResponse })
18
+ async handle(
19
+ @Query() query: ReadManyPersonRequest,
20
+ ): Promise<ReadManyPersonResponse> {
21
+ const response = await this.handler.handle(query)
22
+
23
+ if (response.isFailure()) {
24
+ throw response.value
25
+ }
26
+
27
+ return response.value
28
+ }
29
+ }
@@ -0,0 +1,26 @@
1
+ import { ReadPersonHandler } from '@/application/person/read/read-person.handler'
2
+ import { ReadPersonResponse } from '@/application/person/read/read-person.response'
3
+ import { IController } from '@koalarx/nest/core/controllers/base.controller'
4
+ import { Controller, Get, Param } from '@nestjs/common'
5
+ import { ApiOkResponse, ApiTags } from '@nestjs/swagger'
6
+ import { PERSON_ROUTER_CONFIG } from './router.config'
7
+
8
+ @ApiTags(PERSON_ROUTER_CONFIG.tag)
9
+ @Controller(PERSON_ROUTER_CONFIG.group)
10
+ export class ReadPersonController
11
+ implements IController<null, ReadPersonResponse, string>
12
+ {
13
+ constructor(private readonly handler: ReadPersonHandler) {}
14
+
15
+ @Get(':id')
16
+ @ApiOkResponse({ type: ReadPersonResponse })
17
+ async handle(_, @Param('id') id: string): Promise<ReadPersonResponse> {
18
+ const response = await this.handler.handle(+id)
19
+
20
+ if (response.isFailure()) {
21
+ throw response.value
22
+ }
23
+
24
+ return response.value
25
+ }
26
+ }
@@ -0,0 +1,9 @@
1
+ import { RouterConfigBase } from '@koalarx/nest/core/controllers/router-config.base'
2
+
3
+ class PersonRouterConfig extends RouterConfigBase {
4
+ constructor() {
5
+ super('Person', '/person')
6
+ }
7
+ }
8
+
9
+ export const PERSON_ROUTER_CONFIG = new PersonRouterConfig()
@@ -0,0 +1,30 @@
1
+ import { UpdatePersonHandler } from '@/application/person/update/update-person.handler'
2
+ import { UpdatePersonRequest } from '@/application/person/update/update-person.request'
3
+ import { IController } from '@koalarx/nest/core/controllers/base.controller'
4
+ import { Body, Controller, Param, Put } from '@nestjs/common'
5
+ import { ApiOkResponse, ApiTags } from '@nestjs/swagger'
6
+ import { PERSON_ROUTER_CONFIG } from './router.config'
7
+
8
+ @ApiTags(PERSON_ROUTER_CONFIG.tag)
9
+ @Controller(PERSON_ROUTER_CONFIG.group)
10
+ export class UpdatePersonController
11
+ implements IController<UpdatePersonRequest, void>
12
+ {
13
+ constructor(private readonly handler: UpdatePersonHandler) {}
14
+
15
+ @Put(':id')
16
+ @ApiOkResponse()
17
+ async handle(
18
+ @Body() request: UpdatePersonRequest,
19
+ @Param('id') id: string,
20
+ ): Promise<void> {
21
+ const response = await this.handler.handle({
22
+ id: +id,
23
+ data: request,
24
+ })
25
+
26
+ if (response.isFailure()) {
27
+ throw response.value
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,18 @@
1
+ // @ts-nocheck
2
+ import { PrismaClientWithCustomTransaction } from '@koalarx/nest/core/database/prisma-client-with-custom-transaction.interface'
3
+ import { PrismaTransactionalClient } from '@koalarx/nest/core/database/prisma-transactional-client'
4
+ import { Prisma } from '@prisma/client'
5
+ import { DefaultArgs } from '@prisma/client/runtime/library'
6
+
7
+ export class DbTransactionContext
8
+ extends PrismaTransactionalClient
9
+ implements PrismaClientWithCustomTransaction
10
+ {
11
+ get person(): Prisma.PersonDelegate<DefaultArgs> {
12
+ return this.transactionalClient.person
13
+ }
14
+
15
+ get personPhone(): Prisma.PersonPhoneDelegate<DefaultArgs> {
16
+ return this.transactionalClient.personPhone
17
+ }
18
+ }
@@ -0,0 +1,51 @@
1
+ import { ReadManyPersonRequest } from '@/application/person/read-many/read-many-person.request'
2
+ import { Person } from '@/domain/entities/person/person'
3
+ import { IPersonRepository } from '@/domain/repositories/iperson.repository'
4
+ import { CreatedRegistreResponseBase } from '@koalarx/nest/core/controllers/created-registre-response.base'
5
+ import { ListResponseBase } from '@koalarx/nest/core/controllers/list-response.base'
6
+ import { RepositoryBase } from '@koalarx/nest/core/database/repository.base'
7
+ import { PRISMA_TOKEN } from '@koalarx/nest/core/koala-nest-database.module'
8
+ import { Inject, Injectable } from '@nestjs/common'
9
+ import { Prisma } from '@prisma/client'
10
+ import { DbTransactionContext } from '../db-transaction-context'
11
+
12
+ @Injectable()
13
+ export class PersonRepository
14
+ extends RepositoryBase<Person>
15
+ implements IPersonRepository
16
+ {
17
+ constructor(
18
+ @Inject(PRISMA_TOKEN)
19
+ prisma: DbTransactionContext,
20
+ ) {
21
+ super({
22
+ modelName: Person,
23
+ context: prisma,
24
+ include: { phones: true },
25
+ })
26
+ }
27
+
28
+ async save(person: Person): Promise<CreatedRegistreResponseBase<number>> {
29
+ return this.saveChanges(person)
30
+ }
31
+
32
+ read(id: number): Promise<Person | null> {
33
+ return this.findById(id)
34
+ }
35
+
36
+ readMany(query: ReadManyPersonRequest): Promise<ListResponseBase<Person>> {
37
+ return this.findManyAndCount<Prisma.PersonWhereInput>(
38
+ {
39
+ name: {
40
+ contains: query.name,
41
+ },
42
+ active: query.active,
43
+ },
44
+ query,
45
+ )
46
+ }
47
+
48
+ delete(id: number): Promise<void> {
49
+ return super.delete(id)
50
+ }
51
+ }
@@ -0,0 +1,14 @@
1
+ import { IPersonRepository } from '@/domain/repositories/iperson.repository'
2
+ import { KoalaNestDatabaseModule } from '@koalarx/nest/core/koala-nest-database.module'
3
+ import { Module } from '@nestjs/common'
4
+ import { PersonRepository } from './person.repository'
5
+
6
+ @Module({
7
+ imports: [
8
+ KoalaNestDatabaseModule.register({
9
+ repositories: [{ interface: IPersonRepository, class: PersonRepository }],
10
+ }),
11
+ ],
12
+ exports: [KoalaNestDatabaseModule],
13
+ })
14
+ export class RepositoriesModule {}
@@ -0,0 +1,30 @@
1
+ import { CreatePersonJob } from '@/application/person/create-person-job/create-person-job'
2
+ import { DeleteInactiveJob } from '@/application/person/delete-inative-job/delete-inactive-job'
3
+ import { InactivePersonHandler } from '@/application/person/events/inactive-person/inactive-person-handler'
4
+ import { KoalaApp } from '@koalarx/nest/core/koala-app'
5
+ import { NestFactory } from '@nestjs/core'
6
+ import { AppModule } from './app.module'
7
+ import { DbTransactionContext } from './database/db-transaction-context'
8
+
9
+ async function bootstrap() {
10
+ const app = await NestFactory.create(AppModule).then((app) =>
11
+ new KoalaApp(app)
12
+ .useDoc({
13
+ ui: 'scalar',
14
+ endpoint: '/doc',
15
+ title: 'API de Demonstração',
16
+ version: '1.0',
17
+ })
18
+ .addCronJob(CreatePersonJob)
19
+ .addCronJob(DeleteInactiveJob)
20
+ .addEventJob(InactivePersonHandler)
21
+ .setAppName('example')
22
+ .setInternalUserName('integration.bot')
23
+ .setDbTransactionContext(DbTransactionContext)
24
+ .enableCors()
25
+ .build(),
26
+ )
27
+
28
+ await app.listen(process.env.PORT ?? 3000)
29
+ }
30
+ bootstrap()
@@ -0,0 +1,17 @@
1
+ import { AppModule } from '@/infra/app.module'
2
+ import { DbTransactionContext } from '@/infra/database/db-transaction-context'
3
+ import { KoalaAppTest } from '@koalarx/nest/test/koala-app-test'
4
+ import { Test } from '@nestjs/testing'
5
+
6
+ export async function createE2ETestApp() {
7
+ return Test
8
+ .createTestingModule({ imports: [AppModule] })
9
+ .compile()
10
+ .then((moduleRef) => moduleRef.createNestApplication())
11
+ .then((app) => new KoalaAppTest(app)
12
+ .setDbTransactionContext(DbTransactionContext)
13
+ .enableCors()
14
+ .build()
15
+ )
16
+ .then((app) => app.init())
17
+ }
@@ -0,0 +1,24 @@
1
+ import { CreatePersonHandler } from '@/application/person/create/create-person.handler'
2
+ import { MappingProfile } from '@/domain/mapping/mapping.profile'
3
+ import { AutoMappingService } from '@koalarx/nest/core/mapping/auto-mapping.service'
4
+ import { KoalaAppTestDependencies } from '@koalarx/nest/test/koala-app-test-dependencies'
5
+ import { PersonRepository } from './repositories/person.repository'
6
+ import { DeletePersonHandler } from '@/application/person/delete/delete-person.handler'
7
+ import { ReadPersonHandler } from '@/application/person/read/read-person.handler'
8
+ import { ReadManyPersonHandler } from '@/application/person/read-many/read-many-person.handler'
9
+ import { UpdatePersonHandler } from '@/application/person/update/update-person.handler'
10
+
11
+ export function createUnitTestApp() {
12
+ const automapService = new AutoMappingService(new MappingProfile())
13
+ const personRepository = new PersonRepository()
14
+
15
+ return new KoalaAppTestDependencies({
16
+ dependencies: [
17
+ new CreatePersonHandler(automapService, personRepository),
18
+ new ReadPersonHandler(automapService, personRepository),
19
+ new ReadManyPersonHandler(automapService, personRepository),
20
+ new UpdatePersonHandler(automapService, personRepository),
21
+ new DeletePersonHandler(personRepository)
22
+ ]
23
+ })
24
+ }
@@ -0,0 +1,8 @@
1
+ import { CreatePersonRequest } from "@/application/person/create/create-person.request";
2
+ import { assignObject } from "@koalarx/nest/core/utils/assing-object";
3
+ import { faker } from "@faker-js/faker";
4
+
5
+ export const createPersonRequestMockup = assignObject(CreatePersonRequest, {
6
+ name: faker.person.fullName(),
7
+ phones: [{phone: faker.phone.number()}]
8
+ })
@@ -0,0 +1,27 @@
1
+ import { ReadManyPersonRequest } from "@/application/person/read-many/read-many-person.request";
2
+ import { Person } from "@/domain/entities/person/person";
3
+ import { IPersonRepository } from "@/domain/repositories/iperson.repository";
4
+ import { CreatedRegistreResponseBase } from "@koalarx/nest/core/controllers/created-registre-response.base";
5
+ import { ListResponseBase } from "@koalarx/nest/core/controllers/list-response.base";
6
+ import { InMemoryBaseRepository } from "@koalarx/nest/test/repositories/in-memory-base.repository";
7
+
8
+ export class PersonRepository extends InMemoryBaseRepository<Person> implements IPersonRepository {
9
+ save(person: Person): Promise<CreatedRegistreResponseBase<number>> {
10
+ return this.saveChanges(person)
11
+ }
12
+
13
+ read(id: number): Promise<Person | null> {
14
+ return this.findById(id)
15
+ }
16
+
17
+ readMany(query: ReadManyPersonRequest): Promise<ListResponseBase<Person>> {
18
+ return this.findManyAndCount<ReadManyPersonRequest>(query, (person) =>
19
+ (!query.name || person.name.includes(query.name)) &&
20
+ (query.active === undefined || person.active === query.active)
21
+ )
22
+ }
23
+
24
+ delete(id: number): Promise<void> {
25
+ return super.remove((person) => person.id === id)
26
+ }
27
+ }
@@ -0,0 +1,7 @@
1
+ import { createE2EDatabase } from '@koalarx/nest/test/utils/create-e2e-database';
2
+ import { dropE2EDatabase } from '@koalarx/nest/test/utils/drop-e2e-database';
3
+
4
+ let schemaId: string
5
+
6
+ beforeAll(() => schemaId = createE2EDatabase(), 40000)
7
+ afterAll(async () => dropE2EDatabase(schemaId))
@@ -0,0 +1,31 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonJs",
4
+ "outDir": "./dist",
5
+ "baseUrl": "./",
6
+ "types": ["vitest/globals"],
7
+ "paths": {
8
+ "@/*": ["./apps/example/src/*"],
9
+ "@koalarx/nest/*": ["./apps/koala-nest/src/*"]
10
+ },
11
+ "removeComments": true,
12
+ "emitDecoratorMetadata": true,
13
+ "experimentalDecorators": true,
14
+ "allowSyntheticDefaultImports": true,
15
+ "target": "es2022",
16
+ "incremental": true,
17
+ "skipLibCheck": true,
18
+ "strictNullChecks": true,
19
+ "noImplicitAny": false,
20
+ "strictBindCallApply": false,
21
+ "forceConsistentCasingInFileNames": false,
22
+ "noFallthroughCasesInSwitch": false,
23
+ "resolveJsonModule": true
24
+ },
25
+ "exclude": [
26
+ "node_modules",
27
+ "dist",
28
+ "vitest.config.e2e.mts",
29
+ "vitest.config.mts"
30
+ ]
31
+ }
@@ -0,0 +1,18 @@
1
+ import swc from "unplugin-swc";
2
+ import tsConfigPatchs from "vite-tsconfig-paths";
3
+ import { defineConfig } from "vitest/config";
4
+
5
+ export default defineConfig({
6
+ test: {
7
+ globals: true,
8
+ root: "./",
9
+ include: ["**/*.e2e-spec.ts"],
10
+ setupFiles: ["./apps/example/src/test/setup-e2e.ts"],
11
+ },
12
+ plugins: [
13
+ tsConfigPatchs(),
14
+ swc.vite({
15
+ module: { type: "es6" },
16
+ })
17
+ ],
18
+ });
@@ -0,0 +1,10 @@
1
+ import tsConfigPatchs from 'vite-tsconfig-paths'
2
+ import { defineConfig } from 'vitest/config'
3
+
4
+ export default defineConfig({
5
+ test: {
6
+ globals: true,
7
+ root: './'
8
+ },
9
+ plugins: [tsConfigPatchs()],
10
+ })
@@ -0,0 +1,3 @@
1
+ declare function newProject(projectName: string): void;
2
+
3
+ export { newProject };
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/commands/new-project/index.ts
31
+ var new_project_exports = {};
32
+ __export(new_project_exports, {
33
+ newProject: () => newProject
34
+ });
35
+ module.exports = __toCommonJS(new_project_exports);
36
+
37
+ // src/utils/copy-folder.ts
38
+ var import_fs = __toESM(require("fs"));
39
+ var import_path = __toESM(require("path"));
40
+ function copyFolder(source, target) {
41
+ if (!import_fs.default.existsSync(target)) {
42
+ import_fs.default.mkdirSync(target);
43
+ }
44
+ const files = import_fs.default.readdirSync(source);
45
+ for (const file of files) {
46
+ const sourcePath = import_path.default.join(source, file);
47
+ const targetPath = import_path.default.join(target, file);
48
+ if (import_fs.default.statSync(sourcePath).isDirectory()) {
49
+ if (!import_fs.default.existsSync(target)) {
50
+ import_fs.default.mkdirSync(targetPath);
51
+ }
52
+ copyFolder(sourcePath, targetPath);
53
+ } else {
54
+ import_fs.default.copyFileSync(sourcePath, targetPath);
55
+ }
56
+ }
57
+ }
58
+
59
+ // src/commands/new-project/index.ts
60
+ var import_chalk = __toESM(require("chalk"));
61
+ var import_node_child_process = require("child_process");
62
+ var import_node_fs = require("fs");
63
+ var import_node_path = __toESM(require("path"));
64
+ function newProject(projectName) {
65
+ copyFolder(import_node_path.default.join(__dirname, "code-base/startup-project"), projectName);
66
+ const packageJson = require(import_node_path.default.join(process.cwd(), projectName, "package.json"));
67
+ packageJson.name = projectName;
68
+ (0, import_node_fs.writeFileSync)(import_node_path.default.join(process.cwd(), projectName, "package.json"), JSON.stringify(packageJson, null, 2));
69
+ let readme = (0, import_node_fs.readFileSync)(import_node_path.default.join(import_node_path.default.join(process.cwd(), projectName, "README.md"))).toString();
70
+ readme = readme.replace("[projectName]", projectName);
71
+ (0, import_node_fs.writeFileSync)(import_node_path.default.join(process.cwd(), projectName, "README.md"), readme);
72
+ (0, import_node_child_process.execSync)(`cd ${projectName} && npm install && npx prisma generate`, {
73
+ stdio: "inherit"
74
+ });
75
+ console.log(`${import_chalk.default.green("Projeto criado com sucesso!")}`);
76
+ }
77
+ // Annotate the CommonJS export names for ESM import in node:
78
+ 0 && (module.exports = {
79
+ newProject
80
+ });
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/index.js ADDED
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+
26
+ // src/index.ts
27
+ var import_commander = __toESM(require("commander"));
28
+ var import_inquirer = __toESM(require("inquirer"));
29
+
30
+ // package.json
31
+ var package_default = {
32
+ name: "@koalarx/nest-cli",
33
+ version: "1.0.1",
34
+ description: "Biblioteca de CLI para cria\xE7\xE3o de projetos utilizando Koala Nest",
35
+ scripts: {
36
+ test: "vitest run",
37
+ "test:watch": "vitest",
38
+ "test:cov": "vitest run --coverage",
39
+ "test:debug": "vitest --inspect-brk --inspect --logHeapUsage --threads=false",
40
+ build: "node .github/scripts/publish.js",
41
+ prepare: "npm run build",
42
+ prepublishOnly: "npm test",
43
+ version: "git add -A src",
44
+ postversion: "git push && git push --tags",
45
+ "deploy:hotfix": "npm version patch",
46
+ "deploy:feature": "npm version minor",
47
+ "deploy:release": "npm version major"
48
+ },
49
+ bin: {
50
+ "koala-nest": "dist/index.js"
51
+ },
52
+ repository: {
53
+ type: "git",
54
+ url: "git+https://github.com/igordrangel/koala-nest-cli.git"
55
+ },
56
+ keywords: [
57
+ "Nest.js"
58
+ ],
59
+ author: "Igor D. Rangel",
60
+ license: "ISC",
61
+ bugs: {
62
+ url: "https://github.com/igordrangel/koala-nest-cli/issues"
63
+ },
64
+ homepage: "https://github.com/igordrangel/koala-nest-cli#readme",
65
+ dependencies: {
66
+ chalk: "^2.4.2",
67
+ commander: "^2.19.0",
68
+ figlet: "^1.2.1",
69
+ inquirer: "^6.2.2",
70
+ shelljs: "^0.8.3"
71
+ },
72
+ devDependencies: {
73
+ "@rocketseat/eslint-config": "^1.2.0",
74
+ "@types/node": "^18.14.0",
75
+ "@types/node-fetch": "^2.6.4",
76
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
77
+ "@typescript-eslint/parser": "^5.0.0",
78
+ eslint: "^8.44.0",
79
+ "eslint-config-prettier": "^8.8.0",
80
+ "eslint-plugin-prettier": "^4.2.1",
81
+ prettier: "^2.3.2",
82
+ tsup: "^8.4.0",
83
+ typescript: "^5.2.2"
84
+ },
85
+ tsup: {
86
+ entry: [
87
+ "src"
88
+ ],
89
+ dts: true
90
+ }
91
+ };
92
+
93
+ // src/utils/copy-folder.ts
94
+ var import_fs = __toESM(require("fs"));
95
+ var import_path = __toESM(require("path"));
96
+ function copyFolder(source, target) {
97
+ if (!import_fs.default.existsSync(target)) {
98
+ import_fs.default.mkdirSync(target);
99
+ }
100
+ const files = import_fs.default.readdirSync(source);
101
+ for (const file of files) {
102
+ const sourcePath = import_path.default.join(source, file);
103
+ const targetPath = import_path.default.join(target, file);
104
+ if (import_fs.default.statSync(sourcePath).isDirectory()) {
105
+ if (!import_fs.default.existsSync(target)) {
106
+ import_fs.default.mkdirSync(targetPath);
107
+ }
108
+ copyFolder(sourcePath, targetPath);
109
+ } else {
110
+ import_fs.default.copyFileSync(sourcePath, targetPath);
111
+ }
112
+ }
113
+ }
114
+
115
+ // src/commands/new-project/index.ts
116
+ var import_chalk = __toESM(require("chalk"));
117
+ var import_node_child_process = require("child_process");
118
+ var import_node_fs = require("fs");
119
+ var import_node_path = __toESM(require("path"));
120
+ function newProject(projectName) {
121
+ copyFolder(import_node_path.default.join(__dirname, "code-base/startup-project"), projectName);
122
+ const packageJson = require(import_node_path.default.join(process.cwd(), projectName, "package.json"));
123
+ packageJson.name = projectName;
124
+ (0, import_node_fs.writeFileSync)(import_node_path.default.join(process.cwd(), projectName, "package.json"), JSON.stringify(packageJson, null, 2));
125
+ let readme = (0, import_node_fs.readFileSync)(import_node_path.default.join(import_node_path.default.join(process.cwd(), projectName, "README.md"))).toString();
126
+ readme = readme.replace("[projectName]", projectName);
127
+ (0, import_node_fs.writeFileSync)(import_node_path.default.join(process.cwd(), projectName, "README.md"), readme);
128
+ (0, import_node_child_process.execSync)(`cd ${projectName} && npm install && npx prisma generate`, {
129
+ stdio: "inherit"
130
+ });
131
+ console.log(`${import_chalk.default.green("Projeto criado com sucesso!")}`);
132
+ }
133
+
134
+ // src/index.ts
135
+ var import_chalk2 = __toESM(require("chalk"));
136
+ var import_figlet = __toESM(require("figlet"));
137
+ import_commander.default.version(package_default.version);
138
+ console.log(import_chalk2.default.cyan(import_figlet.default.textSync("Koala Nest CLI")));
139
+ import_commander.default.command("new [projectName]").description("Cria um novo projeto Nest com Koala Nest").action(async (projectName) => {
140
+ if (!projectName) {
141
+ projectName = await import_inquirer.default.prompt([
142
+ {
143
+ type: "input",
144
+ name: "projectName",
145
+ message: "Informe o nome do projeto",
146
+ validate: (value) => value ? true : "N\xE3o \xE9 permitido um nome vazio"
147
+ }
148
+ ]).then((answers) => answers.projectName);
149
+ }
150
+ newProject(projectName);
151
+ });
152
+ import_commander.default.parse(process.argv);