diff --git a/lib/constants.ts b/lib/constants.ts new file mode 100644 index 0000000..5bb4eab --- /dev/null +++ b/lib/constants.ts @@ -0,0 +1,2 @@ +export const PROVIDER = process.env.PROVIDER; +export const TRACING_ENABLED = process.env.TRACING_ENABLED === 'true' && process.env.IS_OFFLINE !== 'true'; diff --git a/lib/default-error-transformer.spec.ts b/lib/default-error-transformer.spec.ts index 7850cc9..e8f77f2 100644 --- a/lib/default-error-transformer.spec.ts +++ b/lib/default-error-transformer.spec.ts @@ -7,8 +7,14 @@ describe('default-error-transformer', () => { const error: HttpError = new HttpError(201, 'message'); expect(defaultErrorTransformer(error, { showStackTrace: false })).toEqual({ + success: false, statusCode: 201, - body: '{"status":201,"name":"Created","message":"message","details":[]}' + body: { + status: 201, + name: 'Created', + message: 'message', + details: [] + }, }); }); }); diff --git a/lib/default-error-transformer.ts b/lib/default-error-transformer.ts index dc81f38..bc4a147 100644 --- a/lib/default-error-transformer.ts +++ b/lib/default-error-transformer.ts @@ -1,9 +1,9 @@ import { getStatusText } from 'http-status-codes'; -import { APIGatewayProxyResult } from 'aws-lambda'; import { HttpError } from './http-error'; +import { IError, IProviderResponse } from './models'; export function defaultErrorTransformer(error: HttpError, - options: { showStackTrace?: boolean }): APIGatewayProxyResult { + options: { showStackTrace?: boolean }): IProviderResponse { const stackTraceDetails = options.showStackTrace ? [{ name: 'Unexpected Error', @@ -11,8 +11,9 @@ export function defaultErrorTransformer(error: HttpError, }] : []; return { + success: false, statusCode: error.statusCode, - body: JSON.stringify({ + body: { status: error.statusCode, name: getStatusText(error.statusCode), message: error.message, @@ -20,6 +21,6 @@ export function defaultErrorTransformer(error: HttpError, ...error.details, ...stackTraceDetails ] - }) + } }; } diff --git a/lib/handler.spec.ts b/lib/handler.spec.ts index 0ed6528..f91fcf5 100644 --- a/lib/handler.spec.ts +++ b/lib/handler.spec.ts @@ -190,4 +190,79 @@ describe('handler', () => { expect(result.statusCode).toEqual(400); expect(JSON.parse(result.body).message).toEqual('Invalid response'); }); + + it('should select the correct provider', async () => { + // tslint:disable-next-line: variable-name + const AWSProvider = jest.fn(); + jest.mock('./providers/aws/provider', () => ({ AWSProvider })); + // tslint:disable-next-line: variable-name + const AzureProvider = jest.fn(); + jest.mock('./providers/azure/provider', () => ({ AzureProvider })); + // tslint:disable-next-line: variable-name + const GoogleProvider = jest.fn(); + jest.mock('./providers/google/provider', () => ({ GoogleProvider })); + + // Default + jest.clearAllMocks(); + jest.resetModules(); + (await import('./handler')).handler({}, async () => Result.Ok(OK)); + expect(AWSProvider).toHaveBeenCalledTimes(1); + expect(AzureProvider).not.toHaveBeenCalled(); + expect(GoogleProvider).not.toHaveBeenCalled(); + + // AWS + jest.clearAllMocks(); + jest.resetModules(); + process.env.PROVIDER = 'aws'; + (await import('./handler')).handler({}, async () => Result.Ok(OK)); + expect(AWSProvider).toHaveBeenCalledTimes(1); + expect(AzureProvider).not.toHaveBeenCalled(); + expect(GoogleProvider).not.toHaveBeenCalled(); + + // Azure + jest.clearAllMocks(); + jest.resetModules(); + process.env.PROVIDER = 'azure'; + (await import('./handler')).handler({}, async () => Result.Ok(OK)); + expect(AWSProvider).not.toHaveBeenCalled(); + expect(AzureProvider).toHaveBeenCalledTimes(1); + expect(GoogleProvider).not.toHaveBeenCalled(); + + // Google + jest.clearAllMocks(); + jest.resetModules(); + process.env.PROVIDER = 'google'; + (await import('./handler')).handler({}, async () => Result.Ok(OK)); + expect(AWSProvider).not.toHaveBeenCalled(); + expect(AzureProvider).not.toHaveBeenCalled(); + expect(GoogleProvider).toHaveBeenCalledTimes(1); + + delete process.env.PROVIDER; + }); + + it('should call trace when tracing is enabled', async () => { + const trace = jest.fn(); + // tslint:disable-next-line: max-classes-per-file + class AWSProvider { + public transformRequest = jest.fn(() => ({})); + public transformResponse = jest.fn(); + public trace = trace; + } + jest.mock('./providers/aws/provider', () => ({ AWSProvider })); + + // Without tracing + jest.resetModules(); + const handle = (await import('./handler')).handler({ traceName: 'test' }, async () => Result.Ok(OK)); + await handle(); + expect(trace).not.toHaveBeenCalled(); + + // With tracing + jest.resetModules(); + process.env.TRACING_ENABLED = 'true'; + const tracedHandle = (await import('./handler')).handler({ traceName: 'test' }, async () => Result.Ok(OK)); + await tracedHandle(); + expect(trace).toHaveBeenCalledTimes(1); + + delete process.env.TRACING_ENABLED; + }); }); diff --git a/lib/handler.ts b/lib/handler.ts index bd401a5..0a1771b 100644 --- a/lib/handler.ts +++ b/lib/handler.ts @@ -1,11 +1,20 @@ import { defaultLogger } from './console-logger'; -import { HandlerOptions, ProxyEvent, ResultResponse, Dictionary, IErrorDetail } from './models'; -import { APIGatewayProxyHandler, APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import { + HandlerOptions, + Dictionary, + IOk, + GenericHandlerOptions, + Handler, + GenericProviderHandler, + IProviderRequest +} from './models'; +import { PROVIDER, TRACING_ENABLED } from './constants'; import { convertAndValidate } from './convert-and-validate'; import { INTERNAL_SERVER_ERROR } from 'http-status-codes'; -import { convertToJson } from './convert-to-json'; import { defaultErrorTransformer } from './default-error-transformer'; import { HttpError } from './http-error'; +import { Provider } from './providers'; +import winston from 'winston'; const ERROR_MESSAGES = { INVALID_BODY: 'Invalid body', @@ -22,83 +31,127 @@ export function handler< T4 = Dictionary | null, TResponse = unknown>( options: HandlerOptions, - eventHandler: (event: ProxyEvent) => ResultResponse): APIGatewayProxyHandler { + eventHandler: Handler): GenericProviderHandler { + // TODO: add support for tracing the transformation and validation as separate segments. + // TODO: add support for generating Swagger documentation based on the validation. const errorTransformer = options.errorTransformer || defaultErrorTransformer; const logger = options.logger || defaultLogger; + const provider = selectProvider(options, logger); - return async (proxyEvent: APIGatewayProxyEvent): Promise => { - + return async (...providerParams: any[]): Promise => { try { + // Transform and validate the request. + const request = provider.transformRequest(...providerParams); + const validatedRequest = await validateRequest(options, request); + const event = { + ...validatedRequest, + body: validatedRequest.body as T1, + queryParameters: validatedRequest.queryParameters as T2, + pathParameters: validatedRequest.pathParameters as T3, + headers: validatedRequest.headers as T4, + }; + + // Execute the handler with optional tracing. + let response: HttpError | IOk; + if (TRACING_ENABLED && options.traceName) { + response = await provider.trace(eventHandler, event); + } else { + response = await eventHandler(event); + } - const pathParameters = options.pathParameters ? - await convertAndValidate( - proxyEvent.pathParameters || {}, - options.pathParameters, - ERROR_MESSAGES.INVALID_PATH_PARAMETERS - ) : proxyEvent.pathParameters; - - const queryParameters = options.queryParameters ? - await convertAndValidate( - proxyEvent.queryStringParameters || {}, - options.queryParameters, - ERROR_MESSAGES.INVALID_QUERY_PARAMETERS - ) : proxyEvent.queryStringParameters; - - const headers = options.headers ? - await convertAndValidate( - proxyEvent.headers, - options.headers, - ERROR_MESSAGES.INVALID_HEADERS - ) : proxyEvent.headers; - - const body = options.body ? - await convertAndValidate( - convertToJson(proxyEvent.body, logger), - options.body, - ERROR_MESSAGES.INVALID_BODY - ) : proxyEvent.body; - - const result = await eventHandler({ - body: body as T1, - queryParameters: queryParameters as T2, - pathParameters: pathParameters as T3, - headers: headers as T4, - httpMethod: proxyEvent.httpMethod, - path: proxyEvent.path, - context: proxyEvent.requestContext - }); - - if (result.success) { - - const validatedBody = options.response ? - await convertAndValidate( - result.body, - options.response, - ERROR_MESSAGES.INVALID_RESPONSE - ) : result.body; - - return { - statusCode: result.statusCode, - body: validatedBody ? JSON.stringify(validatedBody) : '', - headers: result.headers - }; + if (response.success) { + // Validate and send the success response. + const validatedResponse = await validateResponse(options, response); + return provider.transformResponse(validatedResponse, ...providerParams); } - return errorTransformer(result, options); + // Send the error response. + return provider.transformResponse(errorTransformer(response, options), ...providerParams); } catch (error) { - if (error instanceof HttpError) { - return errorTransformer(error, options); + return provider.transformResponse(errorTransformer(error, options), ...providerParams); } // Log unexpected errors logger.error(error); - return errorTransformer(new HttpError( + return provider.transformResponse(errorTransformer(new HttpError( INTERNAL_SERVER_ERROR, error.message - ), options); + ), options), ...providerParams); } }; } + +/** + * Select the provider to use based on the PROVIDER environment variable. + * Will select AWS by default if none is provided. + * @param {GenericHandlerOptions} options - The options to use for the provider instance. + * @param {winston.Logger} logger - The logger to use for the provider instance. + */ +function selectProvider(options: GenericHandlerOptions, logger: winston.Logger): Provider { + switch (PROVIDER) { + default: + case 'aws': + return new (require('./providers/aws')).AWSProvider(options, logger); + case 'azure': + return new (require('./providers/azure')).AzureProvider(options, logger); + case 'google': + return new (require('./providers/google')).GoogleProvider(options, logger); + } +} + +/** + * Validate and convert an incoming request based on the provided handler options. + * @param {GenericHandlerOptions} options - The options to use for validating. + * @param {IProviderRequest} request - The data to validate. + * @returns {IProviderRequest} - The validated and converted data. + */ +async function validateRequest(options: GenericHandlerOptions, request: IProviderRequest): Promise { + return { + ...request, + pathParameters: options.pathParameters ? + await convertAndValidate( + request.pathParameters || {}, + options.pathParameters, + ERROR_MESSAGES.INVALID_PATH_PARAMETERS + ) : request.pathParameters, + queryParameters: options.queryParameters ? + await convertAndValidate( + request.queryParameters || {}, + options.queryParameters, + ERROR_MESSAGES.INVALID_QUERY_PARAMETERS + ) : request.queryParameters, + headers: options.headers ? + await convertAndValidate( + request.headers, + options.headers, + ERROR_MESSAGES.INVALID_HEADERS + ) : request.headers, + body: options.body ? + await convertAndValidate( + request.body, + options.body, + ERROR_MESSAGES.INVALID_BODY + ) : request.body, + }; +} + +/** + * Validate and convert a response based on the provided handler options. + * @param {GenericHandlerOptions} options - The options to use for validating. + * @param {IOk} response - The data to validate. + * @returns {IOk} - The validated and converted data. + */ +async function validateResponse(options: GenericHandlerOptions, response: IOk): Promise> { + return { + ...response, + body: options.response ? + await convertAndValidate( + response.body, + options.response, + ERROR_MESSAGES.INVALID_RESPONSE + ) : response.body, + }; +} diff --git a/lib/http-error.ts b/lib/http-error.ts index c6216fb..2df08e7 100644 --- a/lib/http-error.ts +++ b/lib/http-error.ts @@ -13,4 +13,4 @@ export class HttpError extends Error implements IHttpError { this.success = false; this.details = details; } -} \ No newline at end of file +} diff --git a/lib/models.ts b/lib/models.ts index 1b75587..6ea8020 100644 --- a/lib/models.ts +++ b/lib/models.ts @@ -1,6 +1,5 @@ import { ValidatorOptions } from 'class-validator'; import { ClassType } from 'class-transformer/ClassTransformer'; -import { APIGatewayProxyResult, APIGatewayEventRequestContext } from 'aws-lambda'; import winston from 'winston'; import { HttpError } from './http-error'; @@ -26,7 +25,7 @@ export interface HandlerOptions APIGatewayProxyResult; + errorTransformer?: (error: HttpError) => IProviderResponse; /** * Optional logger. If none is set a default console logger will be used @@ -37,8 +36,14 @@ export interface HandlerOptions {} + export interface Dictionary { [name: string]: string; } export interface ProxyEvent { @@ -48,9 +53,12 @@ export interface ProxyEvent { pathParameters: TPathParameters; httpMethod: string; path: string; - context: APIGatewayEventRequestContext; + // context: APIGatewayEventRequestContext; + context: any; } +export interface GenericProxyEvent extends ProxyEvent {} + export interface IOk { success: true; statusCode: number; @@ -71,4 +79,35 @@ export interface IHttpError { details: IErrorDetail[]; } +export interface IError { + status: number; + name: string; + message: string; + details: IErrorDetail[]; +} + export type ResultResponse = Promise | HttpError>; + +export interface IProviderRequest { + body: { [key: string]: any } | null; + headers: { [header: string]: any } | null; + queryParameters: { [param: string]: any } | null; + pathParameters: { [param: string]: any } | null; + // httpMethod: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH'; + httpMethod: string; + path: string; + context: any; +} + +export interface IProviderResponse { + success: boolean; + statusCode: number; + body?: T; + headers?: { [header: string]: boolean | number | string }; +} + +export type GenericProviderHandler = (...providerParams: any[]) => Promise; + +export type Handler = (event: ProxyEvent) => ResultResponse; + +export type GenericHandler = Handler; diff --git a/lib/providers/aws/index.ts b/lib/providers/aws/index.ts new file mode 100644 index 0000000..3ef69f4 --- /dev/null +++ b/lib/providers/aws/index.ts @@ -0,0 +1,4 @@ +// tslint:disable-next-line: no-console +console.warn('Loading AWS provider'); + +export * from './provider'; diff --git a/lib/providers/aws/provider.ts b/lib/providers/aws/provider.ts new file mode 100644 index 0000000..bb0e06a --- /dev/null +++ b/lib/providers/aws/provider.ts @@ -0,0 +1,80 @@ +import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; +import * as awsTracing from 'aws-xray-sdk'; +import { convertToJson } from '../../convert-to-json'; +import { GenericHandler, GenericProxyEvent, IProviderRequest, IProviderResponse, ResultResponse } from '../../models'; +import { Provider } from '../provider'; + +// export interface IAWSEvent { +// body: string | null; +// headers: { [header: string]: string }; +// multiValueHeaders: { [header: string]: string[] }; +// httpMethod: string; +// isBase64Encoded: boolean; +// path: string; +// pathParameters: { [param: string]: string } | null; +// queryStringParameters: { [param: string]: string } | null; +// multiValueQueryStringParameters: { [param: string]: string[] } | null; +// stageVariables: { [name: string]: string } | null; +// resource: string; +// requestContext: any; +// } + +// interface IAWSResponse { +// statusCode: number; +// headers?: { [header: string]: boolean | number | string }; +// multiValueHeaders?: { [header: string]: Array }; +// body: string; +// isBase64Encoded?: boolean; +// } + +export class AWSProvider extends Provider { + /** + * Transform an event from AWS to an IProviderRequest. + * @param {APIGatewayProxyEvent} event - The AWS event. + * @returns {IProviderRequest} - The transformed data. + */ + public transformRequest(event: APIGatewayProxyEvent): IProviderRequest { + return { + body: event.body !== null ? convertToJson(event.body, this.logger) : null, + headers: event.headers, + queryParameters: event.queryStringParameters, + pathParameters: event.pathParameters, + httpMethod: event.httpMethod.toUpperCase(), + path: event.path, + context: event.requestContext, + }; + } + + /** + * Transform the response to a result AWS can understand. + * @param {IProviderResponse} response - The response to transform. + * @returns {APIGatewayProxyResult} - The AWS result. + */ + public transformResponse(response: IProviderResponse): APIGatewayProxyResult { + return { + statusCode: response.statusCode, + body: response.body ? JSON.stringify(response.body) : '', + headers: response.headers + }; + } + + /** + * Trace the execution of the provided handler using XRay. + * @param {GenericHandler} handler - The handler to trace. + * @param {GenericProxyEvent} event - The event to pass to the handler. + * @returns {ResultResponse} - The response of the handler. + */ + public async trace(handler: GenericHandler, event: GenericProxyEvent): ResultResponse { + return awsTracing.captureAsyncFunc(this.options.traceName!, async (segment) => { + try { + const response = await handler(event); + segment?.close(); + return response; + } catch (err) { + this.logger.error('Error before segment close', err); + segment?.close(err); + throw err; + } + }); + } +} diff --git a/lib/providers/azure/index.ts b/lib/providers/azure/index.ts new file mode 100644 index 0000000..2d3ecb7 --- /dev/null +++ b/lib/providers/azure/index.ts @@ -0,0 +1,4 @@ +// tslint:disable-next-line: no-console +console.warn('Loading Azure provider'); + +export * from './provider'; diff --git a/lib/providers/azure/provider.ts b/lib/providers/azure/provider.ts new file mode 100644 index 0000000..92eb8c4 --- /dev/null +++ b/lib/providers/azure/provider.ts @@ -0,0 +1,85 @@ +import { URL } from 'url'; +import { Context, HttpRequest } from '@azure/functions'; +import * as azureTracing from 'applicationinsights'; +import { TRACING_ENABLED } from '../../constants'; +import { GenericHandler, GenericProxyEvent, IProviderRequest, IProviderResponse, ResultResponse } from '../../models'; +import { Provider } from '../provider'; + +// Initialize the Application Insights agent. +// Maybe move this to the user to execute? +// As it might have problems tracing stuff when loaded at the time the provider is loaded. +if (TRACING_ENABLED) { + azureTracing.setup().start(); +} + +export class AzureProvider extends Provider { + /** + * Transform a request from Azure to an IProviderRequest. + * @param {Context} ctx - The Azure context. + * @param {HttpRequest} req - The Azure request. + * @returns {IProviderRequest} - The transformed data. + */ + public transformRequest(ctx: Context, req: HttpRequest): IProviderRequest { + return { + body: req.body || null, + headers: req.headers, + queryParameters: req.query, + pathParameters: req.params, + httpMethod: req.method?.toUpperCase() || 'UNKNOWN', + path: new URL(req.url).pathname, + context: ctx, + }; + } + + /** + * Transform the response to a result Azure can understand. + * @param {IProviderResponse} response - The response to transform. + */ + public transformResponse(response: IProviderResponse, ctx: Context): void { + // Set content type as JSON by default. + response.headers = response.headers || {}; + response.headers['Content-Type'] = response.headers['Content-Type'] || 'application/json'; + + ctx.res = { + status: response.statusCode, + headers: response.headers, + body: response.body, + }; + } + + /** + * Trace the execution of the provided handler using Azure tracing. + * @param {GenericHandler} handler - The handler to trace. + * @param {GenericProxyEvent} event - The event to pass to the handler. + * @returns {ResultResponse} - The response of the handler. + */ + public async trace(handler: GenericHandler, event: GenericProxyEvent): ResultResponse { + const correlationContext = azureTracing.startOperation(event.context, event.context.req); + + return new Promise(async (resolve, reject) => { + azureTracing.wrapWithCorrelationContext(async () => { + // Save the start time as we have to trace the duration ourselves. + const startTime = Date.now(); + + try { + const response = await handler(event); + resolve(response); + } catch (err) { + azureTracing.defaultClient.trackException({ exception: err }); + reject(err); + } + + // We use a page view here because using a request creates a new trace. + // With short response times the duration is not always displayed correctly in Application Insights. + azureTracing.defaultClient.trackPageView({ + name: this.options.traceName, + duration: Date.now() - startTime, + time: new Date(startTime) + }); + // Immediately write the trace, this is likely to create a delay in function response time. + // TODO: Maybe we can skip flushing as the event loop keeps running in the background? + azureTracing.defaultClient.flush(); + }, correlationContext!)(); + }); + } +} diff --git a/lib/providers/google/index.ts b/lib/providers/google/index.ts new file mode 100644 index 0000000..c002584 --- /dev/null +++ b/lib/providers/google/index.ts @@ -0,0 +1,4 @@ +// tslint:disable-next-line: no-console +console.warn('Loading Google provider'); + +export * from './provider'; diff --git a/lib/providers/google/provider.ts b/lib/providers/google/provider.ts new file mode 100644 index 0000000..7bdd5ec --- /dev/null +++ b/lib/providers/google/provider.ts @@ -0,0 +1,107 @@ +import * as googleTracing from '@google-cloud/trace-agent'; +import { METHOD_NOT_ALLOWED } from 'http-status-codes'; +import { TRACING_ENABLED } from '../../constants'; +import { HttpError } from '../../http-error'; +import { Dictionary, GenericHandler, GenericProxyEvent, IProviderRequest, IProviderResponse, ResultResponse } from '../../models'; +import { Provider } from '../provider'; + +interface IGoogleRequest { + method: string; + headers: { [header: string]: boolean | number | string }; + query: Dictionary; + params: Dictionary; + body: { [name: string]: any }; + url: string; +} + +interface IGoogleResponse { + status(status: number): void; + set(headers: { [header: string]: boolean | number | string }): void; + send(body: { [name: string]: any }): void; +} + +// Initialize the StackDriver trace agent. +// Maybe move this to the user to execute? +// As it might have problems tracing stuff when loaded at the time the provider is loaded. +if (TRACING_ENABLED) { + googleTracing.start(); +} + +export class GoogleProvider extends Provider { + /** + * Transform a request from Google to an IProviderRequest. + * @param {IGoogleRequest} req - The Google request. + * @returns {IProviderRequest} - The transformed data. + */ + public transformRequest(req: IGoogleRequest): IProviderRequest { + // If a HTTP method is defined, limit execution to that method. + if (this.options.httpMethod && this.options.httpMethod !== req.method.toUpperCase()) { + throw new HttpError(METHOD_NOT_ALLOWED); + } + + return { + body: req.body, + headers: req.headers, + queryParameters: req.query, + pathParameters: this.parsePathParameters(req.params), + httpMethod: req.method.toUpperCase(), + path: req.url, + context: null, + }; + } + + /** + * Transform the response to a response Google can understand. + * @param {IProviderResponse} response - The response to transform. + */ + public transformResponse(response: IProviderResponse, req: IGoogleRequest, res: IGoogleResponse): void { + res.status(response.statusCode); + res.set(response.headers || {}); + res.send(response.body || {}); + } + + /** + * Trace the execution of the provided handler using StackDriver tracing. + * @param {GenericHandler} handler - The handler to trace. + * @param {GenericProxyEvent} event - The event to pass to the handler. + * @returns {ResultResponse} - The response of the handler. + */ + public async trace(handler: GenericHandler, event: GenericProxyEvent): ResultResponse { + return new Promise((resolve, reject) => { + // This will create a separate trace. + // The root span that is created from Cloud Functions doesn't seem to be accessible. + googleTracing.get().runInRootSpan({ name: this.options.traceName! }, async (span) => { + try { + const response = await handler(event); + span.endSpan(); + resolve(response); + } catch (err) { + this.logger.error('Error before span end', err); + span.endSpan(); + reject(err); + } + }); + }); + } + + /** + * The path parameters provided by Google are not mapped to a key. + * Parse them by taking each parameter and assigning them to the key defined in the pathParameterMap. + * @param {Dictionary} params - The parameters to parse. + * @returns {Dictionary} - The parsed parameters. + */ + private parsePathParameters(params: Dictionary): Dictionary { + const parts = params['0'].split('/'); + const parameters: Dictionary = {}; + + for (let i = 0; i < parts.length; i++) { + if (this.options.pathParameterMap && this.options.pathParameterMap[i]) { + parameters[this.options.pathParameterMap[i]] = parts[i]; + } else { + parameters[i + ''] = parts[i]; + } + } + + return parameters; + } +} diff --git a/lib/providers/index.ts b/lib/providers/index.ts new file mode 100644 index 0000000..03be03e --- /dev/null +++ b/lib/providers/index.ts @@ -0,0 +1 @@ +export * from './provider'; diff --git a/lib/providers/provider.ts b/lib/providers/provider.ts new file mode 100644 index 0000000..f385372 --- /dev/null +++ b/lib/providers/provider.ts @@ -0,0 +1,23 @@ +import winston from 'winston'; +import { + GenericHandler, + GenericHandlerOptions, + GenericProxyEvent, + IProviderRequest, + IProviderResponse, + ResultResponse +} from '../models'; + +export abstract class Provider { + protected options: GenericHandlerOptions; + protected logger: winston.Logger; + + constructor(options: GenericHandlerOptions, logger: winston.Logger) { + this.options = options; + this.logger = logger; + } + + public abstract transformRequest(...providerParams: any): IProviderRequest; + public abstract transformResponse(response: IProviderResponse, ...providerParams: any): any; + public abstract async trace(handler: GenericHandler, event: GenericProxyEvent): ResultResponse; +} diff --git a/package.json b/package.json index 4ab944b..3aa8e88 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "author": "Ruben v. Rooij", "license": "MIT", "devDependencies": { + "@azure/functions": "^1.2.2", "@semantic-release/changelog": "^3.0.6", "@semantic-release/git": "^7.0.18", "@team-griffin/install-self-peers": "^1.1.1", @@ -48,6 +49,9 @@ "winston": "^3.2.1" }, "peerDependencies": { + "@google-cloud/trace-agent": "^5.1.1", + "applicationinsights": "^1.8.7", + "aws-xray-sdk": "^3.2.0", "class-transformer": "^0.2.3", "class-validator": "^0.9.1" } diff --git a/yarn.lock b/yarn.lock index ef9af00..0c70da6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@azure/functions@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@azure/functions/-/functions-1.2.2.tgz#8fcb6aa3a879d3be0dc3d68919f969b054bbe3f3" + integrity sha512-p/dDHq1sG/iAib+eDY4NxskWHoHW1WFzD85s0SfWxc2wVjJbxB0xz/zBF4s7ymjVgTu+0ceipeBk+tmpnt98oA== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -145,6 +150,53 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@google-cloud/common@^3.0.0": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-3.4.1.tgz#a1920d73c38437923b4b134e245c392d36c442e9" + integrity sha512-e5z0CwsM0RXky+PnyPtQ3QK46ksqm+kE7kX8pm8X+ddBwZJipHchKeazMM5fLlGCS+AALalzXb+uYmH72TRnpQ== + dependencies: + "@google-cloud/projectify" "^2.0.0" + "@google-cloud/promisify" "^2.0.0" + arrify "^2.0.1" + duplexify "^4.1.1" + ent "^2.2.0" + extend "^3.0.2" + google-auth-library "^6.1.1" + retry-request "^4.1.1" + teeny-request "^7.0.0" + +"@google-cloud/projectify@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-2.0.1.tgz#13350ee609346435c795bbfe133a08dfeab78d65" + integrity sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ== + +"@google-cloud/promisify@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-2.0.3.tgz#f934b5cdc939e3c7039ff62b9caaf59a9d89e3a8" + integrity sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw== + +"@google-cloud/trace-agent@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@google-cloud/trace-agent/-/trace-agent-5.1.1.tgz#a8223477625ccb48fb54b7835a8647a586ac33a4" + integrity sha512-YTcK0RLN90pLCprg0XC8uV4oAVd79vsXhkcxmEVwiOOYjUDvSrAhb7y/0SY606zgfhJHmUTNb/fZSWEtZP/slQ== + dependencies: + "@google-cloud/common" "^3.0.0" + "@opencensus/propagation-stackdriver" "0.0.22" + builtin-modules "^3.0.0" + console-log-level "^1.4.0" + continuation-local-storage "^3.2.1" + extend "^3.0.2" + gcp-metadata "^4.0.0" + google-auth-library "^6.0.0" + hex2dec "^1.0.1" + is "^3.2.0" + methods "^1.1.1" + require-in-the-middle "^5.0.0" + semver "^7.0.0" + shimmer "^1.2.0" + source-map-support "^0.5.16" + uuid "^8.0.0" + "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" @@ -371,6 +423,26 @@ dependencies: "@types/node" ">= 8" +"@opencensus/core@^0.0.22": + version "0.0.22" + resolved "https://registry.yarnpkg.com/@opencensus/core/-/core-0.0.22.tgz#dad55faf24825e7ed5e9f3d7a7795aafe15eb021" + integrity sha512-ErazJtivjceNoOZI1bG9giQ6cWS45J4i6iPUtlp7dLNu58OLs/v+CD0FsaPCh47XgPxAI12vbBE8Ec09ViwHNA== + dependencies: + continuation-local-storage "^3.2.1" + log-driver "^1.2.7" + semver "^7.0.0" + shimmer "^1.2.0" + uuid "^8.0.0" + +"@opencensus/propagation-stackdriver@0.0.22": + version "0.0.22" + resolved "https://registry.yarnpkg.com/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.0.22.tgz#94f3098deac85b45f1cf827517937c465294c53e" + integrity sha512-eBvf/ihb1mN8Yz/ASkz8nHzuMKqygu77+VNnUeR0yEh3Nj+ykB8VVR6lK+NAFXo1Rd1cOsTmgvuXAZgDAGleQQ== + dependencies: + "@opencensus/core" "^0.0.22" + hex2dec "^1.0.1" + uuid "^8.0.0" + "@semantic-release/changelog@^3.0.6": version "3.0.6" resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-3.0.6.tgz#9d68d68bf732cbba1034c028bb6720091f783b2a" @@ -522,16 +594,57 @@ dependencies: "@babel/types" "^7.3.0" +"@types/body-parser@*": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/cls-hooked@*": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/cls-hooked/-/cls-hooked-4.3.1.tgz#0fdfd38f827aa77d15120871e9ca5c593840b2e1" + integrity sha512-nMjNjQAk9vAYnDEXRUxGSACarjPDRKVaZ8xrwKzRy1BmzG5tN3JUkuvdVwE8P2GBkSRokxVw+QUpuvFzvOsKpA== + dependencies: + "@types/node" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/express-serve-static-core@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" + integrity sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.8" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a" + integrity sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/glob@*", "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -568,11 +681,23 @@ dependencies: jest-diff "^24.3.0" +"@types/mime@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/mysql@*": + version "2.15.15" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.15.tgz#af2223d2841091a5a819eabee6dff19567f1cf1f" + integrity sha512-1GJnq7RwuFPRicMHdT53vza5v39nep9OKIbozxNUpFXP04CydcdWrqpZQ+MlVdlLFCisWnnt09xughajjWpFsw== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@>= 8": version "12.12.14" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" @@ -588,11 +713,34 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pg-types@*": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@types/pg-types/-/pg-types-1.11.5.tgz#1eebbe62b6772fcc75c18957a90f933d155e005b" + integrity sha512-L8ogeT6vDzT1vxlW3KITTCt+BVXXVkLXfZ/XNm6UqbcJgxf+KPO7yjWx7dQQE8RW07KopL10x2gNMs41+IkMGQ== + +"@types/pg@*": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.14.5.tgz#07638c7aa69061abe4be31267028cc5c3fc35f98" + integrity sha512-wqTKZmqkqXd1YiVRBT2poRrMIojwEi2bKTAAjUX6nEbzr98jc3cfR/7o7ZtubhH5xT7YJ6LRdRr1GZOgs8OUjg== + dependencies: + "@types/node" "*" + "@types/pg-types" "*" + "@types/prettier@^1.19.0": version "1.19.0" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.0.tgz#a2502fb7ce9b6626fdbfc2e2a496f472de1bdd05" integrity sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A== +"@types/qs@*": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + "@types/reflect-metadata@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@types/reflect-metadata/-/reflect-metadata-0.1.0.tgz#592805bdf6d63dd7229773218afeba37ac2eab16" @@ -613,6 +761,14 @@ "@types/glob" "*" "@types/node" "*" +"@types/serve-static@*": + version "1.13.6" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.6.tgz#866b1b8dec41c36e28c7be40ac725b88be43c5c1" + integrity sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA== + dependencies: + "@types/mime" "*" + "@types/node" "*" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -648,6 +804,13 @@ abbrev@1, abbrev@~1.1.1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-globals@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" @@ -787,6 +950,16 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +applicationinsights@^1.8.7: + version "1.8.7" + resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.8.7.tgz#f98774b2da03fdb95afb9d9042ae9d6f10025db6" + integrity sha512-+HENzPBdSjnWL9mc+9o+j9pEaVNI4WsH5RNvfmRLfwQYvbJumcBi4S5bUzclug5KCcFP0S4bYJOmm9MV3kv2GA== + dependencies: + cls-hooked "^4.2.2" + continuation-local-storage "^3.2.1" + diagnostic-channel "0.3.1" + diagnostic-channel-publishers "0.4.1" + aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -872,6 +1045,11 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +arrify@^2.0.0, arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -899,11 +1077,26 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-hook-jl@^1.7.6: + version "1.7.6" + resolved "https://registry.yarnpkg.com/async-hook-jl/-/async-hook-jl-1.7.6.tgz#4fd25c2f864dbaf279c610d73bf97b1b28595e68" + integrity sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg== + dependencies: + stack-chain "^1.3.7" + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-listener@^0.6.0: + version "0.6.10" + resolved "https://registry.yarnpkg.com/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc" + integrity sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw== + dependencies: + semver "^5.3.0" + shimmer "^1.1.0" + async@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -926,6 +1119,11 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atomic-batcher@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/atomic-batcher/-/atomic-batcher-1.0.2.tgz#d16901d10ccec59516c197b9ccd8930689b813b4" + integrity sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q= + aws-lambda@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/aws-lambda/-/aws-lambda-1.0.5.tgz#9f40ca36da2aca8345230d6252c6e0da5a772dcf" @@ -956,6 +1154,49 @@ aws-sign2@~0.7.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= +aws-xray-sdk-core@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/aws-xray-sdk-core/-/aws-xray-sdk-core-3.2.0.tgz#45421ec5f11824e4fcac9cdc868eb2421af9df45" + integrity sha512-6mhqmRsQbDAISyKQuYguO38AhHgGSZsmYLVUYWUV9eJ+GiHZf08apwM7fSdiRw56qCulgSTV5JG2/cnPmtBhUA== + dependencies: + "@types/cls-hooked" "*" + atomic-batcher "^1.0.2" + cls-hooked "^4.2.2" + pkginfo "^0.4.0" + semver "^5.3.0" + +aws-xray-sdk-express@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/aws-xray-sdk-express/-/aws-xray-sdk-express-3.2.0.tgz#cad3681cc51ac66001b38861c2dfb1dd0a129491" + integrity sha512-r0XX/2JmIYES1vUYee6MgmXpAc2Ru86S8J8u5kwOvTGT1hKqJcdPF8GSKocPKqCw1KSRvDOWqwkwJu8/mDl9Ew== + dependencies: + "@types/express" "*" + +aws-xray-sdk-mysql@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/aws-xray-sdk-mysql/-/aws-xray-sdk-mysql-3.2.0.tgz#3ca8a1401d7ed8abcafe2befa1e881547b012435" + integrity sha512-MlX5ngtQseoSCU04gJGqOh3hFDv8+J6qrgeuaTJqIrSy7X8Rsz4bXZessjLfyuuAWGXsDrwquj5lpBU8jvoHuw== + dependencies: + "@types/mysql" "*" + +aws-xray-sdk-postgres@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/aws-xray-sdk-postgres/-/aws-xray-sdk-postgres-3.2.0.tgz#b6804d674d24de41c51a71c76777c674e8d5a70a" + integrity sha512-Xg3X7Wi6TLEjfLXsPwep9sbTbCn1iqYAV6G4+5jQT4VOE+nn6xa7NntewtxWdvfn77awk4Rb8tQ11ftJOMfTrA== + dependencies: + "@types/pg" "*" + +aws-xray-sdk@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/aws-xray-sdk/-/aws-xray-sdk-3.2.0.tgz#0c8638ae30d80e460e9f6c9b3d160bf9c8b5e3a1" + integrity sha512-ARPagVVljHbad8lVsUVRCQrbPERIjb/itEZBgDyyGufHU/kLZ4XvhG0Vocixyrweo7PMCukGyPvSmKyBqbSxiQ== + dependencies: + aws-xray-sdk-core "3.2.0" + aws-xray-sdk-express "3.2.0" + aws-xray-sdk-mysql "3.2.0" + aws-xray-sdk-postgres "3.2.0" + pkginfo "^0.4.0" + aws4@^1.8.0: version "1.9.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" @@ -1004,7 +1245,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== @@ -1034,6 +1275,11 @@ before-after-hook@^2.0.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== +bignumber.js@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" + integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== + bin-links@^1.1.2, bin-links@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.6.tgz#30d33e810829305e5e61b90cfcb9a3a4f65eb516" @@ -1131,6 +1377,11 @@ btoa-lite@^1.0.0: resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1150,6 +1401,11 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +builtin-modules@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -1387,6 +1643,15 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +cls-hooked@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/cls-hooked/-/cls-hooked-4.2.2.tgz#ad2e9a4092680cdaffeb2d3551da0e225eae1908" + integrity sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw== + dependencies: + async-hook-jl "^1.7.6" + emitter-listener "^1.0.1" + semver "^5.4.1" + cmd-shim@^3.0.0, cmd-shim@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-3.0.3.tgz#2c35238d3df37d98ecdd7d5f6b8dc6b21cadc7cb" @@ -1565,6 +1830,19 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +console-log-level@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/console-log-level/-/console-log-level-1.4.1.tgz#9c5a6bb9ef1ef65b05aba83028b0ff894cdf630a" + integrity sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ== + +continuation-local-storage@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb" + integrity sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA== + dependencies: + async-listener "^0.6.0" + emitter-listener "^1.1.1" + conventional-changelog-angular@^5.0.0: version "5.0.6" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" @@ -1871,6 +2149,18 @@ dezalgo@^1.0.0, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" +diagnostic-channel-publishers@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.4.1.tgz#a1147ee0d5a4a06cd2b0795433bc1aee1dbc9801" + integrity sha512-NpZ7IOVUfea/kAx4+ub4NIYZyRCSymjXM5BZxnThs3ul9gAKqjm7J8QDDQW3Ecuo2XxjNLoWLeKmrPUWKNZaYw== + +diagnostic-channel@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.3.1.tgz#7faa143e107f861be3046539eb4908faab3f53fd" + integrity sha512-6eb9YRrimz8oTr5+JDzGmSYnXy5V7YnK5y/hd8AUDK1MssHjQKm9LlD6NSrHx4vMDF3+e/spI2hmWTviElgWZA== + dependencies: + semver "^5.3.0" + diagnostics@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" @@ -1953,6 +2243,16 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +duplexify@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" + integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -1961,11 +2261,25 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + editor@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= +emitter-listener@^1.0.1, emitter-listener@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8" + integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ== + dependencies: + shimmer "^1.2.0" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1990,13 +2304,18 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +ent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + env-ci@^4.0.0: version "4.5.1" resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-4.5.1.tgz#2ef014dcb974728b46d1244e491e9e6ccc1923ef" @@ -2114,6 +2433,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + events@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -2211,7 +2535,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -2271,6 +2595,11 @@ fast-safe-stringify@^2.0.4: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== +fast-text-encoding@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" + integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== + fastq@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" @@ -2477,6 +2806,25 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gaxios@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-4.0.1.tgz#bc7b205a89d883452822cc75e138620c35e3291e" + integrity sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ== + dependencies: + abort-controller "^3.0.0" + extend "^3.0.2" + https-proxy-agent "^5.0.0" + is-stream "^2.0.0" + node-fetch "^2.3.0" + +gcp-metadata@^4.0.0, gcp-metadata@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.2.1.tgz#31849fbcf9025ef34c2297c32a89a1e7e9f2cd62" + integrity sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw== + dependencies: + gaxios "^4.0.0" + json-bigint "^1.0.0" + genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" @@ -2602,11 +2950,33 @@ globby@^10.0.0: merge2 "^1.2.3" slash "^3.0.0" +google-auth-library@^6.0.0, google-auth-library@^6.1.1: + version "6.1.3" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-6.1.3.tgz#39d868140b70d0c4b32c6f6d8f4ccc1400d84dca" + integrity sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g== + dependencies: + arrify "^2.0.0" + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + fast-text-encoding "^1.0.0" + gaxios "^4.0.0" + gcp-metadata "^4.2.0" + gtoken "^5.0.4" + jws "^4.0.0" + lru-cache "^6.0.0" + google-libphonenumber@^3.1.6: version "3.2.14" resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.14.tgz#f206fa466511427c83aa6b893dd8d949eb8e30ae" integrity sha512-4r7mQRbk7EUYV1gyfP1SInYuQsjuDtRXCGLSotxeYDJaj/aF1xFO5PV/GSQeIxXWhIw050DujROICvWpZ1XYRw== +google-p12-pem@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.0.3.tgz#673ac3a75d3903a87f05878f3c75e06fc151669e" + integrity sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA== + dependencies: + node-forge "^0.10.0" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -2634,6 +3004,16 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gtoken@^5.0.4: + version "5.0.5" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.0.5.tgz#e752d18538576777dfe237887e30fc0627870eae" + integrity sha512-wvjkecutFh8kVfbcdBdUWqDRrXb+WrgD79DBDEYf1Om8S1FluhylhtFjrL7Tx69vNhh259qA3Q1P4sPtb+kUYw== + dependencies: + gaxios "^4.0.0" + google-p12-pem "^3.0.3" + jws "^4.0.0" + mime "^2.2.0" + handlebars@^4.1.2, handlebars@^4.4.0: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" @@ -2716,6 +3096,11 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +hex2dec@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/hex2dec/-/hex2dec-1.1.2.tgz#8e1ce4bef36a74f7d5723c3fb3090c2860077338" + integrity sha512-Yu+q/XWr2fFQ11tHxPq4p4EiNkb2y+lAacJNhAdRXVfRIcDH6gi7htWFnnlIzvqHMHoWeIsfXlNAjZInpAOJDA== + hook-std@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" @@ -2800,6 +3185,14 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -3011,6 +3404,13 @@ is-cidr@^3.0.0: dependencies: cidr-regex "^2.0.10" +is-core-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" + integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -3206,6 +3606,11 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" + integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3718,6 +4123,13 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -3767,6 +4179,23 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jwa@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" + integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -4125,6 +4554,11 @@ lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== + logform@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" @@ -4171,6 +4605,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" @@ -4305,6 +4746,11 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== +methods@^1.1.1: + 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" @@ -4344,6 +4790,11 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.42.0" +mime@^2.2.0: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + mime@^2.4.3: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" @@ -4435,6 +4886,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +module-details-from-path@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is= + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -4534,6 +4990,16 @@ node-fetch@^2.2.0, node-fetch@^2.3.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + node-gyp@^5.0.2, node-gyp@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.5.tgz#f6cf1da246eb8c42b097d7cd4d6c3ce23a4163af" @@ -5321,6 +5787,11 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkginfo@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -5780,6 +6251,15 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-in-the-middle@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.0.3.tgz#ef8bfd771760db573bc86d1341d8ae411a04c600" + integrity sha512-p/ICV8uMlqC4tjOYabLMxAWCIKa0YUQgZZ6KDM0xgXJNgdGQ1WmL2A07TwmrZw+wi6ITUFKzH5v3n+ENEyXVkA== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.12.0" + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -5836,11 +6316,26 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" +resolve@^1.12.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry-request@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.1.3.tgz#d5f74daf261372cff58d08b0a1979b4d7cab0fde" + integrity sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ== + dependencies: + debug "^4.1.1" + retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -5988,6 +6483,11 @@ semver@^6.0.0, semver@^6.2.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.0.0: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -6044,6 +6544,11 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shimmer@^1.1.0, shimmer@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -6160,6 +6665,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.16: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.6: version "0.5.16" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" @@ -6274,6 +6787,11 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stack-chain@^1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285" + integrity sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU= + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -6530,6 +7048,17 @@ teeny-request@6.0.1: stream-events "^1.0.5" uuid "^3.3.2" +teeny-request@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.0.1.tgz#bdd41fdffea5f8fbc0d29392cb47bec4f66b2b4c" + integrity sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw== + dependencies: + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" + stream-events "^1.0.5" + uuid "^8.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -6992,6 +7521,11 @@ uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +uuid@^8.0.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -7269,6 +7803,11 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2"