@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.
- package/LICENSE +21 -0
- package/README.md +17 -0
- package/code-base/startup-project/.gitattributes +1 -0
- package/code-base/startup-project/LICENSE +21 -0
- package/code-base/startup-project/README.md +5 -0
- package/code-base/startup-project/eslint.config.mjs +22 -0
- package/code-base/startup-project/nest-cli.json +35 -0
- package/code-base/startup-project/package.json +68 -0
- package/code-base/startup-project/prisma/schema.prisma +30 -0
- package/code-base/startup-project/src/application/person/create/create-person.handler.spec.ts +22 -0
- package/code-base/startup-project/src/application/person/create/create-person.handler.ts +39 -0
- package/code-base/startup-project/src/application/person/create/create-person.request.ts +18 -0
- package/code-base/startup-project/src/application/person/create/create-person.response.ts +3 -0
- package/code-base/startup-project/src/application/person/create/create-person.validator.ts +16 -0
- package/code-base/startup-project/src/application/person/create-person-job/create-person-job.ts +57 -0
- package/code-base/startup-project/src/application/person/delete/delete-person.handler.spec.ts +24 -0
- package/code-base/startup-project/src/application/person/delete/delete-person.handler.ts +33 -0
- package/code-base/startup-project/src/application/person/delete-inative-job/delete-inactive-job.ts +49 -0
- package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-event.ts +3 -0
- package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-handler.ts +27 -0
- package/code-base/startup-project/src/application/person/events/person-event.job.ts +11 -0
- package/code-base/startup-project/src/application/person/read/read-person.handler.spec.ts +29 -0
- package/code-base/startup-project/src/application/person/read/read-person.handler.ts +37 -0
- package/code-base/startup-project/src/application/person/read/read-person.response.ts +30 -0
- package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts +72 -0
- package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts +42 -0
- package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts +15 -0
- package/code-base/startup-project/src/application/person/read-many/read-many-person.response.ts +16 -0
- package/code-base/startup-project/src/application/person/read-many/read-many.validator.ts +16 -0
- package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts +42 -0
- package/code-base/startup-project/src/application/person/update/update-person.handler.ts +56 -0
- package/code-base/startup-project/src/application/person/update/update-person.request.ts +26 -0
- package/code-base/startup-project/src/application/person/update/update-person.validator.ts +17 -0
- package/code-base/startup-project/src/domain/entities/person/person-phone.ts +10 -0
- package/code-base/startup-project/src/domain/entities/person/person.ts +18 -0
- package/code-base/startup-project/src/domain/mapping/mapping.profile.ts +10 -0
- package/code-base/startup-project/src/domain/mapping/person.mapping.ts +24 -0
- package/code-base/startup-project/src/domain/repositories/iperson.repository.ts +14 -0
- package/code-base/startup-project/src/infra/app.module.ts +27 -0
- package/code-base/startup-project/src/infra/controllers/controller.module.ts +16 -0
- package/code-base/startup-project/src/infra/controllers/controllers.module.ts +12 -0
- package/code-base/startup-project/src/infra/controllers/person/create-person.controller.ts +30 -0
- package/code-base/startup-project/src/infra/controllers/person/delete-person.controller.ts +22 -0
- package/code-base/startup-project/src/infra/controllers/person/person.controller.e2e-spec.ts +120 -0
- package/code-base/startup-project/src/infra/controllers/person/person.module.ts +31 -0
- package/code-base/startup-project/src/infra/controllers/person/read-many-person.controller.ts +29 -0
- package/code-base/startup-project/src/infra/controllers/person/read-person.controller.ts +26 -0
- package/code-base/startup-project/src/infra/controllers/person/router.config.ts +9 -0
- package/code-base/startup-project/src/infra/controllers/person/update-person.controller.ts +30 -0
- package/code-base/startup-project/src/infra/database/db-transaction-context.ts +18 -0
- package/code-base/startup-project/src/infra/database/repositories/person.repository.ts +51 -0
- package/code-base/startup-project/src/infra/database/repositories/repositories.module.ts +14 -0
- package/code-base/startup-project/src/infra/main.ts +30 -0
- package/code-base/startup-project/src/test/create-e2e-test-app.ts +17 -0
- package/code-base/startup-project/src/test/create-unit-test-app.ts +24 -0
- package/code-base/startup-project/src/test/mockup/person/create-person-request.mockup.ts +8 -0
- package/code-base/startup-project/src/test/repositories/person.repository.ts +27 -0
- package/code-base/startup-project/src/test/setup-e2e.ts +7 -0
- package/code-base/startup-project/tsconfig.json +31 -0
- package/code-base/startup-project/vitest.config.e2e.mts +18 -0
- package/code-base/startup-project/vitest.config.mts +10 -0
- package/commands/new-project/index.d.ts +3 -0
- package/commands/new-project/index.js +80 -0
- package/index.d.ts +1 -0
- package/index.js +152 -0
- package/package.json +61 -0
- package/utils/copy-folder.d.ts +3 -0
- 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,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,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);
|