Skip to content

Commit d81c6c9

Browse files
authored
feat: add NestJs template (#86)
1 parent 5ecc607 commit d81c6c9

17 files changed

+488
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module.exports = {
2+
parser: '@typescript-eslint/parser',
3+
parserOptions: {
4+
project: 'tsconfig.json',
5+
sourceType: 'module',
6+
},
7+
plugins: ['@typescript-eslint/eslint-plugin'],
8+
extends: [
9+
'plugin:@typescript-eslint/eslint-recommended',
10+
'plugin:@typescript-eslint/recommended',
11+
'prettier',
12+
],
13+
root: true,
14+
env: {
15+
node: true,
16+
jest: true,
17+
},
18+
rules: {
19+
'@typescript-eslint/interface-name-prefix': 'off',
20+
'@typescript-eslint/explicit-function-return-type': 'off',
21+
'@typescript-eslint/no-explicit-any': 'off',
22+
},
23+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# dependencies
2+
/node_modules
3+
4+
# IDE
5+
/.idea
6+
/.awcache
7+
/.vscode
8+
9+
# misc
10+
npm-debug.log
11+
12+
# example
13+
/quick-start
14+
15+
# tests
16+
/test
17+
/coverage
18+
/.nyc_output
19+
20+
# dist
21+
/dist
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
### Sequelize sample
2+
3+
### Installation
4+
5+
`npm install`
6+
7+
### Running
8+
9+
This example requires docker or a local MySQL installation. If using a local MySQL database, see `app.module.ts` for credentials, and make sure there are matching credentials in the database and the source code.
10+
11+
#### Docker
12+
13+
There is a `docker-compose.yml` file for starting Docker.
14+
15+
`docker-compose up`
16+
17+
After running the sample, you can stop the Docker container with
18+
19+
`docker-compose down`
20+
21+
### Run the sample
22+
23+
Then, run Nest as usual:
24+
25+
`npm run start`
26+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
version: "3"
2+
3+
services:
4+
mysql:
5+
image: mysql:8
6+
restart: always
7+
environment:
8+
MYSQL_ROOT_PASSWORD: root
9+
MYSQL_DATABASE: test
10+
ports:
11+
- "3306:3306"

packages/toolkits/pro/template/server/nestJs/nest.js

Whitespace-only changes.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
{
2+
"name": "nest-typescript-starter",
3+
"version": "1.0.0",
4+
"description": "Nest TypeScript starter repository",
5+
"license": "MIT",
6+
"scripts": {
7+
"prebuild": "rimraf dist",
8+
"build": "nest build",
9+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
10+
"start": "nest start",
11+
"start:dev": "nest start --watch",
12+
"start:debug": "nest start --debug --watch",
13+
"start:prod": "node dist/main",
14+
"lint": "eslint '{src,apps,libs,test}/**/*.ts' --fix",
15+
"test": "jest",
16+
"test:watch": "jest --watch",
17+
"test:cov": "jest --coverage",
18+
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
19+
"test:e2e": "echo 'No e2e tests implemented yet.'"
20+
},
21+
"dependencies": {
22+
"@nestjs/common": "10.0.3",
23+
"@nestjs/core": "10.0.3",
24+
"@nestjs/platform-express": "10.0.3",
25+
"@nestjs/sequelize": "10.0.0",
26+
"mysql2": "3.4.3",
27+
"reflect-metadata": "0.1.13",
28+
"rimraf": "5.0.1",
29+
"rxjs": "7.8.1",
30+
"sequelize": "6.32.1",
31+
"sequelize-typescript": "2.1.5",
32+
"typescript": "5.1.6"
33+
},
34+
"devDependencies": {
35+
"@nestjs/cli": "10.0.5",
36+
"@nestjs/schematics": "10.0.1",
37+
"@nestjs/testing": "10.0.3",
38+
"@types/express": "4.17.17",
39+
"@types/jest": "29.5.3",
40+
"@types/node": "20.3.3",
41+
"@types/supertest": "2.0.12",
42+
"@typescript-eslint/eslint-plugin": "5.60.1",
43+
"@typescript-eslint/parser": "5.60.1",
44+
"eslint": "8.42.0",
45+
"eslint-config-prettier": "8.8.0",
46+
"eslint-plugin-import": "2.27.5",
47+
"jest": "29.6.1",
48+
"prettier": "2.8.8",
49+
"supertest": "6.3.3",
50+
"ts-jest": "29.1.1",
51+
"ts-loader": "9.4.4",
52+
"ts-node": "10.9.1",
53+
"tsconfig-paths": "4.2.0",
54+
"typescript": "5.1.6"
55+
},
56+
"jest": {
57+
"moduleFileExtensions": [
58+
"js",
59+
"json",
60+
"ts"
61+
],
62+
"rootDir": "src",
63+
"testRegex": ".spec.ts$",
64+
"transform": {
65+
"^.+\\.(t|j)s$": "ts-jest"
66+
},
67+
"collectCoverageFrom": [
68+
"**/*.(t|j)s"
69+
],
70+
"coverageDirectory": "../coverage",
71+
"testEnvironment": "node"
72+
}
73+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Module } from '@nestjs/common';
2+
import { SequelizeModule } from '@nestjs/sequelize';
3+
import { EmployeesModule } from './employees/employees.module';
4+
5+
@Module({
6+
imports: [
7+
SequelizeModule.forRoot({
8+
dialect: '',
9+
host: '',
10+
port: '',
11+
username: '',
12+
password: '',
13+
database: '',
14+
autoLoadModels: true,
15+
synchronize: true,
16+
}),
17+
EmployeesModule,
18+
],
19+
})
20+
export class AppModule {}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export class CreateEmployeeDto {
2+
id: string;
3+
name: string;
4+
employeeNo: string;
5+
department: string;
6+
departmentLevel: string;
7+
status: string;
8+
workbenchName: string;
9+
project: string;
10+
type: string;
11+
address: string;
12+
roles: string;
13+
lastUpdateUser: string;
14+
createTime: string;
15+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { CreateEmployeeDto } from './dto/create-employee.dto';
3+
import { EmployeesController } from './employees.controller';
4+
import { EmployeesService } from './employees.service';
5+
6+
describe('EmployeesController', () => {
7+
let employeesController: EmployeesController;
8+
let employeesService: EmployeesService;
9+
10+
beforeEach(async () => {
11+
const app: TestingModule = await Test.createTestingModule({
12+
controllers: [EmployeesController],
13+
providers: [
14+
{
15+
provide: EmployeesService,
16+
useValue: {
17+
create: jest
18+
.fn()
19+
.mockImplementation((employee: CreateEmployeeDto) =>
20+
Promise.resolve({ id: '1', ...employee })
21+
),
22+
findAll: jest.fn().mockResolvedValue([
23+
{
24+
firstName: 'firstName #1',
25+
lastName: 'lastName #1',
26+
},
27+
{
28+
firstName: 'firstName #2',
29+
lastName: 'lastName #2',
30+
},
31+
]),
32+
findOne: jest.fn().mockImplementation((id: string) =>
33+
Promise.resolve({
34+
firstName: 'firstName #1',
35+
lastName: 'lastName #1',
36+
id,
37+
})
38+
),
39+
remove: jest.fn(),
40+
},
41+
},
42+
],
43+
}).compile();
44+
45+
employeesController = app.get<EmployeesController>(EmployeesController);
46+
employeesService = app.get<EmployeesService>(EmployeesService);
47+
});
48+
49+
it('should be defined', () => {
50+
expect(employeesController).toBeDefined();
51+
});
52+
53+
describe('findAll()', () => {
54+
it('should find all employees ', () => {
55+
employeesController.getEmployee();
56+
expect(employeesService.getEmployee).toHaveBeenCalled();
57+
});
58+
});
59+
60+
describe('findOne()', () => {
61+
it('should find a employee', () => {
62+
employeesController.findOne('1');
63+
expect(employeesService.findOne).toHaveBeenCalled();
64+
expect(employeesController.findOne('1')).resolves.toEqual({
65+
firstName: 'firstName #1',
66+
lastName: 'lastName #1',
67+
id: '1',
68+
});
69+
});
70+
});
71+
72+
describe('remove()', () => {
73+
it('should remove the employee', () => {
74+
employeesController.remove('2');
75+
expect(employeesService.remove).toHaveBeenCalled();
76+
});
77+
});
78+
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {
2+
Body,
3+
Controller,
4+
Delete,
5+
Get,
6+
Param,
7+
Post,
8+
Query,
9+
} from '@nestjs/common';
10+
import { CreateEmployeeDto } from './dto/create-employee.dto';
11+
import { Employee } from './models/employee.model';
12+
import { EmployeesService } from './employees.service';
13+
14+
@Controller('employee')
15+
export class EmployeesController {
16+
constructor(private readonly employeesService: EmployeesService) {}
17+
18+
@Post('getEmployee')
19+
getEmployee(@Query() searchInfo): Promise<Employee[]> {
20+
return this.employeesService.getEmployee(searchInfo);
21+
}
22+
23+
@Get('getEmployee/:id')
24+
findOne(@Param('id') id: string): Promise<Employee> {
25+
return this.employeesService.findOne(id);
26+
}
27+
}

0 commit comments

Comments
 (0)