diff --git a/common/lib/common-utils/src/index.ts b/common/lib/common-utils/src/index.ts index 72c2be7153d6..e2be5ab2afef 100644 --- a/common/lib/common-utils/src/index.ts +++ b/common/lib/common-utils/src/index.ts @@ -7,12 +7,10 @@ export * from "./indexNode"; export * from "./base64Encoding"; export * from "./batchManager"; export * from "./disposal"; -export * from "./eventEmitterWithErrorHandling"; export * from "./eventForwarder"; -export * from "./events"; export * from "./hashFile"; export * from "./heap"; -export * from "./logger"; +export * from "./nullLoggers"; export * from "./promiseCache"; export * from "./promises"; export * from "./rangeTracker"; diff --git a/common/lib/common-utils/src/lazy.ts b/common/lib/common-utils/src/lazy.ts deleted file mode 100644 index 60a671f917ab..000000000000 --- a/common/lib/common-utils/src/lazy.ts +++ /dev/null @@ -1,35 +0,0 @@ -/*! - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -/** - * Helper class for lazy initialized values. Ensures the value is only generated once, and remain immutable - */ -export class Lazy { - private _value: T | undefined; - private _evaluated: boolean = false; - /** - * Instantiates an instance of Lazy - * @param valueGenerator - the function that will generate the value when value is accessed the first time - */ - constructor(private readonly valueGenerator: () => T) {} - - /** - * Return true if the value as been generated, otherwise false - */ - public get evaluated(): boolean { - return this._evaluated; - } - - /** - * Get the value. If this is the first call the value will be generated - */ - public get value(): T { - if (!this._evaluated) { - this._evaluated = true; - this._value = this.valueGenerator(); - } - return this._value!; - } -} diff --git a/common/lib/common-utils/src/logger.ts b/common/lib/common-utils/src/logger.ts index 88ab23042b94..c49982276a28 100644 --- a/common/lib/common-utils/src/logger.ts +++ b/common/lib/common-utils/src/logger.ts @@ -10,15 +10,7 @@ import { ITelemetryGenericEvent, ITelemetryLogger, ITelemetryPerformanceEvent, - ITelemetryProperties, - TelemetryEventPropertyType, } from "@fluidframework/common-definitions"; -import { debug as registerDebug, IDebugger } from "debug"; -import { performanceNow } from "./performanceNowNode"; - -export interface ITelemetryPropertyGetters { - [index: string]: () => TelemetryEventPropertyType; -} /** * Null logger @@ -35,217 +27,6 @@ export class BaseTelemetryNullLogger implements ITelemetryBaseLogger { } } -/** - * TelemetryLogger class contains various helper telemetry methods, - * encoding in one place schemas for various types of Fluid telemetry events. - * Creates sub-logger that appends properties to all events - */ -export abstract class TelemetryLogger implements ITelemetryLogger { - public static readonly eventNamespaceSeparator = ":"; - - public static formatTick(tick: number): number { - return Math.floor(tick); - } - - /** - * Attempts to parse number from string. - * If fails,returns original string. - * Used to make telemetry data typed (and support math operations, like comparison), - * in places where we do expect numbers (like contentsize/duration property in http header) - */ - public static numberFromString(str: string | null | undefined): string | number | undefined { - if (str === undefined || str === null) { - return undefined; - } - const num = Number(str); - return Number.isNaN(num) ? str : num; - } - - public static sanitizePkgName(name: string) { - return name.replace("@", "").replace("/", "-"); - } - - public static prepareErrorObject(event: ITelemetryBaseEvent, error: any, fetchStack: boolean) { - if (error === null || typeof error !== "object") { - event.error = error; - } else { - // WARNING: Exceptions can contain PII! - // For example, XHR will throw object derived from Error that contains config information - // for failed request, including all the headers, and thus - user tokens! - // Extract only call stack, message, and couple network-related properties form error object - - const errorAsObject = error as { - stack?: string; - message?: string; - }; - - event.stack = errorAsObject.stack; - event.error = errorAsObject.message; - - // Error message can container PII information. - // If we know for sure it does, we have to not log it. - if (error.containsPII) { - event.error = "Error message was removed as it contained PII"; - } else if (error.getCustomProperties) { - const customProps: object = error.getCustomProperties(); - for (const key of Object.keys(customProps)) { - if (event[key] === undefined) { - event[key] = customProps[key]; - } - } - } - } - - // Collect stack if we were not able to extract it from error - if (event.stack === undefined && fetchStack) { - event.stack = TelemetryLogger.getStack(); - } - } - - protected static getStack(): string | undefined { - // Some browsers will populate stack right away, others require throwing Error - let stack = new Error().stack; - if (!stack) { - try { - throw new Error(); - } catch (e) { - stack = e.stack; - } - } - return stack; - } - - protected constructor( - private readonly namespace?: string, - private readonly properties?: object, - private readonly propertyGetters?: ITelemetryPropertyGetters) { - } - - /** - * Send an event with the logger - * - * @param event - the event to send - */ - public abstract send(event: ITelemetryBaseEvent): void; - - /** - * Send a telemetry event with the logger - * - * @param event - the event to send - * @param error - optional error object to log - */ - public sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any) { - const newEvent: ITelemetryBaseEvent = { ...event, category: event.category ? event.category : "generic" }; - if (error !== undefined) { - TelemetryLogger.prepareErrorObject(newEvent, error, false); - } - this.send(newEvent); - } - - /** - * Send an error telemetry event with the logger - * - * @param event - the event to send - * @param error - optional error object to log - */ - public sendErrorEvent(event: ITelemetryErrorEvent, error?: any) { - const newEvent: ITelemetryBaseEvent = { ...event, category: "error" }; - TelemetryLogger.prepareErrorObject(newEvent, error, true); - this.send(newEvent); - } - - /** - * Send a performance telemetry event with the logger - * - * @param event - Event to send - * @param error - optional error object to log - */ - public sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void { - const perfEvent: ITelemetryBaseEvent = { - ...event, - category: event.category ? event.category : "performance", - }; - if (error !== undefined) { - TelemetryLogger.prepareErrorObject(perfEvent, error, false); - } - - if (event.duration) { - perfEvent.duration = TelemetryLogger.formatTick(event.duration); - } - - this.send(perfEvent); - } - - /** - * Log generic error with the logger - * - * @param eventName - the name of the event - * @param error - the error object to include in the event, require to be JSON-able - */ - public logGenericError(eventName: string, error: any) { - this.sendErrorEvent({ eventName }, error); - } - - /** - * Helper method to log exceptions - * @param event - the event to send - * @param exception - Exception object to add to an event - */ - public logException(event: ITelemetryErrorEvent, exception: any): void { - this.sendErrorEvent({ ...event, isException: true }, exception); - } - - /** - * Log an debug assert with the logger - * - * @param condition - the condition to assert on - * @param event - the event to log if the condition fails - */ - public debugAssert(condition: boolean, event?: ITelemetryErrorEvent): void { - this.shipAssert(condition, event); - } - - /** - * Log an ship assert with the logger - * - * @param condition - the condition to assert on - * @param event - the event to log if the condition fails - */ - public shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void { - if (!condition) { - const realEvent: ITelemetryErrorEvent = event === undefined ? { eventName: "Assert" } : event; - realEvent.isAssert = true; - realEvent.stack = TelemetryLogger.getStack(); - this.sendErrorEvent(realEvent); - } - } - - protected prepareEvent(event: ITelemetryBaseEvent): ITelemetryBaseEvent { - const newEvent: ITelemetryBaseEvent = { ...this.properties, ...event }; - if (this.namespace !== undefined) { - newEvent.eventName = `${this.namespace}${TelemetryLogger.eventNamespaceSeparator}${newEvent.eventName}`; - } - // Evaluate any getter functions - if (this.propertyGetters) { - for (const key of Object.keys(this.propertyGetters)) { - if (event[key] !== undefined) { - // Properties directly on the event take priority - continue; - } - const getter = this.propertyGetters[key]; - - // If this throws, hopefully it is handled elsewhere - const value = getter(); - if (value !== undefined) { - newEvent[key] = value; - } - } - } - - return newEvent; - } -} - /** * Null logger * It can be used in places where logger instance is required, but events should be not send over. @@ -268,294 +49,3 @@ export class TelemetryNullLogger implements ITelemetryLogger { public shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void { } } - -/** - * ChildLogger class contains various helper telemetry methods, - * encoding in one place schemas for various types of Fluid telemetry events. - * Creates sub-logger that appends properties to all events - */ -export class ChildLogger extends TelemetryLogger { - /** - * Create child logger - * @param baseLogger - Base logger to use to output events. If undefined, proper child logger - * is created, but it does not sends telemetry events anywhere. - * @param namespace - Telemetry event name prefix to add to all events - * @param properties - Base properties to add to all events - * @param propertyGetters - Getters to add additional properties to all events - */ - public static create( - baseLogger?: ITelemetryBaseLogger, - namespace?: string, - properties?: object, - propertyGetters?: ITelemetryPropertyGetters): TelemetryLogger { - return new ChildLogger( - baseLogger ? baseLogger : new BaseTelemetryNullLogger(), - namespace, - properties, - propertyGetters); - } - - constructor( - protected readonly logger: ITelemetryBaseLogger, - namespace?: string, - properties?: object, - propertyGetters?: ITelemetryPropertyGetters) { - super(namespace, properties, propertyGetters); - } - - /** - * Send an event with the logger - * - * @param event - the event to send - */ - public send(event: ITelemetryBaseEvent): void { - this.logger.send(this.prepareEvent(event)); - } -} - -/** - * Multi-sink logger - * Takes multiple ITelemetryBaseLogger objects (sinks) and logs all events into each sink - * Implements ITelemetryBaseLogger (through static create() method) - */ -export class MultiSinkLogger extends TelemetryLogger { - protected loggers: ITelemetryBaseLogger[] = []; - - /** - * Create multiple sink logger (i.e. logger that sends events to multiple sinks) - * @param namespace - Telemetry event name prefix to add to all events - * @param properties - Base properties to add to all events - * @param propertyGetters - Getters to add additional properties to all events - */ - constructor( - namespace?: string, - properties?: object, - propertyGetters?: ITelemetryPropertyGetters) { - super(namespace, properties, propertyGetters); - } - - /** - * Add logger to send all events to - * @param logger - Logger to add - */ - public addLogger(logger?: ITelemetryBaseLogger) { - if (logger !== undefined && logger !== null) { - this.loggers.push(logger); - } - } - - /** - * Send an event to the loggers - * - * @param event - the event to send to all the registered logger - */ - public send(event: ITelemetryBaseEvent): void { - const newEvent = this.prepareEvent(event); - this.loggers.forEach((logger: ITelemetryBaseLogger) => { - logger.send(newEvent); - }); - } -} - -/** - * Implementation of debug logger - */ -export class DebugLogger extends TelemetryLogger { - /** - * Create debug logger - all events are output to debug npm library - * @param namespace - Telemetry event name prefix to add to all events - * @param properties - Base properties to add to all events - * @param propertyGetters - Getters to add additional properties to all events - */ - public static create( - namespace: string, - properties?: object, - propertyGetters?: ITelemetryPropertyGetters): TelemetryLogger { - // Setup base logger upfront, such that host can disable it (if needed) - const debug = registerDebug(namespace); - - const debugErr = registerDebug(namespace); - debugErr.log = console.error.bind(console); - debugErr.enabled = true; - - return new DebugLogger(debug, debugErr, properties, propertyGetters); - } - - /** - * Mix in debug logger with another logger. - * Returned logger will output events to both newly created debug logger, as well as base logger - * @param namespace - Telemetry event name prefix to add to all events - * @param properties - Base properties to add to all events - * @param propertyGetters - Getters to add additional properties to all events - * @param baseLogger - Base logger to output events (in addition to debug logger being created). Can be undefined. - */ - public static mixinDebugLogger( - namespace: string, - baseLogger?: ITelemetryBaseLogger, - properties?: object, - propertyGetters?: ITelemetryPropertyGetters): TelemetryLogger { - if (!baseLogger) { - return DebugLogger.create(namespace, properties, propertyGetters); - } - - const multiSinkLogger = new MultiSinkLogger(undefined, properties, propertyGetters); - multiSinkLogger.addLogger(DebugLogger.create(namespace)); - multiSinkLogger.addLogger(ChildLogger.create(baseLogger, namespace)); - - return multiSinkLogger; - } - - constructor( - private readonly debug: IDebugger, - private readonly debugErr: IDebugger, - properties?: object, - propertyGetters?: ITelemetryPropertyGetters, - ) { - super(undefined, properties, propertyGetters); - } - - /** - * Send an event to debug loggers - * - * @param event - the event to send - */ - public send(event: ITelemetryBaseEvent): void { - const newEvent: ITelemetryProperties = this.prepareEvent(event); - const isError = newEvent.category === "error"; - let logger = isError ? this.debugErr : this.debug; - - // Use debug's coloring schema for base of the event - const index = event.eventName.lastIndexOf(TelemetryLogger.eventNamespaceSeparator); - const name = event.eventName.substring(index + 1); - if (index > 0) { - logger = logger.extend(event.eventName.substring(0, index)); - } - newEvent.eventName = undefined; - - let tick = ""; - if (event.category === "performance") { - tick = `tick=${TelemetryLogger.formatTick(performanceNow())}`; - } - - // Extract stack to put it last, but also to avoid escaping '\n' in it by JSON.stringify below - const stack = newEvent.stack ? newEvent.stack : ""; - newEvent.stack = undefined; - - // Watch out for circular references - they can come from two sources - // 1) error object - we do not control it and should remove it and retry - // 2) properties supplied by telemetry caller - that's a bug that should be addressed! - let payload: string; - try { - payload = JSON.stringify(newEvent); - } catch (error) { - newEvent.error = undefined; - payload = JSON.stringify(newEvent); - } - - if (payload === "{}") { - payload = ""; - } - - // Force errors out, to help with diagnostics - if (isError) { - logger.enabled = true; - } - - // Print multi-line. - logger(`${name} ${payload} ${tick} ${stack}`); - } -} - -/** - * Helper class to log performance events - */ -export class PerformanceEvent { - public static start(logger: ITelemetryLogger, event: ITelemetryGenericEvent) { - return new PerformanceEvent(logger, event); - } - - private event?: ITelemetryGenericEvent; - private readonly startTime = performanceNow(); - private startMark?: string; - - protected constructor( - private readonly logger: ITelemetryLogger, - event: ITelemetryGenericEvent) { - this.event = { ...event }; - this.reportEvent("start"); - - if (typeof window === "object" && window != null && window.performance) { - this.startMark = `${event.eventName}-start`; - window.performance.mark(this.startMark); - } - } - - public reportProgress(props?: object, eventNameSuffix: string = "update"): void { - this.reportEvent(eventNameSuffix, props); - } - - public end(props?: object, eventNameSuffix = "end"): void { - this.reportEvent(eventNameSuffix, props); - - if (this.startMark) { - const endMark = `${this.event!.eventName}-${eventNameSuffix}`; - window.performance.mark(endMark); - window.performance.measure(`${this.event!.eventName}`, this.startMark, endMark); - this.startMark = undefined; - } - - this.event = undefined; - } - - public cancel(props?: object, error?: any): void { - this.reportEvent("cancel", props, error); - this.event = undefined; - } - - public reportEvent(eventNameSuffix: string, props?: object, error?: any): void { - if (!this.event) { - this.logger.sendErrorEvent({ - eventName: "PerformanceEventAfterStop", - perfEventName: this.event!.eventName, - eventNameSuffix, - }); - return; - } - - const event: ITelemetryPerformanceEvent = { ...this.event, ...props }; - event.eventName = `${event.eventName}_${eventNameSuffix}`; - if (eventNameSuffix !== "start") { - event.duration = performanceNow() - this.startTime; - } - - this.logger.sendPerformanceEvent(event, error); - } -} - -/** - * Helper class for error tracking. - * Object of this instance will record all of their properties when logged with logger. - * Care needs to be taken not to log PII information! - * Logger ignores all properties from any other error objects (not being instance of CustomErrorWithProps), - * with exception of 'message' & 'stack' properties if they exists on error object. - * In other words, logger logs only what it knows about and has good confidence it does not container PII information. - */ -export class CustomErrorWithProps extends Error { - constructor( - message: string, - props?: {[key: string]: string | number}) - { - super(message); - Object.assign(this, props); - } - - // Return all properties - public getCustomProperties(): object { - const props = {}; - // Could not use {...this} because it does not return properties of base class. - for (const key of Object.getOwnPropertyNames(this)) { - props[key] = this[key]; - } - return props; - } -} diff --git a/lerna-package-lock.json b/lerna-package-lock.json index 3fcf4e73c55c..8623279b1460 100644 --- a/lerna-package-lock.json +++ b/lerna-package-lock.json @@ -2213,57 +2213,57 @@ } }, "@microsoft/fluid-agent-scheduler": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-agent-scheduler/-/fluid-agent-scheduler-0.18.3.tgz", - "integrity": "sha1-g+UZaolaPZaghyRYebmJCtRRor4=", - "requires": { - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-map": "^0.18.3", - "@microsoft/fluid-register-collection": "^0.18.3", - "@microsoft/fluid-runtime-definitions": "^0.18.3", - "@microsoft/fluid-shared-object-base": "^0.18.3", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-agent-scheduler/-/fluid-agent-scheduler-0.18.4.tgz", + "integrity": "sha1-vOQW94on/kJ6jy8VRiXZVzKZF30=", + "requires": { + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-map": "^0.18.4", + "@microsoft/fluid-register-collection": "^0.18.4", + "@microsoft/fluid-runtime-definitions": "^0.18.4", + "@microsoft/fluid-shared-object-base": "^0.18.4", "debug": "^4.1.1", "uuid": "^3.3.2" } }, "@microsoft/fluid-aqueduct": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-aqueduct/-/fluid-aqueduct-0.18.3.tgz", - "integrity": "sha1-KVLfYQ2IK6yAZXwI/Kjf/zyvfGc=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-aqueduct/-/fluid-aqueduct-0.18.4.tgz", + "integrity": "sha1-yxqy04RTM5gsrzHXrQsXznX7lHw=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-container-runtime": "^0.18.3", - "@microsoft/fluid-container-runtime-definitions": "^0.18.3", - "@microsoft/fluid-framework-interfaces": "^0.18.3", - "@microsoft/fluid-map": "^0.18.3", - "@microsoft/fluid-runtime-definitions": "^0.18.3", - "@microsoft/fluid-shared-object-base": "^0.18.3", - "@microsoft/fluid-synthesize": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-container-runtime": "^0.18.4", + "@microsoft/fluid-container-runtime-definitions": "^0.18.4", + "@microsoft/fluid-framework-interfaces": "^0.18.4", + "@microsoft/fluid-map": "^0.18.4", + "@microsoft/fluid-runtime-definitions": "^0.18.4", + "@microsoft/fluid-shared-object-base": "^0.18.4", + "@microsoft/fluid-synthesize": "^0.18.4", "uuid": "^3.3.2" } }, "@microsoft/fluid-base-host": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-base-host/-/fluid-base-host-0.18.3.tgz", - "integrity": "sha1-w4ShZ9xw34RG6rb5VCNfclMXHMM=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-base-host/-/fluid-base-host-0.18.4.tgz", + "integrity": "sha1-KEOZHUOnx2uPu1qo7cDjYpSINRY=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-container-loader": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-container-loader": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-web-code-loader": "^0.18.3" + "@microsoft/fluid-web-code-loader": "^0.18.4" } }, "@microsoft/fluid-common-definitions": { @@ -2284,65 +2284,65 @@ } }, "@microsoft/fluid-component-core-interfaces": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-component-core-interfaces/-/fluid-component-core-interfaces-0.18.3.tgz", - "integrity": "sha1-nSTKuYLhVc/seGJZxfDMJe4GL3w=" + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-component-core-interfaces/-/fluid-component-core-interfaces-0.18.4.tgz", + "integrity": "sha1-yHJWFy9nCl7It+dODX6WGT3tJzM=" }, "@microsoft/fluid-component-runtime": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-component-runtime/-/fluid-component-runtime-0.18.3.tgz", - "integrity": "sha1-yWsxtTnNNrjZMvkp+xfrYvrQgVc=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-component-runtime/-/fluid-component-runtime-0.18.4.tgz", + "integrity": "sha1-DJhJWB1WtLcTSvgtAT2IZ1Qa5Cs=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-runtime-definitions": "^0.18.3", - "@microsoft/fluid-shared-object-base": "^0.18.3", + "@microsoft/fluid-runtime-definitions": "^0.18.4", + "@microsoft/fluid-shared-object-base": "^0.18.4", "debug": "^4.1.1", "uuid": "^3.3.2" } }, "@microsoft/fluid-component-runtime-definitions": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-component-runtime-definitions/-/fluid-component-runtime-definitions-0.18.3.tgz", - "integrity": "sha1-e9qjPsMMt6mOtfoP5+U43K+FGyQ=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-component-runtime-definitions/-/fluid-component-runtime-definitions-0.18.4.tgz", + "integrity": "sha1-hA7096D89tXP+j+2a8JTQ30loNg=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-runtime-definitions": "^0.18.3", + "@microsoft/fluid-runtime-definitions": "^0.18.4", "@types/node": "^10.14.6" } }, "@microsoft/fluid-container-definitions": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-definitions/-/fluid-container-definitions-0.18.3.tgz", - "integrity": "sha1-5oVP+HGt2FlfB6sTF2Cg329gSvM=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-definitions/-/fluid-container-definitions-0.18.4.tgz", + "integrity": "sha1-DsjhyqE4CUw4WrgX3nzHhdZm3io=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1" } }, "@microsoft/fluid-container-loader": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-loader/-/fluid-container-loader-0.18.3.tgz", - "integrity": "sha1-3RGxVdc+LU6JD7007RDCWDmefTI=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-loader/-/fluid-container-loader-0.18.4.tgz", + "integrity": "sha1-W5rGuZdY8yDS6Dzt6QaGeoxJTYc=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", "@types/double-ended-queue": "^2.1.0", @@ -2355,22 +2355,22 @@ } }, "@microsoft/fluid-container-runtime": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-runtime/-/fluid-container-runtime-0.18.3.tgz", - "integrity": "sha1-symuiUxTg3PKj7YJwf7s8Sk5Nkg=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-runtime/-/fluid-container-runtime-0.18.4.tgz", + "integrity": "sha1-G7kqlmqSVT1/RyWpb0APMoGoWs4=", "requires": { - "@microsoft/fluid-agent-scheduler": "^0.18.3", + "@microsoft/fluid-agent-scheduler": "^0.18.4", "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-container-runtime-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-container-runtime-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-runtime-definitions": "^0.18.3", - "@microsoft/fluid-runtime-utils": "^0.18.3", + "@microsoft/fluid-runtime-definitions": "^0.18.4", + "@microsoft/fluid-runtime-utils": "^0.18.4", "@types/debug": "^0.0.31", "@types/node": "^10.14.6", "@types/uuid": "^3.4.4", @@ -2387,26 +2387,26 @@ } }, "@microsoft/fluid-container-runtime-definitions": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-runtime-definitions/-/fluid-container-runtime-definitions-0.18.3.tgz", - "integrity": "sha1-PsBo1Tuy1nYcfGAZ3GT/sGx2c8o=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-runtime-definitions/-/fluid-container-runtime-definitions-0.18.4.tgz", + "integrity": "sha1-9x77ZWW6X3ha02B56jNS3mhD1CI=", "requires": { - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-runtime-definitions": "^0.18.3", + "@microsoft/fluid-runtime-definitions": "^0.18.4", "@types/node": "^10.14.6" } }, "@microsoft/fluid-driver-base": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-driver-base/-/fluid-driver-base-0.18.3.tgz", - "integrity": "sha1-+CLL45un8VsX9CP8ocqN712Gdhk=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-driver-base/-/fluid-driver-base-0.18.4.tgz", + "integrity": "sha1-hQ8YmtazIqfVy9JuSo4tDPmVzMs=", "requires": { "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", "@types/debug": "^0.0.31", "@types/node": "^10.14.6", @@ -2422,32 +2422,32 @@ } }, "@microsoft/fluid-driver-definitions": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-driver-definitions/-/fluid-driver-definitions-0.18.3.tgz", - "integrity": "sha1-mRFoYpTrP0Xnu7vIXCmQjAl9eIo=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-driver-definitions/-/fluid-driver-definitions-0.18.4.tgz", + "integrity": "sha1-9mI18asQfU4vQt9gYMgRV4lXZGA=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1" } }, "@microsoft/fluid-driver-utils": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-driver-utils/-/fluid-driver-utils-0.18.3.tgz", - "integrity": "sha1-sbqOKgvjtMLl0odZAA4oatM2T+w=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-driver-utils/-/fluid-driver-utils-0.18.4.tgz", + "integrity": "sha1-aeTbQ0OBPwR7uTD5WIn9JvzZG5A=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1" } }, "@microsoft/fluid-framework-interfaces": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-framework-interfaces/-/fluid-framework-interfaces-0.18.3.tgz", - "integrity": "sha1-BNqsX9/LjPXey4qR0FJDDPXo37Y=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-framework-interfaces/-/fluid-framework-interfaces-0.18.4.tgz", + "integrity": "sha1-cP783Oc/ADcl//yL9P1/Pz0tVoo=", "requires": { - "@microsoft/fluid-component-core-interfaces": "^0.18.3" + "@microsoft/fluid-component-core-interfaces": "^0.18.4" } }, "@microsoft/fluid-gitresources": { @@ -2456,18 +2456,18 @@ "integrity": "sha1-WVO1ox1/sSeTSct9g4AT930j++s=" }, "@microsoft/fluid-local-driver": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-local-driver/-/fluid-local-driver-0.18.3.tgz", - "integrity": "sha1-4/iQ6DbSZF10qLC7fSRZ6qxZGLE=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-local-driver/-/fluid-local-driver-0.18.4.tgz", + "integrity": "sha1-Dnvudm4xAxeyX/Hx16IEnZOH5vw=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-routerlicious-driver": "^0.18.3", + "@microsoft/fluid-routerlicious-driver": "^0.18.4", "@microsoft/fluid-server-local-server": "^0.1005.1", "@microsoft/fluid-server-services-client": "^0.1005.1", "@microsoft/fluid-server-services-core": "^0.1005.1", @@ -2476,17 +2476,17 @@ } }, "@microsoft/fluid-map": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-map/-/fluid-map-0.18.3.tgz", - "integrity": "sha1-OCsPN4Y7VKUSr+mtxq6dh4JuvAk=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-map/-/fluid-map-0.18.4.tgz", + "integrity": "sha1-DMEABNEVPv7X3lv5yGF2ZHkUkI0=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-shared-object-base": "^0.18.3", + "@microsoft/fluid-shared-object-base": "^0.18.4", "debug": "^4.1.1" } }, @@ -2517,28 +2517,28 @@ } }, "@microsoft/fluid-register-collection": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-register-collection/-/fluid-register-collection-0.18.3.tgz", - "integrity": "sha1-Dr16qZyyEvN5A0XNWpq4z/BPaOY=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-register-collection/-/fluid-register-collection-0.18.4.tgz", + "integrity": "sha1-5If0jzQURwREcgPLneOPf+W0hUo=", "requires": { "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-runtime-utils": "^0.18.3", - "@microsoft/fluid-shared-object-base": "^0.18.3", + "@microsoft/fluid-runtime-utils": "^0.18.4", + "@microsoft/fluid-shared-object-base": "^0.18.4", "debug": "^4.1.1" } }, "@microsoft/fluid-routerlicious-driver": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-routerlicious-driver/-/fluid-routerlicious-driver-0.18.3.tgz", - "integrity": "sha1-Q0Urlx3zRu8Kaja1j2osAz04DG8=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-routerlicious-driver/-/fluid-routerlicious-driver-0.18.4.tgz", + "integrity": "sha1-7xGMPlerwvh3cB9VY1jYLKuWFvE=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-driver-base": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-driver-base": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-gitresources": "^0.1005.1", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", @@ -2559,27 +2559,27 @@ } }, "@microsoft/fluid-runtime-definitions": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-runtime-definitions/-/fluid-runtime-definitions-0.18.3.tgz", - "integrity": "sha1-U90lJfsjh84tyaupVqiCUdpDnwo=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-runtime-definitions/-/fluid-runtime-definitions-0.18.4.tgz", + "integrity": "sha1-vGyFGGi4EDlzARsmL3vobWtM4Hk=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", "@types/node": "^10.14.6" } }, "@microsoft/fluid-runtime-utils": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-runtime-utils/-/fluid-runtime-utils-0.18.3.tgz", - "integrity": "sha1-oSaKI9Po6XCnVKF2bp3TQ+c/U1g=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-runtime-utils/-/fluid-runtime-utils-0.18.4.tgz", + "integrity": "sha1-iKxJAxMcQMLIF0WAGgyfOC8EqI4=", "requires": { - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", - "@microsoft/fluid-runtime-definitions": "^0.18.3" + "@microsoft/fluid-runtime-definitions": "^0.18.4" } }, "@microsoft/fluid-server-lambdas": { @@ -2733,15 +2733,15 @@ } }, "@microsoft/fluid-shared-object-base": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-shared-object-base/-/fluid-shared-object-base-0.18.3.tgz", - "integrity": "sha1-+dVhvUggD5y+2uEtX8rt/bQhfcA=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-shared-object-base/-/fluid-shared-object-base-0.18.4.tgz", + "integrity": "sha1-XFrdWIJVq0ywlahioYc67cc1Wy0=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", "@types/debug": "^0.0.31", "@types/double-ended-queue": "^2.1.0", @@ -2758,19 +2758,19 @@ } }, "@microsoft/fluid-synthesize": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-synthesize/-/fluid-synthesize-0.18.3.tgz", - "integrity": "sha1-FPqHQPSeLI/irT5Ch1EGwvTzZZM=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-synthesize/-/fluid-synthesize-0.18.4.tgz", + "integrity": "sha1-e71NTjj00+bFmdLqvTosjNPJE4w=", "requires": { - "@microsoft/fluid-component-core-interfaces": "^0.18.3" + "@microsoft/fluid-component-core-interfaces": "^0.18.4" } }, "@microsoft/fluid-web-code-loader": { - "version": "0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-web-code-loader/-/fluid-web-code-loader-0.18.3.tgz", - "integrity": "sha1-IXbaP3UCv6tdnSvm+AUn+IEtnkM=", + "version": "0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-web-code-loader/-/fluid-web-code-loader-0.18.4.tgz", + "integrity": "sha1-6OLvROh1aTBbiWTELr3rK7XawUs=", "requires": { - "@microsoft/fluid-container-definitions": "^0.18.3", + "@microsoft/fluid-container-definitions": "^0.18.4", "@types/node": "^10.14.6", "isomorphic-fetch": "^2.2.1" } @@ -14901,48 +14901,48 @@ } }, "old-aqueduct": { - "version": "npm:@microsoft/fluid-aqueduct@0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-aqueduct/-/fluid-aqueduct-0.18.3.tgz", - "integrity": "sha1-KVLfYQ2IK6yAZXwI/Kjf/zyvfGc=", + "version": "npm:@microsoft/fluid-aqueduct@0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-aqueduct/-/fluid-aqueduct-0.18.4.tgz", + "integrity": "sha1-yxqy04RTM5gsrzHXrQsXznX7lHw=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-container-runtime": "^0.18.3", - "@microsoft/fluid-container-runtime-definitions": "^0.18.3", - "@microsoft/fluid-framework-interfaces": "^0.18.3", - "@microsoft/fluid-map": "^0.18.3", - "@microsoft/fluid-runtime-definitions": "^0.18.3", - "@microsoft/fluid-shared-object-base": "^0.18.3", - "@microsoft/fluid-synthesize": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-container-runtime": "^0.18.4", + "@microsoft/fluid-container-runtime-definitions": "^0.18.4", + "@microsoft/fluid-framework-interfaces": "^0.18.4", + "@microsoft/fluid-map": "^0.18.4", + "@microsoft/fluid-runtime-definitions": "^0.18.4", + "@microsoft/fluid-shared-object-base": "^0.18.4", + "@microsoft/fluid-synthesize": "^0.18.4", "uuid": "^3.3.2" } }, "old-container-definitions": { - "version": "npm:@microsoft/fluid-container-definitions@0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-definitions/-/fluid-container-definitions-0.18.3.tgz", - "integrity": "sha1-5oVP+HGt2FlfB6sTF2Cg329gSvM=", + "version": "npm:@microsoft/fluid-container-definitions@0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-definitions/-/fluid-container-definitions-0.18.4.tgz", + "integrity": "sha1-DsjhyqE4CUw4WrgX3nzHhdZm3io=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1" } }, "old-container-loader": { - "version": "npm:@microsoft/fluid-container-loader@0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-loader/-/fluid-container-loader-0.18.3.tgz", - "integrity": "sha1-3RGxVdc+LU6JD7007RDCWDmefTI=", + "version": "npm:@microsoft/fluid-container-loader@0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-container-loader/-/fluid-container-loader-0.18.4.tgz", + "integrity": "sha1-W5rGuZdY8yDS6Dzt6QaGeoxJTYc=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", "@microsoft/fluid-common-utils": "^0.18.2", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", - "@microsoft/fluid-driver-utils": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", + "@microsoft/fluid-driver-utils": "^0.18.4", "@microsoft/fluid-protocol-base": "^0.1005.1", "@microsoft/fluid-protocol-definitions": "^0.1005.1", "@types/double-ended-queue": "^2.1.0", @@ -14955,35 +14955,35 @@ } }, "old-runtime-definitions": { - "version": "npm:@microsoft/fluid-runtime-definitions@0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-runtime-definitions/-/fluid-runtime-definitions-0.18.3.tgz", - "integrity": "sha1-U90lJfsjh84tyaupVqiCUdpDnwo=", + "version": "npm:@microsoft/fluid-runtime-definitions@0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-runtime-definitions/-/fluid-runtime-definitions-0.18.4.tgz", + "integrity": "sha1-vGyFGGi4EDlzARsmL3vobWtM4Hk=", "requires": { "@microsoft/fluid-common-definitions": "^0.17.0", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-driver-definitions": "^0.18.3", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-driver-definitions": "^0.18.4", "@microsoft/fluid-protocol-definitions": "^0.1005.1", "@types/node": "^10.14.6" } }, "old-test-utils": { - "version": "npm:@microsoft/fluid-test-utils@0.18.3", - "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-test-utils/-/fluid-test-utils-0.18.3.tgz", - "integrity": "sha1-jIt4FcYTM+1Fh5unFAFnnm336I4=", - "requires": { - "@microsoft/fluid-aqueduct": "^0.18.3", - "@microsoft/fluid-base-host": "^0.18.3", - "@microsoft/fluid-component-core-interfaces": "^0.18.3", - "@microsoft/fluid-component-runtime": "^0.18.3", - "@microsoft/fluid-component-runtime-definitions": "^0.18.3", - "@microsoft/fluid-container-definitions": "^0.18.3", - "@microsoft/fluid-container-loader": "^0.18.3", - "@microsoft/fluid-local-driver": "^0.18.3", - "@microsoft/fluid-map": "^0.18.3", - "@microsoft/fluid-runtime-definitions": "^0.18.3", + "version": "npm:@microsoft/fluid-test-utils@0.18.4", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/fluid-test-utils/-/fluid-test-utils-0.18.4.tgz", + "integrity": "sha1-1jHiUY83iiz/1mXqIcNRpycPHjo=", + "requires": { + "@microsoft/fluid-aqueduct": "^0.18.4", + "@microsoft/fluid-base-host": "^0.18.4", + "@microsoft/fluid-component-core-interfaces": "^0.18.4", + "@microsoft/fluid-component-runtime": "^0.18.4", + "@microsoft/fluid-component-runtime-definitions": "^0.18.4", + "@microsoft/fluid-container-definitions": "^0.18.4", + "@microsoft/fluid-container-loader": "^0.18.4", + "@microsoft/fluid-local-driver": "^0.18.4", + "@microsoft/fluid-map": "^0.18.4", + "@microsoft/fluid-runtime-definitions": "^0.18.4", "@microsoft/fluid-server-local-server": "^0.1005.1", - "@microsoft/fluid-shared-object-base": "^0.18.3" + "@microsoft/fluid-shared-object-base": "^0.18.4" } }, "on-finished": { diff --git a/packages/drivers/odsp-socket-storage/package.json b/packages/drivers/odsp-socket-storage/package.json index fd2cc7572d99..511cf613a013 100644 --- a/packages/drivers/odsp-socket-storage/package.json +++ b/packages/drivers/odsp-socket-storage/package.json @@ -48,6 +48,7 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/drivers/odsp-socket-storage/src/odspDocumentService.ts b/packages/drivers/odsp-socket-storage/src/odspDocumentService.ts index 036398f5fd1a..5908a2fbfd41 100644 --- a/packages/drivers/odsp-socket-storage/src/odspDocumentService.ts +++ b/packages/drivers/odsp-socket-storage/src/odspDocumentService.ts @@ -4,13 +4,12 @@ */ import { ITelemetryLogger } from "@fluidframework/common-definitions"; +import { performanceNow, TelemetryNullLogger } from "@fluidframework/common-utils"; import { ChildLogger, PerformanceEvent, - performanceNow, TelemetryLogger, - TelemetryNullLogger, -} from "@fluidframework/common-utils"; +} from "@fluidframework/client-common-utils"; import { IDocumentDeltaConnection, IDocumentDeltaStorageService, diff --git a/packages/drivers/odsp-socket-storage/src/odspDocumentServiceFactoryCore.ts b/packages/drivers/odsp-socket-storage/src/odspDocumentServiceFactoryCore.ts index 16d04b9bba13..5ae1a47ad4ad 100644 --- a/packages/drivers/odsp-socket-storage/src/odspDocumentServiceFactoryCore.ts +++ b/packages/drivers/odsp-socket-storage/src/odspDocumentServiceFactoryCore.ts @@ -13,7 +13,7 @@ import { ISummaryTree } from "@fluidframework/protocol-definitions"; import { ChildLogger, PerformanceEvent, -} from "@fluidframework/common-utils"; +} from "@fluidframework/client-common-utils"; import { ensureFluidResolvedUrl } from "@fluidframework/driver-utils"; import { IOdspResolvedUrl, HostStoragePolicy } from "./contracts"; import { FetchWrapper, IFetchWrapper } from "./fetchWrapper"; diff --git a/packages/drivers/odsp-socket-storage/src/odspDocumentStorageManager.ts b/packages/drivers/odsp-socket-storage/src/odspDocumentStorageManager.ts index be93150f40c5..7ed6324b375a 100644 --- a/packages/drivers/odsp-socket-storage/src/odspDocumentStorageManager.ts +++ b/packages/drivers/odsp-socket-storage/src/odspDocumentStorageManager.ts @@ -9,9 +9,11 @@ import { fromBase64ToUtf8, fromUtf8ToBase64, hashFile, +} from "@fluidframework/common-utils"; +import { PerformanceEvent, TelemetryLogger, -} from "@fluidframework/common-utils"; +} from "@fluidframework/client-common-utils"; import * as resources from "@fluidframework/gitresources"; import { buildHierarchy, getGitType } from "@fluidframework/protocol-base"; import * as api from "@fluidframework/protocol-definitions"; diff --git a/packages/drivers/odsp-socket-storage/src/test/odspCreateContainer.spec.ts b/packages/drivers/odsp-socket-storage/src/test/odspCreateContainer.spec.ts index 85d9bae66763..13451364d2a8 100644 --- a/packages/drivers/odsp-socket-storage/src/test/odspCreateContainer.spec.ts +++ b/packages/drivers/odsp-socket-storage/src/test/odspCreateContainer.spec.ts @@ -6,7 +6,7 @@ import assert from "assert"; import { IDocumentService, IDocumentServiceFactory } from "@fluidframework/driver-definitions"; import { IRequest } from "@fluidframework/component-core-interfaces"; -import { DebugLogger } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { ISummaryTree, SummaryType } from "@fluidframework/protocol-definitions"; import { OdspDriverUrlResolver } from "../odspDriverUrlResolver"; import { IFetchWrapper } from "../fetchWrapper"; diff --git a/packages/drivers/odsp-socket-storage/src/vroom.ts b/packages/drivers/odsp-socket-storage/src/vroom.ts index 392b99fa9b67..39f2e4c9cfdb 100644 --- a/packages/drivers/odsp-socket-storage/src/vroom.ts +++ b/packages/drivers/odsp-socket-storage/src/vroom.ts @@ -4,7 +4,7 @@ */ import { ITelemetryLogger } from "@fluidframework/common-definitions"; -import { PerformanceEvent } from "@fluidframework/common-utils"; +import { PerformanceEvent } from "@fluidframework/client-common-utils"; import { ISocketStorageDiscovery } from "./contracts"; import { fetchHelper, getWithRetryForTokenRefresh, throwOdspNetworkError, getOrigin } from "./odspUtils"; import { getApiRoot } from "./odspUrlHelper"; diff --git a/packages/hosts/base-host/package.json b/packages/hosts/base-host/package.json index de83ac18ea77..77279c4746cc 100644 --- a/packages/hosts/base-host/package.json +++ b/packages/hosts/base-host/package.json @@ -47,6 +47,7 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/hosts/base-host/src/utils.ts b/packages/hosts/base-host/src/utils.ts index 2811f57d8fcf..d198b19463bd 100644 --- a/packages/hosts/base-host/src/utils.ts +++ b/packages/hosts/base-host/src/utils.ts @@ -5,7 +5,8 @@ import { EventEmitter } from "events"; import { ITelemetryBaseLogger, ITelemetryLogger } from "@fluidframework/common-definitions"; -import { DebugLogger, Deferred, PromiseTimer, Timer } from "@fluidframework/common-utils"; +import { Deferred, PromiseTimer, Timer } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { IFluidCodeDetails } from "@fluidframework/container-definitions"; import { IPendingProposal, IQuorum, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"; diff --git a/packages/loader/container-loader/package.json b/packages/loader/container-loader/package.json index f6a050756beb..9557787f51c3 100644 --- a/packages/loader/container-loader/package.json +++ b/packages/loader/container-loader/package.json @@ -49,10 +49,12 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", "@fluidframework/container-definitions": "^0.19.0", + "@fluidframework/container-utils": "^0.19.0", "@fluidframework/driver-definitions": "^0.19.0", "@fluidframework/driver-utils": "^0.19.0", "@fluidframework/protocol-base": "^0.1006.0-0", diff --git a/packages/loader/container-loader/src/container.ts b/packages/loader/container-loader/src/container.ts index 66abb8615144..b5274f264d89 100644 --- a/packages/loader/container-loader/src/container.ts +++ b/packages/loader/container-loader/src/container.ts @@ -27,14 +27,14 @@ import { ContainerWarning, IThrottlingWarning, } from "@fluidframework/container-definitions"; +import { performanceNow } from "@fluidframework/common-utils"; import { ChildLogger, EventEmitterWithErrorHandling, PerformanceEvent, - performanceNow, raiseConnectedEvent, TelemetryLogger, -} from "@fluidframework/common-utils"; +} from "@fluidframework/client-common-utils"; import { IDocumentService, IDocumentStorageService, @@ -47,13 +47,13 @@ import { import { BlobCacheStorageService, buildSnapshotTree, - CreateContainerError, readAndParse, OnlineStatus, isOnline, ensureFluidResolvedUrl, combineAppAndProtocolSummary, } from "@fluidframework/driver-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; import { isSystemMessage, ProtocolOpHandler, @@ -434,7 +434,7 @@ export class Container extends EventEmitterWithErrorHandling i this.protocolHandler.close(); } - this.context?.dispose(error ? new Error(error.errorType.toString()) : undefined); + this.context?.dispose(error ? new Error(error.message) : undefined); assert(this.connectionState === ConnectionState.Disconnected, "disconnect event was not raised!"); diff --git a/packages/loader/container-loader/src/deltaManager.ts b/packages/loader/container-loader/src/deltaManager.ts index 047ea8b75f54..dd98c14e3e79 100644 --- a/packages/loader/container-loader/src/deltaManager.ts +++ b/packages/loader/container-loader/src/deltaManager.ts @@ -15,7 +15,8 @@ import { IThrottlingWarning, ErrorType, } from "@fluidframework/container-definitions"; -import { PerformanceEvent, performanceNow, TelemetryLogger, TypedEventEmitter } from "@fluidframework/common-utils"; +import { performanceNow, TypedEventEmitter } from "@fluidframework/common-utils"; +import { PerformanceEvent, TelemetryLogger } from "@fluidframework/client-common-utils"; import { IDocumentDeltaStorageService, IDocumentService, @@ -38,10 +39,10 @@ import { ScopeType, } from "@fluidframework/protocol-definitions"; import { - CreateContainerError, createWriteError, createGenericNetworkError, } from "@fluidframework/driver-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; import { ContentCache } from "./contentCache"; import { debug } from "./debug"; import { DeltaConnection } from "./deltaConnection"; diff --git a/packages/loader/container-loader/src/loader.ts b/packages/loader/container-loader/src/loader.ts index 07a0ec3efe30..fa6f8ab4563e 100644 --- a/packages/loader/container-loader/src/loader.ts +++ b/packages/loader/container-loader/src/loader.ts @@ -18,7 +18,8 @@ import { LoaderHeader, IFluidCodeDetails, } from "@fluidframework/container-definitions"; -import { DebugLogger, Deferred } from "@fluidframework/common-utils"; +import { Deferred } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { IDocumentServiceFactory, IFluidResolvedUrl, diff --git a/packages/loader/container-loader/src/test/deltaManager.spec.ts b/packages/loader/container-loader/src/test/deltaManager.spec.ts index 8438f5e84673..9cd4ac561535 100644 --- a/packages/loader/container-loader/src/test/deltaManager.spec.ts +++ b/packages/loader/container-loader/src/test/deltaManager.spec.ts @@ -6,7 +6,7 @@ import assert from "assert"; import { EventEmitter } from "events"; import { ITelemetryLogger } from "@fluidframework/common-definitions"; -import { DebugLogger } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { IClient, IDocumentMessage, IProcessMessageResult, MessageType } from "@fluidframework/protocol-definitions"; import { MockDocumentDeltaConnection, MockDocumentService } from "@fluidframework/test-loader-utils"; import { SinonFakeTimers, useFakeTimers } from "sinon"; diff --git a/packages/loader/container-utils/.eslintrc.js b/packages/loader/container-utils/.eslintrc.js new file mode 100644 index 000000000000..b9189791be96 --- /dev/null +++ b/packages/loader/container-utils/.eslintrc.js @@ -0,0 +1,15 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +module.exports = { + "extends": [ + "@fluidframework/eslint-config-fluid" + ], + "rules": { + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/strict-boolean-expressions": "off", + "no-null/no-null": "off" + } +} diff --git a/packages/loader/container-utils/.gitignore b/packages/loader/container-utils/.gitignore new file mode 100644 index 000000000000..02d308e338ba --- /dev/null +++ b/packages/loader/container-utils/.gitignore @@ -0,0 +1,52 @@ +# Compiled TypeScript and CSS +dist +lib + +# Babel +public/scripts/es5 + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt +.cache-loader + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Typings +typings + +# Debug log from npm +npm-debug.log + +# Code coverage +nyc +.nyc_output/ + +# Chart dependencies +**/charts/*.tgz + +# Generated modeuls +intel_modules/ +temp_modules/ \ No newline at end of file diff --git a/packages/loader/container-utils/.npmignore b/packages/loader/container-utils/.npmignore new file mode 100644 index 000000000000..5e5fd12f6e5b --- /dev/null +++ b/packages/loader/container-utils/.npmignore @@ -0,0 +1,3 @@ +nyc +*.log +**/*.tsbuildinfo diff --git a/packages/loader/container-utils/api-extractor.json b/packages/loader/container-utils/api-extractor.json new file mode 100644 index 000000000000..4d8b958a73cb --- /dev/null +++ b/packages/loader/container-utils/api-extractor.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "extends": "@fluidframework/build-common/api-extractor-common.json" +} diff --git a/packages/loader/container-utils/package.json b/packages/loader/container-utils/package.json new file mode 100644 index 000000000000..db117257648f --- /dev/null +++ b/packages/loader/container-utils/package.json @@ -0,0 +1,85 @@ +{ + "name": "@fluidframework/container-utils", + "version": "0.19.0", + "description": "Fluid container utils", + "repository": "microsoft/FluidFramework", + "license": "MIT", + "author": "Microsoft", + "sideEffects": "false", + "main": "dist/index.js", + "module": "lib/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "npm run build:genver && concurrently npm:build:compile npm:lint", + "build:compile": "concurrently npm:tsc npm:build:esnext", + "build:docs": "api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/", + "build:esnext": "tsc --project ./tsconfig.esnext.json", + "build:full": "npm run build", + "build:full:compile": "npm run build:compile", + "build:genver": "gen-version", + "clean": "rimraf dist lib *.tsbuildinfo *.build.log", + "eslint": "eslint --ext=ts,tsx --format stylish src", + "eslint:fix": "eslint --ext=ts,tsx --format stylish src --fix", + "lint": "npm run eslint", + "lint:fix": "npm run eslint:fix", + "test": "npm run test:mocha", + "test:coverage": "nyc npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/junit-report.xml", + "test:mocha": "mocha --recursive dist/test -r make-promises-safe", + "tsc": "tsc", + "tsc:watch": "tsc --watch" + }, + "nyc": { + "all": true, + "cache-dir": "nyc/.cache", + "exclude": [ + "src/test/**/*.ts", + "dist/test/**/*.js" + ], + "exclude-after-remap": false, + "include": [ + "src/**/*.ts", + "dist/**/*.js" + ], + "report-dir": "nyc/report", + "reporter": [ + "cobertura", + "html", + "text" + ], + "temp-directory": "nyc/.nyc_output" + }, + "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", + "@fluidframework/common-definitions": "^0.18.0-0", + "@fluidframework/common-utils": "^0.19.0-0", + "@fluidframework/container-definitions": "^0.19.0", + "@fluidframework/driver-definitions": "^0.19.0", + "performance-now": "^2.1.0", + "uuid": "^3.3.2" + }, + "devDependencies": { + "@fluidframework/build-common": "^0.16.0-0", + "@fluidframework/eslint-config-fluid": "^0.17.0-0", + "@microsoft/api-extractor": "^7.7.2", + "@types/mocha": "^5.2.5", + "@types/node": "^10.17.24", + "@typescript-eslint/eslint-plugin": "~2.17.0", + "@typescript-eslint/parser": "~2.17.0", + "concurrently": "^5.2.0", + "copyfiles": "^2.1.0", + "eslint": "~6.8.0", + "eslint-plugin-eslint-comments": "~3.1.2", + "eslint-plugin-import": "2.20.0", + "eslint-plugin-no-null": "~1.0.2", + "eslint-plugin-optimize-regex": "~1.1.7", + "eslint-plugin-prefer-arrow": "~1.1.7", + "eslint-plugin-react": "~7.18.0", + "eslint-plugin-unicorn": "~15.0.1", + "make-promises-safe": "^5.1.0", + "mocha": "^5.2.0", + "mocha-junit-reporter": "^1.18.0", + "nyc": "^15.0.0", + "rimraf": "^2.6.2", + "typescript": "~3.7.4" + } +} diff --git a/packages/loader/driver-utils/src/error.ts b/packages/loader/container-utils/src/error.ts similarity index 65% rename from packages/loader/driver-utils/src/error.ts rename to packages/loader/container-utils/src/error.ts index ed47b69ba743..b6e8e419a7b8 100644 --- a/packages/loader/driver-utils/src/error.ts +++ b/packages/loader/container-utils/src/error.ts @@ -5,6 +5,7 @@ // tslint:disable: no-unsafe-any import assert from "assert"; import { ErrorType, IGenericError } from "@fluidframework/container-definitions"; +import { CustomErrorWithProps } from "@fluidframework/client-common-utils"; function messageFromError(error: any) { if (typeof error?.message === "string") { @@ -13,37 +14,6 @@ function messageFromError(error: any) { return `${error}`; } -/** - * TODO: Needs to be removed and replaced with version in logger.ts - * Please use version in @fluidframework/common-util package! - * - * Helper class for error tracking. - * Object of this instance will record all of their properties when logged with logger. - * Care needs to be taken not to log PII information! - * Logger ignores all properties from any other error objects (not being instance of CustomErrorWithProps), - * with exception of 'message' & 'stack' properties if they exists on error object. - * In other words, logger logs only what it knows about and has good confidence it does not container PII information. - */ -export class CustomErrorWithProps extends Error { - constructor( - message: string, - props?: {[key: string]: string | number}) - { - super(message); - Object.assign(this, props); - } - - // Return all properties - public getCustomProperties(): object { - const props = {}; - // Could not use {...this} because it does not return properties of base class. - for (const key of Object.getOwnPropertyNames(this)) { - props[key] = this[key]; - } - return props; - } -} - /** * Generic error */ diff --git a/packages/loader/container-utils/src/index.ts b/packages/loader/container-utils/src/index.ts new file mode 100644 index 000000000000..87debdf8686d --- /dev/null +++ b/packages/loader/container-utils/src/index.ts @@ -0,0 +1,6 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +export * from "./error"; diff --git a/packages/loader/container-utils/src/packageVersion.ts b/packages/loader/container-utils/src/packageVersion.ts new file mode 100644 index 000000000000..13b82d39e4a3 --- /dev/null +++ b/packages/loader/container-utils/src/packageVersion.ts @@ -0,0 +1,9 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + * + * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY + */ + +export const pkgName = "@fluidframework/container-utils"; +export const pkgVersion = "0.19.0"; diff --git a/packages/loader/container-utils/tsconfig.esnext.json b/packages/loader/container-utils/tsconfig.esnext.json new file mode 100644 index 000000000000..ca3d4c50b989 --- /dev/null +++ b/packages/loader/container-utils/tsconfig.esnext.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./lib", + "module": "esnext" + }, +} \ No newline at end of file diff --git a/packages/loader/container-utils/tsconfig.json b/packages/loader/container-utils/tsconfig.json new file mode 100644 index 000000000000..bf64bdc5c7b8 --- /dev/null +++ b/packages/loader/container-utils/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@fluidframework/build-common/ts-common-config.json", + "exclude": [ + "dist", + "node_modules" + ], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "types": [ + "mocha" + ] + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/packages/loader/driver-utils/package.json b/packages/loader/driver-utils/package.json index fc5a14d7899a..765cc93f7451 100644 --- a/packages/loader/driver-utils/package.json +++ b/packages/loader/driver-utils/package.json @@ -44,6 +44,7 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/loader/driver-utils/src/index.ts b/packages/loader/driver-utils/src/index.ts index 53639f0c46fb..ee7f2279a1c9 100644 --- a/packages/loader/driver-utils/src/index.ts +++ b/packages/loader/driver-utils/src/index.ts @@ -10,6 +10,5 @@ export * from "./multiDocumentServiceFactory"; export * from "./multiUrlResolver"; export * from "./network"; export * from "./readAndParse"; -export * from "./error"; export * from "./fluidResolvedUrl"; export * from "./summaryForCreateNew"; diff --git a/packages/loader/driver-utils/src/network.ts b/packages/loader/driver-utils/src/network.ts index 3a6975297869..eba2205b50c5 100644 --- a/packages/loader/driver-utils/src/network.ts +++ b/packages/loader/driver-utils/src/network.ts @@ -13,9 +13,7 @@ import { ErrorType, IErrorBase, } from "@fluidframework/container-definitions"; -import { - CustomErrorWithProps, -} from "./error"; +import { CustomErrorWithProps } from "@fluidframework/client-common-utils"; export enum OnlineStatus { Offline, diff --git a/packages/runtime/client-api/package.json b/packages/runtime/client-api/package.json index 5b333307ba7c..2146a5590b7e 100644 --- a/packages/runtime/client-api/package.json +++ b/packages/runtime/client-api/package.json @@ -51,6 +51,7 @@ "@fluidframework/container-loader": "^0.19.0", "@fluidframework/container-runtime": "^0.19.0", "@fluidframework/container-runtime-definitions": "^0.19.0", + "@fluidframework/container-utils": "^0.19.0", "@fluidframework/driver-definitions": "^0.19.0", "@fluidframework/driver-utils": "^0.19.0", "@fluidframework/ink": "^0.19.0", diff --git a/packages/runtime/client-api/src/api/codeLoader.ts b/packages/runtime/client-api/src/api/codeLoader.ts index a989f6dbc0ae..0c55a85234ea 100644 --- a/packages/runtime/client-api/src/api/codeLoader.ts +++ b/packages/runtime/client-api/src/api/codeLoader.ts @@ -24,7 +24,7 @@ import { IComponentFactory, NamedComponentRegistryEntries, } from "@fluidframework/runtime-definitions"; -import { CreateContainerError } from "@fluidframework/driver-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; import * as sequence from "@fluidframework/sequence"; import { Document } from "./document"; diff --git a/packages/runtime/component-runtime/package.json b/packages/runtime/component-runtime/package.json index 60b10d498b8a..b01e3c6390b4 100644 --- a/packages/runtime/component-runtime/package.json +++ b/packages/runtime/component-runtime/package.json @@ -26,11 +26,13 @@ "tsc:watch": "tsc --watch" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", "@fluidframework/component-runtime-definitions": "^0.19.0", "@fluidframework/container-definitions": "^0.19.0", + "@fluidframework/container-utils": "^0.19.0", "@fluidframework/driver-definitions": "^0.19.0", "@fluidframework/driver-utils": "^0.19.0", "@fluidframework/protocol-base": "^0.1006.0-0", diff --git a/packages/runtime/component-runtime/src/componentRuntime.ts b/packages/runtime/component-runtime/src/componentRuntime.ts index 2bdbdffee6b9..3553596b770d 100644 --- a/packages/runtime/component-runtime/src/componentRuntime.ts +++ b/packages/runtime/component-runtime/src/componentRuntime.ts @@ -21,10 +21,12 @@ import { ILoader, } from "@fluidframework/container-definitions"; import { - ChildLogger, Deferred, - raiseConnectedEvent, } from "@fluidframework/common-utils"; +import { + ChildLogger, + raiseConnectedEvent, +} from "@fluidframework/client-common-utils"; import { buildSnapshotTree } from "@fluidframework/driver-utils"; import { TreeTreeEntry } from "@fluidframework/protocol-base"; import { diff --git a/packages/runtime/component-runtime/src/remoteChannelContext.ts b/packages/runtime/component-runtime/src/remoteChannelContext.ts index e5c9b8241633..7f9059e82ef1 100644 --- a/packages/runtime/component-runtime/src/remoteChannelContext.ts +++ b/packages/runtime/component-runtime/src/remoteChannelContext.ts @@ -5,7 +5,8 @@ import assert from "assert"; import { IDocumentStorageService } from "@fluidframework/driver-definitions"; -import { readAndParse, CreateContainerError } from "@fluidframework/driver-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; +import { readAndParse } from "@fluidframework/driver-utils"; import { ISequencedDocumentMessage, ISnapshotTree, diff --git a/packages/runtime/container-runtime/package.json b/packages/runtime/container-runtime/package.json index 9f57a89fba00..8e725d76e3e7 100644 --- a/packages/runtime/container-runtime/package.json +++ b/packages/runtime/container-runtime/package.json @@ -50,11 +50,13 @@ }, "dependencies": { "@fluidframework/agent-scheduler": "^0.19.0", + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", "@fluidframework/container-definitions": "^0.19.0", "@fluidframework/container-runtime-definitions": "^0.19.0", + "@fluidframework/container-utils": "^0.19.0", "@fluidframework/driver-definitions": "^0.19.0", "@fluidframework/driver-utils": "^0.19.0", "@fluidframework/protocol-base": "^0.1006.0-0", diff --git a/packages/runtime/container-runtime/src/containerRuntime.ts b/packages/runtime/container-runtime/src/containerRuntime.ts index 60f496475fe5..fad4dc0d4e77 100644 --- a/packages/runtime/container-runtime/src/containerRuntime.ts +++ b/packages/runtime/container-runtime/src/containerRuntime.ts @@ -32,16 +32,18 @@ import { Deferred, Trace, LazyPromise, +} from "@fluidframework/common-utils"; +import { ChildLogger, raiseConnectedEvent, -} from "@fluidframework/common-utils"; +} from "@fluidframework/client-common-utils"; import { IDocumentStorageService, ISummaryContext } from "@fluidframework/driver-definitions"; import { BlobCacheStorageService, - CreateContainerError, buildSnapshotTree, readAndParse, } from "@fluidframework/driver-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; import { BlobTreeEntry, isSystemType, diff --git a/packages/runtime/container-runtime/src/summarizer.ts b/packages/runtime/container-runtime/src/summarizer.ts index 0d248e6fa93a..0c879a20f848 100644 --- a/packages/runtime/container-runtime/src/summarizer.ts +++ b/packages/runtime/container-runtime/src/summarizer.ts @@ -5,7 +5,8 @@ import { EventEmitter } from "events"; import { IDisposable, IEvent, IEventProvider, ITelemetryLogger } from "@fluidframework/common-definitions"; -import { ChildLogger, Deferred, PerformanceEvent, PromiseTimer, Timer } from "@fluidframework/common-utils"; +import { Deferred, PromiseTimer, Timer } from "@fluidframework/common-utils"; +import { ChildLogger, CustomErrorWithProps, PerformanceEvent } from "@fluidframework/client-common-utils"; import { IComponentLoadable, IComponentRouter, @@ -15,7 +16,7 @@ import { } from "@fluidframework/component-core-interfaces"; import { IDeltaManager, ErrorType, ISummarizingWarning } from "@fluidframework/container-definitions"; import { ISummaryContext } from "@fluidframework/driver-definitions"; -import { CustomErrorWithProps, CreateContainerError } from "@fluidframework/driver-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; import { IDocumentMessage, ISequencedDocumentMessage, diff --git a/packages/runtime/container-runtime/src/summaryManager.ts b/packages/runtime/container-runtime/src/summaryManager.ts index beb49ca2a022..23f4929b4dc0 100644 --- a/packages/runtime/container-runtime/src/summaryManager.ts +++ b/packages/runtime/container-runtime/src/summaryManager.ts @@ -5,7 +5,8 @@ import { EventEmitter } from "events"; import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions"; -import { ChildLogger, Heap, IComparer, IHeapNode, PerformanceEvent, PromiseTimer } from "@fluidframework/common-utils"; +import { Heap, IComparer, IHeapNode, PromiseTimer } from "@fluidframework/common-utils"; +import { ChildLogger, PerformanceEvent } from "@fluidframework/client-common-utils"; import { IComponent, IRequest } from "@fluidframework/component-core-interfaces"; import { IContainerContext, LoaderHeader, ISummarizingWarning } from "@fluidframework/container-definitions"; import { ISequencedClient } from "@fluidframework/protocol-definitions"; diff --git a/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts b/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts index 4bab6258dbdb..230710cb2ded 100644 --- a/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts +++ b/packages/runtime/container-runtime/src/test/containerRuntime.spec.ts @@ -5,7 +5,7 @@ import assert from "assert"; import { EventEmitter } from "events"; -import { DebugLogger } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { BlobTreeEntry, TreeTreeEntry } from "@fluidframework/protocol-base"; import { ISummaryBlob, diff --git a/packages/runtime/matrix/package.json b/packages/runtime/matrix/package.json index fb36650af4cc..bf79a502425b 100644 --- a/packages/runtime/matrix/package.json +++ b/packages/runtime/matrix/package.json @@ -46,6 +46,7 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/runtime/matrix/src/permutationvector.ts b/packages/runtime/matrix/src/permutationvector.ts index 6b91c5e197f4..1c6ce5c9bb5f 100644 --- a/packages/runtime/matrix/src/permutationvector.ts +++ b/packages/runtime/matrix/src/permutationvector.ts @@ -4,7 +4,7 @@ */ import { strict as assert } from "assert"; -import { ChildLogger } from "@fluidframework/common-utils"; +import { ChildLogger } from "@fluidframework/client-common-utils"; import { IComponentRuntime, IObjectStorageService } from "@fluidframework/component-runtime-definitions"; import { ITelemetryBaseLogger } from "@fluidframework/common-definitions"; import { diff --git a/packages/runtime/merge-tree/package.json b/packages/runtime/merge-tree/package.json index cfe77e21a2cc..588421ebd678 100644 --- a/packages/runtime/merge-tree/package.json +++ b/packages/runtime/merge-tree/package.json @@ -48,6 +48,7 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/runtime/merge-tree/src/snapshotLoader.ts b/packages/runtime/merge-tree/src/snapshotLoader.ts index b50365f41aef..23c64e86e5d8 100644 --- a/packages/runtime/merge-tree/src/snapshotLoader.ts +++ b/packages/runtime/merge-tree/src/snapshotLoader.ts @@ -4,7 +4,8 @@ */ import assert from "assert"; -import { fromBase64ToUtf8, ChildLogger } from "@fluidframework/common-utils"; +import { fromBase64ToUtf8 } from "@fluidframework/common-utils"; +import { ChildLogger } from "@fluidframework/client-common-utils"; import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"; import { IComponentRuntime, IObjectStorageService } from "@fluidframework/component-runtime-definitions"; import { ITelemetryLogger } from "@fluidframework/common-definitions"; diff --git a/packages/runtime/merge-tree/src/snapshotV1.ts b/packages/runtime/merge-tree/src/snapshotV1.ts index e91e2d4e6587..d1e6b2a3b3f6 100644 --- a/packages/runtime/merge-tree/src/snapshotV1.ts +++ b/packages/runtime/merge-tree/src/snapshotV1.ts @@ -10,7 +10,8 @@ import { IComponentHandleContext, IComponentSerializer, } from "@fluidframework/component-core-interfaces"; -import { ChildLogger, fromBase64ToUtf8 } from "@fluidframework/common-utils"; +import { fromBase64ToUtf8 } from "@fluidframework/common-utils"; +import { ChildLogger } from "@fluidframework/client-common-utils"; import { FileMode, ISequencedDocumentMessage, diff --git a/packages/runtime/merge-tree/src/snapshotlegacy.ts b/packages/runtime/merge-tree/src/snapshotlegacy.ts index 2a231616f79b..011fd8d52a9d 100644 --- a/packages/runtime/merge-tree/src/snapshotlegacy.ts +++ b/packages/runtime/merge-tree/src/snapshotlegacy.ts @@ -9,7 +9,7 @@ import { IComponentHandleContext, IComponentSerializer, } from "@fluidframework/component-core-interfaces"; -import { ChildLogger } from "@fluidframework/common-utils"; +import { ChildLogger } from "@fluidframework/client-common-utils"; import { FileMode, ISequencedDocumentMessage, ITree, TreeEntry } from "@fluidframework/protocol-definitions"; import { NonCollabClient, UnassignedSequenceNumber } from "./constants"; import * as MergeTree from "./mergeTree"; diff --git a/packages/runtime/merge-tree/src/test/beastTest.ts b/packages/runtime/merge-tree/src/test/beastTest.ts index cbdc8243ba68..8638c88336f5 100644 --- a/packages/runtime/merge-tree/src/test/beastTest.ts +++ b/packages/runtime/merge-tree/src/test/beastTest.ts @@ -8,7 +8,7 @@ import assert from "assert"; import fs from "fs"; import path from "path"; -import { DebugLogger } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions"; // eslint-disable-next-line import/no-extraneous-dependencies import JsDiff from "diff"; diff --git a/packages/runtime/merge-tree/src/test/testClient.ts b/packages/runtime/merge-tree/src/test/testClient.ts index 812f2ebf4ba5..d0fa3801622a 100644 --- a/packages/runtime/merge-tree/src/test/testClient.ts +++ b/packages/runtime/merge-tree/src/test/testClient.ts @@ -4,7 +4,7 @@ */ import assert from "assert"; -import { DebugLogger } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { ISequencedDocumentMessage, ITree, MessageType } from "@fluidframework/protocol-definitions"; import { IComponentRuntime } from "@fluidframework/component-runtime-definitions"; // eslint-disable-next-line import/no-extraneous-dependencies diff --git a/packages/runtime/runtime-test-utils/package.json b/packages/runtime/runtime-test-utils/package.json index 9fb643ac740d..661dc81120cb 100644 --- a/packages/runtime/runtime-test-utils/package.json +++ b/packages/runtime/runtime-test-utils/package.json @@ -25,6 +25,7 @@ "tsc": "tsc" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/runtime/runtime-test-utils/src/mocks.ts b/packages/runtime/runtime-test-utils/src/mocks.ts index f662dae8f234..e6062d2c1502 100644 --- a/packages/runtime/runtime-test-utils/src/mocks.ts +++ b/packages/runtime/runtime-test-utils/src/mocks.ts @@ -20,10 +20,10 @@ import { ILoader, } from "@fluidframework/container-definitions"; import { - DebugLogger, Deferred, fromUtf8ToBase64, } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import * as git from "@fluidframework/gitresources"; import { IBlob, diff --git a/packages/runtime/sequence/package.json b/packages/runtime/sequence/package.json index 32617f003daa..67c3a65f847a 100644 --- a/packages/runtime/sequence/package.json +++ b/packages/runtime/sequence/package.json @@ -50,6 +50,7 @@ "temp-directory": "nyc/.nyc_output" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/runtime/sequence/src/sequence.ts b/packages/runtime/sequence/src/sequence.ts index 8fd0c9e7f187..786da10e476d 100644 --- a/packages/runtime/sequence/src/sequence.ts +++ b/packages/runtime/sequence/src/sequence.ts @@ -4,7 +4,8 @@ */ import assert from "assert"; -import { ChildLogger, Deferred, fromBase64ToUtf8 } from "@fluidframework/common-utils"; +import { Deferred, fromBase64ToUtf8 } from "@fluidframework/common-utils"; +import { ChildLogger } from "@fluidframework/client-common-utils"; import { IValueChanged, MapKernel } from "@fluidframework/map"; import * as MergeTree from "@fluidframework/merge-tree"; import { diff --git a/packages/runtime/shared-object-common/package.json b/packages/runtime/shared-object-common/package.json index eac3fe71687b..50c17379e38d 100644 --- a/packages/runtime/shared-object-common/package.json +++ b/packages/runtime/shared-object-common/package.json @@ -25,6 +25,7 @@ "tsc": "tsc" }, "dependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/runtime/shared-object-common/src/sharedObject.ts b/packages/runtime/shared-object-common/src/sharedObject.ts index 4d6caffe9024..d313c22af759 100644 --- a/packages/runtime/shared-object-common/src/sharedObject.ts +++ b/packages/runtime/shared-object-common/src/sharedObject.ts @@ -6,7 +6,7 @@ import assert from "assert"; import { ITelemetryErrorEvent, ITelemetryLogger } from "@fluidframework/common-definitions"; import { IComponentHandle } from "@fluidframework/component-core-interfaces"; -import { ChildLogger, EventEmitterWithErrorHandling } from "@fluidframework/common-utils"; +import { ChildLogger, EventEmitterWithErrorHandling } from "@fluidframework/client-common-utils"; import { ISequencedDocumentMessage, ITree, MessageType } from "@fluidframework/protocol-definitions"; import { IChannelAttributes, diff --git a/packages/test/end-to-end/package.json b/packages/test/end-to-end/package.json index 3668ac15ee48..e64ac26039c3 100644 --- a/packages/test/end-to-end/package.json +++ b/packages/test/end-to-end/package.json @@ -52,12 +52,14 @@ "@fluidframework/base-host": "^0.19.0", "@fluidframework/build-common": "^0.16.0-0", "@fluidframework/cell": "^0.19.0", + "@fluidframework/client-common-utils": "^0.19.0", "@fluidframework/component-core-interfaces": "^0.19.0", "@fluidframework/component-runtime": "^0.19.0", "@fluidframework/component-runtime-definitions": "^0.19.0", "@fluidframework/container-definitions": "^0.19.0", "@fluidframework/container-loader": "^0.19.0", "@fluidframework/container-runtime-definitions": "^0.19.0", + "@fluidframework/container-utils": "^0.19.0", "@fluidframework/driver-base": "^0.19.0", "@fluidframework/driver-definitions": "^0.19.0", "@fluidframework/driver-utils": "^0.19.0", diff --git a/packages/test/end-to-end/src/test/error.spec.ts b/packages/test/end-to-end/src/test/error.spec.ts index 12a750e0fb8a..62a2ef0df621 100644 --- a/packages/test/end-to-end/src/test/error.spec.ts +++ b/packages/test/end-to-end/src/test/error.spec.ts @@ -15,11 +15,9 @@ import { IFluidResolvedUrl, IDocumentServiceFactory, } from "@fluidframework/driver-definitions"; -import { - CreateContainerError, - createWriteError, - CustomErrorWithProps, -} from "@fluidframework/driver-utils"; +import { createWriteError } from "@fluidframework/driver-utils"; +import { CustomErrorWithProps } from "@fluidframework/client-common-utils"; +import { CreateContainerError } from "@fluidframework/container-utils"; import { createOdspNetworkError, invalidFileNameStatusCode, diff --git a/packages/test/functional/package.json b/packages/test/functional/package.json index 17f30655519f..91d019330bd7 100644 --- a/packages/test/functional/package.json +++ b/packages/test/functional/package.json @@ -47,6 +47,7 @@ "temp-directory": "nyc/.nyc_output" }, "devDependencies": { + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/build-common": "^0.16.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/container-loader": "^0.19.0", diff --git a/packages/test/functional/src/test/containerRuntime.spec.ts b/packages/test/functional/src/test/containerRuntime.spec.ts index 4afe13fe8555..263c11206229 100644 --- a/packages/test/functional/src/test/containerRuntime.spec.ts +++ b/packages/test/functional/src/test/containerRuntime.spec.ts @@ -5,7 +5,7 @@ import assert from "assert"; import { EventEmitter } from "events"; -import { DebugLogger } from "@fluidframework/common-utils"; +import { DebugLogger } from "@fluidframework/client-common-utils"; import { IClient, ISequencedDocumentMessage, diff --git a/packages/tools/replay-tool/package.json b/packages/tools/replay-tool/package.json index 4c0ec9122520..ca23558db726 100644 --- a/packages/tools/replay-tool/package.json +++ b/packages/tools/replay-tool/package.json @@ -26,6 +26,7 @@ }, "dependencies": { "@fluid-internal/client-api": "^0.19.0", + "@fluidframework/client-common-utils": "^0.19.0-0", "@fluidframework/common-definitions": "^0.18.0-0", "@fluidframework/common-utils": "^0.19.0-0", "@fluidframework/component-core-interfaces": "^0.19.0", diff --git a/packages/tools/replay-tool/src/replayMessages.ts b/packages/tools/replay-tool/src/replayMessages.ts index a495bb2a6824..78faa5aaddec 100644 --- a/packages/tools/replay-tool/src/replayMessages.ts +++ b/packages/tools/replay-tool/src/replayMessages.ts @@ -11,7 +11,7 @@ import { ITelemetryBaseEvent, ITelemetryBaseLogger } from "@fluidframework/commo import { IRequest } from "@fluidframework/component-core-interfaces"; import { IProxyLoaderFactory } from "@fluidframework/container-definitions"; import { Container, Loader } from "@fluidframework/container-loader"; -import { ChildLogger, TelemetryLogger } from "@fluidframework/common-utils"; +import { ChildLogger, TelemetryLogger } from "@fluidframework/client-common-utils"; import { IDocumentServiceFactory, IFluidResolvedUrl, diff --git a/packages/utils/common-utils/.eslintrc.js b/packages/utils/common-utils/.eslintrc.js new file mode 100644 index 000000000000..c2473383e089 --- /dev/null +++ b/packages/utils/common-utils/.eslintrc.js @@ -0,0 +1,18 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +module.exports = { + "extends": [ + "@fluidframework/eslint-config-fluid" + ], + "rules": { + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/strict-boolean-expressions": "off", + "no-bitwise": "off", + "no-null/no-null": "off", + "prefer-arrow/prefer-arrow-functions": "off", + "prefer-rest-params": "off" + } +} \ No newline at end of file diff --git a/packages/utils/common-utils/.gitignore b/packages/utils/common-utils/.gitignore new file mode 100644 index 000000000000..02d308e338ba --- /dev/null +++ b/packages/utils/common-utils/.gitignore @@ -0,0 +1,52 @@ +# Compiled TypeScript and CSS +dist +lib + +# Babel +public/scripts/es5 + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt +.cache-loader + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Typings +typings + +# Debug log from npm +npm-debug.log + +# Code coverage +nyc +.nyc_output/ + +# Chart dependencies +**/charts/*.tgz + +# Generated modeuls +intel_modules/ +temp_modules/ \ No newline at end of file diff --git a/packages/utils/common-utils/.npmignore b/packages/utils/common-utils/.npmignore new file mode 100644 index 000000000000..5e5fd12f6e5b --- /dev/null +++ b/packages/utils/common-utils/.npmignore @@ -0,0 +1,3 @@ +nyc +*.log +**/*.tsbuildinfo diff --git a/packages/utils/common-utils/.npmrc b/packages/utils/common-utils/.npmrc new file mode 100644 index 000000000000..7d0b22c996c2 --- /dev/null +++ b/packages/utils/common-utils/.npmrc @@ -0,0 +1,8 @@ +registry=https://registry.npmjs.org/ +always-auth=false + +@microsoft:registry=https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/ +@microsoft:always-auth=true + +@fluidframework:registry=https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/ +@fluidframework:always-auth=true diff --git a/packages/utils/common-utils/README.md b/packages/utils/common-utils/README.md new file mode 100644 index 000000000000..5ba73ebbd21c --- /dev/null +++ b/packages/utils/common-utils/README.md @@ -0,0 +1,3 @@ +# @fluidframework/common-utils + +Common utilities used by Fluid Framework diff --git a/packages/utils/common-utils/api-extractor.json b/packages/utils/common-utils/api-extractor.json new file mode 100644 index 000000000000..4d8b958a73cb --- /dev/null +++ b/packages/utils/common-utils/api-extractor.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "extends": "@fluidframework/build-common/api-extractor-common.json" +} diff --git a/packages/utils/common-utils/package-lock.json b/packages/utils/common-utils/package-lock.json new file mode 100644 index 000000000000..4c49beaca9b4 --- /dev/null +++ b/packages/utils/common-utils/package-lock.json @@ -0,0 +1,4414 @@ +{ + "name": "@fluidframework/common-utils", + "version": "0.19.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/helpers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@fluidframework/build-common": { + "version": "0.16.0-27351", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@fluidframework/build-common/-/build-common-0.16.0-27351.tgz", + "integrity": "sha1-71Rz1d0kff6jcFbguVztOTnWU+c=", + "dev": true + }, + "@fluidframework/common-definitions": { + "version": "0.18.0-27349", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@fluidframework/common-definitions/-/common-definitions-0.18.0-27349.tgz", + "integrity": "sha1-cuFfIPblhrXkZWOmTBVIEZt6xdk=" + }, + "@fluidframework/eslint-config-fluid": { + "version": "0.17.0-27352", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@fluidframework/eslint-config-fluid/-/eslint-config-fluid-0.17.0-27352.tgz", + "integrity": "sha1-hPcLi4erKnq+DbhK4T0ESuilfEc=", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "~2.17.0", + "@typescript-eslint/parser": "~2.17.0", + "eslint": "~6.8.0", + "eslint-plugin-eslint-comments": "~3.1.2", + "eslint-plugin-import": "2.20.0", + "eslint-plugin-no-null": "~1.0.2", + "eslint-plugin-optimize-regex": "~1.1.7", + "eslint-plugin-prefer-arrow": "~1.1.7", + "eslint-plugin-react": "~7.18.0", + "eslint-plugin-unicorn": "~15.0.1" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@microsoft/api-extractor": { + "version": "7.8.0", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/api-extractor/-/api-extractor-7.8.0.tgz", + "integrity": "sha1-/qaOTyHBvxgCBWD9VyixX+RPCXY=", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.8.0", + "@microsoft/tsdoc": "0.12.19", + "@rushstack/node-core-library": "3.19.7", + "@rushstack/ts-command-line": "4.3.14", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "1.8.1", + "source-map": "~0.6.1", + "typescript": "~3.7.2" + } + }, + "@microsoft/api-extractor-model": { + "version": "7.8.0", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/api-extractor-model/-/api-extractor-model-7.8.0.tgz", + "integrity": "sha1-X1MpmPARCfI9V7QigDu99a1lXYA=", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.12.19", + "@rushstack/node-core-library": "3.19.7" + } + }, + "@microsoft/tsdoc": { + "version": "0.12.19", + "resolved": "https://offnet.pkgs.visualstudio.com/officenet/_packaging/fluid/npm/registry/@microsoft/tsdoc/-/tsdoc-0.12.19.tgz", + "integrity": "sha1-IXPMuSRpqvYgMfqUmdIbFtB/m1c=", + "dev": true + }, + "@rushstack/node-core-library": { + "version": "3.19.7", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.19.7.tgz", + "integrity": "sha512-gKE/OXH5GAj8yJ1kEyRW68UekJernilZ3QTRgmQ0MUHBCQmtZ9Q6T5PQ1sVbcL4teH8BMdpZeFy1DKnHs8h3PA==", + "dev": true, + "requires": { + "@types/node": "10.17.13", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "jju": "~1.4.0", + "semver": "~5.3.0", + "timsort": "~0.3.0", + "z-schema": "~3.18.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", + "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==", + "dev": true + } + } + }, + "@rushstack/ts-command-line": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.3.14.tgz", + "integrity": "sha512-YJZIyKvkm3f6ZdKSfMntHS9542Y2mmMWzaiPPoXxLFZntKxEIDE3WfUNlvOSo3yK4fNd09Tz3hfvTivQNHSiKQ==", + "dev": true, + "requires": { + "@types/argparse": "1.0.33", + "argparse": "~1.0.9", + "colors": "~1.2.1" + } + }, + "@sinonjs/commons": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@types/argparse": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.33.tgz", + "integrity": "sha512-VQgHxyPMTj3hIlq9SY1mctqx+Jj8kpQfoLvDlVSDNOyuYs8JYfkuY3OW/4+dO657yPmNhHpePRx0/Tje5ImNVQ==", + "dev": true + }, + "@types/benchmark": { + "version": "1.0.31", + "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-1.0.31.tgz", + "integrity": "sha512-F6fVNOkGEkSdo/19yWYOwVKGvzbTeWkR/XQYBKtGBQ9oGRjBN9f/L4aJI4sDcVPJO58Y1CJZN8va9V2BhrZapA==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + }, + "@types/node": { + "version": "10.17.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.24.tgz", + "integrity": "sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/sinon": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.2.tgz", + "integrity": "sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.17.0.tgz", + "integrity": "sha512-tg/OMOtPeXlvk0ES8mZzEZ4gd1ruSE03nsKcK+teJhxYv5CPCXK6Mb/OK6NpB4+CqGTHs4MVeoSZXNFqpT1PyQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.17.0", + "eslint-utils": "^1.4.3", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.17.0.tgz", + "integrity": "sha512-2bNf+mZ/3mj5/3CP56v+ldRK3vFy9jOvmCPs/Gr2DeSJh+asPZrhFniv4QmQsHWQFPJFWhFHgkGgJeRmK4m8iQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.17.0", + "eslint-scope": "^5.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.17.0.tgz", + "integrity": "sha512-k1g3gRQ4fwfJoIfgUpz78AovicSWKFANmvTfkAHP24MgJHjWfZI6ya7tsQZt1sLczvP4G9BE5G5MgADHdmJB/w==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.17.0", + "@typescript-eslint/typescript-estree": "2.17.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.17.0.tgz", + "integrity": "sha512-g0eVRULGnEEUakxRfJO0s0Hr1LLQqsI6OrkiCLpdHtdJJek+wyd8mb00vedqAoWldeDcOcP8plqw8/jx9Gr3Lw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concurrently": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.2.0.tgz", + "integrity": "sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copyfiles": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.2.0.tgz", + "integrity": "sha512-iJbHJI+8OKqsq+4JF0rqgRkZzo++jqO6Wf4FUU1JM41cJF6JcY5968XyF4tm3Kkm7ZOMrqlljdm8N9oyY5raGw==", + "dev": true, + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^0.5.1", + "noms": "0.0.0", + "through2": "^2.0.1", + "yargs": "^13.2.4" + }, + "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "date-fns": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.14.0.tgz", + "integrity": "sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-ast-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz", + "integrity": "sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==", + "dev": true, + "requires": { + "lodash.get": "^4.4.2", + "lodash.zip": "^4.2.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-eslint-comments": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz", + "integrity": "sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", + "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-no-null": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-null/-/eslint-plugin-no-null-1.0.2.tgz", + "integrity": "sha1-EjaoEjkTkKGHetQAfCbnRTQclR8=", + "dev": true + }, + "eslint-plugin-optimize-regex": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-optimize-regex/-/eslint-plugin-optimize-regex-1.1.7.tgz", + "integrity": "sha512-YiMp9uerCHqG+EhfQhCNNDyjWkaya2L8ggg0+ou5f1oVu51IK+ziE1VlzaILFVTrhU1llAQw+vNn7cOd73VtwQ==", + "dev": true, + "requires": { + "regexp-tree": "0.1.11" + } + }, + "eslint-plugin-prefer-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.1.7.tgz", + "integrity": "sha512-epsA4g804mRovlOHSbeO1xxW7REGeUjULRME9MJTJDOVscNIA01AkR66TP4cmHDfD+w72EQ9cPhf37MbZiFI2w==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.3.tgz", + "integrity": "sha512-Bt56LNHAQCoou88s8ViKRjMB2+36XRejCQ1VoLj716KI1MoE99HpTVvIThJ0rvFmG4E4Gsq+UgToEjn+j044Bg==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.14.2", + "string.prototype.matchall": "^4.0.2" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-unicorn": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-15.0.1.tgz", + "integrity": "sha512-yahqrPGFUzwH5cnmnj+iPlgPapAiBIZ/ZNSDkhTVPgPCo7/mOEjJ2gDhEclrtQVBE9olmec4N+CKDnJuZ9XpRA==", + "dev": true, + "requires": { + "ci-info": "^2.0.0", + "clean-regexp": "^1.0.0", + "eslint-ast-utils": "^1.1.0", + "eslint-template-visitor": "^1.1.0", + "import-modules": "^2.0.0", + "lodash.camelcase": "^4.3.0", + "lodash.defaultsdeep": "^4.6.1", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.upperfirst": "^4.3.1", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.17", + "regexpp": "^3.0.0", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "regexp-tree": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.21.tgz", + "integrity": "sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz", + "integrity": "sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "multimap": "^1.0.2" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.0.0.tgz", + "integrity": "sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "just-extend": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", + "dev": true + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-promises-safe": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/make-promises-safe/-/make-promises-safe-5.1.0.tgz", + "integrity": "sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g==", + "dev": true + }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "dev": true, + "requires": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "mocha-junit-reporter": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz", + "integrity": "sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "nyc": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", + "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "platform": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", + "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "regexp-tree": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", + "dev": true + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tslib": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "z-schema": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", + "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "dev": true, + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.0.0", + "lodash.isequal": "^4.0.0", + "validator": "^8.0.0" + } + } + } +} diff --git a/packages/utils/common-utils/package.json b/packages/utils/common-utils/package.json new file mode 100644 index 000000000000..084f1f51f6dc --- /dev/null +++ b/packages/utils/common-utils/package.json @@ -0,0 +1,101 @@ +{ + "name": "@fluidframework/client-common-utils", + "version": "0.19.0", + "description": "Collection of utility functions for Fluid", + "repository": "microsoft/FluidFramework", + "license": "MIT", + "author": "Microsoft", + "sideEffects": "false", + "main": "dist/index.js", + "module": "lib/index.js", + "browser": { + "./dist/indexNode.js": "./dist/indexBrowser.js", + "./lib/indexNode.js": "./lib/indexBrowser.js" + }, + "types": "dist/index.d.ts", + "scripts": { + "bench": "ts-node bench/src/index.ts", + "build": "npm run build:genver && concurrently npm:build:compile npm:lint", + "build:ci": "npm run build:genver && npm run build:compile", + "build:compile": "concurrently npm:tsc npm:build:esnext", + "build:docs": "api-extractor run --local && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/", + "build:esnext": "tsc --project ./tsconfig.esnext.json", + "build:full": "npm run build", + "build:full:compile": "npm run build:compile", + "build:genver": "gen-version", + "bump-version": "npm version minor --no-push --no-git-tag-version && npm run build:genver", + "ci:build": "npm run build:genver && npm run build:compile", + "ci:test": "npm run test:report", + "ci:test:coverage": "npm run test:coverage", + "clean": "rimraf dist lib *.tsbuildinfo *.build.log", + "eslint": "eslint --ext=ts,tsx --format stylish src", + "eslint:fix": "eslint --ext=ts,tsx --format stylish src --fix", + "lint": "npm run eslint", + "lint:fix": "npm run eslint:fix", + "test": "npm run test:mocha", + "test:ci": "npm run test:report", + "test:coverage": "nyc npm run test:report", + "test:mocha": "mocha --recursive dist/test -r make-promises-safe", + "test:report": "npm test -- -- --reporter mocha-junit-reporter --reporter-options mochaFile=nyc/mocha-junit-report.xml", + "tsc": "tsc" + }, + "nyc": { + "all": true, + "cache-dir": "nyc/.cache", + "exclude": [ + "src/test/**/*.ts", + "dist/test/**/*.js" + ], + "exclude-after-remap": false, + "include": [ + "src/**/*.ts", + "dist/**/*.js" + ], + "report-dir": "nyc/report", + "reporter": [ + "cobertura", + "html", + "text" + ], + "temp-directory": "nyc/.nyc_output" + }, + "dependencies": { + "@fluidframework/common-definitions": "^0.18.0-0", + "@fluidframework/common-utils": "^0.19.0-0", + "debug": "^4.1.1", + "lodash": "^4.17.11", + "performance-now": "^2.1.0", + "sha.js": "^2.4.11" + }, + "devDependencies": { + "@fluidframework/build-common": "^0.16.0-0", + "@fluidframework/eslint-config-fluid": "^0.17.0-0", + "@microsoft/api-extractor": "^7.7.2", + "@types/benchmark": "^1.0.31", + "@types/debug": "^4.1.5", + "@types/mocha": "^5.2.5", + "@types/node": "^10.17.24", + "@types/sinon": "^7.0.13", + "@typescript-eslint/eslint-plugin": "~2.17.0", + "@typescript-eslint/parser": "~2.17.0", + "benchmark": "^2.1.4", + "concurrently": "^5.2.0", + "copyfiles": "^2.1.0", + "eslint": "~6.8.0", + "eslint-plugin-eslint-comments": "~3.1.2", + "eslint-plugin-import": "2.20.0", + "eslint-plugin-no-null": "~1.0.2", + "eslint-plugin-optimize-regex": "~1.1.7", + "eslint-plugin-prefer-arrow": "~1.1.7", + "eslint-plugin-react": "~7.18.0", + "eslint-plugin-unicorn": "~15.0.1", + "make-promises-safe": "^5.1.0", + "mocha": "^5.2.0", + "mocha-junit-reporter": "^1.18.0", + "nyc": "^15.0.0", + "rimraf": "^2.6.2", + "sinon": "^7.4.2", + "ts-node": "^7.0.1", + "typescript": "~3.7.4" + } +} diff --git a/common/lib/common-utils/src/eventEmitterWithErrorHandling.ts b/packages/utils/common-utils/src/eventEmitterWithErrorHandling.ts similarity index 91% rename from common/lib/common-utils/src/eventEmitterWithErrorHandling.ts rename to packages/utils/common-utils/src/eventEmitterWithErrorHandling.ts index 4fb94212b609..cb4367f78c15 100644 --- a/common/lib/common-utils/src/eventEmitterWithErrorHandling.ts +++ b/packages/utils/common-utils/src/eventEmitterWithErrorHandling.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ import { IEvent } from "@fluidframework/common-definitions"; -import { TypedEventEmitter, EventEmitterEventType } from "./typedEventEmitter"; +import { TypedEventEmitter, EventEmitterEventType } from "@fluidframework/common-utils"; /** * Event Emitter helper class diff --git a/common/lib/common-utils/src/events.ts b/packages/utils/common-utils/src/events.ts similarity index 100% rename from common/lib/common-utils/src/events.ts rename to packages/utils/common-utils/src/events.ts diff --git a/packages/utils/common-utils/src/index.ts b/packages/utils/common-utils/src/index.ts new file mode 100644 index 000000000000..cf3c94040ae9 --- /dev/null +++ b/packages/utils/common-utils/src/index.ts @@ -0,0 +1,8 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +export * from "./eventEmitterWithErrorHandling"; +export * from "./events"; +export * from "./logger"; diff --git a/packages/utils/common-utils/src/logger.ts b/packages/utils/common-utils/src/logger.ts new file mode 100644 index 000000000000..b263eefcc5e2 --- /dev/null +++ b/packages/utils/common-utils/src/logger.ts @@ -0,0 +1,523 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + ITelemetryBaseEvent, + ITelemetryBaseLogger, + ITelemetryErrorEvent, + ITelemetryGenericEvent, + ITelemetryLogger, + ITelemetryPerformanceEvent, + ITelemetryProperties, + TelemetryEventPropertyType, +} from "@fluidframework/common-definitions"; +import { BaseTelemetryNullLogger, performanceNow } from "@fluidframework/common-utils"; +import { debug as registerDebug, IDebugger } from "debug"; + +export interface ITelemetryPropertyGetters { + [index: string]: () => TelemetryEventPropertyType; +} + +/** + * TelemetryLogger class contains various helper telemetry methods, + * encoding in one place schemas for various types of Fluid telemetry events. + * Creates sub-logger that appends properties to all events + */ +export abstract class TelemetryLogger implements ITelemetryLogger { + public static readonly eventNamespaceSeparator = ":"; + + public static formatTick(tick: number): number { + return Math.floor(tick); + } + + /** + * Attempts to parse number from string. + * If fails,returns original string. + * Used to make telemetry data typed (and support math operations, like comparison), + * in places where we do expect numbers (like contentsize/duration property in http header) + */ + public static numberFromString(str: string | null | undefined): string | number | undefined { + if (str === undefined || str === null) { + return undefined; + } + const num = Number(str); + return Number.isNaN(num) ? str : num; + } + + public static sanitizePkgName(name: string) { + return name.replace("@", "").replace("/", "-"); + } + + public static prepareErrorObject(event: ITelemetryBaseEvent, error: any, fetchStack: boolean) { + if (error === null || typeof error !== "object") { + event.error = error; + } else { + // WARNING: Exceptions can contain PII! + // For example, XHR will throw object derived from Error that contains config information + // for failed request, including all the headers, and thus - user tokens! + // Extract only call stack, message, and couple network-related properties form error object + + const errorAsObject = error as { + stack?: string; + message?: string; + }; + + event.stack = errorAsObject.stack; + event.error = errorAsObject.message; + + // Error message can container PII information. + // If we know for sure it does, we have to not log it. + if (error.containsPII) { + event.error = "Error message was removed as it contained PII"; + } else if (error.getCustomProperties) { + const customProps: object = error.getCustomProperties(); + for (const key of Object.keys(customProps)) { + if (event[key] === undefined) { + event[key] = customProps[key]; + } + } + } + } + + // Collect stack if we were not able to extract it from error + if (event.stack === undefined && fetchStack) { + event.stack = TelemetryLogger.getStack(); + } + } + + protected static getStack(): string | undefined { + // Some browsers will populate stack right away, others require throwing Error + let stack = new Error().stack; + if (!stack) { + try { + throw new Error(); + } catch (e) { + stack = e.stack; + } + } + return stack; + } + + protected constructor( + private readonly namespace?: string, + private readonly properties?: object, + private readonly propertyGetters?: ITelemetryPropertyGetters) { + } + + /** + * Send an event with the logger + * + * @param event - the event to send + */ + public abstract send(event: ITelemetryBaseEvent): void; + + /** + * Send a telemetry event with the logger + * + * @param event - the event to send + * @param error - optional error object to log + */ + public sendTelemetryEvent(event: ITelemetryGenericEvent, error?: any) { + const newEvent: ITelemetryBaseEvent = { ...event, category: event.category ? event.category : "generic" }; + if (error !== undefined) { + TelemetryLogger.prepareErrorObject(newEvent, error, false); + } + this.send(newEvent); + } + + /** + * Send an error telemetry event with the logger + * + * @param event - the event to send + * @param error - optional error object to log + */ + public sendErrorEvent(event: ITelemetryErrorEvent, error?: any) { + const newEvent: ITelemetryBaseEvent = { ...event, category: "error" }; + TelemetryLogger.prepareErrorObject(newEvent, error, true); + this.send(newEvent); + } + + /** + * Send a performance telemetry event with the logger + * + * @param event - Event to send + * @param error - optional error object to log + */ + public sendPerformanceEvent(event: ITelemetryPerformanceEvent, error?: any): void { + const perfEvent: ITelemetryBaseEvent = { + ...event, + category: event.category ? event.category : "performance", + }; + if (error !== undefined) { + TelemetryLogger.prepareErrorObject(perfEvent, error, false); + } + + if (event.duration) { + perfEvent.duration = TelemetryLogger.formatTick(event.duration); + } + + this.send(perfEvent); + } + + /** + * Log generic error with the logger + * + * @param eventName - the name of the event + * @param error - the error object to include in the event, require to be JSON-able + */ + public logGenericError(eventName: string, error: any) { + this.sendErrorEvent({ eventName }, error); + } + + /** + * Helper method to log exceptions + * @param event - the event to send + * @param exception - Exception object to add to an event + */ + public logException(event: ITelemetryErrorEvent, exception: any): void { + this.sendErrorEvent({ ...event, isException: true }, exception); + } + + /** + * Log an debug assert with the logger + * + * @param condition - the condition to assert on + * @param event - the event to log if the condition fails + */ + public debugAssert(condition: boolean, event?: ITelemetryErrorEvent): void { + this.shipAssert(condition, event); + } + + /** + * Log an ship assert with the logger + * + * @param condition - the condition to assert on + * @param event - the event to log if the condition fails + */ + public shipAssert(condition: boolean, event?: ITelemetryErrorEvent): void { + if (!condition) { + const realEvent: ITelemetryErrorEvent = event === undefined ? { eventName: "Assert" } : event; + realEvent.isAssert = true; + realEvent.stack = TelemetryLogger.getStack(); + this.sendErrorEvent(realEvent); + } + } + + protected prepareEvent(event: ITelemetryBaseEvent): ITelemetryBaseEvent { + const newEvent: ITelemetryBaseEvent = { ...this.properties, ...event }; + if (this.namespace !== undefined) { + newEvent.eventName = `${this.namespace}${TelemetryLogger.eventNamespaceSeparator}${newEvent.eventName}`; + } + // Evaluate any getter functions + if (this.propertyGetters) { + for (const key of Object.keys(this.propertyGetters)) { + if (event[key] !== undefined) { + // Properties directly on the event take priority + continue; + } + const getter = this.propertyGetters[key]; + + // If this throws, hopefully it is handled elsewhere + const value = getter(); + if (value !== undefined) { + newEvent[key] = value; + } + } + } + + return newEvent; + } +} + +/** + * ChildLogger class contains various helper telemetry methods, + * encoding in one place schemas for various types of Fluid telemetry events. + * Creates sub-logger that appends properties to all events + */ +export class ChildLogger extends TelemetryLogger { + /** + * Create child logger + * @param baseLogger - Base logger to use to output events. If undefined, proper child logger + * is created, but it does not sends telemetry events anywhere. + * @param namespace - Telemetry event name prefix to add to all events + * @param properties - Base properties to add to all events + * @param propertyGetters - Getters to add additional properties to all events + */ + public static create( + baseLogger?: ITelemetryBaseLogger, + namespace?: string, + properties?: object, + propertyGetters?: ITelemetryPropertyGetters): TelemetryLogger { + return new ChildLogger( + baseLogger ? baseLogger : new BaseTelemetryNullLogger(), + namespace, + properties, + propertyGetters); + } + + constructor( + protected readonly logger: ITelemetryBaseLogger, + namespace?: string, + properties?: object, + propertyGetters?: ITelemetryPropertyGetters) { + super(namespace, properties, propertyGetters); + } + + /** + * Send an event with the logger + * + * @param event - the event to send + */ + public send(event: ITelemetryBaseEvent): void { + this.logger.send(this.prepareEvent(event)); + } +} + +/** + * Multi-sink logger + * Takes multiple ITelemetryBaseLogger objects (sinks) and logs all events into each sink + * Implements ITelemetryBaseLogger (through static create() method) + */ +export class MultiSinkLogger extends TelemetryLogger { + protected loggers: ITelemetryBaseLogger[] = []; + + /** + * Create multiple sink logger (i.e. logger that sends events to multiple sinks) + * @param namespace - Telemetry event name prefix to add to all events + * @param properties - Base properties to add to all events + * @param propertyGetters - Getters to add additional properties to all events + */ + constructor( + namespace?: string, + properties?: object, + propertyGetters?: ITelemetryPropertyGetters) { + super(namespace, properties, propertyGetters); + } + + /** + * Add logger to send all events to + * @param logger - Logger to add + */ + public addLogger(logger?: ITelemetryBaseLogger) { + if (logger !== undefined && logger !== null) { + this.loggers.push(logger); + } + } + + /** + * Send an event to the loggers + * + * @param event - the event to send to all the registered logger + */ + public send(event: ITelemetryBaseEvent): void { + const newEvent = this.prepareEvent(event); + this.loggers.forEach((logger: ITelemetryBaseLogger) => { + logger.send(newEvent); + }); + } +} + +/** + * Implementation of debug logger + */ +export class DebugLogger extends TelemetryLogger { + /** + * Create debug logger - all events are output to debug npm library + * @param namespace - Telemetry event name prefix to add to all events + * @param properties - Base properties to add to all events + * @param propertyGetters - Getters to add additional properties to all events + */ + public static create( + namespace: string, + properties?: object, + propertyGetters?: ITelemetryPropertyGetters): TelemetryLogger { + // Setup base logger upfront, such that host can disable it (if needed) + const debug = registerDebug(namespace); + + const debugErr = registerDebug(namespace); + debugErr.log = console.error.bind(console); + debugErr.enabled = true; + + return new DebugLogger(debug, debugErr, properties, propertyGetters); + } + + /** + * Mix in debug logger with another logger. + * Returned logger will output events to both newly created debug logger, as well as base logger + * @param namespace - Telemetry event name prefix to add to all events + * @param properties - Base properties to add to all events + * @param propertyGetters - Getters to add additional properties to all events + * @param baseLogger - Base logger to output events (in addition to debug logger being created). Can be undefined. + */ + public static mixinDebugLogger( + namespace: string, + baseLogger?: ITelemetryBaseLogger, + properties?: object, + propertyGetters?: ITelemetryPropertyGetters): TelemetryLogger { + if (!baseLogger) { + return DebugLogger.create(namespace, properties, propertyGetters); + } + + const multiSinkLogger = new MultiSinkLogger(undefined, properties, propertyGetters); + multiSinkLogger.addLogger(DebugLogger.create(namespace)); + multiSinkLogger.addLogger(ChildLogger.create(baseLogger, namespace)); + + return multiSinkLogger; + } + + constructor( + private readonly debug: IDebugger, + private readonly debugErr: IDebugger, + properties?: object, + propertyGetters?: ITelemetryPropertyGetters, + ) { + super(undefined, properties, propertyGetters); + } + + /** + * Send an event to debug loggers + * + * @param event - the event to send + */ + public send(event: ITelemetryBaseEvent): void { + const newEvent: ITelemetryProperties = this.prepareEvent(event); + const isError = newEvent.category === "error"; + let logger = isError ? this.debugErr : this.debug; + + // Use debug's coloring schema for base of the event + const index = event.eventName.lastIndexOf(TelemetryLogger.eventNamespaceSeparator); + const name = event.eventName.substring(index + 1); + if (index > 0) { + logger = logger.extend(event.eventName.substring(0, index)); + } + newEvent.eventName = undefined; + + let tick = ""; + if (event.category === "performance") { + tick = `tick=${TelemetryLogger.formatTick(performanceNow())}`; + } + + // Extract stack to put it last, but also to avoid escaping '\n' in it by JSON.stringify below + const stack = newEvent.stack ? newEvent.stack : ""; + newEvent.stack = undefined; + + // Watch out for circular references - they can come from two sources + // 1) error object - we do not control it and should remove it and retry + // 2) properties supplied by telemetry caller - that's a bug that should be addressed! + let payload: string; + try { + payload = JSON.stringify(newEvent); + } catch (error) { + newEvent.error = undefined; + payload = JSON.stringify(newEvent); + } + + if (payload === "{}") { + payload = ""; + } + + // Force errors out, to help with diagnostics + if (isError) { + logger.enabled = true; + } + + // Print multi-line. + logger(`${name} ${payload} ${tick} ${stack}`); + } +} + +/** + * Helper class to log performance events + */ +export class PerformanceEvent { + public static start(logger: ITelemetryLogger, event: ITelemetryGenericEvent) { + return new PerformanceEvent(logger, event); + } + + private event?: ITelemetryGenericEvent; + private readonly startTime = performanceNow(); + private startMark?: string; + + protected constructor( + private readonly logger: ITelemetryLogger, + event: ITelemetryGenericEvent) { + this.event = { ...event }; + this.reportEvent("start"); + + if (typeof window === "object" && window != null && window.performance) { + this.startMark = `${event.eventName}-start`; + window.performance.mark(this.startMark); + } + } + + public reportProgress(props?: object, eventNameSuffix: string = "update"): void { + this.reportEvent(eventNameSuffix, props); + } + + public end(props?: object, eventNameSuffix = "end"): void { + this.reportEvent(eventNameSuffix, props); + + if (this.startMark) { + const endMark = `${this.event!.eventName}-${eventNameSuffix}`; + window.performance.mark(endMark); + window.performance.measure(`${this.event!.eventName}`, this.startMark, endMark); + this.startMark = undefined; + } + + this.event = undefined; + } + + public cancel(props?: object, error?: any): void { + this.reportEvent("cancel", props, error); + this.event = undefined; + } + + public reportEvent(eventNameSuffix: string, props?: object, error?: any): void { + if (!this.event) { + this.logger.sendErrorEvent({ + eventName: "PerformanceEventAfterStop", + perfEventName: this.event!.eventName, + eventNameSuffix, + }); + return; + } + + const event: ITelemetryPerformanceEvent = { ...this.event, ...props }; + event.eventName = `${event.eventName}_${eventNameSuffix}`; + if (eventNameSuffix !== "start") { + event.duration = performanceNow() - this.startTime; + } + + this.logger.sendPerformanceEvent(event, error); + } +} + +/** + * Helper class for error tracking. + * Object of this instance will record all of their properties when logged with logger. + * Care needs to be taken not to log PII information! + * Logger ignores all properties from any other error objects (not being instance of CustomErrorWithProps), + * with exception of 'message' & 'stack' properties if they exists on error object. + * In other words, logger logs only what it knows about and has good confidence it does not container PII information. + */ +export class CustomErrorWithProps extends Error { + constructor( + message: string, + props?: {[key: string]: string | number}) + { + super(message); + Object.assign(this, props); + } + + // Return all properties + public getCustomProperties(): object { + const props = {}; + // Could not use {...this} because it does not return properties of base class. + for (const key of Object.getOwnPropertyNames(this)) { + props[key] = this[key]; + } + return props; + } +} diff --git a/packages/utils/common-utils/src/packageVersion.ts b/packages/utils/common-utils/src/packageVersion.ts new file mode 100644 index 000000000000..419958c319da --- /dev/null +++ b/packages/utils/common-utils/src/packageVersion.ts @@ -0,0 +1,9 @@ +/*! + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + * + * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY + */ + +export const pkgName = "@fluidframework/client-common-utils"; +export const pkgVersion = "0.19.0"; diff --git a/packages/utils/common-utils/tsconfig.esnext.json b/packages/utils/common-utils/tsconfig.esnext.json new file mode 100644 index 000000000000..ca3d4c50b989 --- /dev/null +++ b/packages/utils/common-utils/tsconfig.esnext.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./lib", + "module": "esnext" + }, +} \ No newline at end of file diff --git a/packages/utils/common-utils/tsconfig.json b/packages/utils/common-utils/tsconfig.json new file mode 100644 index 000000000000..28133a4c432b --- /dev/null +++ b/packages/utils/common-utils/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@fluidframework/build-common/ts-common-config.json", + "exclude": [ + "dist", + "node_modules" + ], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "types": [ + "node", + "mocha" + ] + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file