Compare commits

..

No commits in common. "master" and "core" have entirely different histories.
master ... core

53 changed files with 437 additions and 984 deletions

View File

@ -1,11 +0,0 @@
# TypeORM
TYPEORM_CONNECTION=mysql
TYPEORM_HOST=localhost
TYPEORM_PORT=3306
TYPEORM_USERNAME=root
TYPEORM_PASSWORD=jeremy
TYPEORM_DATABASE=nest
TYPEORM_SYNCHRONIZE=true
TYPEORM_LOGGING=true
TYPEORM_ENTITIES=./src/**/*.entity{.ts,.js}

3
.gitignore vendored
View File

@ -2,9 +2,6 @@
/dist
/node_modules
# env
.env
# Logs
logs
*.log

53
2019-06-17-2043.md Executable file
View File

@ -0,0 +1,53 @@
---
title: NinghaoNodeCamp2019
date: 2019-06-17
draft: false
---
NinghaoNodeCamp2019 的时间安排是 0615-0630不过由于周末有其它事情没及时开启今天来追上吧。暂时此文不发布到博客先跟着项目更新走
相关链接:
https://gitea.isyin.cn/jeremy/ninghao-nestjs
https://github.com/jeremyyin2012/ninghao-nestjs
https://nnc2019.isyin.cn
## 00 prepare
### 0001 命令行界面
我是 macOS 所以就用自带终端 Terminal 就可以了,以及我也有装了 iTerm以及也在不久前才配置了 oh-my-zsh可以了。
Windows 下 cmder 以前没遇到过,毕竟用的少,也因为 cmd 不好用;据说 Windows 以后会有个很厉害的终端,可能还没那么快,那就先用着 cmder 吧。
### 0002 Git
git macOS 上有的,不过我又用 brew upgrade 更新到了最新版本,不过其实 git 命令用的其实不多,大部分时间还是会用 GUI 类型的产品,一年前基本是 Source Tree但是由于它经常性死掉所以后来就寻找新的替代经过一些尝试后来发现了 Fork体验很好个人非常喜欢也在推荐朋友们使用。
### 0003 代码编辑器
编辑器我工作中针对长期项目主要是 PyCharm临时看一下或者是啥就会用 VS Code经常性地也会把 VS Code 当作临时文本片段编辑器来用比如竖向编辑Sublime 也装着,长期开着做临时文本记录用,直接打开代码文件也会是用它来查看。
### 0004 HTTP 客户端
试过 Postman 还有一些其它的以及 Insomnia后来直接买了 Paw蛮喜欢的。
### 0005 数据库客户端
产品有很多,不过现在都没咋用 GUI 客户端了,能用 Web 的就用 Web 的了几个客户端都蛮能吃内存的Sequel Pro 以前用过,很好用,但是 MySQL 升级到 8 它就不支持了现在不知道更新没TablePlus 以前没遇到过,不过看介绍挺喜欢的,不过价格也感人,后面试用下看看。配数据库服务我现在都一般会配上一个 Web 管理服务不在本地搞太多东西了MySQLAdminerMongoMongo ExpressRedisPHPRedisAdmin。
### 0006 Node.jsv11.13
本地我用 brew 升级到了 v12.4.0
### 0007 Docker 桌面版
Docker 我已经用了蛮久了,开发和生产都在用,目前主要是用 docker-compose 来操作应对较小规模场景完全没问题几乎只需要敲一个命令就完成全部事情。k8s 是非常好,不过手里没那么多配套资源,复杂度也蛮高,暂时还没吃下来。
日常要用的数据库啊什么的都是跑在 Docker 里面了,反正能上 Docker 就优先上 Docker简直不要太舒服就两只手操作那么多服务照以前那还不得死去活来。
### 0008 MySQLv5.7
目前我是会优先考虑 8 版本的,不过好在有 Docker你想什么版本就什么版本多服务多版本共存也完全不是问题。

View File

@ -1,2 +0,0 @@
version: '3'
# msyql 以及 web 管理界面直接用已经通过 docker-compose 创建的 8 版本的,就先不写了

View File

@ -22,22 +22,12 @@
"dependencies": {
"@nestjs/common": "^6.0.0",
"@nestjs/core": "^6.0.0",
"@nestjs/jwt": "^6.1.1",
"@nestjs/passport": "^6.1.0",
"@nestjs/platform-express": "^6.0.0",
"@nestjs/typeorm": "^6.1.2",
"@types/bcrypt": "^3.0.0",
"@types/passport": "^1.0.0",
"@types/passport-jwt": "^3.0.1",
"bcrypt": "^3.0.6",
"class-transformer": "^0.2.3",
"mysql": "^2.17.1",
"passport": "^0.4.0",
"passport-jwt": "^4.0.0",
"class-validator": "^0.9.1",
"reflect-metadata": "^0.1.12",
"rimraf": "^2.6.2",
"rxjs": "^6.3.3",
"typeorm": "^0.2.18"
"rxjs": "^6.3.3"
},
"devDependencies": {
"@nestjs/testing": "^6.0.0",

View File

@ -1,29 +1,32 @@
import { Module } from '@nestjs/common';
import { Module, NestModule, MiddlewareConsumer} from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PostModule } from './modules/post/post.module';
import { UserModule } from './modules/user/user.module';
import { AuthModule } from './modules/auth/auth.module';
import { PostsModule } from './modules/posts/posts.module';
import { DemoMiddleware } from './core/middleware/demo.middleware'
import { APP_GUARD } from '@nestjs/core';
import { DemoRolesGuard } from './core/guards/demo-roles.guard'
import { APP_INTERCEPTOR } from '@nestjs/core';
import { LoggingInterceptor } from './core/interceptors/logging.interceptor'
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'jeremy',
database: 'nest',
synchronize: true,
logging: true,
entities: [__dirname + '/**/*.entity{.ts,.js}'],
}),
PostModule,
UserModule,
AuthModule,
],
imports: [PostsModule],
controllers: [AppController],
providers: [AppService],
providers: [
AppService,
{
provide: APP_GUARD,
useClass: DemoRolesGuard,
},
{
provide: APP_INTERCEPTOR,
useClass: LoggingInterceptor,
}
],
})
export class AppModule {}
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(DemoMiddleware).forRoutes('posts')
}
}

View File

@ -0,0 +1,3 @@
import { ReflectMetadata, SetMetadata } from '@nestjs/common';
export const Roles = (...args: string[]) => SetMetadata('roles', args);

View File

@ -1,3 +1,7 @@
import { createParamDecorator } from "@nestjs/common";
import { createParamDecorator } from '@nestjs/common'
export const User = createParamDecorator((data, req) => req.user)
export const User = createParamDecorator((data, req) => {
console.log('data:', data)
return req.user[data]
})

View File

@ -0,0 +1,7 @@
import { DemoFilter } from './demo.filter';
describe('DemoFilter', () => {
it('should be defined', () => {
expect(new DemoFilter()).toBeDefined();
});
});

View File

@ -0,0 +1,16 @@
import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common';
@Catch(HttpException)
export class DemoFilter<T> implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const request = ctx.getRequest();
const status = exception.getStatus();
response.status(status).json({
statusCode: status,
path: request.url,
});
}
}

View File

@ -0,0 +1,7 @@
import { DemoAuthGuard } from './demo-auth.guard';
describe('DemoAuthGuard', () => {
it('should be defined', () => {
expect(new DemoAuthGuard()).toBeDefined();
});
});

View File

@ -0,0 +1,13 @@
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class DemoAuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return request.header('x-demo') === 'secret';
}
}

View File

@ -0,0 +1,7 @@
import { DemoRolesGuard } from './demo-roles.guard';
describe('DemoRolesGuard', () => {
it('should be defined', () => {
expect(new DemoRolesGuard()).toBeDefined();
});
});

View File

@ -0,0 +1,28 @@
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';
@Injectable()
export class DemoRolesGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
console.log('handler:', context.getHandler());
console.log('class:', context.getClass());
const roles = this.reflector.get<string[]>('roles', context.getHandler())
console.log(roles)
if (!roles) {
return true
}
const request = context.switchToHttp().getRequest();
const { user } = request;
const hasRole = () => user.roles.some(item => roles.includes(item))
return user && user.roles && hasRole();
}
}

View File

@ -0,0 +1,7 @@
import { ErrorsInterceptor } from './errors.interceptor';
describe('ErrorsInterceptor', () => {
it('should be defined', () => {
expect(new ErrorsInterceptor()).toBeDefined();
});
});

View File

@ -0,0 +1,14 @@
import { CallHandler, ExecutionContext, Injectable, NestInterceptor, BadGatewayException } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators'
@Injectable()
export class ErrorsInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next
.handle()
.pipe(
catchError(error => throwError(new BadGatewayException()))
);
}
}

View File

@ -0,0 +1,7 @@
import { LoggingInterceptor } from './logging.interceptor';
describe('LoggingInterceptor', () => {
it('should be defined', () => {
expect(new LoggingInterceptor()).toBeDefined();
});
});

View File

@ -0,0 +1,21 @@
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators'
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
console.log('I am a interceptor!')
const now = Date.now();
console.log('before...');
return next
.handle()
.pipe(
tap(() => console.log(`after... ${Date.now() - now}ms`))
);
}
}

View File

@ -0,0 +1,7 @@
import { TransformInterceptor } from './transform.interceptor';
describe('TransformInterceptor', () => {
it('should be defined', () => {
expect(new TransformInterceptor()).toBeDefined();
});
});

View File

@ -0,0 +1,18 @@
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
export interface Response<T>{
data: T;
}
@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> {
intercept(context: ExecutionContext, next: CallHandler): Observable<Response<T>> {
return next
.handle()
.pipe(
map(item => ({data: item})) // 这个map和js那个map貌似还是有点不一样那边返回的是一个数组呀
);
}
}

View File

@ -0,0 +1,7 @@
import { DemoMiddleware } from './demo.middleware';
describe('DemoMiddleware', () => {
it('should be defined', () => {
expect(new DemoMiddleware()).toBeDefined();
});
});

View File

@ -0,0 +1,24 @@
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class DemoMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
console.log('hello ~')
req.user = {
roles: [
'guest'
]
}
if (req.header('x-demo') === 'secret') {
req.user = {
roles: [
'member'
]
}
}
next();
}
}

View File

@ -0,0 +1,7 @@
import { DemoPipe } from './demo.pipe';
describe('DemoPipe', () => {
it('should be defined', () => {
expect(new DemoPipe()).toBeDefined();
});
});

View File

@ -0,0 +1,8 @@
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class DemoPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
return value;
}
}

View File

@ -1,8 +1,10 @@
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { DemoFilter } from './core/filters/demo.filter'
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// app.useGlobalFilters(new DemoFilter());
await app.listen(3000);
}
bootstrap();

View File

@ -1,18 +0,0 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AuthController } from './auth.controller';
describe('Auth Controller', () => {
let controller: AuthController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [AuthController],
}).compile();
controller = module.get<AuthController>(AuthController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});

View File

@ -1,27 +0,0 @@
import { Controller, Post, Body, Get, UseGuards } from '@nestjs/common';
import { AuthService } from './auth.service';
import { LoginDto } from './login.dto';
import { AuthGuard } from '@nestjs/passport';
import { User } from '../../core/decorators/user.decorator';
@Controller('auth')
export class AuthController {
constructor(
private readonly authService: AuthService,
) { }
@Post('login')
async login(@Body() data: LoginDto) {
return await this.authService.login(data)
}
@Get('test')
@UseGuards(AuthGuard())
async authTest(@User() user) {
console.log('user: ', user)
return {
message: 'ok',
}
}
}

View File

@ -1,4 +0,0 @@
export interface JwtPayload {
id: number;
username: string
}

View File

@ -1,25 +0,0 @@
import { Module } from '@nestjs/common';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { UserModule } from '../user/user.module';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { JwtStrategy } from './strategies/jwt.strategy';
@Module({
imports: [
UserModule,
JwtModule.register({
secret: 'nDSAR3+K4pLD+HIl9xWFY/n7maMxLwPTj5gscZvd9Vo=',
signOptions: {
expiresIn: '12h',
}
}),
PassportModule.register({
defaultStrategy: 'jwt',
}),
],
controllers: [AuthController],
providers: [AuthService, JwtStrategy]
})
export class AuthModule {}

View File

@ -1,18 +0,0 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AuthService } from './auth.service';
describe('AuthService', () => {
let service: AuthService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [AuthService],
}).compile();
service = module.get<AuthService>(AuthService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -1,42 +0,0 @@
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { UserService } from '../user/user.service';
import { LoginDto } from './login.dto';
import { JwtPayload } from './auth.interface';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
constructor(
private readonly userService: UserService,
private readonly jwtService: JwtService,
) {}
async login(data: LoginDto) {
const { username, password } = data
const entity = await this.userService.findByUserName(username)
console.log(entity)
if (!entity) {
throw new UnauthorizedException('用户不存在')
}
const match = await entity.comparePassword(password)
console.log(match)
if (!match) {
throw new UnauthorizedException('密码错误')
}
const { id } = entity
const payload = {username, id}
const token = this.signToken(payload)
return {
...payload,
token
}
}
signToken(data: JwtPayload) {
return this.jwtService.sign(data)
}
}

View File

@ -1,4 +0,0 @@
export class LoginDto {
readonly username: string;
readonly password: string;
}

View File

@ -1,27 +0,0 @@
import { Injectable, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy, ExtractJwt } from "passport-jwt";
import { JwtPayload } from "../auth.interface";
import { UserService } from "../../user/user.service";
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
private readonly userService: UserService
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'nDSAR3+K4pLD+HIl9xWFY/n7maMxLwPTj5gscZvd9Vo=',
})
}
async validate(payload: JwtPayload) {
console.log(payload)
const { username } = payload
const entity = await this.userService.findByUserName(username)
if (!entity) {
throw new UnauthorizedException('用户不存在')
}
return entity
}
}

View File

@ -1,35 +0,0 @@
import { Controller, Post, Body, Get, Param, Put, Delete } from '@nestjs/common';
import { PostService } from './post.service';
import { PostDto } from './post.dto';
@Controller('posts')
export class PostController {
constructor(
private readonly postService: PostService,
) { }
@Post()
async store(@Body() data: PostDto) {
return await this.postService.store(data);
}
@Get()
async index() {
return await this.postService.index();
}
@Get(':id')
async show(@Param() id: string) {
return await this.postService.show(id);
}
@Put(':id')
async update(@Param() id: string, @Body() data: Partial<PostDto>) {
return await this.postService.update(id, data);
}
@Delete(':id')
async destroy(@Param() id: string) {
return await this.postService.destroy(id);
}
}

View File

@ -1,4 +0,0 @@
export class PostDto {
readonly title: string;
readonly body: string;
}

View File

@ -1,19 +0,0 @@
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn} from 'typeorm';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column('longtext', {nullable: true})
body: string;
@CreateDateColumn()
created: Date;
@UpdateDateColumn()
updated: Date;
}

View File

@ -1,14 +0,0 @@
import { Module } from '@nestjs/common';
import { PostController } from './post.controller';
import { PostService } from './post.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Post } from './post.entity';
@Module({
imports: [
TypeOrmModule.forFeature([Post]),
],
controllers: [PostController],
providers: [PostService],
})
export class PostModule {}

View File

@ -1,18 +0,0 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PostService } from './post.service';
describe('PostService', () => {
let service: PostService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [PostService],
}).compile();
service = module.get<PostService>(PostService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});

View File

@ -1,38 +0,0 @@
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { Post } from './post.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { PostDto } from './post.dto';
@Injectable()
export class PostService {
constructor(
@InjectRepository(Post)
private readonly postRepository: Repository<Post>,
) { }
async store(data: PostDto) {
const entity = await this.postRepository.create(data);
return await this.postRepository.save(entity);
}
async index() {
const entities = await this.postRepository.find();
return entities;
}
async show(id: string) {
const entity = await this.postRepository.findOne(id);
return entity;
}
async update(id: string, data: Partial<PostDto>) {
const result = await this.postRepository.update(id, data);
return result;
}
async destroy(id: string) {
const result = await this.postRepository.delete(id);
return result;
}
}

View File

@ -0,0 +1,3 @@
export interface Post {
title: string
}

View File

@ -0,0 +1,6 @@
import { IsString } from 'class-validator'
export class CreatePostDto {
@IsString()
readonly title: string
}

View File

@ -1,15 +1,15 @@
import { Test, TestingModule } from '@nestjs/testing';
import { PostController } from './post.controller';
import { PostsController } from './posts.controller';
describe('Post Controller', () => {
let controller: PostController;
describe('Posts Controller', () => {
let controller: PostsController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [PostController],
controllers: [PostsController],
}).compile();
controller = module.get<PostController>(PostController);
controller = module.get<PostsController>(PostsController);
});
it('should be defined', () => {

View File

@ -0,0 +1,51 @@
import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe, UseGuards, SetMetadata, UseInterceptors } from '@nestjs/common';
import { CreatePostDto } from './post.dto';
import { DemoService } from './providers/demo/demo.service'
import { DemoFilter } from '../../core/filters/demo.filter'
import { DemoAuthGuard } from '../../core/guards/demo-auth.guard'
import { Roles } from '../../core/decorators/roles.decorator'
import { User } from '../../core/decorators/user.decorator'
import { LoggingInterceptor } from '../../core/interceptors/logging.interceptor'
import { TransformInterceptor } from '../../core/interceptors/transform.interceptor'
import { ErrorsInterceptor } from '../../core/interceptors/errors.interceptor'
@Controller('posts')
// @UseGuards(DemoAuthGuard)
// @UseFilters(DemoFilter)
// @ UseInterceptors(LoggingInterceptor)
export class PostsController {
constructor(private readonly demoService: DemoService) {}
@Get()
@UseInterceptors(TransformInterceptor)
@UseInterceptors(ErrorsInterceptor)
index() {
throw new ForbiddenException();
// return this.demoService.findAll();
}
@Get(':id')
show(@Param('id', ParseIntPipe) id) {
console.log('typeof id:', typeof id);
return {
title: `Post ${id}`
}
}
@Post()
// @UseFilters(DemoFilter)
@UsePipes(ValidationPipe)
// @SetMetadata('roles', ['member', 89])
// @Roles('member', 'tester')
@Roles(...['member', 'tester'])
store(@Body() post: CreatePostDto, @User('roles') roles) {
console.log('roles:', roles)
// throw new HttpException('没有权限!', HttpStatus.FORBIDDEN)
// throw new ForbiddenException('没有权限!')
this.demoService.create(post);
}
}

View File

@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { PostsController } from './posts.controller';
import { DemoService } from "./providers/demo/demo.service";
@Module({
controllers: [PostsController],
providers: [DemoService]
})
export class PostsModule {}

View File

@ -1,15 +1,15 @@
import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';
import { DemoService } from './demo.service';
describe('UserService', () => {
let service: UserService;
describe('DemoService', () => {
let service: DemoService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [UserService],
providers: [DemoService],
}).compile();
service = module.get<UserService>(UserService);
service = module.get<DemoService>(DemoService);
});
it('should be defined', () => {

View File

@ -0,0 +1,15 @@
import { Injectable } from '@nestjs/common';
import { Post } from 'src/modules/posts/interfaces/post.interface';
@Injectable()
export class DemoService {
private readonly posts: Post[] = [];
findAll(): Post[] {
return this.posts;
}
create(post: Post) {
this.posts.push(post);
}
}

View File

@ -1,18 +0,0 @@
import { Test, TestingModule } from '@nestjs/testing';
import { UserController } from './user.controller';
describe('User Controller', () => {
let controller: UserController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [UserController],
}).compile();
controller = module.get<UserController>(UserController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});

View File

@ -1,27 +0,0 @@
import { Controller, Post, Body, Get, Param, UseInterceptors, ClassSerializerInterceptor, Put } from '@nestjs/common';
import { UserService } from './user.service';
import { UserDto, UpdatePasswordDto } from './user.dto';
@Controller('users')
export class UserController {
constructor(
private readonly userService: UserService,
) {}
@Post()
async store(@Body() data: UserDto) {
return await this.userService.store(data);
}
@Get(':id')
@UseInterceptors(ClassSerializerInterceptor)
async show(@Param('id') id: string) {
return await this.userService.show(id);
}
@Put(':id/password')
@UseInterceptors(ClassSerializerInterceptor)
async updatePassword(@Param('id') id: string, @Body() data: UpdatePasswordDto) {
return await this.userService.updatePassword(id, data)
}
}

View File

@ -1,9 +0,0 @@
export class UserDto {
readonly username: string;
readonly password: string;
}
export class UpdatePasswordDto {
readonly password: string;
readonly newPassword: string;
}

View File

@ -1,33 +0,0 @@
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, BeforeInsert, BeforeUpdate } from 'typeorm';
import * as bcrypt from 'bcrypt';
import { Exclude } from 'class-transformer';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column('varchar', { unique: true })
username: string;
@Column('longtext', { nullable: true })
@Exclude()
password: string;
@CreateDateColumn()
created: Date;
@UpdateDateColumn()
updated: Date;
@BeforeInsert()
@BeforeUpdate()
async hashPassword() {
this.password = await bcrypt.hash(this.password, 10);
}
async comparePassword(password: string) {
console.log(password, this.password)
return await bcrypt.compare(password, this.password);
}
}

View File

@ -1,15 +0,0 @@
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
@Module({
imports: [
TypeOrmModule.forFeature([User]),
],
controllers: [UserController],
providers: [UserService],
exports: [UserService]
})
export class UserModule {}

View File

@ -1,50 +0,0 @@
import { Injectable, BadRequestException, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
import { UserDto, UpdatePasswordDto } from './user.dto';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>,
) { }
async store(data: UserDto) {
const { username } = data;
const user = await this.userRepository.findOne({ username });
if (user) {
throw new BadRequestException('用户已经存在');
}
const entity = await this.userRepository.create(data);
await this.userRepository.save(entity);
return entity;
}
async show(id: string) {
const entity = await this.userRepository.findOne(id);
if (!entity) {
throw new NotFoundException('没有找到用户');
}
return entity;
}
async updatePassword(id: string, data: UpdatePasswordDto) {
const { password, newPassword } = data;
const entity = await this.userRepository.findOne(id)
if (!entity) {
throw new NotFoundException('没有找到用户')
}
const match = await entity.comparePassword(password)
if (!match) {
throw new BadRequestException('密码错误')
}
entity.password = newPassword
return await this.userRepository.save(entity)
}
async findByUserName(username: string) {
return await this.userRepository.findOne({ username })
}
}

529
yarn.lock
View File

@ -39,19 +39,6 @@
optional "0.1.4"
uuid "3.3.2"
"@nestjs/jwt@^6.1.1":
version "6.1.1"
resolved "https://registry.npm.taobao.org/@nestjs/jwt/download/@nestjs/jwt-6.1.1.tgz#78883321fc8663a7cf32aa725a70adc8454bbf5d"
integrity sha1-eIgzIfyGY6fPMqpyWnCtyEVLv10=
dependencies:
"@types/jsonwebtoken" "7.2.8"
jsonwebtoken "8.4.0"
"@nestjs/passport@^6.1.0":
version "6.1.0"
resolved "https://registry.npm.taobao.org/@nestjs/passport/download/@nestjs/passport-6.1.0.tgz#80da326cc976a82530648d8025b04c8e2d41c10e"
integrity sha1-gNoybMl2qCUwZI2AJbBMji1BwQ4=
"@nestjs/platform-express@^6.0.0":
version "6.3.1"
resolved "https://registry.npm.taobao.org/@nestjs/platform-express/download/@nestjs/platform-express-6.3.1.tgz#8adb602a5bb9571b9d58646bd52141a26ea8ba3e"
@ -69,13 +56,6 @@
dependencies:
optional "0.1.4"
"@nestjs/typeorm@^6.1.2":
version "6.1.2"
resolved "https://registry.npm.taobao.org/@nestjs/typeorm/download/@nestjs/typeorm-6.1.2.tgz#a52b694c6ba976ceef101c72d1b731206a079709"
integrity sha1-pStpTGupds7vEBxy0bcxIGoHlwk=
dependencies:
uuid "3.3.2"
"@nuxtjs/opencollective@0.2.2":
version "0.2.2"
resolved "https://registry.npm.taobao.org/@nuxtjs/opencollective/download/@nuxtjs/opencollective-0.2.2.tgz#26a761ebf588cc92a422d7cee996a66bd6e2761e"
@ -85,11 +65,6 @@
consola "^2.3.0"
node-fetch "^2.3.0"
"@types/bcrypt@^3.0.0":
version "3.0.0"
resolved "https://registry.npm.taobao.org/@types/bcrypt/download/@types/bcrypt-3.0.0.tgz#851489a9065a067cb7f3c9cbe4ce9bed8bba0876"
integrity sha1-hRSJqQZaBny388nL5M6b7Yu6CHY=
"@types/body-parser@*":
version "1.17.0"
resolved "https://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
@ -118,7 +93,7 @@
"@types/node" "*"
"@types/range-parser" "*"
"@types/express@*", "@types/express@^4.16.0":
"@types/express@^4.16.0":
version "4.17.0"
resolved "https://registry.npm.taobao.org/@types/express/download/@types/express-4.17.0.tgz#49eaedb209582a86f12ed9b725160f12d04ef287"
integrity sha1-SertsglYKobxLtm3JRYPEtBO8oc=
@ -137,20 +112,6 @@
resolved "https://registry.npm.taobao.org/@types/json5/download/@types/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
"@types/jsonwebtoken@*":
version "8.3.2"
resolved "https://registry.npm.taobao.org/@types/jsonwebtoken/download/@types/jsonwebtoken-8.3.2.tgz#e3d5245197152346fae7ee87d5541aa5a92d0362"
integrity sha1-49UkUZcVI0b65+6H1VQapaktA2I=
dependencies:
"@types/node" "*"
"@types/jsonwebtoken@7.2.8":
version "7.2.8"
resolved "https://registry.npm.taobao.org/@types/jsonwebtoken/download/@types/jsonwebtoken-7.2.8.tgz#8d199dab4ddb5bba3234f8311b804d2027af2b3a"
integrity sha1-jRmdq03bW7oyNPgxG4BNICevKzo=
dependencies:
"@types/node" "*"
"@types/mime@*":
version "2.0.1"
resolved "https://registry.npm.taobao.org/@types/mime/download/@types/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
@ -166,30 +127,6 @@
resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-10.14.9.tgz#2e8d678039d27943ce53a1913386133227fd9066"
integrity sha1-Lo1ngDnSeUPOU6GRM4YTMif9kGY=
"@types/passport-jwt@^3.0.1":
version "3.0.1"
resolved "https://registry.npm.taobao.org/@types/passport-jwt/download/@types/passport-jwt-3.0.1.tgz#bc4c2610815565de977ea1a580c047d71c646084"
integrity sha1-vEwmEIFVZd6XfqGlgMBH1xxkYIQ=
dependencies:
"@types/express" "*"
"@types/jsonwebtoken" "*"
"@types/passport-strategy" "*"
"@types/passport-strategy@*":
version "0.2.35"
resolved "https://registry.npm.taobao.org/@types/passport-strategy/download/@types/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c"
integrity sha1-5S9SEieepz8C2bBq9n7+nO/OLQw=
dependencies:
"@types/express" "*"
"@types/passport" "*"
"@types/passport@*", "@types/passport@^1.0.0":
version "1.0.0"
resolved "https://registry.npm.taobao.org/@types/passport/download/@types/passport-1.0.0.tgz#747fa127a747a145ff279f3df3e07c425e5ff297"
integrity sha1-dH+hJ6dHoUX/J5898+B8Ql5f8pc=
dependencies:
"@types/express" "*"
"@types/range-parser@*":
version "1.2.3"
resolved "https://registry.npm.taobao.org/@types/range-parser/download/@types/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
@ -291,11 +228,6 @@ ansi-regex@^3.0.0:
resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@ -308,11 +240,6 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
any-promise@^1.0.0:
version "1.3.0"
resolved "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@ -321,11 +248,6 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
app-root-path@^2.0.1:
version "2.2.1"
resolved "https://registry.npm.taobao.org/app-root-path/download/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a"
integrity sha1-0N9KaC7kCCc1g9Q/b3npiSYkvJo=
append-field@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/append-field/download/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
@ -643,11 +565,6 @@ balanced-match@^1.0.0:
resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
base64-js@^1.0.2:
version "1.3.0"
resolved "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
integrity sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=
base@^0.11.1:
version "0.11.2"
resolved "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
@ -668,19 +585,6 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
bcrypt@^3.0.6:
version "3.0.6"
resolved "https://registry.npm.taobao.org/bcrypt/download/bcrypt-3.0.6.tgz#f607846df62d27e60d5e795612c4f67d70206eb2"
integrity sha1-9geEbfYtJ+YNXnlWEsT2fXAgbrI=
dependencies:
nan "2.13.2"
node-pre-gyp "0.12.0"
bignumber.js@7.2.1:
version "7.2.1"
resolved "https://registry.npm.taobao.org/bignumber.js/download/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f"
integrity sha1-gMBIdZ2CaACAfEv9Uh5Q7bulel8=
binary-extensions@^1.0.0:
version "1.13.1"
resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
@ -774,24 +678,11 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/buffer-equal-constant-time/download/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
buffer-from@1.x, buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=
buffer@^5.1.0:
version "5.2.1"
resolved "https://registry.npm.taobao.org/buffer/download/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
integrity sha1-3Vf6DxCaxZxgJHkETcp7iz0LcdY=
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
builtin-modules@^1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@ -857,7 +748,7 @@ caseless@~0.12.0:
resolved "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@^1.1.1, chalk@^1.1.3:
chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
@ -868,7 +759,7 @@ chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1:
version "2.4.2"
resolved "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=
@ -921,6 +812,14 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
class-validator@^0.9.1:
version "0.9.1"
resolved "https://registry.npm.taobao.org/class-validator/download/class-validator-0.9.1.tgz#d60e58c5d14abca0a41bce38cf792ad4c46d1531"
integrity sha1-1g5YxdFKvKCkG844z3kq1MRtFTE=
dependencies:
google-libphonenumber "^3.1.6"
validator "10.4.0"
cli-boxes@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
@ -938,17 +837,6 @@ cli-color@1.4.0:
memoizee "^0.4.14"
timers-ext "^0.1.5"
cli-highlight@^2.0.0:
version "2.1.1"
resolved "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.1.tgz#2180223d51618b112f4509cf96e4a6c750b07e97"
integrity sha1-IYAiPVFhixEvRQnPluSmx1Cwfpc=
dependencies:
chalk "^2.3.0"
highlight.js "^9.6.0"
mz "^2.4.0"
parse5 "^4.0.0"
yargs "^13.0.0"
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
@ -958,15 +846,6 @@ cliui@^4.0.0:
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=
dependencies:
string-width "^3.1.0"
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"
co@^4.6.0:
version "4.6.0"
resolved "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@ -1057,9 +936,9 @@ configstore@^3.0.0:
xdg-basedir "^3.0.0"
consola@^2.3.0:
version "2.9.0"
resolved "https://registry.npm.taobao.org/consola/download/consola-2.9.0.tgz?cache=0&sync_timestamp=1560867735070&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsola%2Fdownload%2Fconsola-2.9.0.tgz#57760e3a65a53ec27337f4add31505802d902278"
integrity sha1-V3YOOmWlPsJzN/St0xUFgC2QIng=
version "2.7.1"
resolved "https://registry.npm.taobao.org/consola/download/consola-2.7.1.tgz#3f7f7c53eb44362240c3aee41b9bb2641d5ca32e"
integrity sha1-P398U+tENiJAw67kG5uyZB1coy4=
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
@ -1193,7 +1072,7 @@ data-urls@^1.0.0:
date-fns@^1.23.0:
version "1.30.1"
resolved "https://registry.npm.taobao.org/date-fns/download/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
resolved "https://registry.npm.taobao.org/date-fns/download/date-fns-1.30.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdate-fns%2Fdownload%2Fdate-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
integrity sha1-LnG/CxGRU9u0zE6I2epaz7UNwFw=
debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
@ -1217,13 +1096,6 @@ debug@^3.1.0, debug@^3.2.6:
dependencies:
ms "^2.1.1"
debug@^4.1.1:
version "4.1.1"
resolved "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=
dependencies:
ms "^2.1.1"
decamelize@^1.1.1, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@ -1349,11 +1221,6 @@ dot-prop@^4.1.0:
dependencies:
is-obj "^1.0.0"
dotenv@^6.2.0:
version "6.2.0"
resolved "https://registry.npm.taobao.org/dotenv/download/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064"
integrity sha1-lBwEEFNdlCyL7PKNPzV9vZ1HYGQ=
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.npm.taobao.org/duplexer3/download/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
@ -1367,23 +1234,11 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.npm.taobao.org/ecdsa-sig-formatter/download/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
integrity sha1-rg8PothQRe8UqBfao86azQSJ5b8=
dependencies:
safe-buffer "^5.0.1"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@ -1524,7 +1379,7 @@ exec-sh@^0.2.0:
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
resolved "https://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
dependencies:
cross-spawn "^5.0.1"
@ -1537,7 +1392,7 @@ execa@^0.7.0:
execa@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
resolved "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
integrity sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=
dependencies:
cross-spawn "^6.0.0"
@ -1706,11 +1561,6 @@ fb-watchman@^2.0.0:
dependencies:
bser "^2.0.0"
figlet@^1.1.1:
version "1.2.3"
resolved "https://registry.npm.taobao.org/figlet/download/figlet-1.2.3.tgz#7d25df546f41fc411c2a8b88012d48d55de72129"
integrity sha1-fSXfVG9B/EEcKouIAS1I1V3nISk=
filename-regex@^2.0.0:
version "2.0.1"
resolved "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
@ -1804,18 +1654,9 @@ forever-agent@~0.6.1:
resolved "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@^2.3.1:
version "2.4.0"
resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.4.0.tgz?cache=0&sync_timestamp=1560929244634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fform-data%2Fdownload%2Fform-data-2.4.0.tgz#4902b831b051e0db5612a35e1a098376f7b13ad8"
integrity sha1-SQK4MbBR4NtWEqNeGgmDdvexOtg=
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
form-data@~2.3.2:
form-data@^2.3.1, form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz?cache=0&sync_timestamp=1560929244634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fform-data%2Fdownload%2Fform-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y=
dependencies:
asynckit "^0.4.0"
@ -1888,11 +1729,6 @@ get-caller-file@^1.0.1:
resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=
get-caller-file@^2.0.1:
version "2.0.5"
resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@ -1964,6 +1800,11 @@ globals@^9.18.0:
resolved "https://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
integrity sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=
google-libphonenumber@^3.1.6:
version "3.2.2"
resolved "https://registry.npm.taobao.org/google-libphonenumber/download/google-libphonenumber-3.2.2.tgz#3d9d7ba727e99a50812f21b0ed313723b76c5c54"
integrity sha1-PZ17pyfpmlCBLyGw7TE3I7dsXFQ=
got@^6.7.1:
version "6.7.1"
resolved "https://registry.npm.taobao.org/got/download/got-6.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
@ -2085,11 +1926,6 @@ has@^1.0.1, has@^1.0.3:
dependencies:
function-bind "^1.1.1"
highlight.js@^9.6.0:
version "9.15.8"
resolved "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.15.8.tgz#f344fda123f36f1a65490e932cf90569e4999971"
integrity sha1-80T9oSPzbxplSQ6TLPkFaeSZmXE=
hoek@5.x.x:
version "5.0.4"
resolved "https://registry.npm.taobao.org/hoek/download/hoek-5.0.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhoek%2Fdownload%2Fhoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da"
@ -2147,11 +1983,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4:
dependencies:
safer-buffer ">= 2.1.2 < 3"
ieee754@^1.1.4:
version "1.1.13"
resolved "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
integrity sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=
ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
@ -2190,14 +2021,9 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=
inherits@2.0.3:
inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@^1.3.4, ini@~1.3.0:
@ -2525,7 +2351,7 @@ isemail@3.x.x:
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisexe%2Fdownload%2Fisexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
isobject@^2.0.0:
@ -2564,7 +2390,7 @@ istanbul-api@^1.3.1:
istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1:
version "1.2.1"
resolved "https://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fistanbul-lib-coverage%2Fdownload%2Fistanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
resolved "https://registry.npm.taobao.org/istanbul-lib-coverage/download/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
integrity sha1-zPftzQoLubj3Kf7rCTBHD5r2ZPA=
istanbul-lib-hook@^1.2.2:
@ -2610,7 +2436,7 @@ istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6:
istanbul-reports@^1.5.1:
version "1.5.1"
resolved "https://registry.npm.taobao.org/istanbul-reports/download/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
resolved "https://registry.npm.taobao.org/istanbul-reports/download/istanbul-reports-1.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fistanbul-reports%2Fdownload%2Fistanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
integrity sha1-l+Tb87UV6MSEyuoV1lJO69P/Tho=
dependencies:
handlebars "^4.0.3"
@ -2956,7 +2782,7 @@ js-tokens@^3.0.2:
resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.7.0:
js-yaml@^3.13.0, js-yaml@^3.7.0:
version "3.13.1"
resolved "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=
@ -3045,37 +2871,6 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
jsonwebtoken@8.4.0:
version "8.4.0"
resolved "https://registry.npm.taobao.org/jsonwebtoken/download/jsonwebtoken-8.4.0.tgz#8757f7b4cb7440d86d5e2f3becefa70536c8e46a"
integrity sha1-h1f3tMt0QNhtXi877O+nBTbI5Go=
dependencies:
jws "^3.1.5"
lodash.includes "^4.3.0"
lodash.isboolean "^3.0.3"
lodash.isinteger "^4.0.4"
lodash.isnumber "^3.0.3"
lodash.isplainobject "^4.0.6"
lodash.isstring "^4.0.1"
lodash.once "^4.0.0"
ms "^2.1.1"
jsonwebtoken@^8.2.0:
version "8.5.1"
resolved "https://registry.npm.taobao.org/jsonwebtoken/download/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
integrity sha1-AOceC431TCEhofJhN98igGc7zA0=
dependencies:
jws "^3.2.2"
lodash.includes "^4.3.0"
lodash.isboolean "^3.0.3"
lodash.isinteger "^4.0.4"
lodash.isnumber "^3.0.3"
lodash.isplainobject "^4.0.6"
lodash.isstring "^4.0.1"
lodash.once "^4.0.0"
ms "^2.1.1"
semver "^5.6.0"
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@ -3086,23 +2881,6 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
jwa@^1.4.1:
version "1.4.1"
resolved "https://registry.npm.taobao.org/jwa/download/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
integrity sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=
dependencies:
buffer-equal-constant-time "1.0.1"
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
jws@^3.1.5, jws@^3.2.2:
version "3.2.2"
resolved "https://registry.npm.taobao.org/jws/download/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
integrity sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=
dependencies:
jwa "^1.4.1"
safe-buffer "^5.0.1"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@ -3198,41 +2976,6 @@ locate-path@^3.0.0:
p-locate "^3.0.0"
path-exists "^3.0.0"
lodash.includes@^4.3.0:
version "4.3.0"
resolved "https://registry.npm.taobao.org/lodash.includes/download/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
lodash.isboolean@^3.0.3:
version "3.0.3"
resolved "https://registry.npm.taobao.org/lodash.isboolean/download/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
lodash.isinteger@^4.0.4:
version "4.0.4"
resolved "https://registry.npm.taobao.org/lodash.isinteger/download/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
lodash.isnumber@^3.0.3:
version "3.0.3"
resolved "https://registry.npm.taobao.org/lodash.isnumber/download/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
lodash.isplainobject@^4.0.6:
version "4.0.6"
resolved "https://registry.npm.taobao.org/lodash.isplainobject/download/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
lodash.isstring@^4.0.1:
version "4.0.1"
resolved "https://registry.npm.taobao.org/lodash.isstring/download/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
lodash.once@^4.0.0:
version "4.1.1"
resolved "https://registry.npm.taobao.org/lodash.once/download/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.npm.taobao.org/lodash.sortby/download/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@ -3516,30 +3259,6 @@ multer@1.4.1:
type-is "^1.6.4"
xtend "^4.0.0"
mysql@^2.17.1:
version "2.17.1"
resolved "https://registry.npm.taobao.org/mysql/download/mysql-2.17.1.tgz#62bba4a039a9b2f73638cd1652ce50fc6f682899"
integrity sha1-YrukoDmpsvc2OM0WUs5Q/G9oKJk=
dependencies:
bignumber.js "7.2.1"
readable-stream "2.3.6"
safe-buffer "5.1.2"
sqlstring "2.3.1"
mz@^2.4.0:
version "2.7.0"
resolved "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
integrity sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=
dependencies:
any-promise "^1.0.0"
object-assign "^4.0.1"
thenify-all "^1.0.0"
nan@2.13.2:
version "2.13.2"
resolved "https://registry.npm.taobao.org/nan/download/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
integrity sha1-9R3Hrma6fV1V4ebU2AkugCya7+c=
nan@^2.12.1:
version "2.14.0"
resolved "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@ -3617,7 +3336,7 @@ node-notifier@^5.2.1:
shellwords "^0.1.1"
which "^1.3.0"
node-pre-gyp@0.12.0, node-pre-gyp@^0.12.0:
node-pre-gyp@^0.12.0:
version "0.12.0"
resolved "https://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
integrity sha1-ObpLsUOdoDApX4meO1ILd4V2YUk=
@ -3731,7 +3450,7 @@ oauth-sign@~0.9.0:
resolved "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=
object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@ -3838,7 +3557,7 @@ os-locale@^2.0.0:
lcid "^1.0.0"
mem "^1.1.0"
os-locale@^3.0.0, os-locale@^3.1.0:
os-locale@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz?cache=0&sync_timestamp=1560274285880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fos-locale%2Fdownload%2Fos-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
integrity sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=
@ -3923,11 +3642,6 @@ package-json@^4.0.0:
registry-url "^3.0.3"
semver "^5.1.0"
parent-require@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/parent-require/download/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977"
integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=
parse-glob@^3.0.4:
version "3.0.4"
resolved "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
@ -3953,7 +3667,7 @@ parse-json@^4.0.0:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
parse5@4.0.0, parse5@^4.0.0:
parse5@4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/parse5/download/parse5-4.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse5%2Fdownload%2Fparse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
integrity sha1-bXhlbj2o14tOwLkG98CO8d/j9gg=
@ -3968,27 +3682,6 @@ pascalcase@^0.1.1:
resolved "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
passport-jwt@^4.0.0:
version "4.0.0"
resolved "https://registry.npm.taobao.org/passport-jwt/download/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065"
integrity sha1-fwvnupQuKLn10iwuu7jOlu988GU=
dependencies:
jsonwebtoken "^8.2.0"
passport-strategy "^1.0.0"
passport-strategy@1.x.x, passport-strategy@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/passport-strategy/download/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=
passport@^0.4.0:
version "0.4.0"
resolved "https://registry.npm.taobao.org/passport/download/passport-0.4.0.tgz#c5095691347bd5ad3b5e180238c3914d16f05811"
integrity sha1-xQlWkTR71a07XhgCOMORTRbwWBE=
dependencies:
passport-strategy "1.x.x"
pause "0.0.1"
path-dirname@^1.0.0:
version "1.0.2"
resolved "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
@ -4040,11 +3733,6 @@ path-type@^1.0.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
pause@0.0.1:
version "0.0.1"
resolved "https://registry.npm.taobao.org/pause/download/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@ -4123,9 +3811,9 @@ private@^0.1.8:
integrity sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I=
version "2.0.0"
resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=
prompts@^0.1.9:
version "0.1.14"
@ -4149,9 +3837,9 @@ pseudomap@^1.0.2:
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
psl@^1.1.24, psl@^1.1.28:
version "1.1.33"
resolved "https://registry.npm.taobao.org/psl/download/psl-1.1.33.tgz#5533d9384ca7aab86425198e10e8053ebfeab661"
integrity sha1-VTPZOEynqrhkJRmOEOgFPr/qtmE=
version "1.1.32"
resolved "https://registry.npm.taobao.org/psl/download/psl-1.1.32.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpsl%2Fdownload%2Fpsl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db"
integrity sha1-PxMnF88vnBaXJLK2yvNzz2lBmNs=
pstree.remy@^1.1.6:
version "1.1.7"
@ -4256,7 +3944,7 @@ readable-stream@1.1.x:
isarray "0.0.1"
string_decoder "~0.10.x"
readable-stream@2.3.6, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5:
readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5:
version "2.3.6"
resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=
@ -4285,7 +3973,7 @@ realpath-native@^1.0.0:
dependencies:
util.promisify "^1.0.0"
reflect-metadata@^0.1.12, reflect-metadata@^0.1.13:
reflect-metadata@^0.1.12:
version "0.1.13"
resolved "https://registry.npm.taobao.org/reflect-metadata/download/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
integrity sha1-Z648pXyXKiqhZCsQ/jY/4y1J3Ag=
@ -4399,11 +4087,6 @@ require-main-filename@^1.0.1:
resolved "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=
resolve-cwd@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@ -4495,7 +4178,7 @@ sane@^2.0.0:
optionalDependencies:
fsevents "^1.2.3"
sax@>=0.6.0, sax@^1.2.4:
sax@^1.2.4:
version "1.2.4"
resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk=
@ -4507,7 +4190,7 @@ semver-diff@^2.0.0:
dependencies:
semver "^5.0.3"
"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5, semver@^5.5.0, semver@^5.6.0:
"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5, semver@^5.5.0:
version "5.7.0"
resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.0.tgz?cache=0&sync_timestamp=1559063729249&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
integrity sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=
@ -4548,7 +4231,7 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
set-value@^0.4.3:
version "0.4.3"
resolved "https://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fset-value%2Fdownload%2Fset-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
resolved "https://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
dependencies:
extend-shallow "^2.0.1"
@ -4558,7 +4241,7 @@ set-value@^0.4.3:
set-value@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fset-value%2Fdownload%2Fset-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
resolved "https://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
integrity sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=
dependencies:
extend-shallow "^2.0.1"
@ -4717,11 +4400,6 @@ sprintf-js@~1.0.2:
resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sqlstring@2.3.1:
version "2.3.1"
resolved "https://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40"
integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
@ -4790,15 +4468,6 @@ string-width@^1.0.1:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
string-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE=
dependencies:
emoji-regex "^7.0.1"
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@ -4825,13 +4494,6 @@ strip-ansi@^4.0.0:
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=
dependencies:
ansi-regex "^4.1.0"
strip-bom@3.0.0, strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@ -4940,20 +4602,6 @@ test-exclude@^4.2.1:
read-pkg-up "^1.0.1"
require-main-filename "^1.0.1"
thenify-all@^1.0.0:
version "1.6.0"
resolved "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
dependencies:
thenify ">= 3.1.0 < 4"
"thenify@>= 3.1.0 < 4":
version "3.3.0"
resolved "https://registry.npm.taobao.org/thenify/download/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=
dependencies:
any-promise "^1.0.0"
throat@^4.0.0:
version "4.1.0"
resolved "https://registry.npm.taobao.org/throat/download/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
@ -5164,26 +4812,6 @@ typedarray@^0.0.6:
resolved "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typeorm@^0.2.18:
version "0.2.18"
resolved "https://registry.npm.taobao.org/typeorm/download/typeorm-0.2.18.tgz#8ae1d21104117724af41ddc11035c40a705e1de8"
integrity sha1-iuHSEQQRdySvQd3BEDXECnBeHeg=
dependencies:
app-root-path "^2.0.1"
buffer "^5.1.0"
chalk "^2.4.2"
cli-highlight "^2.0.0"
debug "^4.1.1"
dotenv "^6.2.0"
glob "^7.1.2"
js-yaml "^3.13.1"
mkdirp "^0.5.1"
reflect-metadata "^0.1.13"
tslib "^1.9.0"
xml2js "^0.4.17"
yargonaut "^1.1.2"
yargs "^13.2.1"
typescript@3.4.3:
version "3.4.3"
resolved "https://registry.npm.taobao.org/typescript/download/typescript-3.4.3.tgz#0eb320e4ace9b10eadf5bc6103286b0f8b7c224f"
@ -5315,6 +4943,11 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
validator@10.4.0:
version "10.4.0"
resolved "https://registry.npm.taobao.org/validator/download/validator-10.4.0.tgz#ee99a44afb3bb5ed350a159f056ca72a204cfc3c"
integrity sha1-7pmkSvs7te01ChWfBWynKiBM/Dw=
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@ -5441,15 +5074,6 @@ wrap-ansi@^2.0.0:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=
dependencies:
ansi-styles "^3.2.0"
string-width "^3.0.0"
strip-ansi "^5.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@ -5466,7 +5090,7 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.1.0:
ws@^5.2.0:
version "5.2.2"
resolved "https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz?cache=0&sync_timestamp=1560788200711&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
resolved "https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
integrity sha1-3/7xSGa46NyRM1glFNG++vlumA8=
dependencies:
async-limiter "~1.0.0"
@ -5481,19 +5105,6 @@ xml-name-validator@^3.0.0:
resolved "https://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
integrity sha1-auc+Bt5NjG5H+fsYH3jWSK1FfGo=
xml2js@^0.4.17:
version "0.4.19"
resolved "https://registry.npm.taobao.org/xml2js/download/xml2js-0.4.19.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxml2js%2Fdownload%2Fxml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
integrity sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=
dependencies:
sax ">=0.6.0"
xmlbuilder "~9.0.1"
xmlbuilder@~9.0.1:
version "9.0.7"
resolved "https://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.npm.taobao.org/xtend/download/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@ -5504,7 +5115,7 @@ y18n@^3.2.1:
resolved "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
"y18n@^3.2.1 || ^4.0.0":
version "4.0.0"
resolved "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha1-le+U+F7MgdAHwmThkKEg8KPIVms=
@ -5519,15 +5130,6 @@ yallist@^3.0.0, yallist@^3.0.3:
resolved "https://registry.npm.taobao.org/yallist/download/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
integrity sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=
yargonaut@^1.1.2:
version "1.1.4"
resolved "https://registry.npm.taobao.org/yargonaut/download/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c"
integrity sha1-xk9WQyx0ZScSIfU/XMUXiQw9bgw=
dependencies:
chalk "^1.1.1"
figlet "^1.1.1"
parent-require "^1.0.0"
yargs-parser@10.x:
version "10.1.0"
resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-10.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
@ -5543,14 +5145,6 @@ yargs-parser@^11.1.1:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^13.1.0:
version "13.1.1"
resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
integrity sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^9.0.2:
version "9.0.2"
resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-9.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@ -5594,23 +5188,6 @@ yargs@^12.0.1:
y18n "^3.2.1 || ^4.0.0"
yargs-parser "^11.1.1"
yargs@^13.0.0, yargs@^13.2.1:
version "13.2.4"
resolved "https://registry.npm.taobao.org/yargs/download/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
integrity sha1-C1YreUAW65ZRuYvTes82SqXW3IM=
dependencies:
cliui "^5.0.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
os-locale "^3.1.0"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.1.0"
yn@^3.0.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/yn/download/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114"