From ea8ab440bbbec38128a3171185feb888bb19eb7d Mon Sep 17 00:00:00 2001 From: zlq4863947 Date: Sat, 9 Mar 2019 01:20:59 +0900 Subject: [PATCH] feat(models): increase the base table --- jest.config.js | 2 +- modules/common/big-number-util/format.spec.ts | 172 +++++ modules/common/big-number-util/format.ts | 38 + modules/common/big-number-util/index.ts | 1 + .../websocket/internal/orderbook/helpers.ts | 4 +- .../websocket/internal/quote/helpers.ts | 4 +- .../testing/entity-test-bed/constants.ts | 29 +- .../entity-test-bed/entity-test-bed.spec.ts | 2 +- .../entity/candlestick/candlestick.entity.ts | 115 +++ .../candlestick.repository.spec.ts | 68 ++ .../candlestick/candlestick.repository.ts | 31 + modules/models/entity/candlestick/index.ts | 2 + modules/models/entity/index.ts | 4 + .../models/entity/master-exchange/index.ts | 2 + .../master-exchange/master-exchange.entity.ts | 65 ++ .../master-exchange.repository.spec.ts | 72 ++ .../master-exchange.repository.ts | 35 + .../entity/master-pair/master-pair.entity.ts | 12 +- .../master-pair.repository.spec.ts | 6 +- .../master-pair/master-pair.repository.ts | 13 +- modules/models/entity/orderbook/index.ts | 2 + .../entity/orderbook/orderbook.entity.ts | 69 ++ .../orderbook/orderbook.repository.spec.ts | 62 ++ .../entity/orderbook/orderbook.repository.ts | 25 + modules/models/entity/transaction/index.ts | 2 + .../entity/transaction/transaction.entity.ts | 90 +++ .../transaction.repository.spec.ts | 105 +++ .../transaction/transaction.repository.ts | 35 + .../testing/data/models/candlestick.entity.ts | 19 + modules/testing/data/models/index.ts | 4 + .../data/models/master-exchange.entity.ts | 12 + .../testing/data/models/master-pair.entity.ts | 1 - .../testing/data/models/orderbook.entity.ts | 17 + .../testing/data/models/transaction.entity.ts | 16 + modules/types/exchange.ts | 10 +- modules/types/package.json | 2 +- package.json | 5 +- yarn.lock | 676 +----------------- 38 files changed, 1144 insertions(+), 685 deletions(-) create mode 100644 modules/common/big-number-util/format.spec.ts create mode 100644 modules/common/big-number-util/format.ts create mode 100644 modules/models/entity/candlestick/candlestick.entity.ts create mode 100644 modules/models/entity/candlestick/candlestick.repository.spec.ts create mode 100644 modules/models/entity/candlestick/candlestick.repository.ts create mode 100644 modules/models/entity/candlestick/index.ts create mode 100644 modules/models/entity/master-exchange/index.ts create mode 100644 modules/models/entity/master-exchange/master-exchange.entity.ts create mode 100644 modules/models/entity/master-exchange/master-exchange.repository.spec.ts create mode 100644 modules/models/entity/master-exchange/master-exchange.repository.ts create mode 100644 modules/models/entity/orderbook/index.ts create mode 100644 modules/models/entity/orderbook/orderbook.entity.ts create mode 100644 modules/models/entity/orderbook/orderbook.repository.spec.ts create mode 100644 modules/models/entity/orderbook/orderbook.repository.ts create mode 100644 modules/models/entity/transaction/index.ts create mode 100644 modules/models/entity/transaction/transaction.entity.ts create mode 100644 modules/models/entity/transaction/transaction.repository.spec.ts create mode 100644 modules/models/entity/transaction/transaction.repository.ts create mode 100644 modules/testing/data/models/candlestick.entity.ts create mode 100644 modules/testing/data/models/master-exchange.entity.ts create mode 100644 modules/testing/data/models/orderbook.entity.ts create mode 100644 modules/testing/data/models/transaction.entity.ts diff --git a/jest.config.js b/jest.config.js index 501d800..1a515d9 100644 --- a/jest.config.js +++ b/jest.config.js @@ -18,7 +18,7 @@ module.exports = { testMatch: ['/modules/**/*.spec.ts', '/projects/**/*.spec.ts'], testURL: 'http://localhost/', collectCoverageFrom: ['modules/**/*.{js,ts}', 'projects/**/*.{js,ts}', '!projects/**/main.{js,ts}', '!modules/**/index.{js,ts}', '!**/node_modules/**', '!**/vendor/**'], - coveragePathIgnorePatterns: ['/node_modules/', '/test-helpers/', '/main.{js,ts}', '/dist/', 'entity-test-bed'], + coveragePathIgnorePatterns: ['/node_modules/', '/test-helpers/', '/main.{js,ts}', '/dist/', 'entity-test-bed', '/types/'], coverageReporters: ['json', 'lcov'], verbose: true, preset: 'ts-jest', diff --git a/modules/common/big-number-util/format.spec.ts b/modules/common/big-number-util/format.spec.ts new file mode 100644 index 0000000..1c9dfde --- /dev/null +++ b/modules/common/big-number-util/format.spec.ts @@ -0,0 +1,172 @@ +import { fixByDigits, floorByDigit } from './format'; + +describe('floorByDigit', () => { + describe('btc_jpy pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 0; + }); + + it('should return floored value #1', () => { + const value = 808138; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(808138); + }); + + it('should return floored value #2', () => { + const value = 808138.5; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(808138); + }); + }); + + describe('xrp_jpy pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 3; + }); + + it('should return floored value #1', () => { + const value = 64.655; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(64.655); + }); + + it('should return floored value #2', () => { + const value = 64.6; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(64.6); + }); + + it('should return floored value #3', () => { + const value = 64.6558; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(64.655); + }); + }); + + describe('ltc_btc pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 8; + }); + + it('should return floored value #1', () => { + const value = 0.01598311; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(0.01598311); + }); + }); + + describe('eth_btc pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 8; + }); + + it('should return floored value #1', () => { + const value = 0.07678989; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(0.07678989); + }); + }); + + describe('mona_jpy pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 3; + }); + + it('should return floored value #1', () => { + const value = 366.897; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(366.897); + }); + }); + + describe('mona_btc pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 8; + }); + + it('should return floored value #1', () => { + const value = 0.000454; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(0.000454); + }); + }); + + describe('bcc_jpy pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 0; + }); + + it('should return floored value #7', () => { + const value = 107999; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(107999); + }); + }); + + describe('bcc_btc pair:', () => { + let priceDigit: number; + + beforeEach(() => { + priceDigit = 8; + }); + + it('should return floored value #8', () => { + const value = 0.13387562; + + const result = floorByDigit(value, priceDigit); + expect(result).toBeTruthy(); + expect(result).toBe(0.13387562); + }); + }); +}); + +describe('fixByDigits', () => { + describe('When proper values are provided', () => { + it('should calculate values properly', () => { + const base = '0.001'; + expect(fixByDigits(base, 1)).toBe('0.0'); + expect(fixByDigits(base, 2)).toBe('0.00'); + expect(fixByDigits(base, 3)).toBe('0.001'); + expect(fixByDigits(base, 4)).toBe('0.0010'); + }); + + it('should round values', () => { + const base = '0.009'; + expect(fixByDigits(base, 2)).toBe('0.01'); + }); + }); +}); diff --git a/modules/common/big-number-util/format.ts b/modules/common/big-number-util/format.ts new file mode 100644 index 0000000..5048987 --- /dev/null +++ b/modules/common/big-number-util/format.ts @@ -0,0 +1,38 @@ +import { BigNumber } from 'bignumber.js'; + +import { getBigNumber } from './get-big-number'; + +/** + * get floored number by specific decimal places. + * + * @param {number} value - number to floor. + * @param {number} decimalPlace - where to floor. + * @returns {number} + */ +export function floorByDigit(value: BigNumber.Value, decimalPlace: number = 0): number { + const bigNumber = getBigNumber(value); + + // fix number with priceDigit (0.123456 -> 0.1234) + const characteristic = getBigNumber(10).pow(decimalPlace); + // If input is specified as a number greater than 15 digits, + // it will result in an error so cast once to string. + // @see https://github.com/MikeMcl/bignumber.js/issues/148 + const multiplied = bigNumber.multipliedBy(characteristic); + + return multiplied + .integerValue(BigNumber.ROUND_FLOOR) + .dividedBy(characteristic) + .toNumber(); +} + +/** + * Fix value with provided digits. + * + * @param value + * @param digits + */ +export function fixByDigits(value: BigNumber.Value, digits: number): string { + const bn = getBigNumber(value); + + return bn.toFixed(digits); +} diff --git a/modules/common/big-number-util/index.ts b/modules/common/big-number-util/index.ts index 198acb7..8014d62 100644 --- a/modules/common/big-number-util/index.ts +++ b/modules/common/big-number-util/index.ts @@ -1,2 +1,3 @@ export * from './condition'; +export * from './format'; export * from './get-big-number'; diff --git a/modules/exchanges/crypto/bitmex/websocket/internal/orderbook/helpers.ts b/modules/exchanges/crypto/bitmex/websocket/internal/orderbook/helpers.ts index d9c4c31..b103c08 100644 --- a/modules/exchanges/crypto/bitmex/websocket/internal/orderbook/helpers.ts +++ b/modules/exchanges/crypto/bitmex/websocket/internal/orderbook/helpers.ts @@ -29,8 +29,8 @@ export function update( originSource: WebsocketData, updateSource: WebsocketData, ): WebsocketData { - const originData = originSource.data || []; - const updateData = updateSource.data || []; + const originData = originSource.data; + const updateData = updateSource.data; originSource.data = originData; diff --git a/modules/exchanges/crypto/bitmex/websocket/internal/quote/helpers.ts b/modules/exchanges/crypto/bitmex/websocket/internal/quote/helpers.ts index eedf009..6571073 100644 --- a/modules/exchanges/crypto/bitmex/websocket/internal/quote/helpers.ts +++ b/modules/exchanges/crypto/bitmex/websocket/internal/quote/helpers.ts @@ -11,6 +11,6 @@ export function transform(source: QuoteSource): QuoteResponse { }; } -export function getTradeChannel(pair: string, endPoint?: PublicEndPoints | PrivateEndPoints): string { - return `${endPoint ? endPoint : PublicEndPoints.Quote}:${pair}`; +export function getTradeChannel(pair: string): string { + return `${PublicEndPoints.Quote}:${pair}`; } diff --git a/modules/models/common/testing/entity-test-bed/constants.ts b/modules/models/common/testing/entity-test-bed/constants.ts index b682c0d..45178a9 100644 --- a/modules/models/common/testing/entity-test-bed/constants.ts +++ b/modules/models/common/testing/entity-test-bed/constants.ts @@ -1,7 +1,30 @@ import { ObjectType } from 'typeorm'; -import { MasterPairEntity, MasterPairRepository } from '../../../entity'; +import { + CandlestickEntity, + CandlestickRepository, + MasterExchangeEntity, + MasterExchangeRepository, + MasterPairEntity, + MasterPairRepository, + OrderbookEntity, + OrderbookRepository, + TransactionEntity, + TransactionRepository, +} from '../../../entity'; -export const allEntityTypes: ObjectType[] = [MasterPairEntity]; +export const allEntityTypes: ObjectType[] = [ + MasterPairEntity, + MasterExchangeEntity, + OrderbookEntity, + TransactionEntity, + CandlestickEntity, +]; -export const allRepositoryTypes: ObjectType[] = [MasterPairRepository]; +export const allRepositoryTypes: ObjectType[] = [ + MasterPairRepository, + MasterExchangeRepository, + OrderbookRepository, + TransactionRepository, + CandlestickRepository, +]; diff --git a/modules/models/common/testing/entity-test-bed/entity-test-bed.spec.ts b/modules/models/common/testing/entity-test-bed/entity-test-bed.spec.ts index bb0dcb8..ab413b0 100644 --- a/modules/models/common/testing/entity-test-bed/entity-test-bed.spec.ts +++ b/modules/models/common/testing/entity-test-bed/entity-test-bed.spec.ts @@ -19,7 +19,7 @@ const expectedBase = { ...createBase, minOrderAmount: '0.000000000', minOrderPrice: '0.000000000', - isEnabled: false, + isEnabled: true, createdAt: 'overridden', updatedAt: 'overridden', }; diff --git a/modules/models/entity/candlestick/candlestick.entity.ts b/modules/models/entity/candlestick/candlestick.entity.ts new file mode 100644 index 0000000..bd14fab --- /dev/null +++ b/modules/models/entity/candlestick/candlestick.entity.ts @@ -0,0 +1,115 @@ +import { Timestamp } from '@dripjs/types'; +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +import { nullableDateTransformer } from '../../common'; + +@Entity({ + name: 'candlestick', +}) +export class CandlestickEntity { + @PrimaryGeneratedColumn({ + type: 'bigint', + name: 'id', + unsigned: true, + comment: 'primary auto generated id', + }) + readonly id!: string; + + @Column({ + type: 'varchar', + name: 'exchange', + length: 20, + comment: 'exchange name', + }) + readonly exchange!: string; + + @Column({ + type: 'varchar', + name: 'symbol', + length: 20, + comment: 'symbol name', + }) + readonly symbol!: string; + + @Column({ + type: 'varchar', + name: 'period', + length: 10, + comment: 'period type', + }) + readonly period!: string; + + @Column({ + type: 'decimal', + name: 'open', + precision: 21, + scale: 9, + unsigned: true, + }) + readonly open!: string; + + @Column({ + type: 'decimal', + name: 'high', + precision: 21, + scale: 9, + unsigned: true, + }) + readonly high!: string; + + @Column({ + type: 'decimal', + name: 'low', + precision: 21, + scale: 9, + unsigned: true, + }) + readonly low!: string; + + @Column({ + type: 'decimal', + name: 'close', + precision: 21, + scale: 9, + unsigned: true, + }) + readonly close!: string; + + @Column({ + type: 'decimal', + name: 'volume', + precision: 21, + scale: 9, + unsigned: true, + }) + readonly volume!: string; + + @Column({ + type: 'datetime', + name: 'time', + precision: 3, + transformer: nullableDateTransformer, + }) + readonly time!: Timestamp; + + @Column({ + type: 'datetime', + name: 'created_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly createdAt!: Timestamp; + + @Column({ + type: 'datetime', + name: 'updated_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + onUpdate: 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly updatedAt!: Timestamp; +} diff --git a/modules/models/entity/candlestick/candlestick.repository.spec.ts b/modules/models/entity/candlestick/candlestick.repository.spec.ts new file mode 100644 index 0000000..4c7b746 --- /dev/null +++ b/modules/models/entity/candlestick/candlestick.repository.spec.ts @@ -0,0 +1,68 @@ +import { fixByDigits } from '@dripjs/common'; +import { CandlestickEntity, CandlestickEntityCreateParams, CandlestickRepository, EntityTestBed } from '@dripjs/models'; +import { getCandlestickDefaultData } from '@dripjs/testing'; +import { Timestamp } from '@dripjs/types'; + +describe('candlestick.repository', () => { + let candlestickReposity: CandlestickRepository; + const defaultData = getCandlestickDefaultData(); + const exchange = 'bitmex'; + const pair = 'xbtusd'; + + beforeAll(async () => { + await EntityTestBed.setup(); + candlestickReposity = EntityTestBed.getRepository(CandlestickRepository); + }); + + afterAll(async () => { + await EntityTestBed.cleanup(); + }); + + beforeEach(async () => { + await EntityTestBed.reset(); + await candlestickReposity.insertNewCandlesticks(defaultData); + }); + + describe('insertNewCandlestick', () => { + it('should insert new candlestick', async () => { + const newData = { + ...defaultData[0], + exchange: 'bitbank', + time: Date.now() as Timestamp, + }; + await candlestickReposity.insertNewCandlestick(newData); + const insertedCandlestick = await candlestickReposity.find({ + exchange: newData.exchange, + }); + expect(insertedCandlestick.map(getDataFromEntity)).toEqual([newData]); + }); + }); + + describe('insertNewCandlesticks', () => { + it('should insert new Candlesticks', async () => { + const insertedCandlesticks = await candlestickReposity.find(); + expect(insertedCandlesticks.map(getDataFromEntity)).toEqual(defaultData); + }); + }); + + describe('getCandlesticks', () => { + it('should get candlesticks', async () => { + const res = await candlestickReposity.getCandlesticks(exchange, pair); + expect([getDataFromEntity(res[0])]).toEqual(defaultData); + }); + }); +}); + +function getDataFromEntity(entity: CandlestickEntity): CandlestickEntityCreateParams { + return { + exchange: entity.exchange, + symbol: entity.symbol, + period: entity.period, + time: entity.time, + open: fixByDigits(entity.open, 0), + high: fixByDigits(entity.high, 0), + low: fixByDigits(entity.low, 0), + close: fixByDigits(entity.close, 0), + volume: fixByDigits(entity.volume, 0), + }; +} diff --git a/modules/models/entity/candlestick/candlestick.repository.ts b/modules/models/entity/candlestick/candlestick.repository.ts new file mode 100644 index 0000000..a5b8b67 --- /dev/null +++ b/modules/models/entity/candlestick/candlestick.repository.ts @@ -0,0 +1,31 @@ +import { Timestamp } from '@dripjs/types'; +import { EntityRepository, Repository } from 'typeorm'; + +import { CandlestickEntity } from './candlestick.entity'; + +export interface CandlestickEntityCreateParams { + exchange: CandlestickEntity['exchange']; + symbol: CandlestickEntity['symbol']; + period: CandlestickEntity['period']; + time: CandlestickEntity['time']; + open: CandlestickEntity['open']; + high: CandlestickEntity['high']; + low: CandlestickEntity['low']; + close: CandlestickEntity['close']; + volume: CandlestickEntity['volume']; +} + +@EntityRepository(CandlestickEntity) +export class CandlestickRepository extends Repository { + async insertNewCandlestick(params: CandlestickEntityCreateParams): Promise { + return this.save(params as CandlestickEntity, { reload: false }); + } + + async insertNewCandlesticks(params: CandlestickEntityCreateParams[]): Promise { + return this.save(params as CandlestickEntity[], { reload: false }); + } + + async getCandlesticks(exchange: string, symbol: string): Promise { + return this.find({ where: { exchange, symbol } }); + } +} diff --git a/modules/models/entity/candlestick/index.ts b/modules/models/entity/candlestick/index.ts new file mode 100644 index 0000000..a28ae42 --- /dev/null +++ b/modules/models/entity/candlestick/index.ts @@ -0,0 +1,2 @@ +export * from './candlestick.entity'; +export * from './candlestick.repository'; diff --git a/modules/models/entity/index.ts b/modules/models/entity/index.ts index 8739983..973895a 100644 --- a/modules/models/entity/index.ts +++ b/modules/models/entity/index.ts @@ -1 +1,5 @@ export * from './master-pair'; +export * from './master-exchange'; +export * from './orderbook'; +export * from './candlestick'; +export * from './transaction'; diff --git a/modules/models/entity/master-exchange/index.ts b/modules/models/entity/master-exchange/index.ts new file mode 100644 index 0000000..1c27ba5 --- /dev/null +++ b/modules/models/entity/master-exchange/index.ts @@ -0,0 +1,2 @@ +export * from './master-exchange.entity'; +export * from './master-exchange.repository'; diff --git a/modules/models/entity/master-exchange/master-exchange.entity.ts b/modules/models/entity/master-exchange/master-exchange.entity.ts new file mode 100644 index 0000000..0afdcc1 --- /dev/null +++ b/modules/models/entity/master-exchange/master-exchange.entity.ts @@ -0,0 +1,65 @@ +import { Exchange, Timestamp } from '@dripjs/types'; +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +import { nullableBooleanTinyintTransformer, nullableDateTransformer } from '../../common'; + +@Entity({ + name: 'master_exchange', +}) +export class MasterExchangeEntity { + @PrimaryGeneratedColumn({ + type: 'bigint', + name: 'id', + unsigned: true, + comment: 'primary auto generated id', + }) + readonly id!: string; + + @Column({ + type: 'varchar', + name: 'name', + length: 20, + comment: 'special exchange name', + }) + readonly name!: Exchange['name']; + + @Column({ + type: 'varchar', + name: 'type', + length: 10, + comment: 'exchange type', + }) + readonly type!: Exchange['type']; + + @Column({ + type: 'tinyint', + name: 'is_enabled', + unsigned: true, + width: 1, + comment: 'whether exchange is enable status', + default: '1', + transformer: nullableBooleanTinyintTransformer, + }) + readonly isEnabled!: Exchange['isEnabled']; + + @Column({ + type: 'datetime', + name: 'created_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly createdAt!: Timestamp; + + @Column({ + type: 'datetime', + name: 'updated_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + onUpdate: 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly updatedAt!: Timestamp; +} diff --git a/modules/models/entity/master-exchange/master-exchange.repository.spec.ts b/modules/models/entity/master-exchange/master-exchange.repository.spec.ts new file mode 100644 index 0000000..a5ceebd --- /dev/null +++ b/modules/models/entity/master-exchange/master-exchange.repository.spec.ts @@ -0,0 +1,72 @@ +import { EntityTestBed, MasterExchangeEntity, MasterExchangeEntityCreateParams, MasterExchangeRepository } from '@dripjs/models'; +import { getExchangeDefaultData } from '@dripjs/testing'; + +describe('master-exchange.repository', () => { + let masterExchangeReposity: MasterExchangeRepository; + const defaultData = getExchangeDefaultData(); + const exchange = 'bitmex'; + + beforeAll(async () => { + await EntityTestBed.setup(); + masterExchangeReposity = EntityTestBed.getRepository(MasterExchangeRepository); + }); + + afterAll(async () => { + await EntityTestBed.cleanup(); + }); + + beforeEach(async () => { + await EntityTestBed.reset(); + await masterExchangeReposity.insertNewExchanges(defaultData); + }); + + describe('insertNewExchange', () => { + it('should insert new exchange', async () => { + const newData = { + ...defaultData[0], + name: 'bitbank', + }; + await masterExchangeReposity.insertNewExchange(newData); + const insertedExchange = await masterExchangeReposity.find({ + name: newData.name, + }); + expect(insertedExchange.map(getDataFromEntity)).toEqual([newData]); + }); + }); + + describe('insertNewExchanges', () => { + it('should insert new Exchanges', async () => { + const insertedExchange = await masterExchangeReposity.find(); + expect(insertedExchange.map(getDataFromEntity)).toEqual(defaultData); + }); + }); + + describe('findByName', () => { + it('should find by name', async () => { + const existed = await masterExchangeReposity.findByName(exchange); + expect(existed).toBeDefined(); + expect(getDataFromEntity(existed!)).toEqual(defaultData[0]); + }); + }); + + describe('getExchanges', () => { + it('should get exchanges', async () => { + const exInfo = await masterExchangeReposity.getExchanges(); + expect([getDataFromEntity(exInfo[0])]).toEqual(defaultData); + }); + }); + + describe('getExchangeNames', () => { + it('should get exchange names', async () => { + const exNames = await masterExchangeReposity.getExchangeNames(); + expect(exNames).toEqual(defaultData.map((o) => o.name)); + }); + }); +}); + +function getDataFromEntity(entity: MasterExchangeEntity): MasterExchangeEntityCreateParams { + return { + name: entity.name, + type: entity.type, + }; +} diff --git a/modules/models/entity/master-exchange/master-exchange.repository.ts b/modules/models/entity/master-exchange/master-exchange.repository.ts new file mode 100644 index 0000000..485c179 --- /dev/null +++ b/modules/models/entity/master-exchange/master-exchange.repository.ts @@ -0,0 +1,35 @@ +import { EntityRepository, Repository } from 'typeorm'; + +import { MasterExchangeEntity } from './master-exchange.entity'; + +export interface MasterExchangeEntityCreateParams { + name: MasterExchangeEntity['name']; + type: MasterExchangeEntity['type']; +} + +@EntityRepository(MasterExchangeEntity) +export class MasterExchangeRepository extends Repository { + async findByName(name: string): Promise { + return this.findOne({ where: { name } }); + } + + async insertNewExchange(params: MasterExchangeEntityCreateParams): Promise { + return this.save(params as MasterExchangeEntity, { reload: false }); + } + + async insertNewExchanges(params: MasterExchangeEntityCreateParams[]): Promise { + return this.save(params as MasterExchangeEntity[], { reload: false }); + } + + async getExchanges(): Promise { + return this.find({ where: { isEnabled: true } }); + } + + async getExchangeNames(): Promise { + const rs: { name: string }[] = await this.createQueryBuilder() + .select('name') + .execute(); + + return rs.map((record) => record.name); + } +} diff --git a/modules/models/entity/master-pair/master-pair.entity.ts b/modules/models/entity/master-pair/master-pair.entity.ts index 7810344..8f6fc5d 100644 --- a/modules/models/entity/master-pair/master-pair.entity.ts +++ b/modules/models/entity/master-pair/master-pair.entity.ts @@ -19,7 +19,7 @@ export class MasterPairEntity { @Column({ type: 'varchar', name: 'name', - length: 32, + length: 20, comment: 'special pair name', }) readonly name!: Pair['name']; @@ -27,7 +27,7 @@ export class MasterPairEntity { @Column({ type: 'varchar', name: 'exchange', - length: 32, + length: 20, comment: 'exchange name of special pair', }) readonly exchange!: Pair['exchange']; @@ -67,7 +67,7 @@ export class MasterPairEntity { @Column({ type: 'decimal', name: 'min_order_amount', - precision: 9, + precision: 21, scale: 9, unsigned: true, comment: 'min Order amount', @@ -87,7 +87,7 @@ export class MasterPairEntity { @Column({ type: 'decimal', name: 'min_order_price', - precision: 9, + precision: 21, scale: 9, unsigned: true, comment: 'min Order price', @@ -110,7 +110,7 @@ export class MasterPairEntity { unsigned: true, width: 1, comment: 'whether pair is enable status', - default: '0', + default: '1', transformer: nullableBooleanTinyintTransformer, }) readonly isEnabled!: Pair['isEnabled']; @@ -122,6 +122,7 @@ export class MasterPairEntity { default: /* istanbul ignore next */ () => 'NOW(3)', transformer: nullableDateTransformer, }) + /* istanbul ignore next */ readonly createdAt!: Timestamp; @Column({ @@ -132,5 +133,6 @@ export class MasterPairEntity { onUpdate: 'NOW(3)', transformer: nullableDateTransformer, }) + /* istanbul ignore next */ readonly updatedAt!: Timestamp; } diff --git a/modules/models/entity/master-pair/master-pair.repository.spec.ts b/modules/models/entity/master-pair/master-pair.repository.spec.ts index d52c6f4..5211056 100644 --- a/modules/models/entity/master-pair/master-pair.repository.spec.ts +++ b/modules/models/entity/master-pair/master-pair.repository.spec.ts @@ -4,6 +4,7 @@ import { getPairDefaultData } from '@dripjs/testing'; describe('master-pair.repository', () => { let masterPairReposity: MasterPairRepository; const defaultData = getPairDefaultData(); + const exchange = 'bitmex'; const pair = 'xbtusd'; beforeAll(async () => { @@ -53,14 +54,14 @@ describe('master-pair.repository', () => { describe('getPair', () => { it('should get pair', async () => { - const pairInfo = await masterPairReposity.getPair(); + const pairInfo = await masterPairReposity.getPairs(exchange); expect([getDataFromEntity(pairInfo[0])]).toEqual(defaultData); }); }); describe('getPairNames', () => { it('should get pair names', async () => { - const pairNames = await masterPairReposity.getPairNames(); + const pairNames = await masterPairReposity.getPairNames(exchange); expect(pairNames).toEqual(defaultData.map((o) => o.name)); }); }); @@ -83,6 +84,5 @@ function getDataFromEntity(entity: MasterPairEntity): MasterPairEntityCreatePara pricePrecision: entity.pricePrecision, maxOrderAmount: entity.maxOrderAmount, maxOrderPrice: entity.maxOrderPrice, - isEnabled: entity.isEnabled, }; } diff --git a/modules/models/entity/master-pair/master-pair.repository.ts b/modules/models/entity/master-pair/master-pair.repository.ts index ec3fa0b..55c759b 100644 --- a/modules/models/entity/master-pair/master-pair.repository.ts +++ b/modules/models/entity/master-pair/master-pair.repository.ts @@ -11,7 +11,6 @@ export interface MasterPairEntityCreateParams { pricePrecision: MasterPairEntity['pricePrecision']; maxOrderAmount: MasterPairEntity['maxOrderAmount']; maxOrderPrice: MasterPairEntity['maxOrderPrice']; - isEnabled: MasterPairEntity['isEnabled']; } export interface PairPrecision { @@ -44,13 +43,19 @@ export class MasterPairRepository extends Repository { return rs && rs.length > 0 ? rs[0] : { amountPrecision: 0, pricePrecision: 0 }; } - async getPair(): Promise { - return this.find({ where: { isEnabled: true } }); + async getPairs(exchange: string): Promise { + return this.find({ + where: { + exchange, + isEnabled: true, + }, + }); } - async getPairNames(): Promise { + async getPairNames(exchange: string): Promise { const rs: { name: string }[] = await this.createQueryBuilder() .select('name') + .where({ exchange }) .execute(); return rs.map((record) => record.name); diff --git a/modules/models/entity/orderbook/index.ts b/modules/models/entity/orderbook/index.ts new file mode 100644 index 0000000..136fd75 --- /dev/null +++ b/modules/models/entity/orderbook/index.ts @@ -0,0 +1,2 @@ +export * from './orderbook.entity'; +export * from './orderbook.repository'; diff --git a/modules/models/entity/orderbook/orderbook.entity.ts b/modules/models/entity/orderbook/orderbook.entity.ts new file mode 100644 index 0000000..4460f85 --- /dev/null +++ b/modules/models/entity/orderbook/orderbook.entity.ts @@ -0,0 +1,69 @@ +import { Depth, Timestamp } from '@dripjs/types'; +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +import { nullableDateTransformer } from '../../common'; + +@Entity({ + name: 'orderbook', +}) +export class OrderbookEntity { + @PrimaryGeneratedColumn({ + type: 'bigint', + name: 'id', + unsigned: true, + comment: 'primary auto generated id', + }) + readonly id!: string; + + @Column({ + type: 'varchar', + name: 'exchange', + length: 20, + comment: 'exchange name', + }) + readonly exchange!: string; + + @Column({ + type: 'varchar', + name: 'symbol', + length: 20, + comment: 'symbol name', + }) + readonly symbol!: string; + + @Column({ + type: 'datetime', + name: 'time', + precision: 3, + transformer: nullableDateTransformer, + }) + readonly time!: Timestamp; + + @Column({ + type: 'json', + name: 'data', + comment: 'orderbook thin json data', + }) + readonly data!: Depth; + + @Column({ + type: 'datetime', + name: 'created_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly createdAt!: Timestamp; + + @Column({ + type: 'datetime', + name: 'updated_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + onUpdate: 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly updatedAt!: Timestamp; +} diff --git a/modules/models/entity/orderbook/orderbook.repository.spec.ts b/modules/models/entity/orderbook/orderbook.repository.spec.ts new file mode 100644 index 0000000..adedefa --- /dev/null +++ b/modules/models/entity/orderbook/orderbook.repository.spec.ts @@ -0,0 +1,62 @@ +import { EntityTestBed, OrderbookEntity, OrderbookEntityParams, OrderbookRepository } from '@dripjs/models'; +import { getOrderbookDefaultData } from '@dripjs/testing'; +import { Timestamp } from '@dripjs/types'; + +describe('orderbook.repository', () => { + let orderbookReposity: OrderbookRepository; + const defaultData = getOrderbookDefaultData(); + const exchange = 'bitmex'; + const pair = 'xbtusd'; + + beforeAll(async () => { + await EntityTestBed.setup(); + orderbookReposity = EntityTestBed.getRepository(OrderbookRepository); + }); + + afterAll(async () => { + await EntityTestBed.cleanup(); + }); + + beforeEach(async () => { + await EntityTestBed.reset(); + await orderbookReposity.insertNewOrderbooks(defaultData); + }); + + describe('insertNewOrderbook', () => { + it('should insert new orderbook', async () => { + const newData = { + ...defaultData[0], + exchange: 'bitbank', + time: Date.now() as Timestamp, + }; + await orderbookReposity.insertNewOrderbook(newData); + const insertedOrderbook = await orderbookReposity.find({ + exchange: newData.exchange, + }); + expect(insertedOrderbook.map(getDataFromEntity)).toEqual([newData]); + }); + }); + + describe('insertNewOrderbooks', () => { + it('should insert new Orderbooks', async () => { + const insertedOrderbooks = await orderbookReposity.find(); + expect(insertedOrderbooks.map(getDataFromEntity)).toEqual(defaultData); + }); + }); + + describe('getOrderbooks', () => { + it('should get orderbooks', async () => { + const res = await orderbookReposity.getOrderbooks({ exchange, symbol: pair }); + expect([getDataFromEntity(res[0])]).toEqual(defaultData); + }); + }); +}); + +function getDataFromEntity(entity: OrderbookEntity): OrderbookEntityParams { + return { + exchange: entity.exchange, + symbol: entity.symbol, + time: entity.time, + data: entity.data, + }; +} diff --git a/modules/models/entity/orderbook/orderbook.repository.ts b/modules/models/entity/orderbook/orderbook.repository.ts new file mode 100644 index 0000000..147f021 --- /dev/null +++ b/modules/models/entity/orderbook/orderbook.repository.ts @@ -0,0 +1,25 @@ +import { EntityRepository, Repository } from 'typeorm'; + +import { OrderbookEntity } from './orderbook.entity'; + +export interface OrderbookEntityParams { + exchange: OrderbookEntity['exchange']; + symbol: OrderbookEntity['symbol']; + time: OrderbookEntity['time']; + data: OrderbookEntity['data']; +} + +@EntityRepository(OrderbookEntity) +export class OrderbookRepository extends Repository { + async insertNewOrderbook(params: OrderbookEntityParams): Promise { + return this.save(params as OrderbookEntity, { reload: false }); + } + + async insertNewOrderbooks(params: OrderbookEntityParams[]): Promise { + return this.save(params as OrderbookEntity[], { reload: false }); + } + + async getOrderbooks(params: Partial): Promise { + return this.find({ where: { params } }); + } +} diff --git a/modules/models/entity/transaction/index.ts b/modules/models/entity/transaction/index.ts new file mode 100644 index 0000000..0525876 --- /dev/null +++ b/modules/models/entity/transaction/index.ts @@ -0,0 +1,2 @@ +export * from './transaction.entity'; +export * from './transaction.repository'; diff --git a/modules/models/entity/transaction/transaction.entity.ts b/modules/models/entity/transaction/transaction.entity.ts new file mode 100644 index 0000000..8a322f0 --- /dev/null +++ b/modules/models/entity/transaction/transaction.entity.ts @@ -0,0 +1,90 @@ +import { Timestamp } from '@dripjs/types'; +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +import { nullableDateTransformer } from '../../common'; + +@Entity({ + name: 'transaction', +}) +export class TransactionEntity { + @PrimaryGeneratedColumn({ + type: 'bigint', + name: 'id', + unsigned: true, + comment: 'transaction id', + }) + readonly id!: string; + + @Column({ + type: 'varchar', + name: 'exchange', + length: 20, + comment: 'exchange name', + }) + readonly exchange!: string; + + @Column({ + type: 'varchar', + name: 'symbol', + length: 20, + comment: 'symbol name', + }) + readonly symbol!: string; + + @Column({ + type: 'datetime', + name: 'time', + precision: 3, + transformer: nullableDateTransformer, + }) + readonly time!: Timestamp; + + @Column({ + type: 'varchar', + name: 'side', + length: 4, + comment: 'order side (buy or sell)', + }) + readonly side!: string; + + @Column({ + type: 'decimal', + name: 'price', + precision: 21, + scale: 9, + unsigned: true, + comment: 'order price', + }) + readonly price!: string; + + @Column({ + type: 'decimal', + name: 'amount', + precision: 21, + scale: 9, + unsigned: true, + comment: 'order amount', + }) + readonly amount!: string; + + @Column({ + type: 'datetime', + name: 'created_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly createdAt!: Timestamp; + + @Column({ + type: 'datetime', + name: 'updated_at', + precision: 3, + default: /* istanbul ignore next */ () => 'NOW(3)', + onUpdate: 'NOW(3)', + transformer: nullableDateTransformer, + }) + /* istanbul ignore next */ + readonly updatedAt!: Timestamp; +} diff --git a/modules/models/entity/transaction/transaction.repository.spec.ts b/modules/models/entity/transaction/transaction.repository.spec.ts new file mode 100644 index 0000000..c11b49b --- /dev/null +++ b/modules/models/entity/transaction/transaction.repository.spec.ts @@ -0,0 +1,105 @@ +import { equalStrictly, isPositive } from '@dripjs/common'; +import { EntityTestBed, TransactionEntityCreateParams, TransactionRepository } from '@dripjs/models'; +import { getTransactionDefaultData } from '@dripjs/testing'; +import { OrderSide, Timestamp } from '@dripjs/types'; +import * as moment from 'moment'; + +describe('trade.repository', () => { + let transactionReposity: TransactionRepository; + const defaultData = getTransactionDefaultData(); + const exchange = 'bitmex'; + const pair = 'xbtusd'; + // for entity assertion + const isTimestamp = isPositive; + // to check value with ignoring precision. ('0.0001', '0.0001000') + const isValueOf = (v1: any) => (v2: any) => equalStrictly(v1, v2); + + // fixture + const btxFixture: TransactionEntityCreateParams = { + exchange, + symbol: pair, + side: OrderSide.Sell, + price: '1.0', + amount: '1.293841200', + time: Date.now() as Timestamp, + }; + + beforeAll(async () => { + await EntityTestBed.setup(); + transactionReposity = EntityTestBed.getRepository(TransactionRepository); + }); + + afterAll(async () => { + await EntityTestBed.cleanup(); + }); + + beforeEach(async () => { + await EntityTestBed.reset(); + await transactionReposity.insertNewTransactions(defaultData); + }); + + describe('insertNewTransaction', () => { + it('should insert new Transaction', async () => { + const newData = { + ...defaultData[0], + exchange: 'bitbank', + time: Date.now() as Timestamp, + }; + await transactionReposity.insertNewTransaction(newData); + const insertedTransaction = await transactionReposity.find({ + exchange: newData.exchange, + }); + + EntityTestBed.assertEntity(insertedTransaction[0], { + id: '2', + exchange: 'bitbank', + symbol: pair, + side: OrderSide.Buy, + price: isValueOf(newData.price), + amount: isValueOf(newData.amount), + time: isTimestamp, + createdAt: isTimestamp, + updatedAt: isTimestamp, + }); + }); + }); + + describe('insertNewTransactions', () => { + it('should insert new Transactions', async () => { + const insertedTransactions = await transactionReposity.find(); + expect( + insertedTransactions.map((getDataFromEntity) => { + return { + ...getDataFromEntity, + amount: defaultData[0].amount, + price: defaultData[0].price, + id: undefined, + createdAt: undefined, + updatedAt: undefined, + }; + }), + ).toEqual(defaultData); + expect(equalStrictly(insertedTransactions[0].amount, defaultData[0].amount)); + expect(equalStrictly(insertedTransactions[0].price, defaultData[0].price)); + }); + }); + + describe('fetchByRange', () => { + it('fetch transactions by pair & time should filter `[startAt, endAt)`', async () => { + // insert btc_jpy, xrp_jpy transactions + const startAt = moment('2019-12-09'); + const endAt = moment('2019-12-10'); + await transactionReposity.insertNewTransactions([ + { + ...btxFixture, + id: 2, + createdAt: startAt.valueOf() as Timestamp, + }, + ] as any[]); + + const trans = await transactionReposity.fetchByRange(exchange, pair, startAt, endAt); + expect(trans.length).toBe(1); + expect(trans[0].id).toBe('2'); + }); + }); +}); diff --git a/modules/models/entity/transaction/transaction.repository.ts b/modules/models/entity/transaction/transaction.repository.ts new file mode 100644 index 0000000..ee94d5a --- /dev/null +++ b/modules/models/entity/transaction/transaction.repository.ts @@ -0,0 +1,35 @@ +import * as moment from 'moment'; +import { EntityRepository, Repository } from 'typeorm'; + +import { TransactionEntity } from './transaction.entity'; + +export interface TransactionEntityCreateParams { + exchange: TransactionEntity['exchange']; + symbol: TransactionEntity['symbol']; + time: TransactionEntity['time']; + side: TransactionEntity['side']; + price: TransactionEntity['price']; + amount: TransactionEntity['amount']; +} + +@EntityRepository(TransactionEntity) +export class TransactionRepository extends Repository { + async insertNewTransaction(params: TransactionEntityCreateParams): Promise { + return this.save(params as TransactionEntity, { reload: false }); + } + + async insertNewTransactions(params: TransactionEntityCreateParams[]): Promise { + return this.save(params as TransactionEntity[], { reload: false }); + } + + async fetchByRange(exchange: string, symbol: string, startAt: moment.Moment, endAt: moment.Moment): Promise { + // DB created_at format: `2018-12-07 06:39:03.239` + const timeFmt = `YYYY-MM-DD HH:mm:ss.SSS`; + + return this.createQueryBuilder() + .where('exchange = :exchange and symbol = :symbol and created_at >= :startAt and created_at < :endAt') + .orderBy('id', 'DESC') + .setParameters({ exchange, symbol, startAt: startAt.format(timeFmt), endAt: endAt.format(timeFmt) }) + .getMany(); + } +} diff --git a/modules/testing/data/models/candlestick.entity.ts b/modules/testing/data/models/candlestick.entity.ts new file mode 100644 index 0000000..d28a2b1 --- /dev/null +++ b/modules/testing/data/models/candlestick.entity.ts @@ -0,0 +1,19 @@ +import { CandlestickEntityCreateParams } from '@dripjs/models'; +import { Timestamp } from '@dripjs/types'; + +// use function to avoid object mutating when insert to db +export function getCandlestickDefaultData(): CandlestickEntityCreateParams[] { + return [ + { + exchange: 'bitmex', + symbol: 'xbtusd', + time: Date.now() as Timestamp, + period: '5', + open: '4800', + close: '4821', + low: '4800', + high: '4832', + volume: '10', + }, + ]; +} diff --git a/modules/testing/data/models/index.ts b/modules/testing/data/models/index.ts index 70e0491..755af38 100644 --- a/modules/testing/data/models/index.ts +++ b/modules/testing/data/models/index.ts @@ -1 +1,5 @@ export * from './master-pair.entity'; +export * from './master-exchange.entity'; +export * from './orderbook.entity'; +export * from './transaction.entity'; +export * from './candlestick.entity'; diff --git a/modules/testing/data/models/master-exchange.entity.ts b/modules/testing/data/models/master-exchange.entity.ts new file mode 100644 index 0000000..b9e78a3 --- /dev/null +++ b/modules/testing/data/models/master-exchange.entity.ts @@ -0,0 +1,12 @@ +import { MasterExchangeEntityCreateParams } from '@dripjs/models'; +import { ExchangeType } from '@dripjs/types'; + +// use function to avoid object mutating when insert to db +export function getExchangeDefaultData(): MasterExchangeEntityCreateParams[] { + return [ + { + name: 'bitmex', + type: ExchangeType.Crypto, + }, + ]; +} diff --git a/modules/testing/data/models/master-pair.entity.ts b/modules/testing/data/models/master-pair.entity.ts index 25f12e9..656e48a 100644 --- a/modules/testing/data/models/master-pair.entity.ts +++ b/modules/testing/data/models/master-pair.entity.ts @@ -12,7 +12,6 @@ export function getPairDefaultData(): MasterPairEntityCreateParams[] { pricePrecision: 1, maxOrderAmount: 9999999, maxOrderPrice: 9999999, - isEnabled: true, }, ]; } diff --git a/modules/testing/data/models/orderbook.entity.ts b/modules/testing/data/models/orderbook.entity.ts new file mode 100644 index 0000000..8475d45 --- /dev/null +++ b/modules/testing/data/models/orderbook.entity.ts @@ -0,0 +1,17 @@ +import { OrderbookEntityParams } from '@dripjs/models'; +import { Timestamp } from '@dripjs/types'; + +// use function to avoid object mutating when insert to db +export function getOrderbookDefaultData(): OrderbookEntityParams[] { + return [ + { + exchange: 'bitmex', + symbol: 'xbtusd', + time: Date.now() as Timestamp, + data: { + asks: [[3860, 847930], [3859.5, 1057318]], + bids: [[3859, 727336], [3858.5, 59311]], + }, + }, + ]; +} diff --git a/modules/testing/data/models/transaction.entity.ts b/modules/testing/data/models/transaction.entity.ts new file mode 100644 index 0000000..5ae0d2b --- /dev/null +++ b/modules/testing/data/models/transaction.entity.ts @@ -0,0 +1,16 @@ +import { TransactionEntityCreateParams } from '@dripjs/models'; +import { OrderSide, Timestamp } from '@dripjs/types'; + +// use function to avoid object mutating when insert to db +export function getTransactionDefaultData(): TransactionEntityCreateParams[] { + return [ + { + exchange: 'bitmex', + symbol: 'xbtusd', + time: Date.now() as Timestamp, + side: OrderSide.Buy, + price: '4821', + amount: '10', + }, + ]; +} diff --git a/modules/types/exchange.ts b/modules/types/exchange.ts index d699a4b..7c08e05 100644 --- a/modules/types/exchange.ts +++ b/modules/types/exchange.ts @@ -1,7 +1,13 @@ export interface Exchange { - code: string; name: string; - desc?: string; + type: ExchangeType; + isEnabled: boolean; +} + +export enum ExchangeType { + Crypto = 'crypto', + Stock = 'stock', + Futures = 'futures', } export interface Market { diff --git a/modules/types/package.json b/modules/types/package.json index 268a3d4..ea8ab13 100644 --- a/modules/types/package.json +++ b/modules/types/package.json @@ -1,6 +1,6 @@ { "name": "dripjs-types", - "version": "0.1.2", + "version": "0.1.3", "description": "dripjs types", "main": "dist/index.js", "typings": "dist/index.d.ts", diff --git a/package.json b/package.json index e62f79a..44d5b9e 100644 --- a/package.json +++ b/package.json @@ -103,9 +103,6 @@ }, "homepage": "https://github.com/zlq4863947/dripjs#readme", "devDependencies": { - "@nestjs/common": "5.7.3", - "@nestjs/core": "5.7.3", - "@nestjs/typeorm": "5.3.0", "@types/jest": "24.0.9", "@types/lodash": "4.14.122", "@types/qs": "6.5.2", @@ -140,7 +137,7 @@ "config": "^3.0.1", "dotenv": "^6.2.0", "dripjs-common": "^0.1.0", - "dripjs-types": "^0.1.2", + "dripjs-types": "^0.1.3", "lodash": "^4.17.11", "moment": "^2.24.0", "mysql": "^2.16.0", diff --git a/yarn.lock b/yarn.lock index 8727b2e..b28b4bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -289,55 +289,11 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nestjs/common@5.7.3": - version "5.7.3" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-5.7.3.tgz#8b446e936f998ffc694d0a750df43b9b310dade8" - integrity sha512-xZ1SQKtOA+UUXphTF5vn4Z+B0fcRR4JPDdd+dqkcLqs9eP6q0i4lJWwugYxBRzyqWNFFiLif9t9NiuMNuWxgrg== - dependencies: - axios "0.18.0" - cli-color "1.2.0" - deprecate "1.0.0" - multer "1.3.0" - uuid "3.3.2" - -"@nestjs/core@5.7.3": - version "5.7.3" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-5.7.3.tgz#3ec7f8d8f2279ed12466bdee0252d79e5703aa3e" - integrity sha512-t+ohavL+AvF9dzqFgXrftIqztpoVlMP66lC14gJpFTUy7vtigs/nkDLH8099NCrrWODEm+4ExwGvJ0uqEBZfxQ== - dependencies: - "@nuxtjs/opencollective" "0.1.0" - body-parser "1.18.3" - cors "2.8.4" - express "4.16.3" - fast-safe-stringify "1.2.0" - iterare "0.0.8" - object-hash "1.3.0" - optional "0.1.4" - path-to-regexp "2.2.1" - uuid "3.3.2" - -"@nestjs/typeorm@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-5.3.0.tgz#448d6d08d73ceb3c1f8a00a07e26a86c8a62b9f8" - integrity sha512-8g80OcKRTfhh5oSkfUKPMfcKBuC0gsr79wBksUwEWoglB/7bvO/erz8RC0XQPdjRH6NRUc+qrglywGm6Be2FZQ== - dependencies: - uuid "3.3.2" - "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@nuxtjs/opencollective@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.1.0.tgz#5dfb10b2148ce77e9590bca9b9ed6e71d2a500eb" - integrity sha512-e09TxGpTxMOfVwvVWPKNttKslnCtbvp5ofc0EwlKdA4IA8AUIyeteGraGZGs+JO4zw4y2+YxRlNN2xQ+c6KFjw== - dependencies: - chalk "^2.4.1" - consola "^1.4.3" - esm "^3.0.79" - node-fetch "^2.2.0" - "@types/babel__core@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.0.tgz#710f2487dda4dcfd010ca6abb2b4dc7394365c51" @@ -507,14 +463,6 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== -accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - acorn-globals@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" @@ -558,7 +506,7 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-regex@^2.0.0, ansi-regex@^2.1.1: +ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= @@ -603,11 +551,6 @@ app-root-path@^2.0.1: resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" integrity sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo= -append-field@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" - integrity sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo= - append-transform@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" @@ -652,11 +595,6 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -738,7 +676,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axios@0.18.0, axios@^0.18.0: +axios@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= @@ -837,38 +775,6 @@ bignumber.js@^8.1.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885" integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ== -body-parser@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -body-parser@1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" - on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -942,19 +848,6 @@ builtin-modules@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.0.0.tgz#1e587d44b006620d90286cc7a9238bbc6129cab1" integrity sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg== -busboy@^0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= - dependencies: - dicer "0.2.5" - readable-stream "1.1.x" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1068,11 +961,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -1088,18 +976,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli-color@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.2.0.tgz#3a5ae74fd76b6267af666e69e2afbbd01def34d1" - integrity sha1-OlrnT9drYmevZm5p4q+70B3vNNE= - dependencies: - ansi-regex "^2.1.1" - d "1" - es5-ext "^0.10.12" - es6-iterator "2" - memoizee "^0.4.3" - timers-ext "0.1" - cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -1209,7 +1085,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.6.0: +concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1226,26 +1102,6 @@ config@^3.0.1: dependencies: json5 "^1.0.1" -consola@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/consola/-/consola-1.4.5.tgz#09732d07cb50af07332e54e0f42fafb92b962c4a" - integrity sha512-movqq3MbyXbSf7cG/x+EbO3VjKQVZPB/zeB5+lN1TuBYh9BWDemLQca9P+a4xpO4lXva9rz+Bd8XyqlH136Lww== - dependencies: - chalk "^2.3.2" - figures "^2.0.0" - lodash "^4.17.5" - std-env "^1.1.0" - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - conventional-changelog-angular@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0" @@ -1412,16 +1268,6 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0: dependencies: safe-buffer "~5.1.1" -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1432,14 +1278,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" - integrity sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY= - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig@^5.0.5: version "5.0.7" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04" @@ -1501,13 +1339,6 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= - dependencies: - es5-ext "^0.10.9" - dargs@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" @@ -1536,7 +1367,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1636,26 +1467,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= - -depd@~1.1.1, depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -deprecate@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-1.0.0.tgz#661490ed2428916a6c8883d8834e5646f4e4a4a8" - integrity sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -1666,14 +1477,6 @@ detect-newline@^2.1.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= -dicer@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" - integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= - dependencies: - readable-stream "1.1.x" - streamsearch "0.1.2" - diff-sequences@^24.3.0: version "24.3.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" @@ -1751,10 +1554,10 @@ dripjs-common@^0.1.0: rxjs "^6.4.0" ws "^6.1.3" -dripjs-types@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dripjs-types/-/dripjs-types-0.1.2.tgz#de434cb6823b989f8f42f35a1ad99bfeef3073ff" - integrity sha512-I3hLrJYVPSsdKhx+HS/raTBPiy+PulPB15NUWP16yEpC43q5diXTxZzmqMk36bjp7aYwJ9lQC/hNkeRJhzNRMw== +dripjs-types@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/dripjs-types/-/dripjs-types-0.1.3.tgz#6573a15951991f3bc78c1ad1146aa46ff61ffa1e" + integrity sha512-U4JskIRHyzHFEYbHYihe3xW8j+zIMqWZkiLX7TQPtBCkL6kAoXAcRiI0vIeeLe+3rG894s0sE9sCwf6A7co6kg== ecc-jsbn@~0.1.1: version "0.1.2" @@ -1764,11 +1567,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1779,11 +1577,6 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -1840,47 +1633,6 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.12, es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.48" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.48.tgz#9a0b31eeded39e64453bcedf6f9d50bbbfb43850" - integrity sha512-CdRvPlX/24Mj5L4NVxTs4804sxiS2CjVprgCmrgoDkdmjdY4D+ySHa7K3jJf8R40dFg0tIm3z/dk326LrnuSGw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1958,11 +1710,6 @@ eslint@^5.0.0: table "^5.2.3" text-table "^0.2.0" -esm@^3.0.79: - version "3.2.9" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.9.tgz#9dca653e3b39f89c3c65c5e84cebfa4af345c10d" - integrity sha512-mATFs9dpCjnEyNv27z29UNDmJmBBX8zMdcFip7aIOrBRTpLs8SA+6Ek1QtsWfvecAJVeZy+X5D3Z6xZVtUvYdg== - espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" @@ -2011,19 +1758,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - exec-sh@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" @@ -2085,42 +1819,6 @@ expect@^24.3.1: jest-message-util "^24.3.0" jest-regex-util "^24.3.0" -express@4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" - integrity sha1-avilAjUNsyRuzEvs9rWjTSL37VM= - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2201,11 +1899,6 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fast-safe-stringify@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.0.tgz#ebd42666fd18fe4f2ba4f0d295065f3f85cade96" - integrity sha1-69QmZv0Y/k8rpPDSlQZfP4XK3pY= - fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" @@ -2255,19 +1948,6 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" - unpipe "~1.0.0" - find-line-column@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/find-line-column/-/find-line-column-0.5.2.tgz#db00238ff868551a182e74a103416d295a98c8ca" @@ -2340,11 +2020,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2352,11 +2027,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - fs-access@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" @@ -2636,26 +2306,6 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" -http-errors@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -2665,18 +2315,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== - -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -2822,7 +2460,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -2873,11 +2511,6 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ipaddr.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -2914,13 +2547,6 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -3049,7 +2675,7 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1, is-promise@^2.1.0: +is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= @@ -3208,11 +2834,6 @@ istanbul-reports@^2.1.1: dependencies: handlebars "^4.1.0" -iterare@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/iterare/-/iterare-0.0.8.tgz#a969a80a1fbff6b78f28776594d7bc2bdfab6aad" - integrity sha1-qWmoCh+/9rePKHdllNe8K9+raq0= - jest-changed-files@^24.3.0: version "24.3.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.3.0.tgz#7050ae29aaf1d59437c80f21d5b3cd354e88a499" @@ -3840,7 +3461,7 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5, lodash@^4.2.1: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.2.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -3873,13 +3494,6 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= - dependencies: - es5-ext "~0.10.2" - make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -3972,11 +3586,6 @@ mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" @@ -3993,20 +3602,6 @@ mem@^4.0.0: mimic-fn "^1.0.0" p-is-promise "^2.0.0" -memoizee@^0.4.3: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== - dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" - memory-fs@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -4061,11 +3656,6 @@ meow@^5.0.0: trim-newlines "^2.0.0" yargs-parser "^10.0.0" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -4078,11 +3668,6 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -4107,18 +3692,13 @@ mime-db@~1.38.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== -mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.22" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== dependencies: mime-db "~1.38.0" -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -4189,20 +3769,6 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -multer@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" - integrity sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI= - dependencies: - append-field "^0.1.0" - busboy "^0.2.11" - concat-stream "^1.5.0" - mkdirp "^0.5.1" - object-assign "^3.0.0" - on-finished "^2.3.0" - type-is "^1.6.4" - xtend "^4.0.0" - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -4249,26 +3815,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= - -next-tick@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" - integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -4334,12 +3885,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= - -object-assign@^4, object-assign@^4.0.1: +object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4353,11 +3899,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" - integrity sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ== - object-keys@^1.0.12: version "1.1.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" @@ -4385,13 +3926,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -on-finished@^2.3.0, on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4414,11 +3948,6 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optional@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" - integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== - optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -4563,11 +4092,6 @@ parse5@^3.0.3: dependencies: "@types/node" "*" -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -4610,16 +4134,6 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -4730,14 +4244,6 @@ prompts@^2.0.1: kleur "^3.0.2" sisteransi "^1.0.0" -proxy-addr@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.8.0" - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -4776,51 +4282,21 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== - -qs@6.5.2, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - qs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - -raw-body@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== - dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" - unpipe "1.0.0" - rc@~1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4878,16 +4354,6 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@2.3.6, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -5096,11 +4562,6 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -5143,35 +4604,6 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5197,16 +4629,6 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5424,33 +4846,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - -std-env@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-1.3.1.tgz#4e1758412439e9ece1d437b1b098551911aa44ee" - integrity sha512-KI2F2pPJpd3lHjng+QLezu0eq+QDtXcv1um016mhOPAJFHKL+09ykK5PUBWta2pZDC8BVV0VPya08A15bUXSLQ== - dependencies: - is-ci "^1.1.0" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= - string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" @@ -5485,11 +4885,6 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.0.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -5655,14 +5050,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timers-ext@0.1, timers-ext@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5889,14 +5276,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5993,11 +5372,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -6036,12 +5410,7 @@ util.promisify@^1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@3.3.2, uuid@^3.3.2: +uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== @@ -6054,11 +5423,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -6212,7 +5576,7 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= -xtend@^4.0.0, xtend@~4.0.1: +xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=